mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			139 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import cPickle, unittest
 | 
						|
from cStringIO import StringIO
 | 
						|
from test.pickletester import AbstractPickleTests, AbstractPickleModuleTests
 | 
						|
from test.pickletester import AbstractPicklerUnpicklerObjectTests
 | 
						|
from test import test_support
 | 
						|
 | 
						|
class cPickleTests(AbstractPickleTests, AbstractPickleModuleTests):
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        self.dumps = cPickle.dumps
 | 
						|
        self.loads = cPickle.loads
 | 
						|
 | 
						|
    error = cPickle.BadPickleGet
 | 
						|
    module = cPickle
 | 
						|
 | 
						|
class cPicklePicklerTests(AbstractPickleTests):
 | 
						|
 | 
						|
    def dumps(self, arg, proto=0):
 | 
						|
        f = StringIO()
 | 
						|
        p = cPickle.Pickler(f, proto)
 | 
						|
        p.dump(arg)
 | 
						|
        f.seek(0)
 | 
						|
        return f.read()
 | 
						|
 | 
						|
    def loads(self, buf):
 | 
						|
        f = StringIO(buf)
 | 
						|
        p = cPickle.Unpickler(f)
 | 
						|
        return p.load()
 | 
						|
 | 
						|
    error = cPickle.BadPickleGet
 | 
						|
 | 
						|
class cPickleListPicklerTests(AbstractPickleTests):
 | 
						|
 | 
						|
    def dumps(self, arg, proto=0):
 | 
						|
        p = cPickle.Pickler(proto)
 | 
						|
        p.dump(arg)
 | 
						|
        return p.getvalue()
 | 
						|
 | 
						|
    def loads(self, *args):
 | 
						|
        f = StringIO(args[0])
 | 
						|
        p = cPickle.Unpickler(f)
 | 
						|
        return p.load()
 | 
						|
 | 
						|
    error = cPickle.BadPickleGet
 | 
						|
 | 
						|
class cPickleFastPicklerTests(AbstractPickleTests):
 | 
						|
 | 
						|
    def dumps(self, arg, proto=0):
 | 
						|
        f = StringIO()
 | 
						|
        p = cPickle.Pickler(f, proto)
 | 
						|
        p.fast = 1
 | 
						|
        p.dump(arg)
 | 
						|
        f.seek(0)
 | 
						|
        return f.read()
 | 
						|
 | 
						|
    def loads(self, *args):
 | 
						|
        f = StringIO(args[0])
 | 
						|
        p = cPickle.Unpickler(f)
 | 
						|
        return p.load()
 | 
						|
 | 
						|
    error = cPickle.BadPickleGet
 | 
						|
 | 
						|
    def test_recursive_list(self):
 | 
						|
        self.assertRaises(ValueError,
 | 
						|
                          AbstractPickleTests.test_recursive_list,
 | 
						|
                          self)
 | 
						|
 | 
						|
    def test_recursive_tuple(self):
 | 
						|
        self.assertRaises(ValueError,
 | 
						|
                          AbstractPickleTests.test_recursive_tuple,
 | 
						|
                          self)
 | 
						|
 | 
						|
    def test_recursive_inst(self):
 | 
						|
        self.assertRaises(ValueError,
 | 
						|
                          AbstractPickleTests.test_recursive_inst,
 | 
						|
                          self)
 | 
						|
 | 
						|
    def test_recursive_dict(self):
 | 
						|
        self.assertRaises(ValueError,
 | 
						|
                          AbstractPickleTests.test_recursive_dict,
 | 
						|
                          self)
 | 
						|
 | 
						|
    def test_recursive_multi(self):
 | 
						|
        self.assertRaises(ValueError,
 | 
						|
                          AbstractPickleTests.test_recursive_multi,
 | 
						|
                          self)
 | 
						|
 | 
						|
    def test_nonrecursive_deep(self):
 | 
						|
        # If it's not cyclic, it should pickle OK even if the nesting
 | 
						|
        # depth exceeds PY_CPICKLE_FAST_LIMIT.  That happens to be
 | 
						|
        # 50 today.  Jack Jansen reported stack overflow on Mac OS 9
 | 
						|
        # at 64.
 | 
						|
        a = []
 | 
						|
        for i in range(60):
 | 
						|
            a = [a]
 | 
						|
        b = self.loads(self.dumps(a))
 | 
						|
        self.assertEqual(a, b)
 | 
						|
 | 
						|
class cPicklePicklerUnpicklerObjectTests(AbstractPicklerUnpicklerObjectTests):
 | 
						|
 | 
						|
    pickler_class = cPickle.Pickler
 | 
						|
    unpickler_class = cPickle.Unpickler
 | 
						|
 | 
						|
 | 
						|
class Node(object):
 | 
						|
    pass
 | 
						|
 | 
						|
class cPickleDeepRecursive(unittest.TestCase):
 | 
						|
    def test_issue2702(self):
 | 
						|
        # This should raise a RecursionLimit but in some
 | 
						|
        # platforms (FreeBSD, win32) sometimes raises KeyError instead,
 | 
						|
        # or just silently terminates the interpreter (=crashes).
 | 
						|
        nodes = [Node() for i in range(500)]
 | 
						|
        for n in nodes:
 | 
						|
            n.connections = list(nodes)
 | 
						|
            n.connections.remove(n)
 | 
						|
        self.assertRaises((AttributeError, RuntimeError), cPickle.dumps, n)
 | 
						|
 | 
						|
    def test_issue3179(self):
 | 
						|
        # Safe test, because I broke this case when fixing the
 | 
						|
        # behaviour for the previous test.
 | 
						|
        res=[]
 | 
						|
        for x in range(1,2000):
 | 
						|
            res.append(dict(doc=x, similar=[]))
 | 
						|
        cPickle.dumps(res)
 | 
						|
 | 
						|
 | 
						|
def test_main():
 | 
						|
    test_support.run_unittest(
 | 
						|
        cPickleTests,
 | 
						|
        cPicklePicklerTests,
 | 
						|
        cPickleListPicklerTests,
 | 
						|
        cPickleFastPicklerTests,
 | 
						|
        cPickleDeepRecursive,
 | 
						|
        cPicklePicklerUnpicklerObjectTests,
 | 
						|
    )
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    test_main()
 |