segmented-memcache 1.2.0

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.
@@ -0,0 +1,11 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/memcache/local_server'
3
+ require File.dirname(__FILE__) + '/memcache_server_test_helper'
4
+
5
+ class MemcacheLocalServerTest < Test::Unit::TestCase
6
+ include MemcacheServerTestHelper
7
+
8
+ def setup
9
+ @memcache = Memcache::LocalServer.new
10
+ end
11
+ end
@@ -0,0 +1,65 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/memcache/null_server'
3
+
4
+ class MemcacheNullServerTest < Test::Unit::TestCase
5
+ def setup
6
+ @memcache = Memcache::NullServer.new
7
+ end
8
+
9
+ def m
10
+ @memcache
11
+ end
12
+
13
+ def test_set_and_get
14
+ m.set(2, 'foo', 0)
15
+
16
+ assert_equal nil, m.get('2')
17
+ assert_equal nil, m.get('2')
18
+ end
19
+
20
+ def test_incr
21
+ m.incr('foo')
22
+ assert_equal nil, m.get('foo')
23
+
24
+ m.incr('foo', -1)
25
+ assert_equal nil, m.get('foo')
26
+
27
+ m.incr('foo', 52)
28
+ assert_equal nil, m.get('foo')
29
+
30
+ m.incr('foo', -43)
31
+ assert_equal nil, m.get('foo')
32
+ end
33
+
34
+ def test_multi_get
35
+ m.set(2, '1,2,3')
36
+ m.set(3, '4,5')
37
+
38
+ assert_equal Hash.new, m.get([2,3])
39
+ end
40
+
41
+ def test_delete
42
+ m.set(2, '1,2,3')
43
+
44
+ assert_equal nil, m.get(2)
45
+
46
+ m.delete(2)
47
+
48
+ assert_equal nil, m.get(2)
49
+ end
50
+
51
+ def test_flush_all
52
+ m.set(2, 'bar')
53
+
54
+ assert_equal nil, m.get(2)
55
+
56
+ m.flush_all
57
+
58
+ assert_equal nil, m.get(2)
59
+ end
60
+
61
+ def test_expiry
62
+ m.add('test', '1', 1)
63
+ assert_equal nil, m.get('test')
64
+ end
65
+ end
@@ -0,0 +1,28 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require File.dirname(__FILE__) + '/memcache_server_test_helper'
4
+ require File.dirname(__FILE__) + '/../lib/memcache/pg_server'
5
+
6
+ class MemcachePGServerTest < Test::Unit::TestCase
7
+ ActiveRecord::Base.establish_connection(
8
+ :adapter => "postgresql",
9
+ :host => "localhost",
10
+ :username => "postgres",
11
+ :password => "",
12
+ :database => "memcache_test"
13
+ )
14
+ ActiveRecord::Migration.verbose = false
15
+ ActiveRecord::Base.connection.client_min_messages = 'panic'
16
+
17
+ include MemcacheServerTestHelper
18
+
19
+ def setup
20
+ Memcache::Migration.table = 'memcache_test'
21
+ Memcache::Migration.up
22
+ @memcache = Memcache::PGServer.new(:table => 'memcache_test')
23
+ end
24
+
25
+ def teardown
26
+ Memcache::Migration.down
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/memcache_server_test_helper'
3
+
4
+ $VERBOSE = nil
5
+ Memcache::SegmentedServer.const_set('MAX_SIZE', 3)
6
+
7
+ class MemcacheSegmentedServerTest < Test::Unit::TestCase
8
+ include MemcacheServerTestHelper
9
+ include MemcacheServerTestHelper::AdvancedMethods
10
+ PORT = 11212
11
+
12
+ def setup
13
+ start_memcache(PORT)
14
+ @memcache = Memcache::SegmentedServer.new(:host => 'localhost', :port => PORT)
15
+
16
+ end
17
+
18
+ def teardown
19
+ stop_memcache(PORT)
20
+ end
21
+ end
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/memcache_server_test_helper'
3
+
4
+ class MemcacheServerTest < Test::Unit::TestCase
5
+ include MemcacheServerTestHelper
6
+ include MemcacheServerTestHelper::AdvancedMethods
7
+ PORT = 11212
8
+
9
+ def setup
10
+ start_memcache(PORT)
11
+ @memcache = Memcache::Server.new(:host => 'localhost', :port => PORT)
12
+ end
13
+
14
+ def teardown
15
+ stop_memcache(PORT)
16
+ end
17
+
18
+ def test_stats
19
+ m.set('foo', '1')
20
+ m.get('foo')
21
+ m.get('bar')
22
+
23
+ stats = m.stats
24
+ assert_equal 2, stats['cmd_get']
25
+ assert_equal 1, stats['cmd_set']
26
+ assert_equal 1, stats['curr_items']
27
+ end
28
+
29
+ def test_clone
30
+ m.set('foo', 1)
31
+ c = m.clone
32
+
33
+ assert_not_equal m.send(:socket), c.send(:socket)
34
+ end
35
+ end
@@ -0,0 +1,159 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ module MemcacheServerTestHelper
4
+ def m
5
+ @memcache
6
+ end
7
+
8
+ def test_set_and_get
9
+ m.set(2, 'foo', 0)
10
+
11
+ assert_equal 'foo', m.get('2')
12
+ assert_equal 'foo', m.get('2')
13
+
14
+ m.set(2, 'bar', 0)
15
+
16
+ assert_equal 'bar', m.get('2')
17
+ assert_equal 'bar', m.get('2')
18
+ end
19
+
20
+ def test_expiry
21
+ m.set('foo', 'foo', 1)
22
+ assert_equal 'foo', m.get('foo')
23
+
24
+ m.add('bar', 'bar', 1)
25
+ assert_equal 'bar', m.get('bar')
26
+
27
+ m.set('baz', '')
28
+ m.replace('baz', 'baz', '1')
29
+ assert_equal 'baz', m.get('baz')
30
+
31
+ m.set('bam', 'bap', Time.now + 1)
32
+ assert_equal 'bap', m.get('bam')
33
+
34
+ sleep 2
35
+
36
+ assert_equal nil, m.get('foo')
37
+ assert_equal nil, m.get('bar')
38
+ assert_equal nil, m.get('baz')
39
+ assert_equal nil, m.get('bam')
40
+ end
41
+
42
+ def test_add_and_replace
43
+ # Replace should do nothing if key doesn't exist.
44
+ m.replace('foo', 'bar')
45
+ assert_equal nil, m.get('foo')
46
+
47
+ # Add should only work if key doesn't exist.
48
+ m.add('foo', 'foo')
49
+ assert_equal 'foo', m.get('foo')
50
+ assert_equal nil, m.add('foo', 'bar')
51
+ assert_equal 'foo', m.get('foo')
52
+
53
+ # Replace should only work if key doesn't exist.
54
+ m.replace('foo', 'bar')
55
+ assert_equal 'bar', m.get('foo')
56
+ end
57
+
58
+ def test_append_and_prepend
59
+ m.append('foo', 'bar')
60
+ assert_equal nil, m.get('foo')
61
+
62
+ m.set('foo', 'foo')
63
+ m.append('foo', 'bar')
64
+ assert_equal 'foobar', m.get('foo')
65
+
66
+ m.prepend('foo', 'baz')
67
+ assert_equal 'bazfoobar', m.get('foo')
68
+ end
69
+
70
+ def test_incr
71
+ # incr does nothing if value doesn't exist
72
+ m.incr('foo')
73
+ assert_equal nil, m.get('foo')
74
+
75
+ m.decr('foo', 1)
76
+ assert_equal nil, m.get('foo')
77
+
78
+ m.set('foo', '0')
79
+ m.incr('foo')
80
+ assert_equal '1', m.get('foo')
81
+
82
+ m.incr('foo', 52)
83
+ assert_equal '53', m.get('foo')
84
+
85
+ m.decr('foo', 43)
86
+ assert_equal '10', m.get('foo')
87
+
88
+ # Cannot go below zero.
89
+ m.decr('foo', 100)
90
+ assert_equal '0', m.get('foo').strip
91
+ end
92
+
93
+ def test_multi_get
94
+ m.set(2, '1,2,3')
95
+ m.set(3, '4,5')
96
+
97
+ expected = { '2' => '1,2,3', '3' => '4,5' }
98
+ assert_equal expected, m.get([2,3])
99
+ end
100
+
101
+ def test_delete
102
+ m.set(2, '1,2,3')
103
+
104
+ assert_equal '1,2,3', m.get(2)
105
+
106
+ m.delete(2)
107
+
108
+ assert_equal nil, m.get(2)
109
+ end
110
+
111
+ def test_flush_all
112
+ m.set(2, 'bar')
113
+
114
+ assert_equal 'bar', m.get(2)
115
+
116
+ m.flush_all
117
+
118
+ assert_equal nil, m.get(2)
119
+ end
120
+
121
+ module AdvancedMethods
122
+ def test_flags
123
+ m.set('thom', 'hartmann', 0)
124
+ value = m.gets('thom')
125
+ assert_equal 0, value.memcache_flags
126
+
127
+ m.set('thom', 'hartmann', 0, 0b11110001)
128
+ value = m.gets('thom')
129
+ assert_equal 0b11110001, value.memcache_flags
130
+
131
+ value = m.get('thom')
132
+ assert_equal 0b11110001, value.memcache_flags
133
+
134
+ m.set('thom', 'hartmann', 0, 0b10101010)
135
+ value = m.get('thom')
136
+ assert_equal 0b10101010, value.memcache_flags
137
+ end
138
+
139
+ def test_gets_and_cas
140
+ m.set('thom', 'hartmann')
141
+
142
+ value = m.gets('thom')
143
+ assert_equal 'hartmann', value
144
+ m.cas('thom', 'thompson', value.memcache_cas)
145
+ assert_equal 'thompson', m.get('thom')
146
+
147
+ value = m.gets('thom')
148
+ m.delete('thom')
149
+ assert_nil m.cas('thom', 'hartson', value.memcache_cas)
150
+ assert_equal nil, m.get('thom')
151
+
152
+ m.add('thom', 'hartmann')
153
+ value = m.gets('thom')
154
+ m.set('thom', 'foo')
155
+ assert_nil m.cas('thom', 'hartson', value.memcache_cas)
156
+ assert_equal 'foo', m.get('thom')
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,233 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/test_helper'
3
+
4
+ class MemcacheTest < Test::Unit::TestCase
5
+ PORTS = [11212, 11213, 11214, 11215, 11216, 11217]
6
+
7
+ def m
8
+ @memcache
9
+ end
10
+
11
+ def setup
12
+ start_memcache(*PORTS)
13
+ @memcache = Memcache.new(:servers => PORTS.collect {|p| "localhost:#{p}"})
14
+ end
15
+
16
+ def teardown
17
+ stop_memcache(*PORTS)
18
+ end
19
+
20
+ def test_get_and_set
21
+ 100.times do |i|
22
+ m.set(i.to_s, i)
23
+ assert_equal i, m.get(i.to_s)
24
+ end
25
+
26
+ keys = (0..200).to_a
27
+ results = m.get(keys)
28
+ assert_equal 100, results.size
29
+ results.each do |key, value|
30
+ assert_equal key.to_i, value
31
+ end
32
+
33
+ 100.times do |i|
34
+ m.set(i.to_s, i.to_s, :raw => true)
35
+ assert_equal i.to_s, m.get(i.to_s, :raw => true)
36
+ end
37
+
38
+ results = m.get(keys ,:raw => true)
39
+ assert_equal 100, results.size
40
+ results.each do |key, value|
41
+ assert_equal key, value
42
+ end
43
+ end
44
+
45
+ def test_alternate_accessors
46
+ m['baz'] = 24
47
+ assert_equal 24, m['baz']
48
+ end
49
+
50
+ def test_add_and_replace
51
+ 100.times do |i|
52
+ m.replace(i.to_s, [:foo, i])
53
+ assert_equal nil, m.get(i.to_s)
54
+
55
+ m.add(i.to_s, [:bar, i])
56
+ assert_equal [:bar, i], m.get(i.to_s)
57
+
58
+ m.replace(i.to_s, [:foo, i])
59
+ assert_equal [:foo, i], m.get(i.to_s)
60
+
61
+ m.add(i.to_s, [:baz, i])
62
+ assert_equal [:foo, i], m.get(i.to_s)
63
+
64
+ m.replace(i.to_s, 'blah', :raw => true)
65
+ assert_equal 'blah', m.get(i.to_s, :raw => true)
66
+
67
+ m.delete(i.to_s)
68
+ assert_equal nil, m.get(i.to_s, :raw => true)
69
+
70
+ m.add(i.to_s, 'homerun', :raw => true)
71
+ assert_equal 'homerun', m.get(i.to_s, :raw => true)
72
+ end
73
+ end
74
+
75
+ def test_append_and_prepend
76
+ 100.times do |i|
77
+ m.append(i.to_s, 'doh!')
78
+ assert_equal nil, m.read(i.to_s)
79
+
80
+ m.write(i.to_s, 'bar')
81
+ m.prepend(i.to_s, 'foo')
82
+ assert_equal 'foobar', m.read(i.to_s)
83
+
84
+ m.append(i.to_s, i.to_s)
85
+ assert_equal "foobar#{i}", m.read(i.to_s)
86
+ end
87
+ end
88
+
89
+ def test_get_or_set
90
+ 100.times do |i|
91
+ m.get_or_set("foo#{i}", [i, :foo])
92
+ assert_equal [i, :foo], m["foo#{i}"]
93
+
94
+ m.get_or_set("foo#{i}") {raise}
95
+ assert_equal [i, :foo], m["foo#{i}"]
96
+
97
+ # Overwrite if changed.
98
+ m.get_or_set("bar#{i}") do
99
+ m.set("bar#{i}", [i, :foo])
100
+ [i, :bar]
101
+ end
102
+ assert_equal [i, :bar], m["bar#{i}"]
103
+ end
104
+ end
105
+
106
+ def test_get_or_add
107
+ 100.times do |i|
108
+ m.get_or_add("foo#{i}", [:foo, i])
109
+ assert_equal [:foo, i], m["foo#{i}"]
110
+
111
+ m.get_or_add("foo#{i}") {raise}
112
+ assert_equal [:foo, i], m["foo#{i}"]
113
+
114
+ # Don't overwrite if changed.
115
+ m.get_or_add("bar#{i}") do
116
+ m.set("bar#{i}", [:foo, i])
117
+ :bar
118
+ end
119
+ assert_equal [:foo, i], m["bar#{i}"]
120
+ end
121
+ end
122
+
123
+ def test_update
124
+ 100.times do |i|
125
+ m.set("foo#{i}", [:foo, i])
126
+ assert_equal [:foo, i], m["foo#{i}"]
127
+
128
+ m.update("foo#{i}") do |list|
129
+ list << i.to_s
130
+ list << :bar
131
+ list
132
+ end
133
+ assert_equal [:foo, i, i.to_s, :bar], m["foo#{i}"]
134
+ end
135
+ end
136
+
137
+ def test_get_some
138
+ 100.times do |i|
139
+ i = i * 2
140
+ m.set(i.to_s, i)
141
+ assert_equal i, m.get(i.to_s)
142
+ end
143
+
144
+ keys = (0...200).to_a
145
+ results = m.get_some(keys) do |missing_keys|
146
+ assert_equal 100, missing_keys.size
147
+ r = {}
148
+ missing_keys.each do |key|
149
+ r[key] = key.to_i
150
+ end
151
+ r
152
+ end
153
+
154
+ assert_equal 200, results.size
155
+ results.each do |key, value|
156
+ assert_equal key.to_i, value
157
+ end
158
+ end
159
+
160
+ def test_get_with_reset_expiry
161
+ m.add('foo', 'quick brown fox', :expiry => 1)
162
+ assert_equal 'quick brown fox', m.get('foo', :expiry => 2)
163
+ sleep(1)
164
+ assert_equal 'quick brown fox', m.get('foo')
165
+ end
166
+
167
+ def test_expiry
168
+ 100.times do |i|
169
+ m.set("int#{i}", i, :expiry => 1)
170
+ assert_equal i, m.get("int#{i}")
171
+
172
+ m.set("time#{i}", i, :expiry => Time.now + 1)
173
+ assert_equal i, m.get("time#{i}")
174
+ end
175
+
176
+ sleep 2
177
+
178
+ 100.times do |i|
179
+ assert_equal nil, m.get("int#{i}")
180
+ assert_equal nil, m.get("time#{i}")
181
+ end
182
+ end
183
+
184
+ def test_in_namespace
185
+ threads = []
186
+ 10.times do |i|
187
+ m.in_namespace("_#{i}_") do
188
+ 10.times do |j|
189
+ m.in_namespace("_#{j}_") do
190
+ assert_equal nil, m.get('foo')
191
+ m.set('foo', 'bar')
192
+ assert_equal 'bar', m.get('foo')
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
198
+
199
+ def test_incr_and_decr
200
+ m.write('foo', 0)
201
+
202
+ m.incr('foo', 100)
203
+ assert_equal 100, m.count('foo')
204
+
205
+ m.decr('foo', 100)
206
+ assert_equal 0, m.count('foo')
207
+
208
+ m.incr('foo', 500)
209
+ assert_equal 500, m.count('foo')
210
+
211
+ m.decr('foo', 300)
212
+ assert_equal 200, m.count('foo')
213
+
214
+ m.decr('foo', 300)
215
+ assert_equal 0, m.count('foo')
216
+ end
217
+
218
+ def test_flags
219
+ m.set('foo', :foo, :flags => 43)
220
+ assert_equal 43, m.get('foo').memcache_flags
221
+
222
+ m.set('foo', 'foo', :raw => true, :flags => 43)
223
+ assert_equal 43, m.get('foo', :raw => true).memcache_flags
224
+ end
225
+
226
+ def test_clone
227
+ m.set('foo', 1)
228
+ c = m.clone
229
+
230
+ assert_not_equal m.servers.collect {|s| s.send(:socket)},
231
+ c.servers.collect {|s| s.send(:socket)}
232
+ end
233
+ end