test/test_mem_cache.rb in fiveruns-memcache-client-1.5.0.3 vs test/test_mem_cache.rb in fiveruns-memcache-client-1.5.0.4
- old
+ new
@@ -1,13 +1,12 @@
+# encoding: utf-8
require 'stringio'
require 'test/unit'
-require 'rubygems'
-require 'test/zentest_assertions'
$TESTING = true
-require 'memcache'
+require File.dirname(__FILE__) + '/../lib/memcache'
class MemCache
attr_writer :namespace
@@ -84,26 +83,27 @@
assert_equal "lost connection to example.com:11211", e.message
end
def test_cache_get_bad_state
server = FakeServer.new
- server.socket.data.write "bogus response\r\n"
+
+ # Write two messages to the socket to test failover
+ server.socket.data.write "bogus response\r\nbogus response\r\n"
server.socket.data.rewind
@cache.servers = []
@cache.servers << server
e = assert_raise MemCache::MemCacheError do
@cache.cache_get(server, 'my_namespace:key')
end
- assert_equal "unexpected response \"bogus response\\r\\n\"", e.message
+ assert_match /#{Regexp.quote 'unexpected response "bogus response\r\n"'}/, e.message
- deny server.alive?
+ assert !server.alive?
- assert_equal "get my_namespace:key\r\n",
- server.socket.written.string
+ assert_match /get my_namespace:key\r\n/, server.socket.written.string
end
def test_cache_get_miss
socket = FakeSocket.new
socket.data.write "END\r\n"
@@ -143,32 +143,39 @@
assert_equal "lost connection to example.com:11211", e.message
end
def test_cache_get_multi_bad_state
server = FakeServer.new
- server.socket.data.write "bogus response\r\n"
+
+ # Write two messages to the socket to test failover
+ server.socket.data.write "bogus response\r\nbogus response\r\n"
server.socket.data.rewind
@cache.servers = []
@cache.servers << server
e = assert_raise MemCache::MemCacheError do
@cache.cache_get_multi server, 'my_namespace:key'
end
- assert_equal "unexpected response \"bogus response\\r\\n\"", e.message
+ assert_match /#{Regexp.quote 'unexpected response "bogus response\r\n"'}/, e.message
- deny server.alive?
+ assert !server.alive?
- assert_equal "get my_namespace:key\r\n",
- server.socket.written.string
+ assert_match /get my_namespace:key\r\n/, server.socket.written.string
end
def test_crc32_ITU_T
assert_equal 0, ''.crc32_ITU_T
- assert_equal 1260851911, 'my_namespace:key'.crc32_ITU_T
+ # First value is the fast C version, last value is the pure Ruby version
+ assert_in [-886631737, 1260851911], 'my_namespace:key'.crc32_ITU_T
+ assert_in [-224284233, 870540390], 'my_nameāspace:key'.crc32_ITU_T
end
+
+ def assert_in(possible_values, value)
+ assert possible_values.include?(value), "#{possible_values.inspect} should contain #{value}"
+ end
def test_initialize
cache = MemCache.new :namespace => 'my_namespace', :readonly => true
assert_equal 'my_namespace', cache.namespace
@@ -214,11 +221,11 @@
:namespace => 'my_namespace', :readonly => true
assert_equal 'my_namespace', cache.namespace
assert_equal true, cache.readonly?
assert_equal false, cache.servers.empty?
- deny_empty cache.instance_variable_get(:@buckets)
+ assert !cache.instance_variable_get(:@buckets).empty?
end
def test_initialize_too_many_args
assert_raises ArgumentError do
MemCache.new 1, 2, 3
@@ -501,11 +508,13 @@
@cache.servers = []
@cache.servers << server
@cache.set 'key', 'value'
- expected = "set my_namespace:key 0 0 9\r\n\004\b\"\nvalue\r\n"
+ dumped = Marshal.dump('value')
+ expected = "set my_namespace:key 0 0 #{dumped.length}\r\n#{dumped}\r\n"
+# expected = "set my_namespace:key 0 0 9\r\n\004\b\"\nvalue\r\n"
assert_equal expected, server.socket.written.string
end
def test_set_expiry
server = FakeServer.new
@@ -514,11 +523,12 @@
@cache.servers = []
@cache.servers << server
@cache.set 'key', 'value', 5
- expected = "set my_namespace:key 0 5 9\r\n\004\b\"\nvalue\r\n"
+ dumped = Marshal.dump('value')
+ expected = "set my_namespace:key 0 5 #{dumped.length}\r\n#{dumped}\r\n"
assert_equal expected, server.socket.written.string
end
def test_set_raw
server = FakeServer.new
@@ -543,32 +553,37 @@
assert_equal 'Update of readonly cache', e.message
end
def test_set_too_big
server = FakeServer.new
- server.socket.data.write "SERVER_ERROR object too large for cache\r\n"
+
+ # Write two messages to the socket to test failover
+ server.socket.data.write "SERVER_ERROR\r\nSERVER_ERROR object too large for cache\r\n"
server.socket.data.rewind
+
@cache.servers = []
@cache.servers << server
e = assert_raise MemCache::MemCacheError do
@cache.set 'key', 'v'
end
- assert_equal 'object too large for cache', e.message
+ assert_match /object too large for cache/, e.message
end
def test_add
server = FakeServer.new
server.socket.data.write "STORED\r\n"
server.socket.data.rewind
@cache.servers = []
@cache.servers << server
@cache.add 'key', 'value'
+
+ dumped = Marshal.dump('value')
- expected = "add my_namespace:key 0 0 9\r\n\004\b\"\nvalue\r\n"
+ expected = "add my_namespace:key 0 0 #{dumped.length}\r\n#{dumped}\r\n"
assert_equal expected, server.socket.written.string
end
def test_add_exists
server = FakeServer.new
@@ -577,11 +592,12 @@
@cache.servers = []
@cache.servers << server
@cache.add 'key', 'value'
- expected = "add my_namespace:key 0 0 9\r\n\004\b\"\nvalue\r\n"
+ dumped = Marshal.dump('value')
+ expected = "add my_namespace:key 0 0 #{dumped.length}\r\n#{dumped}\r\n"
assert_equal expected, server.socket.written.string
end
def test_add_expiry
server = FakeServer.new
@@ -590,11 +606,12 @@
@cache.servers = []
@cache.servers << server
@cache.add 'key', 'value', 5
- expected = "add my_namespace:key 0 5 9\r\n\004\b\"\nvalue\r\n"
+ dumped = Marshal.dump('value')
+ expected = "add my_namespace:key 0 5 #{dumped.length}\r\n#{dumped}\r\n"
assert_equal expected, server.socket.written.string
end
def test_add_raw
server = FakeServer.new
@@ -653,24 +670,25 @@
end
end
def test_flush_all_failure
socket = FakeSocket.new
- socket.data.write "ERROR\r\n"
+
+ # Write two messages to the socket to test failover
+ socket.data.write "ERROR\r\nERROR\r\n"
socket.data.rewind
+
server = FakeServer.new socket
- def server.host() "localhost"; end
- def server.port() 11211; end
@cache.servers = []
@cache.servers << server
assert_raise MemCache::MemCacheError do
@cache.flush_all
end
- assert_equal "flush_all\r\n", socket.written.string
+ assert_match /flush_all\r\n/, socket.written.string
end
def test_stats
socket = FakeSocket.new
socket.data.write "STAT pid 20188\r\nSTAT total_items 32\r\nSTAT version 1.2.3\r\nSTAT rusage_user 1:300\r\nSTAT dummy ok\r\nEND\r\n"
@@ -695,27 +713,47 @@
def test_basic_threaded_operations_should_work
cache = MemCache.new :multithread => true,
:namespace => 'my_namespace',
:readonly => false
- server = util_setup_server cache, 'example.com', "OK\r\n"
- cache.instance_variable_set :@servers, [server]
+ server = FakeServer.new
+ server.socket.data.write "STORED\r\n"
+ server.socket.data.rewind
+
+ cache.servers = []
+ cache.servers << server
+
+ assert cache.multithread
+
assert_nothing_raised do
cache.set "test", "test value"
end
+
+ # TODO Fails in 1.9
+ assert_match /set my_namespace:test.*\r\n.*test value.*\r\n/, server.socket.written.string
end
def test_basic_unthreaded_operations_should_work
cache = MemCache.new :multithread => false,
:namespace => 'my_namespace',
:readonly => false
- server = util_setup_server cache, 'example.com', "OK\r\n"
- cache.instance_variable_set :@servers, [server]
+ server = FakeServer.new
+ server.socket.data.write "STORED\r\n"
+ server.socket.data.rewind
+
+ cache.servers = []
+ cache.servers << server
+
+ assert !cache.multithread
+
assert_nothing_raised do
cache.set "test", "test value"
end
+
+ # TODO Fails in 1.9
+ assert_match /set my_namespace:test.*\r\n.*test value\r\n/, server.socket.written.string
end
def util_setup_fake_server
server = FakeServer.new
server.socket.data.write "VALUE my_namespace:key 0 14\r\n"