Files
flexnbd-c/tests/acceptance/test_source_error_handling.rb
Alex Young eb90308b6e Handle a failed disconnect correctly
If the sender disconnects its socket before sending the disconnect
message, the destination should restart the migration process.  This
patch makes sure that happens.
2012-07-12 09:39:39 +01:00

110 lines
2.2 KiB
Ruby

# encoding: utf-8
require 'test/unit'
require 'environment'
class TestSourceErrorHandling < Test::Unit::TestCase
def setup
@env = Environment.new
@env.writefile1( "f" * 4 )
@env.serve1
end
def teardown
@env.nbd1.can_die(0)
@env.cleanup
end
def test_failure_to_connect_reported_in_mirror_cmd_response
stdout, stderr = @env.mirror12_unchecked
assert_match( /failed to connect/, stderr )
end
def test_destination_hangs_after_connect_reports_error_at_source
run_fake( "dest/hang_after_connect",
:err => /Remote server failed to respond/ )
end
def test_destination_rejects_connection_reports_error_at_source
run_fake( "dest/reject_acl",
:err => /Mirror was rejected/ )
end
def test_wrong_size_causes_disconnect
run_fake( "dest/hello_wrong_size",
:err => /Remote size does not match local size/ )
end
def test_wrong_magic_causes_disconnect
run_fake( "dest/hello_wrong_magic",
:err => /Mirror was rejected/ )
end
def test_disconnect_after_hello_causes_retry
run_fake( "dest/close_after_hello",
:out => /Mirror started/ )
end
def test_write_times_out_causes_retry
run_fake( "dest/hang_after_write" )
end
def test_rejected_write_causes_retry
run_fake( "dest/error_on_write" )
end
def test_disconnect_before_write_reply_causes_retry
run_fake( "dest/close_after_write" )
end
def test_bad_write_reply_causes_retry
run_fake( "dest/write_wrong_magic" )
end
def test_pre_entrust_disconnect_causes_retry
run_fake( "dest/close_after_writes" )
end
def test_post_entrust_disconnect_causes_retry
@env.nbd1.can_die(0)
run_fake( "dest/close_after_entrust" )
end
def test_entrust_error_causes_retry
run_fake( "dest/error_on_entrust" )
end
private
def run_fake(name, opts = {})
@env.run_fake( name, @env.ip, @env.port2 )
stdout, stderr = @env.mirror12_unchecked
assert_success
assert_match( opts[:err], stderr ) if opts[:err]
assert_match( opts[:out], stdout ) if opts[:out]
return stdout, stderr
end
def assert_success( msg=nil )
assert @env.fake_reports_success, msg || "Fake failed"
end
end # class TestSourceErrorHandling