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.
- checksums.yaml +5 -5
- data/{History.md → CHANGELOG.md} +211 -0
- data/Gemfile +3 -6
- data/LICENSE +1 -1
- data/README.md +30 -208
- data/lib/dalli/cas/client.rb +2 -57
- data/lib/dalli/client.rb +254 -253
- data/lib/dalli/compressor.rb +13 -2
- data/lib/dalli/key_manager.rb +121 -0
- data/lib/dalli/options.rb +7 -7
- data/lib/dalli/pipelined_getter.rb +177 -0
- data/lib/dalli/protocol/base.rb +241 -0
- data/lib/dalli/protocol/binary/request_formatter.rb +117 -0
- data/lib/dalli/protocol/binary/response_header.rb +36 -0
- data/lib/dalli/protocol/binary/response_processor.rb +239 -0
- data/lib/dalli/protocol/binary/sasl_authentication.rb +60 -0
- data/lib/dalli/protocol/binary.rb +173 -0
- data/lib/dalli/protocol/connection_manager.rb +252 -0
- data/lib/dalli/protocol/meta/key_regularizer.rb +31 -0
- data/lib/dalli/protocol/meta/request_formatter.rb +121 -0
- data/lib/dalli/protocol/meta/response_processor.rb +211 -0
- data/lib/dalli/protocol/meta.rb +178 -0
- data/lib/dalli/protocol/response_buffer.rb +54 -0
- data/lib/dalli/protocol/server_config_parser.rb +86 -0
- data/lib/dalli/protocol/ttl_sanitizer.rb +45 -0
- data/lib/dalli/protocol/value_compressor.rb +85 -0
- data/lib/dalli/protocol/value_marshaller.rb +59 -0
- data/lib/dalli/protocol/value_serializer.rb +91 -0
- data/lib/dalli/protocol.rb +8 -0
- data/lib/dalli/ring.rb +97 -86
- data/lib/dalli/server.rb +4 -719
- data/lib/dalli/servers_arg_normalizer.rb +54 -0
- data/lib/dalli/socket.rb +123 -115
- data/lib/dalli/version.rb +5 -1
- data/lib/dalli.rb +45 -14
- data/lib/rack/session/dalli.rb +162 -42
- metadata +136 -63
- data/Performance.md +0 -42
- data/Rakefile +0 -43
- data/dalli.gemspec +0 -29
- data/lib/action_dispatch/middleware/session/dalli_store.rb +0 -81
- data/lib/active_support/cache/dalli_store.rb +0 -372
- data/lib/dalli/railtie.rb +0 -7
- data/test/benchmark_test.rb +0 -243
- data/test/helper.rb +0 -56
- data/test/memcached_mock.rb +0 -201
- data/test/sasl/memcached.conf +0 -1
- data/test/sasl/sasldb +0 -1
- data/test/test_active_support.rb +0 -541
- data/test/test_cas_client.rb +0 -107
- data/test/test_compressor.rb +0 -52
- data/test/test_dalli.rb +0 -682
- data/test/test_encoding.rb +0 -32
- data/test/test_failover.rb +0 -137
- data/test/test_network.rb +0 -64
- data/test/test_rack_session.rb +0 -341
- data/test/test_ring.rb +0 -85
- data/test/test_sasl.rb +0 -105
- data/test/test_serializer.rb +0 -29
- data/test/test_server.rb +0 -110
data/test/test_active_support.rb
DELETED
@@ -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
|
data/test/test_cas_client.rb
DELETED
@@ -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
|
data/test/test_compressor.rb
DELETED
@@ -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
|