From 5c66d356770a64157ed9a10dc4be398a18a315db Mon Sep 17 00:00:00 2001 From: Alex Young Date: Tue, 3 Jul 2012 15:33:00 +0100 Subject: [PATCH] Test that closing the socket immediately after sending write data causes an error --- .../fakes/source/close_after_write_data.rb | 33 +++++++++++++++++++ tests/acceptance/flexnbd/fake_source.rb | 4 +++ tests/acceptance/test_dest_error_handling.rb | 10 +++++- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100755 tests/acceptance/fakes/source/close_after_write_data.rb diff --git a/tests/acceptance/fakes/source/close_after_write_data.rb b/tests/acceptance/fakes/source/close_after_write_data.rb new file mode 100755 index 0000000..082f571 --- /dev/null +++ b/tests/acceptance/fakes/source/close_after_write_data.rb @@ -0,0 +1,33 @@ +#!/usr/bin/env ruby +# encoding: utf-8 + +# We connect, pause the server, issue a write request, send data, +# disconnect, then cont the server. This ensures that our disconnect +# happens before the server can try to write the reply. + +require 'flexnbd/fake_source' +include FlexNBD + +addr, port, srv_pid = *ARGV + +client = FakeSource.new( addr, port, "Timed out connecting" ) +client.read_hello + +Process.kill( "STOP", srv_pid.to_i ) + +client.write_write_request( 0, 8 ) +client.write_data( "12345678" ) +client.close + +Process.kill( "CONT", srv_pid.to_i ) + +# This sleep ensures that we don't return control to the test runner +# too soon, giving the flexnbd process time to fall over if it's going +# to. +sleep(0.25) + +# ...and can we reconnect? +client2 = FakeSource.new( addr, port, "Timed out connecting" ) +client2.close + +exit(0) diff --git a/tests/acceptance/flexnbd/fake_source.rb b/tests/acceptance/flexnbd/fake_source.rb index 76df06e..49ddb5c 100644 --- a/tests/acceptance/flexnbd/fake_source.rb +++ b/tests/acceptance/flexnbd/fake_source.rb @@ -40,6 +40,10 @@ module FlexNBD @sock.write( [len ].pack( 'N' ) ) end + def write_data( data ) + @sock.write( data ) + end + def read_response magic = @sock.read(4) diff --git a/tests/acceptance/test_dest_error_handling.rb b/tests/acceptance/test_dest_error_handling.rb index c534e54..cc28979 100644 --- a/tests/acceptance/test_dest_error_handling.rb +++ b/tests/acceptance/test_dest_error_handling.rb @@ -50,10 +50,18 @@ class TestDestErrorHandling < Test::Unit::TestCase end - def test_disconnect_before_write_reply_causes_error + def test_disconnect_before_write_data_causes_error run_fake( "source/close_after_write" ) end + + def test_disconnect_before_write_reply_causes_error + # Note that this is an odd case: writing the reply doesn't fail. + # The test passes because the next attempt by flexnbd to read a + # request returns EOF. + run_fake( "source/close_after_write_data" ) + end + private def run_fake( name ) @env.run_fake( name, @env.ip, @env.port1 )