diff --git a/spec/integration/failover_spec.rb b/spec/integration/failover_spec.rb index a0eaddc..a2e11e4 100644 --- a/spec/integration/failover_spec.rb +++ b/spec/integration/failover_spec.rb @@ -8,7 +8,7 @@ require 'logger_helper' describe "Full Failover support of AMQP gem" do - before(:all) do + before(:each) do @flog = LoggerHelper.new AMQP::Failover.logger = @flog end @@ -19,10 +19,11 @@ describe "Full Failover support of AMQP gem" do end it "should be able to connect" do + port1 = 15672 EM.run { - serv = start_server(15672) + serv = start_server(port1) EM.add_timer(0.1) { - conn = AMQP.connect(:host => 'localhost', :port => 15672) + conn = AMQP.connect(:host => 'localhost', :port => port1) conn.failover.should be_nil EM.add_timer(0.1) { conn.should be_connected @@ -33,26 +34,32 @@ describe "Full Failover support of AMQP gem" do end it "should be able to connect and failover" do + port1 = 25672 + port2 = 35672 EM.run { - serv1 = start_server(25672) - serv2 = start_server(35672) + # start mock amqp servers + serv1 = start_server(port1) + serv2 = start_server(port2) EM.add_timer(0.1) { - conn = AMQP.connect({:hosts => [{:port => 25672}, {:port => 35672}]}) - conn.failover.primary[:port].should == 25672 - conn.settings[:port].should == 25672 + # start amqp client connection and make sure it's picked the right config + conn = AMQP.connect({:hosts => [{:port => port1}, {:port => port2}]}) + conn.failover.primary[:port].should == port1 + conn.settings[:port].should == port1 conn.settings.should == conn.failover.primary EM.add_timer(0.1) { + # make sure client connected to the correct server, then kill server conn.should be_connected serv1.log.should have(3).items serv2.log.should have(0).items serv1.stop EM.add_timer(0.1) { + # make sure client performed a failover when primary server died conn.should be_connected [:error, :info].each do |i| @flog.send("#{i}_log").should have(1).item - @flog.send("#{i}_log")[0][0].should match(/connect to or lost connection.+25672.+attempting connection.+35672/i) + @flog.send("#{i}_log")[0][0].should match(/connect to or lost connection.+#{port1}.+attempting connection.+#{port2}/i) end - conn.settings[:port].should == 35672 + conn.settings[:port].should == port2 serv1.log.should have(3).items serv2.log.should have(3).items conn.close @@ -66,4 +73,51 @@ describe "Full Failover support of AMQP gem" do } end + it "should be able to fallback when primary server returns" do + port1 = 45672 + port2 = 55672 + lambda { + EM.run { + # start mock amqp servers + serv1 = start_server(port1) + serv2 = start_server(port2) + EM.add_timer(0.1) { + # start amqp client connection and make sure it's picked the right config + conn = AMQP.connect({:hosts => [{:port => port1}, {:port => port2}], :fallback => true, :fallback_interval => 0.1}) + conn.failover.primary[:port].should == port1 + conn.settings[:port].should == port1 + conn.settings.should == conn.failover.primary + EM.add_timer(0.1) { + # make sure client connected to the correct server, then kill server + conn.should be_connected + serv1.log.should have(3).items + serv2.log.should have(0).items + serv1.stop + EM.add_timer(0.1) { + # make sure client performed a failover when primary server died + conn.should be_connected + [:error, :info].each do |i| + @flog.send("#{i}_log").should have(1).item + @flog.send("#{i}_log")[0][0].should match(/connect to or lost connection.+#{port1}.+attempting connection.+#{port2}/i) + end + conn.settings[:port].should == port2 + serv1.log.should have(3).items + serv2.log.should have(3).items + serv3 = start_server(port1) + EM.add_timer(0.2) { + # by this point client should have raised a SystemExit exception + serv2.stop + EM.stop + } + } + } + } + } + }.should raise_error(SystemExit, "exit") + [:error, :info].each do |i| + @flog.send("#{i}_log").should have(2).item + @flog.send("#{i}_log")[1][0].should match(/primary server.+45672.+performing clean exit/i) + end + end + end