Issue #23392: Added tests for marshal C API that works with FILE*.
diff --git a/Lib/test/test_marshal.py b/Lib/test/test_marshal.py
index 59fa3eb..1967c48 100644
--- a/Lib/test/test_marshal.py
+++ b/Lib/test/test_marshal.py
@@ -6,6 +6,11 @@
 import unittest
 import os
 
+try:
+    import _testcapi
+except ImportError:
+    _testcapi = None
+
 class IntTestCase(unittest.TestCase):
     def test_ints(self):
         # Test the full range of Python ints.
@@ -316,6 +321,65 @@
         self.check_unmarshallable(bytearray(size))
 
 
+@test_support.cpython_only
+@unittest.skipUnless(_testcapi, 'requires _testcapi')
+class CAPI_TestCase(unittest.TestCase):
+
+    def test_write_long_to_file(self):
+        for v in range(marshal.version + 1):
+            _testcapi.pymarshal_write_long_to_file(0x12345678, test_support.TESTFN, v)
+            with open(test_support.TESTFN, 'rb') as f:
+                data = f.read()
+            test_support.unlink(test_support.TESTFN)
+            self.assertEqual(data, b'\x78\x56\x34\x12')
+
+    def test_write_object_to_file(self):
+        obj = ('\u20ac', b'abc', 123, 45.6, 7+8j, 'long line '*1000)
+        for v in range(marshal.version + 1):
+            _testcapi.pymarshal_write_object_to_file(obj, test_support.TESTFN, v)
+            with open(test_support.TESTFN, 'rb') as f:
+                data = f.read()
+            test_support.unlink(test_support.TESTFN)
+            self.assertEqual(marshal.loads(data), obj)
+
+    def test_read_short_from_file(self):
+        with open(test_support.TESTFN, 'wb') as f:
+            f.write(b'\x34\x12xxxx')
+        r, p = _testcapi.pymarshal_read_short_from_file(test_support.TESTFN)
+        test_support.unlink(test_support.TESTFN)
+        self.assertEqual(r, 0x1234)
+        self.assertEqual(p, 2)
+
+    def test_read_long_from_file(self):
+        with open(test_support.TESTFN, 'wb') as f:
+            f.write(b'\x78\x56\x34\x12xxxx')
+        r, p = _testcapi.pymarshal_read_long_from_file(test_support.TESTFN)
+        test_support.unlink(test_support.TESTFN)
+        self.assertEqual(r, 0x12345678)
+        self.assertEqual(p, 4)
+
+    def test_read_last_object_from_file(self):
+        obj = ('\u20ac', b'abc', 123, 45.6, 7+8j)
+        for v in range(marshal.version + 1):
+            data = marshal.dumps(obj, v)
+            with open(test_support.TESTFN, 'wb') as f:
+                f.write(data + b'xxxx')
+            r, p = _testcapi.pymarshal_read_last_object_from_file(test_support.TESTFN)
+            test_support.unlink(test_support.TESTFN)
+            self.assertEqual(r, obj)
+
+    def test_read_object_from_file(self):
+        obj = ('\u20ac', b'abc', 123, 45.6, 7+8j)
+        for v in range(marshal.version + 1):
+            data = marshal.dumps(obj, v)
+            with open(test_support.TESTFN, 'wb') as f:
+                f.write(data + b'xxxx')
+            r, p = _testcapi.pymarshal_read_object_from_file(test_support.TESTFN)
+            test_support.unlink(test_support.TESTFN)
+            self.assertEqual(r, obj)
+            self.assertEqual(p, len(data))
+
+
 def test_main():
     test_support.run_unittest(IntTestCase,
                               FloatTestCase,
@@ -325,6 +389,7 @@
                               ExceptionTestCase,
                               BugsTestCase,
                               LargeValuesTestCase,
+                              CAPI_TestCase,
                              )
 
 if __name__ == "__main__":