dalli 2.7.3 → 3.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. checksums.yaml +5 -5
  2. data/{History.md → CHANGELOG.md} +211 -0
  3. data/Gemfile +3 -6
  4. data/LICENSE +1 -1
  5. data/README.md +30 -208
  6. data/lib/dalli/cas/client.rb +2 -57
  7. data/lib/dalli/client.rb +254 -253
  8. data/lib/dalli/compressor.rb +13 -2
  9. data/lib/dalli/key_manager.rb +121 -0
  10. data/lib/dalli/options.rb +7 -7
  11. data/lib/dalli/pipelined_getter.rb +177 -0
  12. data/lib/dalli/protocol/base.rb +241 -0
  13. data/lib/dalli/protocol/binary/request_formatter.rb +117 -0
  14. data/lib/dalli/protocol/binary/response_header.rb +36 -0
  15. data/lib/dalli/protocol/binary/response_processor.rb +239 -0
  16. data/lib/dalli/protocol/binary/sasl_authentication.rb +60 -0
  17. data/lib/dalli/protocol/binary.rb +173 -0
  18. data/lib/dalli/protocol/connection_manager.rb +252 -0
  19. data/lib/dalli/protocol/meta/key_regularizer.rb +31 -0
  20. data/lib/dalli/protocol/meta/request_formatter.rb +121 -0
  21. data/lib/dalli/protocol/meta/response_processor.rb +211 -0
  22. data/lib/dalli/protocol/meta.rb +178 -0
  23. data/lib/dalli/protocol/response_buffer.rb +54 -0
  24. data/lib/dalli/protocol/server_config_parser.rb +86 -0
  25. data/lib/dalli/protocol/ttl_sanitizer.rb +45 -0
  26. data/lib/dalli/protocol/value_compressor.rb +85 -0
  27. data/lib/dalli/protocol/value_marshaller.rb +59 -0
  28. data/lib/dalli/protocol/value_serializer.rb +91 -0
  29. data/lib/dalli/protocol.rb +8 -0
  30. data/lib/dalli/ring.rb +97 -86
  31. data/lib/dalli/server.rb +4 -719
  32. data/lib/dalli/servers_arg_normalizer.rb +54 -0
  33. data/lib/dalli/socket.rb +123 -115
  34. data/lib/dalli/version.rb +5 -1
  35. data/lib/dalli.rb +45 -14
  36. data/lib/rack/session/dalli.rb +162 -42
  37. metadata +136 -63
  38. data/Performance.md +0 -42
  39. data/Rakefile +0 -43
  40. data/dalli.gemspec +0 -29
  41. data/lib/action_dispatch/middleware/session/dalli_store.rb +0 -81
  42. data/lib/active_support/cache/dalli_store.rb +0 -372
  43. data/lib/dalli/railtie.rb +0 -7
  44. data/test/benchmark_test.rb +0 -243
  45. data/test/helper.rb +0 -56
  46. data/test/memcached_mock.rb +0 -201
  47. data/test/sasl/memcached.conf +0 -1
  48. data/test/sasl/sasldb +0 -1
  49. data/test/test_active_support.rb +0 -541
  50. data/test/test_cas_client.rb +0 -107
  51. data/test/test_compressor.rb +0 -52
  52. data/test/test_dalli.rb +0 -682
  53. data/test/test_encoding.rb +0 -32
  54. data/test/test_failover.rb +0 -137
  55. data/test/test_network.rb +0 -64
  56. data/test/test_rack_session.rb +0 -341
  57. data/test/test_ring.rb +0 -85
  58. data/test/test_sasl.rb +0 -105
  59. data/test/test_serializer.rb +0 -29
  60. data/test/test_server.rb +0 -110
@@ -1,541 +0,0 @@
1
- # encoding: utf-8
2
- require 'helper'
3
- require 'connection_pool'
4
-
5
- class MockUser
6
- def cache_key
7
- "users/1/21348793847982314"
8
- end
9
- end
10
-
11
- describe 'ActiveSupport' do
12
- before do
13
- @port = 19987
14
- end
15
-
16
- describe 'active_support caching' do
17
-
18
- it 'has accessible options' do
19
- @dalli = ActiveSupport::Cache.lookup_store(:dalli_store, "localhost:#{@port}", :expires_in => 5.minutes, :frob => 'baz')
20
- assert_equal 'baz', @dalli.options[:frob]
21
- end
22
-
23
- it 'allow mute and silence' do
24
- memcached_persistent(@port) do
25
- @dalli = ActiveSupport::Cache.lookup_store(:dalli_store, "localhost:#{@port}")
26
- @dalli.mute do
27
- assert op_addset_succeeds(@dalli.write('foo', 'bar', nil))
28
- assert_equal 'bar', @dalli.read('foo', nil)
29
- end
30
- refute @dalli.silence?
31
- @dalli.silence!
32
- assert_equal true, @dalli.silence?
33
- end
34
- end
35
-
36
- it 'handle nil options' do
37
- memcached_persistent(@port) do
38
- @dalli = ActiveSupport::Cache.lookup_store(:dalli_store, "localhost:#{@port}")
39
- assert op_addset_succeeds(@dalli.write('foo', 'bar', nil))
40
- assert_equal 'bar', @dalli.read('foo', nil)
41
- assert_equal 18, @dalli.fetch('lkjsadlfk', nil) { 18 }
42
- assert_equal 18, @dalli.fetch('lkjsadlfk', nil) { 18 }
43
- assert_equal 1, @dalli.increment('lkjsa', 1, nil)
44
- assert_equal 2, @dalli.increment('lkjsa', 1, nil)
45
- assert_equal 1, @dalli.decrement('lkjsa', 1, nil)
46
- assert_equal true, @dalli.delete('lkjsa')
47
- end
48
- end
49
-
50
- it 'support fetch' do
51
- with_activesupport do
52
- memcached_persistent(@port) do
53
- connect(@port)
54
- dvalue = @dalli.fetch('someotherkeywithoutspaces', :expires_in => 1.second) { 123 }
55
- assert_equal 123, dvalue
56
-
57
- o = Object.new
58
- o.instance_variable_set :@foo, 'bar'
59
- dvalue = @dalli.fetch(rand_key, :raw => true) { o }
60
- assert_equal o, dvalue
61
-
62
- dvalue = @dalli.fetch(rand_key) { o }
63
- assert_equal o, dvalue
64
-
65
- @dalli.write('false', false)
66
- dvalue = @dalli.fetch('false') { flunk }
67
- assert_equal false, dvalue
68
-
69
- user = MockUser.new
70
- @dalli.write(user.cache_key, false)
71
- dvalue = @dalli.fetch(user) { flunk }
72
- assert_equal false, dvalue
73
- end
74
- end
75
- end
76
-
77
- it 'support keys with spaces on Rails3' do
78
- with_activesupport do
79
- memcached_persistent(@port) do
80
- connect(@port)
81
- dvalue = @dalli.fetch('some key with spaces', :expires_in => 1.second) { 123 }
82
- assert_equal 123, dvalue
83
- end
84
- end
85
- end
86
-
87
- it 'support read_multi' do
88
- with_activesupport do
89
- memcached_persistent(@port) do
90
- connect(@port)
91
- x = rand_key
92
- y = rand_key
93
- assert_equal({}, @dalli.read_multi(x, y))
94
- @dalli.write(x, '123')
95
- @dalli.write(y, 123)
96
- assert_equal({ x => '123', y => 123 }, @dalli.read_multi(x, y))
97
- end
98
- end
99
- end
100
-
101
- it 'support read_multi with an array' do
102
- with_activesupport do
103
- memcached_persistent(@port) do
104
- connect(@port)
105
- x = rand_key
106
- y = rand_key
107
- assert_equal({}, @dalli.read_multi([x, y]))
108
- @dalli.write(x, '123')
109
- @dalli.write(y, 123)
110
- assert_equal({}, @dalli.read_multi([x, y]))
111
- @dalli.write([x, y], '123')
112
- assert_equal({ [x, y] => '123' }, @dalli.read_multi([x, y]))
113
- end
114
- end
115
- end
116
-
117
- it 'support read_multi with an empty array' do
118
- with_activesupport do
119
- memcached_persistent(@port) do
120
- connect(@port)
121
- assert_equal({}, @dalli.read_multi([]))
122
- end
123
- end
124
- end
125
-
126
- it 'support raw read_multi' do
127
- with_activesupport do
128
- memcached_persistent(@port) do
129
- connect(@port)
130
- @dalli.write("abc", 5, :raw => true)
131
- @dalli.write("cba", 5, :raw => true)
132
- assert_equal({'abc' => '5', 'cba' => '5' }, @dalli.read_multi("abc", "cba"))
133
- end
134
- end
135
- end
136
-
137
- it 'support read_multi with LocalCache' do
138
- with_activesupport do
139
- memcached_persistent(@port) do
140
- connect(@port)
141
- x = rand_key
142
- y = rand_key
143
- assert_equal({}, @dalli.read_multi(x, y))
144
- @dalli.write(x, '123')
145
- @dalli.write(y, 456)
146
-
147
- @dalli.with_local_cache do
148
- assert_equal({ x => '123', y => 456 }, @dalli.read_multi(x, y))
149
- Dalli::Client.any_instance.expects(:get).with(any_parameters).never
150
-
151
- dres = @dalli.read(x)
152
- assert_equal dres, '123'
153
- end
154
-
155
- Dalli::Client.any_instance.unstub(:get)
156
-
157
- # Fresh LocalStore
158
- @dalli.with_local_cache do
159
- @dalli.read(x)
160
- Dalli::Client.any_instance.expects(:get_multi).with([y.to_s]).returns(y.to_s => 456)
161
-
162
- assert_equal({ x => '123', y => 456}, @dalli.read_multi(x, y))
163
- end
164
- end
165
- end
166
- end
167
-
168
- it 'supports fetch_multi' do
169
- with_activesupport do
170
- memcached_persistent(@port) do
171
- connect(@port)
172
-
173
- x = rand_key.to_s
174
- y = rand_key
175
- hash = { x => 'ABC', y => 'DEF' }
176
-
177
- @dalli.write(y, '123')
178
-
179
- results = @dalli.fetch_multi(x, y) { |key| hash[key] }
180
-
181
- assert_equal({ x => 'ABC', y => '123' }, results)
182
- assert_equal('ABC', @dalli.read(x))
183
- assert_equal('123', @dalli.read(y))
184
- end
185
- end
186
- end
187
-
188
- it 'support read, write and delete' do
189
- with_activesupport do
190
- memcached_persistent(@port) do
191
- connect(@port)
192
- y = rand_key
193
- assert_nil @dalli.read(y)
194
- dres = @dalli.write(y, 123)
195
- assert op_addset_succeeds(dres)
196
-
197
- dres = @dalli.read(y)
198
- assert_equal 123, dres
199
-
200
- dres = @dalli.delete(y)
201
- assert_equal true, dres
202
-
203
- user = MockUser.new
204
- dres = @dalli.write(user.cache_key, "foo")
205
- assert op_addset_succeeds(dres)
206
-
207
- dres = @dalli.read(user)
208
- assert_equal "foo", dres
209
-
210
- dres = @dalli.delete(user)
211
- assert_equal true, dres
212
-
213
- dres = @dalli.write(:false_value, false)
214
- assert op_addset_succeeds(dres)
215
- dres = @dalli.read(:false_value)
216
- assert_equal false, dres
217
-
218
- bigkey = '123456789012345678901234567890'
219
- @dalli.write(bigkey, 'double width')
220
- assert_equal 'double width', @dalli.read(bigkey)
221
- assert_equal({bigkey => "double width"}, @dalli.read_multi(bigkey))
222
- end
223
- end
224
- end
225
-
226
- it 'support read, write and delete with local namespace' do
227
- with_activesupport do
228
- memcached_persistent(@port) do
229
- connect(@port, '')
230
- key = 'key_with_namespace'
231
- namespace_value = @dalli.fetch(key, :namespace => 'namespace') { 123 }
232
- assert_equal 123, namespace_value
233
-
234
- res = @dalli.read(key, :namespace => 'namespace')
235
- assert_equal 123, res
236
-
237
- res = @dalli.delete(key, :namespace => 'namespace')
238
- assert_equal true, res
239
-
240
- res = @dalli.write(key, "foo", :namespace => 'namespace')
241
- assert op_addset_succeeds(res)
242
-
243
- res = @dalli.read(key, :namespace => 'namespace')
244
- assert_equal "foo", res
245
- end
246
- end
247
- end
248
-
249
- it 'support multi_read and multi_fetch with local namespace' do
250
- with_activesupport do
251
- memcached_persistent(@port) do
252
- connect(@port, '')
253
- x = rand_key.to_s
254
- y = rand_key
255
- namespace = 'namespace'
256
- hash = { x => 'ABC', y => 'DEF' }
257
-
258
- results = @dalli.fetch_multi(x, y, :namespace => namespace) { |key| hash[key] }
259
-
260
- assert_equal({ x => 'ABC', y => 'DEF' }, results)
261
- assert_equal('ABC', @dalli.read(x, :namespace => namespace))
262
- assert_equal('DEF', @dalli.read(y, :namespace => namespace))
263
-
264
- @dalli.write("abc", 5, :namespace => 'namespace')
265
- @dalli.write("cba", 5, :namespace => 'namespace')
266
- assert_equal({'abc' => 5, 'cba' => 5 }, @dalli.read_multi("abc", "cba", :namespace => 'namespace'))
267
- end
268
- end
269
- end
270
-
271
- it 'support read, write and delete with LocalCache' do
272
- with_activesupport do
273
- memcached_persistent(@port) do
274
- connect(@port)
275
- y = rand_key.to_s
276
- @dalli.with_local_cache do
277
- Dalli::Client.any_instance.expects(:get).with(y, {}).once.returns(123)
278
- dres = @dalli.read(y)
279
- assert_equal 123, dres
280
-
281
- Dalli::Client.any_instance.expects(:get).with(y, {}).never
282
-
283
- dres = @dalli.read(y)
284
- assert_equal 123, dres
285
-
286
- @dalli.write(y, 456)
287
- dres = @dalli.read(y)
288
- assert_equal 456, dres
289
-
290
- @dalli.delete(y)
291
- Dalli::Client.any_instance.expects(:get).with(y, {}).once.returns(nil)
292
- dres = @dalli.read(y)
293
- assert_equal nil, dres
294
- end
295
- end
296
- end
297
- end
298
-
299
- it 'support unless_exist with LocalCache' do
300
- with_activesupport do
301
- memcached_persistent(@port) do
302
- connect(@port)
303
- y = rand_key.to_s
304
- @dalli.with_local_cache do
305
- Dalli::Client.any_instance.expects(:add).with(y, 123, nil, {:unless_exist => true}).once.returns(true)
306
- dres = @dalli.write(y, 123, :unless_exist => true)
307
- assert_equal true, dres
308
-
309
- Dalli::Client.any_instance.expects(:add).with(y, 321, nil, {:unless_exist => true}).once.returns(false)
310
-
311
- dres = @dalli.write(y, 321, :unless_exist => true)
312
- assert_equal false, dres
313
-
314
- Dalli::Client.any_instance.expects(:get).with(y, {}).once.returns(123)
315
-
316
- dres = @dalli.read(y)
317
- assert_equal 123, dres
318
- end
319
- end
320
- end
321
- end
322
-
323
- it 'support increment/decrement commands' do
324
- with_activesupport do
325
- memcached_persistent(@port) do
326
- connect(@port)
327
- assert op_addset_succeeds(@dalli.write('counter', 0, :raw => true))
328
- assert_equal 1, @dalli.increment('counter')
329
- assert_equal 2, @dalli.increment('counter')
330
- assert_equal 1, @dalli.decrement('counter')
331
- assert_equal "1", @dalli.read('counter', :raw => true)
332
-
333
- assert_equal 1, @dalli.increment('counterX')
334
- assert_equal 2, @dalli.increment('counterX')
335
- assert_equal 2, @dalli.read('counterX', :raw => true).to_i
336
-
337
- assert_equal 5, @dalli.increment('counterY1', 1, :initial => 5)
338
- assert_equal 6, @dalli.increment('counterY1', 1, :initial => 5)
339
- assert_equal 6, @dalli.read('counterY1', :raw => true).to_i
340
-
341
- assert_equal nil, @dalli.increment('counterZ1', 1, :initial => nil)
342
- assert_equal nil, @dalli.read('counterZ1')
343
-
344
- assert_equal 5, @dalli.decrement('counterY2', 1, :initial => 5)
345
- assert_equal 4, @dalli.decrement('counterY2', 1, :initial => 5)
346
- assert_equal 4, @dalli.read('counterY2', :raw => true).to_i
347
-
348
- assert_equal nil, @dalli.decrement('counterZ2', 1, :initial => nil)
349
- assert_equal nil, @dalli.read('counterZ2')
350
-
351
- user = MockUser.new
352
- assert op_addset_succeeds(@dalli.write(user, 0, :raw => true))
353
- assert_equal 1, @dalli.increment(user)
354
- assert_equal 2, @dalli.increment(user)
355
- assert_equal 1, @dalli.decrement(user)
356
- assert_equal "1", @dalli.read(user, :raw => true)
357
- end
358
- end
359
- end
360
-
361
- it 'support exist command' do
362
- with_activesupport do
363
- memcached_persistent(@port) do
364
- connect(@port)
365
- @dalli.write(:foo, 'a')
366
- @dalli.write(:false_value, false)
367
-
368
- assert_equal true, @dalli.exist?(:foo)
369
- assert_equal true, @dalli.exist?(:false_value)
370
-
371
- assert_equal false, @dalli.exist?(:bar)
372
-
373
- user = MockUser.new
374
- @dalli.write(user, 'foo')
375
- assert_equal true, @dalli.exist?(user)
376
- end
377
- end
378
- end
379
-
380
- it 'support other esoteric commands' do
381
- with_activesupport do
382
- memcached_persistent(@port) do
383
- connect(@port)
384
- ds = @dalli.stats
385
- assert_equal 1, ds.keys.size
386
- assert ds[ds.keys.first].keys.size > 0
387
-
388
- @dalli.reset
389
- end
390
- end
391
- end
392
-
393
- it 'respect "raise_errors" option' do
394
- with_activesupport do
395
- new_port = 29333
396
- memcached_persistent(new_port) do
397
- @dalli = ActiveSupport::Cache.lookup_store(:dalli_store, "localhost:#{new_port}")
398
- @dalli.write 'foo', 'bar'
399
- assert_equal @dalli.read('foo'), 'bar'
400
-
401
- memcached_kill(new_port)
402
-
403
- assert_equal @dalli.read('foo'), nil
404
-
405
- @dalli = ActiveSupport::Cache.lookup_store(:dalli_store, "localhost:#{new_port}", :raise_errors => true)
406
-
407
- exception = [Dalli::RingError, { :message => "No server available" }]
408
-
409
- assert_raises(*exception) { @dalli.read 'foo' }
410
- assert_raises(*exception) { @dalli.read 'foo', :raw => true }
411
- assert_raises(*exception) { @dalli.write 'foo', 'bar' }
412
- assert_raises(*exception) { @dalli.exist? 'foo' }
413
- assert_raises(*exception) { @dalli.increment 'foo' }
414
- assert_raises(*exception) { @dalli.decrement 'foo' }
415
- assert_raises(*exception) { @dalli.delete 'foo' }
416
- assert_equal @dalli.read_multi('foo', 'bar'), {}
417
- assert_raises(*exception) { @dalli.delete 'foo' }
418
- assert_raises(*exception) { @dalli.fetch('foo') { 42 } }
419
- end
420
- end
421
- end
422
-
423
- describe 'instruments' do
424
- it 'payload hits' do
425
- with_activesupport do
426
- memcached_persistent(@port) do
427
- connect(@port)
428
-
429
- payload = {}
430
- dres = @dalli.write('false', false)
431
- assert op_addset_succeeds(dres)
432
- foo = @dalli.fetch('burrito') do 'tacos' end
433
- assert 'tacos', foo
434
-
435
- # NOTE: mocha stubbing for yields
436
- # makes the result of the block nil in all cases
437
- # there was a ticket about this:
438
- # http://floehopper.lighthouseapp.com/projects/22289/tickets/14-8687-blocks-return-value-is-dropped-on-stubbed-yielding-methods
439
- @dalli.stubs(:instrument).yields payload
440
-
441
- @dalli.read('false')
442
- assert_equal true, payload.delete(:hit)
443
-
444
-
445
- foo = @dalli.fetch('unset_key') do 'tacos' end
446
- assert_equal false, payload.delete(:hit)
447
-
448
- @dalli.fetch('burrito') do 'tacos' end
449
- assert_equal true, payload.delete(:hit)
450
-
451
- @dalli.unstub(:instrument)
452
- end
453
- end
454
- end
455
- end
456
- end
457
-
458
- it 'handle crazy characters from far-away lands' do
459
- with_activesupport do
460
- memcached_persistent(@port) do
461
- connect(@port)
462
- key = "fooƒ"
463
- value = 'bafƒ'
464
- assert op_addset_succeeds(@dalli.write(key, value))
465
- assert_equal value, @dalli.read(key)
466
- end
467
- end
468
- end
469
-
470
- it 'normalize options as expected' do
471
- with_activesupport do
472
- memcached_persistent(@port) do
473
- @dalli = ActiveSupport::Cache::DalliStore.new("localhost:#{@port}", :expires_in => 1, :namespace => 'foo', :compress => true)
474
- assert_equal 1, @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:expires_in]
475
- assert_equal 'foo', @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:namespace]
476
- assert_equal ["localhost:#{@port}"], @dalli.instance_variable_get(:@data).instance_variable_get(:@servers)
477
- end
478
- end
479
- end
480
-
481
- it 'handles nil server with additional options' do
482
- with_activesupport do
483
- memcached_persistent(@port) do
484
- @dalli = ActiveSupport::Cache::DalliStore.new(nil, :expires_in => 1, :namespace => 'foo', :compress => true)
485
- assert_equal 1, @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:expires_in]
486
- assert_equal 'foo', @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:namespace]
487
- assert_equal ["127.0.0.1:11211"], @dalli.instance_variable_get(:@data).instance_variable_get(:@servers)
488
- end
489
- end
490
- end
491
-
492
- it 'supports connection pooling' do
493
- with_activesupport do
494
- memcached_persistent(@port) do
495
- @dalli = ActiveSupport::Cache::DalliStore.new("localhost:#{@port}", :expires_in => 1, :namespace => 'foo', :compress => true, :pool_size => 3)
496
- assert_equal nil, @dalli.read('foo')
497
- assert @dalli.write('foo', 1)
498
- assert_equal 1, @dalli.fetch('foo') { raise 'boom' }
499
- assert_equal true, @dalli.dalli.is_a?(ConnectionPool)
500
- assert_equal 1, @dalli.increment('bar')
501
- assert_equal 0, @dalli.decrement('bar')
502
- assert_equal true, @dalli.delete('bar')
503
- assert_equal [true], @dalli.clear
504
- assert_equal 1, @dalli.stats.size
505
- end
506
- end
507
- end
508
-
509
- it 'allow keys to be frozen' do
510
- with_activesupport do
511
- memcached_persistent(@port) do
512
- connect(@port)
513
- key = "foo"
514
- key.freeze
515
- assert op_addset_succeeds(@dalli.write(key, "value"))
516
- end
517
- end
518
- end
519
-
520
- it 'allow keys from a hash' do
521
- with_activesupport do
522
- memcached_persistent(@port) do
523
- connect(@port)
524
- map = { "one" => "one", "two" => "two" }
525
- map.each_pair do |k, v|
526
- assert op_addset_succeeds(@dalli.write(k, v))
527
- end
528
- assert_equal map, @dalli.read_multi(*(map.keys))
529
- end
530
- end
531
- end
532
-
533
- def connect(port = 19122, namespace = lambda{33.to_s(36)})
534
- @dalli = ActiveSupport::Cache.lookup_store(:dalli_store, "localhost:#{port}", :expires_in => 10.seconds, :namespace => namespace)
535
- @dalli.clear
536
- end
537
-
538
- def rand_key
539
- rand(1_000_000_000)
540
- end
541
- end
@@ -1,107 +0,0 @@
1
- require 'helper'
2
- require 'memcached_mock'
3
-
4
- describe 'Dalli::Cas::Client' do
5
- describe 'using a live server' do
6
- it 'supports get with CAS' do
7
- memcached_cas_persistent do |dc|
8
- dc.flush
9
-
10
- expected = { 'blah' => 'blerg!' }
11
- get_block_called = false
12
- stored_value = stored_cas = nil
13
- # Validate call-with-block
14
- dc.get_cas('gets_key') do |v, cas|
15
- get_block_called = true
16
- stored_value = v
17
- stored_cas = cas
18
- end
19
- assert get_block_called
20
- assert_nil stored_value
21
-
22
- dc.set('gets_key', expected)
23
-
24
- # Validate call-with-return-value
25
- stored_value, stored_cas = dc.get_cas('gets_key')
26
- assert_equal stored_value, expected
27
- assert(stored_cas != 0)
28
- end
29
- end
30
-
31
- it 'supports multi-get with CAS' do
32
- memcached_cas_persistent do |dc|
33
- dc.close
34
- dc.flush
35
-
36
- expected_hash = {'a' => 'foo', 'b' => 123}
37
- expected_hash.each_pair do |k, v|
38
- dc.set(k, v)
39
- end
40
-
41
- # Invocation without block
42
- resp = dc.get_multi_cas(%w(a b c d e f))
43
- resp.each_pair do |k, data|
44
- value, cas = [data.first, data[1]]
45
- assert_equal expected_hash[k], value
46
- assert(cas && cas != 0)
47
- end
48
-
49
- # Invocation with block
50
- dc.get_multi_cas(%w(a b c d e f)) do |k, data|
51
- value, cas = [data.first, data[1]]
52
- assert_equal expected_hash[k], value
53
- assert(cas && cas != 0)
54
- end
55
- end
56
- end
57
-
58
- it 'supports replace-with-CAS operation' do
59
- memcached_cas_persistent do |dc|
60
- dc.flush
61
- cas = dc.set('key', 'value')
62
-
63
- # Accepts CAS, replaces, and returns new CAS
64
- cas = dc.replace_cas('key', 'value2', cas)
65
- assert cas.is_a?(Integer)
66
-
67
- assert_equal 'value2', dc.get('key')
68
- end
69
- end
70
-
71
- it 'supports delete with CAS' do
72
- memcached_cas_persistent do |dc|
73
- cas = dc.set('some_key', 'some_value')
74
- dc.delete_cas('some_key', cas)
75
- assert_nil dc.get('some_key')
76
- end
77
- end
78
-
79
- it 'handles CAS round-trip operations' do
80
- memcached_cas_persistent do |dc|
81
- dc.flush
82
-
83
- expected = {'blah' => 'blerg!'}
84
- dc.set('some_key', expected)
85
-
86
- value, cas = dc.get_cas('some_key')
87
- assert_equal value, expected
88
- assert(!cas.nil? && cas != 0)
89
-
90
- # Set operation, first with wrong then with correct CAS
91
- expected = {'blah' => 'set succeeded'}
92
- assert(dc.set_cas('some_key', expected, cas+1) == false)
93
- assert op_addset_succeeds(cas = dc.set_cas('some_key', expected, cas))
94
-
95
- # Replace operation, first with wrong then with correct CAS
96
- expected = {'blah' => 'replace succeeded'}
97
- assert(dc.replace_cas('some_key', expected, cas+1) == false)
98
- assert op_addset_succeeds(cas = dc.replace_cas('some_key', expected, cas))
99
-
100
- # Delete operation, first with wrong then with correct CAS
101
- assert(dc.delete_cas('some_key', cas+1) == false)
102
- assert dc.delete_cas('some_key', cas)
103
- end
104
- end
105
-
106
- end
107
- end
@@ -1,52 +0,0 @@
1
- # encoding: utf-8
2
- require 'helper'
3
- require 'json'
4
- require 'memcached_mock'
5
-
6
- class NoopCompressor
7
- def self.compress(data)
8
- data
9
- end
10
-
11
- def self.decompress(data)
12
- data
13
- end
14
- end
15
-
16
- describe 'Compressor' do
17
-
18
- it 'default to Dalli::Compressor' do
19
- memcached(29199) do |dc|
20
- dc.set 1,2
21
- assert_equal Dalli::Compressor, dc.instance_variable_get('@ring').servers.first.compressor
22
- end
23
- end
24
-
25
- it 'support a custom compressor' do
26
- memcached(29199) do |dc|
27
- memcache = Dalli::Client.new('127.0.0.1:29199', :compressor => NoopCompressor)
28
- memcache.set 1,2
29
- begin
30
- assert_equal NoopCompressor, memcache.instance_variable_get('@ring').servers.first.compressor
31
-
32
- memcached(19127) do |newdc|
33
- assert newdc.set("string-test", "a test string")
34
- assert_equal("a test string", newdc.get("string-test"))
35
- end
36
- end
37
- end
38
- end
39
- end
40
-
41
- describe 'GzipCompressor' do
42
-
43
- it 'compress and uncompress data using Zlib::GzipWriter/Reader' do
44
- memcached(19127,nil,{:compress=>true,:compressor=>Dalli::GzipCompressor}) do |dc|
45
- data = (0...1025).map{65.+(rand(26)).chr}.join
46
- assert dc.set("test", data)
47
- assert_equal Dalli::GzipCompressor, dc.instance_variable_get('@ring').servers.first.compressor
48
- assert_equal(data, dc.get("test"))
49
- end
50
- end
51
-
52
- end