1414from unittest import mock
1515
1616import pymemcache
17+ from packaging import version as get_package_version
18+ from pymemcache import __version__ as pymemcache_package_version
1719from pymemcache .exceptions import (
1820 MemcacheClientError ,
1921 MemcacheIllegalInputError ,
3335TEST_HOST = "localhost"
3436TEST_PORT = 117711
3537
38+ pymemcache_version = get_package_version .parse (pymemcache_package_version )
39+
40+ # In pymemcache versions greater than 2, set_multi, set_many and delete_multi
41+ # now use a batched call
42+ # https://github.com/pinterest/pymemcache/blob/master/ChangeLog.rst#new-in-version-200 # noqa
43+ pymemcache_version_lt_2 = pymemcache_version < get_package_version .parse (
44+ "2.0.0"
45+ )
46+
47+ # In pymemcache versions greater than 3.4.1, the stats command no
48+ # longer sends trailing whitespace in the command
49+ # https://github.com/pinterest/pymemcache/blob/master/ChangeLog.rst#new-in-version-342 # noqa
50+ pymemcache_version_gt_341 = pymemcache_version > get_package_version .parse (
51+ "3.4.1"
52+ )
53+
3654
3755class PymemcacheClientTestCase (
3856 TestBase
@@ -126,11 +144,16 @@ def test_set_multi_success(self):
126144 client = self .make_client ([b"STORED\r \n " ])
127145 # Alias for set_many, a convienance function that calls set for every key
128146 result = client .set_multi ({b"key" : b"value" }, noreply = False )
129- self .assertTrue (result )
130-
131147 spans = self .memory_exporter .get_finished_spans ()
132148
133- self .check_spans (spans , 2 , ["set key" , "set_multi key" ])
149+ # In pymemcache versions greater than 2, set_multi now uses a batched call
150+ # https://github.com/pinterest/pymemcache/blob/master/ChangeLog.rst#new-in-version-200 # noqa
151+ if pymemcache_version_lt_2 :
152+ self .assertTrue (result )
153+ self .check_spans (spans , 2 , ["set key" , "set_multi key" ])
154+ else :
155+ assert len (result ) == 0
156+ self .check_spans (spans , 1 , ["set_multi key" ])
134157
135158 def test_delete_not_found (self ):
136159 client = self .make_client ([b"NOT_FOUND\r \n " ])
@@ -191,19 +214,30 @@ def test_delete_many_found(self):
191214
192215 spans = self .memory_exporter .get_finished_spans ()
193216
194- self .check_spans (
195- spans , 3 , ["add key" , "delete key" , "delete_many key" ]
196- )
217+ # In pymemcache versions greater than 2, delete_many now uses a batched call
218+ # https://github.com/pinterest/pymemcache/blob/master/ChangeLog.rst#new-in-version-200 # noqa
219+ if pymemcache_version_lt_2 :
220+ self .check_spans (
221+ spans , 3 , ["add key" , "delete key" , "delete_many key" ]
222+ )
223+ else :
224+ self .check_spans (spans , 2 , ["add key" , "delete_many key" ])
197225
198226 def test_set_many_success (self ):
199227 client = self .make_client ([b"STORED\r \n " ])
200228 # a convienance function that calls set for every key
201229 result = client .set_many ({b"key" : b"value" }, noreply = False )
202- self .assertTrue (result )
203230
204231 spans = self .memory_exporter .get_finished_spans ()
205232
206- self .check_spans (spans , 2 , ["set key" , "set_many key" ])
233+ # In pymemcache versions greater than 2, set_many now uses a batched call
234+ # https://github.com/pinterest/pymemcache/blob/master/ChangeLog.rst#new-in-version-200 # noqa
235+ if pymemcache_version_lt_2 :
236+ self .assertTrue (result )
237+ self .check_spans (spans , 2 , ["set key" , "set_many key" ])
238+ else :
239+ assert len (result ) == 0
240+ self .check_spans (spans , 1 , ["set_many key" ])
207241
208242 def test_set_get (self ):
209243 client = self .make_client (
@@ -243,7 +277,7 @@ def test_prepend_stored(self):
243277
244278 def test_cas_stored (self ):
245279 client = self .make_client ([b"STORED\r \n " ])
246- result = client .cas (b"key" , b"value" , b"cas " , noreply = False )
280+ result = client .cas (b"key" , b"value" , b"1 " , noreply = False )
247281 self .assertTrue (result )
248282
249283 spans = self .memory_exporter .get_finished_spans ()
@@ -252,7 +286,7 @@ def test_cas_stored(self):
252286
253287 def test_cas_exists (self ):
254288 client = self .make_client ([b"EXISTS\r \n " ])
255- result = client .cas (b"key" , b"value" , b"cas " , noreply = False )
289+ result = client .cas (b"key" , b"value" , b"1 " , noreply = False )
256290 assert result is False
257291
258292 spans = self .memory_exporter .get_finished_spans ()
@@ -261,7 +295,7 @@ def test_cas_exists(self):
261295
262296 def test_cas_not_found (self ):
263297 client = self .make_client ([b"NOT_FOUND\r \n " ])
264- result = client .cas (b"key" , b"value" , b"cas " , noreply = False )
298+ result = client .cas (b"key" , b"value" , b"1 " , noreply = False )
265299 assert result is None
266300
267301 spans = self .memory_exporter .get_finished_spans ()
@@ -445,7 +479,14 @@ def test_version_success(self):
445479 def test_stats (self ):
446480 client = self .make_client ([b"STAT fake_stats 1\r \n " , b"END\r \n " ])
447481 result = client .stats ()
448- assert client .sock .send_bufs == [b"stats \r \n " ]
482+
483+ # In pymemcache versions greater than 3.4.1, the stats command no
484+ # longer sends trailing whitespace in the command
485+ # https://github.com/pinterest/pymemcache/blob/master/ChangeLog.rst#new-in-version-342 # noqa
486+ if pymemcache_version_gt_341 :
487+ assert client .sock .send_bufs == [b"stats\r \n " ]
488+ else :
489+ assert client .sock .send_bufs == [b"stats \r \n " ]
449490 assert result == {b"fake_stats" : 1 }
450491
451492 spans = self .memory_exporter .get_finished_spans ()
@@ -544,5 +585,4 @@ def test_delete_many_found(self):
544585 self .assertTrue (result )
545586
546587 spans = self .memory_exporter .get_finished_spans ()
547-
548588 self .check_spans (spans , 2 , ["add key" , "delete key" ])
0 commit comments