14
14
from unittest import mock
15
15
16
16
import pymemcache
17
+ from packaging import version as get_package_version
18
+ from pymemcache import __version__ as pymemcache_package_version
17
19
from pymemcache .exceptions import (
18
20
MemcacheClientError ,
19
21
MemcacheIllegalInputError ,
33
35
TEST_HOST = "localhost"
34
36
TEST_PORT = 117711
35
37
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
+
36
54
37
55
class PymemcacheClientTestCase (
38
56
TestBase
@@ -126,11 +144,16 @@ def test_set_multi_success(self):
126
144
client = self .make_client ([b"STORED\r \n " ])
127
145
# Alias for set_many, a convienance function that calls set for every key
128
146
result = client .set_multi ({b"key" : b"value" }, noreply = False )
129
- self .assertTrue (result )
130
-
131
147
spans = self .memory_exporter .get_finished_spans ()
132
148
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" ])
134
157
135
158
def test_delete_not_found (self ):
136
159
client = self .make_client ([b"NOT_FOUND\r \n " ])
@@ -191,19 +214,30 @@ def test_delete_many_found(self):
191
214
192
215
spans = self .memory_exporter .get_finished_spans ()
193
216
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" ])
197
225
198
226
def test_set_many_success (self ):
199
227
client = self .make_client ([b"STORED\r \n " ])
200
228
# a convienance function that calls set for every key
201
229
result = client .set_many ({b"key" : b"value" }, noreply = False )
202
- self .assertTrue (result )
203
230
204
231
spans = self .memory_exporter .get_finished_spans ()
205
232
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" ])
207
241
208
242
def test_set_get (self ):
209
243
client = self .make_client (
@@ -243,7 +277,7 @@ def test_prepend_stored(self):
243
277
244
278
def test_cas_stored (self ):
245
279
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 )
247
281
self .assertTrue (result )
248
282
249
283
spans = self .memory_exporter .get_finished_spans ()
@@ -252,7 +286,7 @@ def test_cas_stored(self):
252
286
253
287
def test_cas_exists (self ):
254
288
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 )
256
290
assert result is False
257
291
258
292
spans = self .memory_exporter .get_finished_spans ()
@@ -261,7 +295,7 @@ def test_cas_exists(self):
261
295
262
296
def test_cas_not_found (self ):
263
297
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 )
265
299
assert result is None
266
300
267
301
spans = self .memory_exporter .get_finished_spans ()
@@ -445,7 +479,14 @@ def test_version_success(self):
445
479
def test_stats (self ):
446
480
client = self .make_client ([b"STAT fake_stats 1\r \n " , b"END\r \n " ])
447
481
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 " ]
449
490
assert result == {b"fake_stats" : 1 }
450
491
451
492
spans = self .memory_exporter .get_finished_spans ()
@@ -544,5 +585,4 @@ def test_delete_many_found(self):
544
585
self .assertTrue (result )
545
586
546
587
spans = self .memory_exporter .get_finished_spans ()
547
-
548
588
self .check_spans (spans , 2 , ["add key" , "delete key" ])
0 commit comments