Skip to content

Commit

Permalink
Merge pull request #115 from suhailpatel/fix-mockmemcacheclient
Browse files Browse the repository at this point in the history
Fix MockMemcacheClient serialization/deserialization
  • Loading branch information
nichochar committed Sep 19, 2016
2 parents fc2174d + 95da41a commit dcd9f5b
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 5 deletions.
35 changes: 35 additions & 0 deletions pymemcache/test/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -723,6 +723,41 @@ def make_client(self, mock_socket_values, **kwargs):
client.sock = MockSocket(list(mock_socket_values))
return client

def test_get_found(self):
client = self.make_client([
b'STORED\r\n',
b'VALUE key 0 5\r\nvalue\r\nEND\r\n',
])
result = client.set(b'key', b'value', noreply=False)
result = client.get(b'key')
assert result == b'value'

def test_deserialization(self):
def _serializer(key, value):
if isinstance(value, dict):
return json.dumps(value).encode('UTF-8'), 1
return value, 0

def _deserializer(key, value, flags):
if flags == 1:
return json.loads(value.decode('UTF-8'))
return value

client = self.make_client([
b'STORED\r\n',
b'VALUE key1 0 5\r\nhello\r\nEND\r\n',
b'STORED\r\n',
b'VALUE key2 0 18\r\n{"hello": "world"}\r\nEND\r\n',
], serializer=_serializer, deserializer=_deserializer)

result = client.set(b'key1', b'hello', noreply=False)
result = client.get(b'key1')
assert result == b'hello'

result = client.set(b'key2', dict(hello='world'), noreply=False)
result = client.get(b'key2')
assert result == dict(hello='world')


class TestPrefixedClient(ClientTestMixin, unittest.TestCase):
def make_client(self, mock_socket_values, **kwargs):
Expand Down
10 changes: 5 additions & 5 deletions pymemcache/test/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ def get(self, key, default=None):
if key not in self._contents:
return default

expire, value, was_serialized = self._contents[key]
expire, value, flags = self._contents[key]
if expire and expire < time.time():
del self._contents[key]
return default

if self.deserializer:
return self.deserializer(key, value, 2 if was_serialized else 1)
return self.deserializer(key, value, flags)
return value

def get_many(self, keys):
Expand All @@ -72,14 +72,14 @@ def set(self, key, value, expire=0, noreply=True):
if isinstance(value, six.text_type):
raise MemcacheIllegalInputError(value)

was_serialized = False
flags = 0
if self.serializer:
value = self.serializer(key, value)
value, flags = self.serializer(key, value)

if expire:
expire += time.time()

self._contents[key] = expire, value, was_serialized
self._contents[key] = expire, value, flags
return True

def set_many(self, values, expire=None, noreply=True):
Expand Down

0 comments on commit dcd9f5b

Please sign in to comment.