dalli 2.7.2 → 3.2.4
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} +231 -0
- data/Gemfile +14 -5
- data/LICENSE +1 -1
- data/README.md +33 -201
- data/lib/dalli/cas/client.rb +2 -57
- data/lib/dalli/client.rb +259 -254
- 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/pid_cache.rb +40 -0
- data/lib/dalli/pipelined_getter.rb +177 -0
- data/lib/dalli/protocol/base.rb +239 -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 +254 -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 -694
- data/lib/dalli/servers_arg_normalizer.rb +54 -0
- data/lib/dalli/socket.rb +122 -80
- data/lib/dalli/version.rb +5 -1
- data/lib/dalli.rb +45 -14
- data/lib/rack/session/dalli.rb +162 -42
- metadata +40 -96
- data/Performance.md +0 -42
- data/Rakefile +0 -42
- 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 -363
- data/lib/dalli/railtie.rb +0 -7
- data/test/benchmark_test.rb +0 -242
- data/test/helper.rb +0 -55
- data/test/memcached_mock.rb +0 -121
- data/test/sasldb +0 -1
- data/test/test_active_support.rb +0 -439
- data/test/test_cas_client.rb +0 -107
- data/test/test_compressor.rb +0 -53
- data/test/test_dalli.rb +0 -625
- data/test/test_encoding.rb +0 -32
- data/test/test_failover.rb +0 -128
- data/test/test_network.rb +0 -54
- data/test/test_rack_session.rb +0 -341
- data/test/test_ring.rb +0 -85
- data/test/test_sasl.rb +0 -110
- data/test/test_serializer.rb +0 -30
- data/test/test_server.rb +0 -80
data/test/memcached_mock.rb
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
require "socket"
|
2
|
-
|
3
|
-
$started = {}
|
4
|
-
|
5
|
-
module MemcachedMock
|
6
|
-
def self.start(port=19123, &block)
|
7
|
-
server = TCPServer.new("localhost", port)
|
8
|
-
session = server.accept
|
9
|
-
block.call session
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.delayed_start(port=19123, wait=1, &block)
|
13
|
-
server = TCPServer.new("localhost", port)
|
14
|
-
sleep wait
|
15
|
-
block.call server
|
16
|
-
end
|
17
|
-
|
18
|
-
module Helper
|
19
|
-
# Forks the current process and starts a new mock Memcached server on
|
20
|
-
# port 22122.
|
21
|
-
#
|
22
|
-
# memcached_mock(lambda {|sock| socket.write('123') }) do
|
23
|
-
# assert_equal "PONG", Dalli::Client.new('localhost:22122').get('abc')
|
24
|
-
# end
|
25
|
-
#
|
26
|
-
def memcached_mock(proc, meth = :start)
|
27
|
-
return unless supports_fork?
|
28
|
-
begin
|
29
|
-
pid = fork do
|
30
|
-
trap("TERM") { exit }
|
31
|
-
|
32
|
-
MemcachedMock.send(meth) do |*args|
|
33
|
-
proc.call(*args)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
sleep 0.3 # Give time for the socket to start listening.
|
38
|
-
yield
|
39
|
-
ensure
|
40
|
-
if pid
|
41
|
-
Process.kill("TERM", pid)
|
42
|
-
Process.wait(pid)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
PATHS = %w(
|
48
|
-
/usr/local/bin/
|
49
|
-
/opt/local/bin/
|
50
|
-
/usr/bin/
|
51
|
-
)
|
52
|
-
|
53
|
-
def find_memcached
|
54
|
-
output = `memcached -h | head -1`.strip
|
55
|
-
if output && output =~ /^memcached (\d.\d.\d+)/ && $1 > '1.4'
|
56
|
-
return (puts "Found #{output} in PATH"; '')
|
57
|
-
end
|
58
|
-
PATHS.each do |path|
|
59
|
-
output = `memcached -h | head -1`.strip
|
60
|
-
if output && output =~ /^memcached (\d\.\d\.\d+)/ && $1 > '1.4'
|
61
|
-
return (puts "Found #{output} in #{path}"; path)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
raise Errno::ENOENT, "Unable to find memcached 1.4+ locally"
|
66
|
-
end
|
67
|
-
|
68
|
-
def memcached(port=19122, args='', options={})
|
69
|
-
memcached_server(port, args)
|
70
|
-
yield Dalli::Client.new(["localhost:#{port}", "127.0.0.1:#{port}"], options)
|
71
|
-
end
|
72
|
-
|
73
|
-
def memcached_cas(port=19122, args='', options={})
|
74
|
-
memcached_server(port, args)
|
75
|
-
require 'dalli/cas/client'
|
76
|
-
yield Dalli::Client.new(["localhost:#{port}", "127.0.0.1:#{port}"], options)
|
77
|
-
end
|
78
|
-
|
79
|
-
def memcached_server(port=19122, args='')
|
80
|
-
Memcached.path ||= find_memcached
|
81
|
-
|
82
|
-
cmd = "#{Memcached.path}memcached #{args} -p #{port}"
|
83
|
-
|
84
|
-
$started[port] ||= begin
|
85
|
-
#puts "Starting: #{cmd}..."
|
86
|
-
pid = IO.popen(cmd).pid
|
87
|
-
at_exit do
|
88
|
-
begin
|
89
|
-
Process.kill("TERM", pid)
|
90
|
-
Process.wait(pid)
|
91
|
-
rescue Errno::ECHILD, Errno::ESRCH
|
92
|
-
end
|
93
|
-
end
|
94
|
-
sleep 0.1
|
95
|
-
pid
|
96
|
-
end
|
97
|
-
end
|
98
|
-
|
99
|
-
def supports_fork?
|
100
|
-
!defined?(RUBY_ENGINE) || RUBY_ENGINE != 'jruby'
|
101
|
-
end
|
102
|
-
|
103
|
-
def memcached_kill(port)
|
104
|
-
pid = $started.delete(port)
|
105
|
-
if pid
|
106
|
-
begin
|
107
|
-
Process.kill("TERM", pid)
|
108
|
-
Process.wait(pid)
|
109
|
-
rescue Errno::ECHILD, Errno::ESRCH
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
module Memcached
|
118
|
-
class << self
|
119
|
-
attr_accessor :path
|
120
|
-
end
|
121
|
-
end
|
data/test/sasldb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
testuser:testtest:::::::
|
data/test/test_active_support.rb
DELETED
@@ -1,439 +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
|
-
describe 'active_support caching' do
|
13
|
-
|
14
|
-
it 'has accessible options' do
|
15
|
-
@dalli = ActiveSupport::Cache.lookup_store(:dalli_store, 'localhost:19122', :expires_in => 5.minutes, :frob => 'baz')
|
16
|
-
assert_equal 'baz', @dalli.options[:frob]
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'allow mute and silence' do
|
20
|
-
@dalli = ActiveSupport::Cache.lookup_store(:dalli_store, 'localhost:19122')
|
21
|
-
@dalli.mute do
|
22
|
-
assert op_addset_succeeds(@dalli.write('foo', 'bar', nil))
|
23
|
-
assert_equal 'bar', @dalli.read('foo', nil)
|
24
|
-
end
|
25
|
-
refute @dalli.silence?
|
26
|
-
@dalli.silence!
|
27
|
-
assert_equal true, @dalli.silence?
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'handle nil options' do
|
31
|
-
@dalli = ActiveSupport::Cache.lookup_store(:dalli_store, 'localhost:19122')
|
32
|
-
assert op_addset_succeeds(@dalli.write('foo', 'bar', nil))
|
33
|
-
assert_equal 'bar', @dalli.read('foo', nil)
|
34
|
-
assert_equal 18, @dalli.fetch('lkjsadlfk', nil) { 18 }
|
35
|
-
assert_equal 18, @dalli.fetch('lkjsadlfk', nil) { 18 }
|
36
|
-
assert_equal 1, @dalli.increment('lkjsa', 1, nil)
|
37
|
-
assert_equal 2, @dalli.increment('lkjsa', 1, nil)
|
38
|
-
assert_equal 1, @dalli.decrement('lkjsa', 1, nil)
|
39
|
-
assert_equal true, @dalli.delete('lkjsa')
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'support fetch' do
|
43
|
-
with_activesupport do
|
44
|
-
memcached do
|
45
|
-
connect
|
46
|
-
dvalue = @dalli.fetch('someotherkeywithoutspaces', :expires_in => 1.second) { 123 }
|
47
|
-
assert_equal 123, dvalue
|
48
|
-
|
49
|
-
o = Object.new
|
50
|
-
o.instance_variable_set :@foo, 'bar'
|
51
|
-
dvalue = @dalli.fetch(rand_key, :raw => true) { o }
|
52
|
-
assert_equal o, dvalue
|
53
|
-
|
54
|
-
dvalue = @dalli.fetch(rand_key) { o }
|
55
|
-
assert_equal o, dvalue
|
56
|
-
|
57
|
-
@dalli.write('false', false)
|
58
|
-
dvalue = @dalli.fetch('false') { flunk }
|
59
|
-
assert_equal false, dvalue
|
60
|
-
|
61
|
-
user = MockUser.new
|
62
|
-
@dalli.write(user.cache_key, false)
|
63
|
-
dvalue = @dalli.fetch(user) { flunk }
|
64
|
-
assert_equal false, dvalue
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
it 'support keys with spaces on Rails3' do
|
70
|
-
with_activesupport do
|
71
|
-
memcached do
|
72
|
-
connect
|
73
|
-
dvalue = @dalli.fetch('some key with spaces', :expires_in => 1.second) { 123 }
|
74
|
-
assert_equal 123, dvalue
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'support read_multi' do
|
80
|
-
with_activesupport do
|
81
|
-
memcached do
|
82
|
-
connect
|
83
|
-
x = rand_key
|
84
|
-
y = rand_key
|
85
|
-
assert_equal({}, @dalli.read_multi(x, y))
|
86
|
-
@dalli.write(x, '123')
|
87
|
-
@dalli.write(y, 123)
|
88
|
-
assert_equal({ x => '123', y => 123 }, @dalli.read_multi(x, y))
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'support read_multi with an array' do
|
94
|
-
with_activesupport do
|
95
|
-
memcached do
|
96
|
-
connect
|
97
|
-
x = rand_key
|
98
|
-
y = rand_key
|
99
|
-
assert_equal({}, @dalli.read_multi([x, y]))
|
100
|
-
@dalli.write(x, '123')
|
101
|
-
@dalli.write(y, 123)
|
102
|
-
assert_equal({}, @dalli.read_multi([x, y]))
|
103
|
-
@dalli.write([x, y], '123')
|
104
|
-
assert_equal({ [x, y] => '123' }, @dalli.read_multi([x, y]))
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
it 'support raw read_multi' do
|
110
|
-
with_activesupport do
|
111
|
-
memcached do
|
112
|
-
connect
|
113
|
-
@dalli.write("abc", 5, :raw => true)
|
114
|
-
@dalli.write("cba", 5, :raw => true)
|
115
|
-
assert_equal({'abc' => '5', 'cba' => '5' }, @dalli.read_multi("abc", "cba"))
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
it 'support read_multi with LocalCache' do
|
121
|
-
with_activesupport do
|
122
|
-
memcached do
|
123
|
-
connect
|
124
|
-
x = rand_key
|
125
|
-
y = rand_key
|
126
|
-
assert_equal({}, @dalli.read_multi(x, y))
|
127
|
-
@dalli.write(x, '123')
|
128
|
-
@dalli.write(y, 456)
|
129
|
-
|
130
|
-
@dalli.with_local_cache do
|
131
|
-
assert_equal({ x => '123', y => 456 }, @dalli.read_multi(x, y))
|
132
|
-
Dalli::Client.any_instance.expects(:get).with(any_parameters).never
|
133
|
-
|
134
|
-
dres = @dalli.read(x)
|
135
|
-
assert_equal dres, '123'
|
136
|
-
end
|
137
|
-
|
138
|
-
Dalli::Client.any_instance.unstub(:get)
|
139
|
-
|
140
|
-
# Fresh LocalStore
|
141
|
-
@dalli.with_local_cache do
|
142
|
-
@dalli.read(x)
|
143
|
-
Dalli::Client.any_instance.expects(:get_multi).with([y.to_s]).returns(y.to_s => 456)
|
144
|
-
|
145
|
-
assert_equal({ x => '123', y => 456}, @dalli.read_multi(x, y))
|
146
|
-
end
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'supports fetch_multi' do
|
152
|
-
with_activesupport do
|
153
|
-
memcached do
|
154
|
-
connect
|
155
|
-
|
156
|
-
x = rand_key.to_s
|
157
|
-
y = rand_key
|
158
|
-
hash = { x => 'ABC', y => 'DEF' }
|
159
|
-
|
160
|
-
@dalli.write(y, '123')
|
161
|
-
|
162
|
-
results = @dalli.fetch_multi(x, y) { |key| hash[key] }
|
163
|
-
|
164
|
-
assert_equal({ x => 'ABC', y => '123' }, results)
|
165
|
-
assert_equal('ABC', @dalli.read(x))
|
166
|
-
assert_equal('123', @dalli.read(y))
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
it 'support read, write and delete' do
|
172
|
-
with_activesupport do
|
173
|
-
memcached do
|
174
|
-
connect
|
175
|
-
y = rand_key
|
176
|
-
assert_nil @dalli.read(y)
|
177
|
-
dres = @dalli.write(y, 123)
|
178
|
-
assert op_addset_succeeds(dres)
|
179
|
-
|
180
|
-
dres = @dalli.read(y)
|
181
|
-
assert_equal 123, dres
|
182
|
-
|
183
|
-
dres = @dalli.delete(y)
|
184
|
-
assert_equal true, dres
|
185
|
-
|
186
|
-
user = MockUser.new
|
187
|
-
dres = @dalli.write(user.cache_key, "foo")
|
188
|
-
assert op_addset_succeeds(dres)
|
189
|
-
|
190
|
-
dres = @dalli.read(user)
|
191
|
-
assert_equal "foo", dres
|
192
|
-
|
193
|
-
dres = @dalli.delete(user)
|
194
|
-
assert_equal true, dres
|
195
|
-
|
196
|
-
bigkey = '123456789012345678901234567890'
|
197
|
-
@dalli.write(bigkey, 'double width')
|
198
|
-
assert_equal 'double width', @dalli.read(bigkey)
|
199
|
-
assert_equal({bigkey => "double width"}, @dalli.read_multi(bigkey))
|
200
|
-
end
|
201
|
-
end
|
202
|
-
end
|
203
|
-
|
204
|
-
it 'support read, write and delete with LocalCache' do
|
205
|
-
with_activesupport do
|
206
|
-
memcached do
|
207
|
-
connect
|
208
|
-
y = rand_key.to_s
|
209
|
-
@dalli.with_local_cache do
|
210
|
-
Dalli::Client.any_instance.expects(:get).with(y, {}).once.returns(123)
|
211
|
-
dres = @dalli.read(y)
|
212
|
-
assert_equal 123, dres
|
213
|
-
|
214
|
-
Dalli::Client.any_instance.expects(:get).with(y, {}).never
|
215
|
-
|
216
|
-
dres = @dalli.read(y)
|
217
|
-
assert_equal 123, dres
|
218
|
-
|
219
|
-
@dalli.write(y, 456)
|
220
|
-
dres = @dalli.read(y)
|
221
|
-
assert_equal 456, dres
|
222
|
-
|
223
|
-
@dalli.delete(y)
|
224
|
-
Dalli::Client.any_instance.expects(:get).with(y, {}).once.returns(nil)
|
225
|
-
dres = @dalli.read(y)
|
226
|
-
assert_equal nil, dres
|
227
|
-
end
|
228
|
-
end
|
229
|
-
end
|
230
|
-
end
|
231
|
-
|
232
|
-
it 'support unless_exist with LocalCache' do
|
233
|
-
with_activesupport do
|
234
|
-
memcached do
|
235
|
-
connect
|
236
|
-
y = rand_key.to_s
|
237
|
-
@dalli.with_local_cache do
|
238
|
-
Dalli::Client.any_instance.expects(:add).with(y, 123, nil, {:unless_exist => true}).once.returns(true)
|
239
|
-
dres = @dalli.write(y, 123, :unless_exist => true)
|
240
|
-
assert_equal true, dres
|
241
|
-
|
242
|
-
Dalli::Client.any_instance.expects(:add).with(y, 321, nil, {:unless_exist => true}).once.returns(false)
|
243
|
-
|
244
|
-
dres = @dalli.write(y, 321, :unless_exist => true)
|
245
|
-
assert_equal false, dres
|
246
|
-
|
247
|
-
Dalli::Client.any_instance.expects(:get).with(y, {}).once.returns(123)
|
248
|
-
|
249
|
-
dres = @dalli.read(y)
|
250
|
-
assert_equal 123, dres
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
it 'support increment/decrement commands' do
|
257
|
-
with_activesupport do
|
258
|
-
memcached do
|
259
|
-
connect
|
260
|
-
assert op_addset_succeeds(@dalli.write('counter', 0, :raw => true))
|
261
|
-
assert_equal 1, @dalli.increment('counter')
|
262
|
-
assert_equal 2, @dalli.increment('counter')
|
263
|
-
assert_equal 1, @dalli.decrement('counter')
|
264
|
-
assert_equal "1", @dalli.read('counter', :raw => true)
|
265
|
-
|
266
|
-
assert_equal 1, @dalli.increment('counterX')
|
267
|
-
assert_equal 2, @dalli.increment('counterX')
|
268
|
-
assert_equal 2, @dalli.read('counterX', :raw => true).to_i
|
269
|
-
|
270
|
-
assert_equal 5, @dalli.increment('counterY1', 1, :initial => 5)
|
271
|
-
assert_equal 6, @dalli.increment('counterY1', 1, :initial => 5)
|
272
|
-
assert_equal 6, @dalli.read('counterY1', :raw => true).to_i
|
273
|
-
|
274
|
-
assert_equal nil, @dalli.increment('counterZ1', 1, :initial => nil)
|
275
|
-
assert_equal nil, @dalli.read('counterZ1')
|
276
|
-
|
277
|
-
assert_equal 5, @dalli.decrement('counterY2', 1, :initial => 5)
|
278
|
-
assert_equal 4, @dalli.decrement('counterY2', 1, :initial => 5)
|
279
|
-
assert_equal 4, @dalli.read('counterY2', :raw => true).to_i
|
280
|
-
|
281
|
-
assert_equal nil, @dalli.decrement('counterZ2', 1, :initial => nil)
|
282
|
-
assert_equal nil, @dalli.read('counterZ2')
|
283
|
-
|
284
|
-
user = MockUser.new
|
285
|
-
assert op_addset_succeeds(@dalli.write(user, 0, :raw => true))
|
286
|
-
assert_equal 1, @dalli.increment(user)
|
287
|
-
assert_equal 2, @dalli.increment(user)
|
288
|
-
assert_equal 1, @dalli.decrement(user)
|
289
|
-
assert_equal "1", @dalli.read(user, :raw => true)
|
290
|
-
end
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
it 'support exist command' do
|
295
|
-
with_activesupport do
|
296
|
-
memcached do
|
297
|
-
connect
|
298
|
-
@dalli.write(:foo, 'a')
|
299
|
-
@dalli.write(:false_value, false)
|
300
|
-
|
301
|
-
assert_equal true, @dalli.exist?(:foo)
|
302
|
-
assert_equal true, @dalli.exist?(:false_value)
|
303
|
-
|
304
|
-
assert_equal false, @dalli.exist?(:bar)
|
305
|
-
|
306
|
-
user = MockUser.new
|
307
|
-
@dalli.write(user, 'foo')
|
308
|
-
assert_equal true, @dalli.exist?(user)
|
309
|
-
end
|
310
|
-
end
|
311
|
-
end
|
312
|
-
|
313
|
-
it 'support other esoteric commands' do
|
314
|
-
with_activesupport do
|
315
|
-
memcached do
|
316
|
-
connect
|
317
|
-
ds = @dalli.stats
|
318
|
-
assert_equal 1, ds.keys.size
|
319
|
-
assert ds[ds.keys.first].keys.size > 0
|
320
|
-
|
321
|
-
@dalli.reset
|
322
|
-
end
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
it 'respect "raise_errors" option' do
|
327
|
-
with_activesupport do
|
328
|
-
memcached(29125) do
|
329
|
-
@dalli = ActiveSupport::Cache.lookup_store(:dalli_store, 'localhost:29125')
|
330
|
-
@dalli.write 'foo', 'bar'
|
331
|
-
assert_equal @dalli.read('foo'), 'bar'
|
332
|
-
|
333
|
-
memcached_kill(29125)
|
334
|
-
|
335
|
-
assert_equal @dalli.read('foo'), nil
|
336
|
-
|
337
|
-
@dalli = ActiveSupport::Cache.lookup_store(:dalli_store, 'localhost:29125', :raise_errors => true)
|
338
|
-
|
339
|
-
exception = [Dalli::RingError, { :message => "No server available" }]
|
340
|
-
|
341
|
-
assert_raises(*exception) { @dalli.read 'foo' }
|
342
|
-
assert_raises(*exception) { @dalli.read 'foo', :raw => true }
|
343
|
-
assert_raises(*exception) { @dalli.write 'foo', 'bar' }
|
344
|
-
assert_raises(*exception) { @dalli.exist? 'foo' }
|
345
|
-
assert_raises(*exception) { @dalli.increment 'foo' }
|
346
|
-
assert_raises(*exception) { @dalli.decrement 'foo' }
|
347
|
-
assert_raises(*exception) { @dalli.delete 'foo' }
|
348
|
-
assert_equal @dalli.read_multi('foo', 'bar'), {}
|
349
|
-
assert_raises(*exception) { @dalli.delete 'foo' }
|
350
|
-
assert_raises(*exception) { @dalli.fetch('foo') { 42 } }
|
351
|
-
end
|
352
|
-
end
|
353
|
-
end
|
354
|
-
end
|
355
|
-
|
356
|
-
it 'handle crazy characters from far-away lands' do
|
357
|
-
with_activesupport do
|
358
|
-
memcached do
|
359
|
-
connect
|
360
|
-
key = "fooƒ"
|
361
|
-
value = 'bafƒ'
|
362
|
-
assert op_addset_succeeds(@dalli.write(key, value))
|
363
|
-
assert_equal value, @dalli.read(key)
|
364
|
-
end
|
365
|
-
end
|
366
|
-
end
|
367
|
-
|
368
|
-
it 'normalize options as expected' do
|
369
|
-
with_activesupport do
|
370
|
-
memcached do
|
371
|
-
@dalli = ActiveSupport::Cache::DalliStore.new('localhost:19122', :expires_in => 1, :namespace => 'foo', :compress => true)
|
372
|
-
assert_equal 1, @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:expires_in]
|
373
|
-
assert_equal 'foo', @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:namespace]
|
374
|
-
assert_equal ["localhost:19122"], @dalli.instance_variable_get(:@data).instance_variable_get(:@servers)
|
375
|
-
end
|
376
|
-
end
|
377
|
-
end
|
378
|
-
|
379
|
-
it 'handles nil server with additional options' do
|
380
|
-
with_activesupport do
|
381
|
-
memcached do
|
382
|
-
@dalli = ActiveSupport::Cache::DalliStore.new(nil, :expires_in => 1, :namespace => 'foo', :compress => true)
|
383
|
-
assert_equal 1, @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:expires_in]
|
384
|
-
assert_equal 'foo', @dalli.instance_variable_get(:@data).instance_variable_get(:@options)[:namespace]
|
385
|
-
assert_equal ["127.0.0.1:11211"], @dalli.instance_variable_get(:@data).instance_variable_get(:@servers)
|
386
|
-
end
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
it 'supports connection pooling' do
|
391
|
-
with_activesupport do
|
392
|
-
memcached do
|
393
|
-
@dalli = ActiveSupport::Cache::DalliStore.new('localhost:19122', :expires_in => 1, :namespace => 'foo', :compress => true, :pool_size => 3)
|
394
|
-
assert_equal nil, @dalli.read('foo')
|
395
|
-
assert @dalli.write('foo', 1)
|
396
|
-
assert_equal 1, @dalli.fetch('foo') { raise 'boom' }
|
397
|
-
assert_equal true, @dalli.dalli.is_a?(ConnectionPool)
|
398
|
-
assert_equal 1, @dalli.increment('bar')
|
399
|
-
assert_equal 0, @dalli.decrement('bar')
|
400
|
-
assert_equal true, @dalli.delete('bar')
|
401
|
-
assert_equal [true], @dalli.clear
|
402
|
-
assert_equal 1, @dalli.stats.size
|
403
|
-
end
|
404
|
-
end
|
405
|
-
end
|
406
|
-
|
407
|
-
it 'allow keys to be frozen' do
|
408
|
-
with_activesupport do
|
409
|
-
memcached do
|
410
|
-
connect
|
411
|
-
key = "foo"
|
412
|
-
key.freeze
|
413
|
-
assert op_addset_succeeds(@dalli.write(key, "value"))
|
414
|
-
end
|
415
|
-
end
|
416
|
-
end
|
417
|
-
|
418
|
-
it 'allow keys from a hash' do
|
419
|
-
with_activesupport do
|
420
|
-
memcached do
|
421
|
-
connect
|
422
|
-
map = { "one" => "one", "two" => "two" }
|
423
|
-
map.each_pair do |k, v|
|
424
|
-
assert op_addset_succeeds(@dalli.write(k, v))
|
425
|
-
end
|
426
|
-
assert_equal map, @dalli.read_multi(*(map.keys))
|
427
|
-
end
|
428
|
-
end
|
429
|
-
end
|
430
|
-
|
431
|
-
def connect
|
432
|
-
@dalli = ActiveSupport::Cache.lookup_store(:dalli_store, 'localhost:19122', :expires_in => 10.seconds, :namespace => lambda{33.to_s(36)})
|
433
|
-
@dalli.clear
|
434
|
-
end
|
435
|
-
|
436
|
-
def rand_key
|
437
|
-
rand(1_000_000_000)
|
438
|
-
end
|
439
|
-
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 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 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.second]
|
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.second]
|
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 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 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 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
|