1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
require 'spec_helper'
describe EM::Hiredis::BaseClient do
it "should be able to connect to redis (required for all tests!)" do
em {
redis = EM::Hiredis.connect
redis.callback {
done
}
redis.errback {
puts "CHECK THAT THE REDIS SERVER IS RUNNING ON PORT 6379"
fail
}
}
end
it "should emit an event on reconnect failure, with the retry count",
:localhost => true do
# Assumes there is no redis server on 9999
connect(1, "redis://localhost:9999/") do |redis|
expected = 1
redis.on(:reconnect_failed) { |count|
count.should == expected
expected += 1
done if expected == 3
}
end
end
it "should emit disconnected when the connection closes" do
connect do |redis|
redis.on(:disconnected) {
done
}
redis.close_connection
end
end
it "should fail the client deferrable after 4 unsuccessful attempts",
:localhost => true do
connect(1, "redis://localhost:9999/") do |redis|
events = []
redis.on(:reconnect_failed) { |count|
events << count
}
redis.errback { |error|
error.class.should == EM::Hiredis::Error
error.message.should == 'Could not connect after 4 attempts'
events.should == [1,2,3,4]
done
}
end
end
it "should fail commands immediately when in failed state",
:localhost => true do
connect(1, "redis://localhost:9999/") do |redis|
redis.fail
redis.get('foo').errback { |error|
error.class.should == EM::Hiredis::Error
error.message.should == 'Redis connection in failed state'
done
}
end
end
it "should fail queued commands when entering failed state",
:localhost => true do
connect(1, "redis://localhost:9999/") do |redis|
redis.get('foo').errback { |error|
error.class.should == EM::Hiredis::Error
error.message.should == 'Redis connection in failed state'
done
}
redis.fail
end
end
it "should allow reconfiguring the client at runtime",
:localhost => true do
connect(1, "redis://localhost:9999/") do |redis|
redis.on(:reconnect_failed) {
redis.configure("redis://localhost:6379/9")
redis.info {
done
}
}
end
end
it "should allow connection to be reconnected" do
connect do |redis|
redis.on(:reconnected) {
done
}
# Wait for first connection to complete
redis.callback {
redis.reconnect_connection
}
end
end
it "should wrap error responses returned by redis" do
connect do |redis|
redis.sadd('foo', 'bar') {
df = redis.get('foo')
df.callback {
fail "Should have received error response from redis"
}
df.errback { |e|
e.class.should == EM::Hiredis::RedisError
e.should be_kind_of(EM::Hiredis::Error)
msg = "WRONGTYPE Operation against a key holding the wrong kind of value"
e.message.should == msg
# This is the wrapped error from redis:
e.redis_error.class.should == RuntimeError
e.redis_error.message.should == msg
done
}
}
end
end
end
|