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 124 125 126 127 128 129 130 131 132
|
# test/connection_test.rb
require File.expand_path('../test_helper', __FILE__)
describe Beaneater::Connection do
describe 'for #new' do
before do
@host = 'localhost'
@bc = Beaneater::Connection.new(@host)
end
it "should store address, host and port" do
assert_equal 'localhost', @bc.address
assert_equal 'localhost', @bc.host
assert_equal 11300, @bc.port
end
it "should init connection" do
assert_kind_of TCPSocket, @bc.connection
if @bc.connection.peeraddr[0] == 'AF_INET'
assert_equal '127.0.0.1', @bc.connection.peeraddr[3]
else
assert_equal 'AF_INET6', @bc.connection.peeraddr[0]
assert_equal '::1', @bc.connection.peeraddr[3]
end
assert_equal 11300, @bc.connection.peeraddr[1]
end
it "should raise on invalid connection" do
assert_raises(Beaneater::NotConnected) { Beaneater::Connection.new("localhost:8544") }
end
it "should support array connection to single connection" do
@bc2 = Beaneater::Connection.new([@host])
assert_equal 'localhost', @bc.address
assert_equal 'localhost', @bc.host
assert_equal 11300, @bc.port
end
end # new
describe 'for #transmit' do
before do
@host = 'localhost'
@bc = Beaneater::Connection.new(@host)
end
it "should return yaml loaded response" do
res = @bc.transmit 'stats'
refute_nil res[:body]['current-connections']
assert_equal 'OK', res[:status]
end
it "should return id" do
res = @bc.transmit "put 0 0 100 1\r\nX"
assert res[:id]
assert_equal 'INSERTED', res[:status]
end
it "should support dashes in response" do
res = @bc.transmit "use foo-bar\r\n"
assert_equal 'USING', res[:status]
assert_equal 'foo-bar', res[:id]
end
it "should pass crlf through without changing its length" do
res = @bc.transmit "put 0 0 100 2\r\n\r\n"
assert_equal 'INSERTED', res[:status]
end
it "should handle *any* byte value without changing length" do
res = @bc.transmit "put 0 0 100 256\r\n"+(0..255).to_a.pack("c*")
assert_equal 'INSERTED', res[:status]
end
it "should retry command with success after one connection failure" do
TCPSocket.any_instance.expects(:readline).times(2).
raises(EOFError.new).then.
returns("DELETED 56\nFOO")
res = @bc.transmit "delete 56\r\n"
assert_equal 'DELETED', res[:status]
end
it "should fail after exceeding retries with DrainingError" do
TCPSocket.any_instance.expects(:readline).times(3).
raises(Beaneater::UnexpectedResponse.from_status("DRAINING", "delete 56"))
assert_raises(Beaneater::DrainingError) { @bc.transmit "delete 56\r\n" }
end
it "should fail after exceeding reconnect max retries" do
# next connection attempts should fail
TCPSocket.stubs(:new).times(3).raises(Errno::ECONNREFUSED.new)
TCPSocket.any_instance.stubs(:readline).times(1).raises(EOFError.new)
assert_raises(Beaneater::NotConnected) { @bc.transmit "delete 56\r\n" }
end
it "tubes_watched are restored after reconnect" do
client = Beaneater.new('127.0.0.1:11300')
client.tubes.watch! "another"
TCPSocket.prepend Module.new {
def readline
if !$called
$called = true
raise EOFError
end
super
end
}
assert_equal %w[another], client.tubes.watched.map(&:name)
end
end # transmit
describe 'for #close' do
before do
@host = 'localhost'
@bc = Beaneater::Connection.new(@host)
end
it "should clear connection" do
assert_kind_of TCPSocket, @bc.connection
@bc.close
assert_nil @bc.connection
assert_raises(Beaneater::NotConnected) { @bc.transmit 'stats' }
end
end # close
end # Beaneater::Connection
|