From c437bb98fe015bc3cfeb664254da9ab87720c894 Mon Sep 17 00:00:00 2001 From: Suhail Patel Date: Mon, 19 Sep 2016 15:48:56 +0100 Subject: [PATCH 1/5] Add failing test of MockMemcacheClient serializer/deserializer --- pymemcache/test/test_client.py | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py index 24d6b9d6..e6645aab 100644 --- a/pymemcache/test/test_client.py +++ b/pymemcache/test/test_client.py @@ -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), 1 + return value, 0 + + def _deserializer(key, value, flags): + if flags == 1: + return json.loads(value) + 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', 'hello', noreply=False) + result = client.get(b'key1') + assert result == '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): From 1291a140f8604bdf9dcfdd370101b2e6a98dca32 Mon Sep 17 00:00:00 2001 From: Suhail Patel Date: Mon, 19 Sep 2016 15:49:12 +0100 Subject: [PATCH 2/5] Fix the MockMemcacheClient implementation --- pymemcache/test/utils.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pymemcache/test/utils.py b/pymemcache/test/utils.py index 997a58e9..f2c5a80b 100644 --- a/pymemcache/test/utils.py +++ b/pymemcache/test/utils.py @@ -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): @@ -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): From 87247d44f723ad55f55b1e221977a908379b84f0 Mon Sep 17 00:00:00 2001 From: Suhail Patel Date: Mon, 19 Sep 2016 16:42:36 +0100 Subject: [PATCH 3/5] Use a bytes string --- pymemcache/test/test_client.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py index e6645aab..cf7ed29a 100644 --- a/pymemcache/test/test_client.py +++ b/pymemcache/test/test_client.py @@ -735,12 +735,12 @@ def test_get_found(self): def test_deserialization(self): def _serializer(key, value): if isinstance(value, dict): - return json.dumps(value), 1 + return json.dumps(value.decode('UTF-8')), 1 return value, 0 def _deserializer(key, value, flags): if flags == 1: - return json.loads(value) + return json.loads(value).encode('UTF-8') return value client = self.make_client([ @@ -750,7 +750,7 @@ def _deserializer(key, value, flags): b'VALUE key2 0 18\r\n{"hello": "world"}\r\nEND\r\n', ], serializer=_serializer, deserializer=_deserializer) - result = client.set(b'key1', 'hello', noreply=False) + result = client.set(b'key1', b'hello', noreply=False) result = client.get(b'key1') assert result == 'hello' From 4acdf08ce88e8bdc92b41d6278c4eae17eab7b78 Mon Sep 17 00:00:00 2001 From: Suhail Patel Date: Mon, 19 Sep 2016 16:45:41 +0100 Subject: [PATCH 4/5] Fix encode/decode wrong way around --- pymemcache/test/test_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py index cf7ed29a..1892ae08 100644 --- a/pymemcache/test/test_client.py +++ b/pymemcache/test/test_client.py @@ -735,12 +735,12 @@ def test_get_found(self): def test_deserialization(self): def _serializer(key, value): if isinstance(value, dict): - return json.dumps(value.decode('UTF-8')), 1 + return json.dumps(value).encode('UTF-8'), 1 return value, 0 def _deserializer(key, value, flags): if flags == 1: - return json.loads(value).encode('UTF-8') + return json.loads(value.decode('UTF-8')) return value client = self.make_client([ From 95da41acc1a4c5facf2de2fdad4a60f9b05e9d22 Mon Sep 17 00:00:00 2001 From: Suhail Patel Date: Mon, 19 Sep 2016 17:00:18 +0100 Subject: [PATCH 5/5] Assert bytes string --- pymemcache/test/test_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymemcache/test/test_client.py b/pymemcache/test/test_client.py index 1892ae08..530f4c13 100644 --- a/pymemcache/test/test_client.py +++ b/pymemcache/test/test_client.py @@ -752,7 +752,7 @@ def _deserializer(key, value, flags): result = client.set(b'key1', b'hello', noreply=False) result = client.get(b'key1') - assert result == 'hello' + assert result == b'hello' result = client.set(b'key2', dict(hello='world'), noreply=False) result = client.get(b'key2')