PYTHON-318 - Fix for SON pickling protocol 2
Updated tests to check protocol pickling as well
This commit is contained in:
parent
271767f5b3
commit
486c3ce24a
@ -72,6 +72,11 @@ class SON(dict):
|
||||
self.update(data)
|
||||
self.update(kwargs)
|
||||
|
||||
def __new__(cls, *args, **kwargs):
|
||||
instance = super(SON, cls).__new__(cls, *args, **kwargs)
|
||||
instance.__keys = []
|
||||
return instance
|
||||
|
||||
def __repr__(self):
|
||||
result = []
|
||||
for key in self.__keys:
|
||||
@ -214,3 +219,4 @@ class SON(dict):
|
||||
for k, v in self.iteritems():
|
||||
out[k] = copy.deepcopy(v, memo)
|
||||
return out
|
||||
|
||||
|
||||
@ -125,9 +125,10 @@ class TestDBRef(unittest.TestCase):
|
||||
|
||||
def test_pickling(self):
|
||||
dbr = DBRef('coll', 5, foo='bar')
|
||||
pkl = pickle.dumps(dbr)
|
||||
dbr2 = pickle.loads(pkl)
|
||||
self.assertEqual(dbr, dbr2)
|
||||
for protocol in [0, 1, 2, -1]:
|
||||
pkl = pickle.dumps(dbr, protocol=protocol)
|
||||
dbr2 = pickle.loads(pkl)
|
||||
self.assertEqual(dbr, dbr2)
|
||||
|
||||
def test_dbref_hash(self):
|
||||
dbref_1a = DBRef('collection', 'id', 'database')
|
||||
|
||||
@ -133,7 +133,9 @@ class TestObjectId(unittest.TestCase):
|
||||
|
||||
def test_pickling(self):
|
||||
orig = ObjectId()
|
||||
self.assertEqual(orig, pickle.loads(pickle.dumps(orig)))
|
||||
for protocol in [0, 1, 2, -1]:
|
||||
pkl = pickle.dumps(orig, protocol=protocol)
|
||||
self.assertEqual(orig, pickle.loads(pkl))
|
||||
|
||||
def test_pickle_backwards_compatability(self):
|
||||
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
|
||||
import unittest
|
||||
import sys
|
||||
import pickle
|
||||
sys.path[0:0] = [""]
|
||||
|
||||
from bson.son import SON
|
||||
@ -53,6 +54,27 @@ class TestSON(unittest.TestCase):
|
||||
self.assertEqual(dict, c.to_dict()["blah"][0].__class__)
|
||||
self.assertEqual(dict, d.to_dict()["blah"]["foo"].__class__)
|
||||
|
||||
def test_pickle(self):
|
||||
|
||||
simple_son = SON([])
|
||||
complex_son = SON([('son', simple_son), ('list', [simple_son, simple_son])])
|
||||
|
||||
for protocol in [0, 1, 2, -1]:
|
||||
pickled = pickle.loads(pickle.dumps(complex_son, protocol=protocol))
|
||||
self.assertEquals(pickled['son'], pickled['list'][0])
|
||||
self.assertEquals(pickled['son'], pickled['list'][1])
|
||||
|
||||
def test_pickle_backwards_compatability(self):
|
||||
|
||||
# This string was generated by pickling a SON object in pymongo
|
||||
# version 2.1.1
|
||||
pickled_with_2_1_1 = (
|
||||
"ccopy_reg\n_reconstructor\np0\n(cbson.son\nSON\np1\n"
|
||||
"c__builtin__\ndict\np2\n(dp3\ntp4\nRp5\n(dp6\n"
|
||||
"S'_SON__keys'\np7\n(lp8\nsb."
|
||||
)
|
||||
son_2_1_1 = pickle.loads(pickled_with_2_1_1)
|
||||
self.assertEqual(son_2_1_1, SON([]))
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@ -49,8 +49,10 @@ class TestTimestamp(unittest.TestCase):
|
||||
dc = copy.deepcopy(d)
|
||||
self.assertEqual(dc, t.as_datetime())
|
||||
|
||||
dp = pickle.loads(pickle.dumps(d))
|
||||
self.assertEqual(dp, t.as_datetime())
|
||||
for protocol in [0, 1, 2, -1]:
|
||||
pkl = pickle.dumps(d, protocol=protocol)
|
||||
dp = pickle.loads(pkl)
|
||||
self.assertEqual(dp, t.as_datetime())
|
||||
|
||||
def test_exceptions(self):
|
||||
self.assertRaises(TypeError, Timestamp)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user