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.
- data/.gitignore +1 -0
- data/LICENSE +20 -0
- data/README.rdoc +215 -0
- data/Rakefile +56 -0
- data/VERSION.yml +5 -0
- data/lib/memcache/local_server.rb +107 -0
- data/lib/memcache/migration.rb +23 -0
- data/lib/memcache/null_server.rb +30 -0
- data/lib/memcache/pg_server.rb +163 -0
- data/lib/memcache/segmented_server.rb +116 -0
- data/lib/memcache/server.rb +265 -0
- data/lib/memcache.rb +409 -0
- data/segmented-memcache.gemspec +68 -0
- data/test/memcache_local_server_test.rb +11 -0
- data/test/memcache_null_server_test.rb +65 -0
- data/test/memcache_pg_server_test.rb +28 -0
- data/test/memcache_segmented_server_test.rb +21 -0
- data/test/memcache_server_test.rb +35 -0
- data/test/memcache_server_test_helper.rb +159 -0
- data/test/memcache_test.rb +233 -0
- data/test/test_helper.rb +26 -0
- metadata +83 -0
@@ -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
|