1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- # -*- coding: utf-8 -*-
- from unittest import TestCase
- from library.pymemcache.serde import (pickle_serde,
- PickleSerde,
- FLAG_STRING,
- FLAG_PICKLE, FLAG_INTEGER, FLAG_LONG, FLAG_UNICODE)
- import pytest
- import six
- from six.moves import cPickle as pickle
- class CustomInt(int):
- """
- Custom integer type for testing.
- Entirely useless, but used to show that built in types get serialized and
- deserialized back as the same type of object.
- """
- pass
- @pytest.mark.unit()
- class TestSerde(TestCase):
- serde = pickle_serde
- def check(self, value, expected_flags):
- serialized, flags = self.serde.serialize(b'key', value)
- assert flags == expected_flags
- # pymemcache stores values as byte strings, so we immediately the value
- # if needed so deserialized works as it would with a real server
- if not isinstance(serialized, six.binary_type):
- serialized = six.text_type(serialized).encode('ascii')
- deserialized = self.serde.deserialize(b'key', serialized, flags)
- assert deserialized == value
- def test_bytes(self):
- self.check(b'value', FLAG_STRING)
- self.check(b'\xc2\xa3 $ \xe2\x82\xac', FLAG_STRING) # £ $ €
- def test_unicode(self):
- self.check(u'value', FLAG_UNICODE)
- self.check(u'£ $ €', FLAG_UNICODE)
- def test_int(self):
- self.check(1, FLAG_INTEGER)
- def test_long(self):
- # long only exists with Python 2, so we're just testing for another
- # integer with Python 3
- if six.PY2:
- expected_flags = FLAG_LONG
- else:
- expected_flags = FLAG_INTEGER
- self.check(123123123123123123123, expected_flags)
- def test_pickleable(self):
- self.check({'a': 'dict'}, FLAG_PICKLE)
- def test_subtype(self):
- # Subclass of a native type will be restored as the same type
- self.check(CustomInt(123123), FLAG_PICKLE)
- @pytest.mark.unit()
- class TestSerdePickleVersion0(TestCase):
- serde = PickleSerde(pickle_version=0)
- @pytest.mark.unit()
- class TestSerdePickleVersion1(TestCase):
- serde = PickleSerde(pickle_version=1)
- @pytest.mark.unit()
- class TestSerdePickleVersion2(TestCase):
- serde = PickleSerde(pickle_version=2)
- @pytest.mark.unit()
- class TestSerdePickleVersionHighest(TestCase):
- serde = PickleSerde(
- pickle_version=pickle.HIGHEST_PROTOCOL
- )
|