зеркало из https://github.com/github/memcached.git
331 строка
8.0 KiB
Ruby
331 строка
8.0 KiB
Ruby
require File.expand_path("#{File.dirname(__FILE__)}/../test_helper")
|
|
require 'active_support/duration'
|
|
require 'logger'
|
|
|
|
class RailsTest # TODO
|
|
|
|
def setup
|
|
@servers = ['127.0.0.1:43042', '127.0.0.1:43043', "#{UNIX_SOCKET_NAME}0"]
|
|
@duration = ActiveSupport::Duration.new(2592000, [[:months, 1]])
|
|
@namespace = 'rails_test'
|
|
@cache = Memcached::Rails.new(:servers => @servers, :namespace => @namespace, :logger => Logger.new(File.open("/dev/null", "w")))
|
|
@value = OpenStruct.new(:a => 1, :b => 2, :c => GenericClass)
|
|
@marshalled_value = Marshal.dump(@value)
|
|
end
|
|
|
|
def test_get
|
|
@cache.set key, @value
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
end
|
|
|
|
def test_exist
|
|
@cache.delete(key)
|
|
assert !@cache.exist?(key)
|
|
@cache.set key, nil
|
|
assert @cache.exist?(key)
|
|
@cache.set key, @value
|
|
assert @cache.exist?(key)
|
|
end
|
|
|
|
def test_get_multi
|
|
@cache.set key, @value
|
|
assert_equal(
|
|
{key => @value},
|
|
@cache.get_multi([key]))
|
|
end
|
|
|
|
def test_get_multi_empty_string
|
|
@cache.set key, "", 0, true
|
|
assert_equal(
|
|
{key => ""},
|
|
@cache.get_multi([key], true))
|
|
end
|
|
|
|
def test_delete
|
|
@cache.set key, @value
|
|
assert_nothing_raised do
|
|
@cache.delete key
|
|
end
|
|
assert_nil(@cache.get(key))
|
|
end
|
|
|
|
def test_delete_missing
|
|
assert_nothing_raised do
|
|
@cache.delete key
|
|
assert !@cache.delete(key)
|
|
end
|
|
end
|
|
|
|
def test_delete_with_two_arguments
|
|
assert_nothing_raised do
|
|
@cache.delete(key, 5)
|
|
assert_nil(@cache.get(key))
|
|
end
|
|
end
|
|
|
|
def test_bracket_accessors
|
|
@cache[key] = @value
|
|
result = @cache[key]
|
|
assert_equal @value, result
|
|
end
|
|
|
|
def test_cas
|
|
cache = Memcached::Rails.new(:servers => @servers, :namespace => @namespace, :support_cas => true)
|
|
value2 = OpenStruct.new(:d => 3, :e => 4, :f => GenericClass)
|
|
|
|
# Existing set
|
|
cache.set key, @value
|
|
cache.cas(key) do |current|
|
|
assert_equal @value, current
|
|
value2
|
|
end
|
|
assert_equal value2, cache.get(key)
|
|
|
|
# Missing set
|
|
cache.delete key
|
|
assert_nothing_raised do
|
|
cache.cas(key) { @called = true }
|
|
end
|
|
assert_nil cache.get(key)
|
|
assert_nil @called
|
|
|
|
# Conflicting set after a gets
|
|
cache.set key, @value
|
|
assert_nothing_raised do
|
|
result = cache.cas(key) do |current|
|
|
cache.set key, value2
|
|
current
|
|
end
|
|
assert_equal result, false
|
|
end
|
|
assert_equal value2, cache.get(key)
|
|
end
|
|
|
|
def test_get_missing
|
|
@cache.delete key rescue nil
|
|
result = @cache.get key
|
|
assert_equal nil, result
|
|
end
|
|
|
|
def test_get_nil
|
|
@cache.set key, nil, 0
|
|
result = @cache.get key
|
|
assert_equal nil, result
|
|
end
|
|
|
|
def test_namespace
|
|
assert_equal @namespace, @cache.namespace
|
|
end
|
|
|
|
def test_active
|
|
assert @cache.active?
|
|
end
|
|
|
|
def test_servers
|
|
compare_servers @cache, @servers
|
|
end
|
|
|
|
def test_servers_alive
|
|
@cache.servers.each do |server|
|
|
assert server.alive?
|
|
end
|
|
end
|
|
|
|
def test_set_servers
|
|
cache = Memcached::Rails.new(:servers => @servers, :namespace => @namespace)
|
|
compare_servers cache, @servers
|
|
cache.set_servers cache.servers
|
|
cache = Memcached::Rails.new(:servers => @servers.first, :namespace => @namespace)
|
|
cache.set_servers @servers.first
|
|
end
|
|
|
|
def test_cas_with_duration
|
|
cache = Memcached::Rails.new(:servers => @servers, :namespace => @namespace, :support_cas => true)
|
|
value2 = OpenStruct.new(:d => 3, :e => 4, :f => GenericClass)
|
|
cache.set key, @value
|
|
cache.cas(key, @duration) do |current|
|
|
assert_equal @value, current
|
|
value2
|
|
end
|
|
assert_equal value2, cache.get(key)
|
|
end
|
|
|
|
def test_set_with_duration
|
|
@cache.set key, @value, @duration
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
end
|
|
|
|
def test_set_with_invalid_type
|
|
assert_raises(TypeError) do
|
|
@cache.set key, Object.new, 0, true
|
|
end
|
|
end
|
|
|
|
def test_write_with_default_duration
|
|
# should be do an actual write
|
|
@cache.write key, @value
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
|
|
# should use correct ttl
|
|
@cache = Memcached::Rails.new(:servers => @servers, :namespace => @namespace, :default_ttl => 123)
|
|
@cache.expects(:set).with(key, @value, 123, nil)
|
|
@cache.write key, @value
|
|
end
|
|
|
|
def test_write_with_duration_as_ttl
|
|
# should be do an actual write
|
|
@cache.write key, @value, :ttl => 123
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
|
|
# should use correct ttl
|
|
@cache.expects(:set).with(key, @value, 123, nil)
|
|
@cache.write key, @value, :ttl => 123
|
|
end
|
|
|
|
def test_write_with_duration_as_expires_in
|
|
# should be do an actual write
|
|
@cache.write key, @value, :expires_in => @duration
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
|
|
# should use correct ttl
|
|
@cache.expects(:set).with(key, @value, 123, nil)
|
|
@cache.write key, @value, :expires_in => 123
|
|
end
|
|
|
|
def test_write_with_unless_exist
|
|
@cache.write key, @value, :unless_exist => true
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
|
|
rand_value = "rand-value-#{rand}"
|
|
@cache.write key, rand_value, :unless_exist => true
|
|
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
end
|
|
|
|
def test_write_with_fixnum_and_raw
|
|
@cache.write key, 1, :raw => true
|
|
result = @cache.read key, :raw => true
|
|
assert_equal "1", result
|
|
end
|
|
|
|
def test_add_with_duration
|
|
@cache.add key, @value, @duration
|
|
result = @cache.get key
|
|
assert_equal @value, result
|
|
end
|
|
|
|
def test_fetch
|
|
# returns
|
|
assert_equal @value, @cache.fetch("x"){ @value }
|
|
|
|
# sets
|
|
assert_equal @value, @cache.read("x")
|
|
|
|
# reads
|
|
assert_equal @value, @cache.fetch("x"){ 1 }
|
|
|
|
# works with options
|
|
@cache.expects(:write).with("y", 1, :foo => :bar)
|
|
@cache.fetch("y", :foo => :bar){ 1 }
|
|
end
|
|
|
|
def test_fetch_when_no_block_given
|
|
rand_key = "key-#{rand}"
|
|
|
|
# gets nil the first time
|
|
assert_equal nil, @cache.fetch(rand_key)
|
|
|
|
# sets value to @value
|
|
assert_equal @value, @cache.fetch(rand_key) { @value }
|
|
|
|
# gets @value
|
|
assert_equal @value, @cache.fetch(rand_key)
|
|
end
|
|
|
|
def test_read_multi
|
|
# empty
|
|
assert_equal({}, @cache.read_multi)
|
|
assert_equal({}, @cache.read_multi("a", "b"))
|
|
assert_raise TypeError do
|
|
@cache.read_multi(["a", "b"])
|
|
end
|
|
|
|
# filled
|
|
@cache.write "a", @value
|
|
assert_equal({"a" => @value}, @cache.read_multi("a", "b"))
|
|
assert_raise TypeError do
|
|
@cache.read_multi(["a", "b"])
|
|
end
|
|
|
|
# multiple keys
|
|
@cache.write "b", 1
|
|
assert_equal({"a" => @value, "b" => 1}, @cache.read_multi("a", "b"))
|
|
|
|
# keeps order on 1.9
|
|
if RUBY_VERSION =~ /^1.9/
|
|
assert_equal ["a", "b"], @cache.read_multi("a", "b").keys
|
|
assert_equal ["b", "a"], @cache.read_multi("b", "a").keys
|
|
end
|
|
end
|
|
|
|
def test_clear
|
|
@cache.write("x", 1)
|
|
assert_equal 1, @cache.read("x")
|
|
assert_equal nil, @cache.clear
|
|
assert_equal nil, @cache.read("x")
|
|
end
|
|
|
|
def test_increment
|
|
rand_key = "rand-key-#{rand}"
|
|
assert_equal nil, @cache.increment(rand_key)
|
|
|
|
start = 10
|
|
@cache.write rand_key, start.to_s, { :raw => true }
|
|
|
|
assert_equal start, @cache.read(rand_key, { :raw => true }).to_i
|
|
assert_equal start+1, @cache.increment(rand_key)
|
|
|
|
assert_equal start+1+5, @cache.increment(rand_key, 5)
|
|
end
|
|
|
|
def test_decrement
|
|
rand_key = "rand-key-#{rand}"
|
|
assert_equal nil, @cache.decrement(rand_key)
|
|
|
|
start = 10
|
|
@cache.write rand_key, start.to_s, { :raw => true }
|
|
|
|
assert_equal start, @cache.read(rand_key, { :raw => true }).to_i
|
|
assert_equal start-1, @cache.decrement(rand_key)
|
|
|
|
assert_equal start-1-5, @cache.decrement(rand_key, 5)
|
|
end
|
|
|
|
def test_read_with_nil_options
|
|
@cache.write key, @value
|
|
assert_equal @value, @cache.read(key, nil)
|
|
end
|
|
|
|
def test_write_with_nil_options
|
|
@cache.write key, @value, nil
|
|
assert_equal @value, @cache.read(key)
|
|
end
|
|
|
|
private
|
|
|
|
def key
|
|
caller.first[/.*[` ](.*)'/, 1] # '
|
|
end
|
|
|
|
def compare_servers(cache, servers)
|
|
cache.servers.map{|s| "#{s.hostname}:#{s.port}".chomp(':0')} == servers
|
|
end
|
|
end
|