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"