test_serde.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # -*- coding: utf-8 -*-
  2. from unittest import TestCase
  3. from library.pymemcache.serde import (pickle_serde,
  4. PickleSerde,
  5. FLAG_STRING,
  6. FLAG_PICKLE, FLAG_INTEGER, FLAG_LONG, FLAG_UNICODE)
  7. import pytest
  8. import six
  9. from six.moves import cPickle as pickle
  10. class CustomInt(int):
  11. """
  12. Custom integer type for testing.
  13. Entirely useless, but used to show that built in types get serialized and
  14. deserialized back as the same type of object.
  15. """
  16. pass
  17. @pytest.mark.unit()
  18. class TestSerde(TestCase):
  19. serde = pickle_serde
  20. def check(self, value, expected_flags):
  21. serialized, flags = self.serde.serialize(b'key', value)
  22. assert flags == expected_flags
  23. # pymemcache stores values as byte strings, so we immediately the value
  24. # if needed so deserialized works as it would with a real server
  25. if not isinstance(serialized, six.binary_type):
  26. serialized = six.text_type(serialized).encode('ascii')
  27. deserialized = self.serde.deserialize(b'key', serialized, flags)
  28. assert deserialized == value
  29. def test_bytes(self):
  30. self.check(b'value', FLAG_STRING)
  31. self.check(b'\xc2\xa3 $ \xe2\x82\xac', FLAG_STRING) # £ $ €
  32. def test_unicode(self):
  33. self.check(u'value', FLAG_UNICODE)
  34. self.check(u'£ $ €', FLAG_UNICODE)
  35. def test_int(self):
  36. self.check(1, FLAG_INTEGER)
  37. def test_long(self):
  38. # long only exists with Python 2, so we're just testing for another
  39. # integer with Python 3
  40. if six.PY2:
  41. expected_flags = FLAG_LONG
  42. else:
  43. expected_flags = FLAG_INTEGER
  44. self.check(123123123123123123123, expected_flags)
  45. def test_pickleable(self):
  46. self.check({'a': 'dict'}, FLAG_PICKLE)
  47. def test_subtype(self):
  48. # Subclass of a native type will be restored as the same type
  49. self.check(CustomInt(123123), FLAG_PICKLE)
  50. @pytest.mark.unit()
  51. class TestSerdePickleVersion0(TestCase):
  52. serde = PickleSerde(pickle_version=0)
  53. @pytest.mark.unit()
  54. class TestSerdePickleVersion1(TestCase):
  55. serde = PickleSerde(pickle_version=1)
  56. @pytest.mark.unit()
  57. class TestSerdePickleVersion2(TestCase):
  58. serde = PickleSerde(pickle_version=2)
  59. @pytest.mark.unit()
  60. class TestSerdePickleVersionHighest(TestCase):
  61. serde = PickleSerde(
  62. pickle_version=pickle.HIGHEST_PROTOCOL
  63. )