summaryrefslogtreecommitdiff
path: root/pymemcache/test/test_serde.py
blob: e36e213c5a68e21eb4035a505e08e5a4d44c5531 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from unittest import TestCase

from pymemcache.serde import (
    pickle_serde,
    PickleSerde,
    FLAG_BYTES,
    FLAG_PICKLE,
    FLAG_INTEGER,
    FLAG_TEXT,
)
import pytest
import 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, bytes):
            serialized = str(serialized).encode("ascii")

        deserialized = self.serde.deserialize(b"key", serialized, flags)
        assert deserialized == value

    def test_bytes(self):
        self.check(b"value", FLAG_BYTES)
        self.check(b"\xc2\xa3 $ \xe2\x82\xac", FLAG_BYTES)  # £ $ €

    def test_unicode(self):
        self.check("value", FLAG_TEXT)
        self.check("£ $ €", FLAG_TEXT)

    def test_int(self):
        self.check(1, FLAG_INTEGER)

    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)