From 137a764cc78fda4d22bed9186eb2b2f2c496224d Mon Sep 17 00:00:00 2001 From: Alex Young Date: Wed, 27 Jun 2012 16:32:01 +0100 Subject: [PATCH] Add a test for a second client connecting during a mirror --- tests/fakes/source/connect_during_hello.rb | 36 ++++++++++++++++++++++ tests/flexnbd.rb | 4 ++- tests/nbd_scenarios | 10 ++++-- 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100755 tests/fakes/source/connect_during_hello.rb diff --git a/tests/fakes/source/connect_during_hello.rb b/tests/fakes/source/connect_during_hello.rb new file mode 100755 index 0000000..756fa69 --- /dev/null +++ b/tests/fakes/source/connect_during_hello.rb @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby + +# Connect to the destination, then hang. Connect a second time to the +# destinatioin. This will trigger the destination's thread clearer. + +require 'socket' +require 'timeout' + +addr, port = *ARGV + +# client_sock1 is a connection the destination is expecting. +client_sock1 = nil +begin + Timeout.timeout(2) do + client_sock1 = TCPSocket.open( addr, port ) + end +rescue Timeout::Error + $stderr.puts "Timed out connecting." + exit 1 +end + +#client_sock2 is the interloper. +client_sock2 = nil +begin + Timeout.timeout(2) do + client_sock2 = TCPSocket.open( addr, port ) + end +rescue Timeout::Error + $stderr.puts "Timed out connecting a second time." + exit 1 +end + +# This is the expected source crashing after connect +client_sock1.close +# And this is just a tidy-up. +client_sock2.close diff --git a/tests/flexnbd.rb b/tests/flexnbd.rb index 5c49345..229e2de 100644 --- a/tests/flexnbd.rb +++ b/tests/flexnbd.rb @@ -313,7 +313,9 @@ class FlexNBD end def kill - can_die(2) + # At this point, to a certain degree we don't care what the exit + # status is + can_die(1) if @pid begin Process.kill("INT", @pid) diff --git a/tests/nbd_scenarios b/tests/nbd_scenarios index 96a0714..73fa21a 100644 --- a/tests/nbd_scenarios +++ b/tests/nbd_scenarios @@ -263,6 +263,8 @@ class NBDConnectSourceFailureScenarios < Test::Unit::TestCase assert @env.fake_reports_success end + + end @@ -280,26 +282,28 @@ class NBDConnectDestFailureScenarios < Test::Unit::TestCase def test_hello_blocked_by_disconnect_causes_error_not_fatal - @env.nbd1.can_die(1) run_fake( "source/close_after_connect" ) assert_no_control end def test_hello_goes_astray_causes_timeout_error - @env.nbd1.can_die(1) run_fake( "source/hang_after_hello" ) assert_no_control end def test_disconnect_after_hello_causes_error_not_fatal - @env.nbd1.can_die(1) run_fake( "source/close_after_hello" ) assert_no_control end + def test_double_connect_during_hello + run_fake( "source/connect_during_hello" ) + end + + private def run_fake( name ) @env.run_fake( name, @env.ip, @env.port1 )