From: Serhiy Storchaka Date: Tue, 29 Sep 2015 12:34:53 +0000 (+0300) Subject: Moved unpickling tests with prepickled data to separate class. X-Git-Tag: v3.5.1rc1~247 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=104de66b76bef9ae466c739ac281852773c27d61;p=python Moved unpickling tests with prepickled data to separate class. --- 104de66b76bef9ae466c739ac281852773c27d61 diff --cc Lib/test/pickletester.py index 78b5483928,e8f6574aed..55851295bc --- a/Lib/test/pickletester.py +++ b/Lib/test/pickletester.py @@@ -1734,54 -1710,6 +1767,27 @@@ class AbstractPickleTests(unittest.Test self.assertIn(('c%s\n%s' % (mod, name)).encode(), pickled) self.assertIs(type(self.loads(pickled)), type(val)) - def test_compat_unpickle(self): - # xrange(1, 7) - pickled = b'\x80\x02c__builtin__\nxrange\nK\x01K\x07K\x01\x87R.' - unpickled = self.loads(pickled) - self.assertIs(type(unpickled), range) - self.assertEqual(unpickled, range(1, 7)) - self.assertEqual(list(unpickled), [1, 2, 3, 4, 5, 6]) - # reduce - pickled = b'\x80\x02c__builtin__\nreduce\n.' - self.assertIs(self.loads(pickled), functools.reduce) - # whichdb.whichdb - pickled = b'\x80\x02cwhichdb\nwhichdb\n.' - self.assertIs(self.loads(pickled), dbm.whichdb) - # Exception(), StandardError() - for name in (b'Exception', b'StandardError'): - pickled = (b'\x80\x02cexceptions\n' + name + b'\nU\x03ugh\x85R.') - unpickled = self.loads(pickled) - self.assertIs(type(unpickled), Exception) - self.assertEqual(str(unpickled), 'ugh') - # UserDict.UserDict({1: 2}), UserDict.IterableUserDict({1: 2}) - for name in (b'UserDict', b'IterableUserDict'): - pickled = (b'\x80\x02(cUserDict\n' + name + - b'\no}U\x04data}K\x01K\x02ssb.') - unpickled = self.loads(pickled) - self.assertIs(type(unpickled), collections.UserDict) - self.assertEqual(unpickled, collections.UserDict({1: 2})) - + def test_local_lookup_error(self): + # Test that whichmodule() errors out cleanly when looking up + # an assumed globally-reachable object fails. + def f(): + pass + # Since the function is local, lookup will fail + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + with self.assertRaises((AttributeError, pickle.PicklingError)): + pickletools.dis(self.dumps(f, proto)) + # Same without a __module__ attribute (exercises a different path + # in _pickle.c). + del f.__module__ + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + with self.assertRaises((AttributeError, pickle.PicklingError)): + pickletools.dis(self.dumps(f, proto)) + # Yet a different path. + f.__name__ = f.__qualname__ + for proto in range(0, pickle.HIGHEST_PROTOCOL + 1): + with self.assertRaises((AttributeError, pickle.PicklingError)): + pickletools.dis(self.dumps(f, proto)) + class BigmemPickleTests(unittest.TestCase):