diff options
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_marshal.py | 65 |
1 files changed, 65 insertions, 0 deletions
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 sys 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 @@ class LargeValuesTestCase(unittest.TestCase): 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 @@ def test_main(): ExceptionTestCase, BugsTestCase, LargeValuesTestCase, + CAPI_TestCase, ) if __name__ == "__main__": |