Skip to content

Python 3 crash on storing binary strings #80

@timgraham

Description

@timgraham

This test (adapted from Django's test suite) passes on Python 2, but fails on Python 3:

diff --git a/tests/test_memcache.py b/tests/test_memcache.py
index 321dc7b..0415de9 100644
--- a/tests/test_memcache.py
+++ b/tests/test_memcache.py
@@ -137,6 +137,30 @@ class TestMemcache(unittest.TestCase):
         value = self.mc.get(key)
         self.assertEqual(value, 5)

+    def test_binary_string(self):
+        # Binary strings should be cacheable
+        from zlib import compress, decompress
+        value = 'value_to_be_compressed'
+        compressed_value = compress(value.encode())
+
+        # Test set
+        self.mc.set('binary1', compressed_value)
+        compressed_result = self.mc.get('binary1')
+        self.assertEqual(compressed_value, compressed_result)
+        self.assertEqual(value, decompress(compressed_result).decode())
+
+        # Test add
+        self.mc.add('binary1-add', compressed_value)
+        compressed_result = self.mc.get('binary1-add')
+        self.assertEqual(compressed_value, compressed_result)
+        self.assertEqual(value, decompress(compressed_result).decode())
+
+        # Test set_many
+        self.mc.set_multi({'binary1-set_many': compressed_value})
+        compressed_result = self.mc.get('binary1-set_many')
+        self.assertEqual(compressed_value, compressed_result)
+        self.assertEqual(value, decompress(compressed_result).decode())
+
     def test_ignore_too_large_value(self):
         # NOTE: "MemCached: while expecting[...]" is normal...
         key = 'keyhere'
======================================================================
ERROR: test_binary_string (__main__.TestMemcache)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests/test_memcache3.py", line 53, in test_binary_string
    compressed_result = self.mc.get('binary1')
  File "/home/tim/code/python-memcached/memcache.py", line 1093, in get
    return self._get('get', key)
  File "/home/tim/code/python-memcached/memcache.py", line 1077, in _get
    return _unsafe_get()
  File "/home/tim/code/python-memcached/memcache.py", line 1065, in _unsafe_get
    value = self._recv_value(server, flags, rlen)
  File "/home/tim/code/python-memcached/memcache.py", line 1235, in _recv_value
    val = buf.decode('utf8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9c in position 1: invalid start byte

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions