
This is important because if we try to rebind after a migration and someone else is in the way, any clients trying to reconnect to us will instead be connecting to the squatter.
109 lines
2.3 KiB
Ruby
109 lines
2.3 KiB
Ruby
# encoding: utf-8
|
|
|
|
require 'test/unit'
|
|
require 'environment'
|
|
|
|
class TestDestErrorHandling < Test::Unit::TestCase
|
|
|
|
def setup
|
|
@env = Environment.new
|
|
@env.writefile1( "0" * 4 )
|
|
@env.listen1
|
|
end
|
|
|
|
def teardown
|
|
@env.cleanup
|
|
end
|
|
|
|
|
|
def test_hello_blocked_by_disconnect_causes_error_not_fatal
|
|
run_fake( "source/close_after_connect" )
|
|
assert_no_control
|
|
end
|
|
|
|
|
|
def test_hello_goes_astray_causes_timeout_error
|
|
run_fake( "source/hang_after_hello" )
|
|
assert_no_control
|
|
end
|
|
|
|
|
|
def test_disconnect_after_hello_causes_error_not_fatal
|
|
run_fake( "source/close_after_hello" )
|
|
assert_no_control
|
|
end
|
|
|
|
|
|
def test_partial_read_causes_error
|
|
run_fake( "source/close_mid_read" )
|
|
end
|
|
|
|
def test_double_connect_during_hello
|
|
run_fake( "source/connect_during_hello" )
|
|
end
|
|
|
|
|
|
def test_acl_rejection
|
|
@env.acl1("127.0.0.1")
|
|
run_fake( "source/connect_from_banned_ip")
|
|
end
|
|
|
|
|
|
def test_bad_write
|
|
run_fake( "source/write_out_of_range" )
|
|
end
|
|
|
|
|
|
def test_disconnect_before_write_data_causes_error
|
|
run_fake( "source/close_after_write" )
|
|
end
|
|
|
|
def test_disconnect_before_entrust_reply_causes_error
|
|
run_fake( "source/close_after_entrust" )
|
|
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
|
|
|
|
|
|
def test_disconnect_after_entrust_reply_causes_error
|
|
@env.nbd1.can_die(0)
|
|
# This fake runs a failed migration then a succeeding one, so we
|
|
# expect the destination to take control.
|
|
run_fake( "source/close_after_entrust_reply" )
|
|
assert_control
|
|
end
|
|
|
|
|
|
def test_cant_rebind_dies
|
|
@env.nbd1.can_die(6)
|
|
run_fake( "source/successful_transfer" )
|
|
end
|
|
|
|
|
|
private
|
|
def run_fake( name )
|
|
@env.run_fake( name, @env.ip, @env.port1, @env.ip, @env.rebind_port1 )
|
|
assert @env.fake_reports_success, "#{name} failed."
|
|
end
|
|
|
|
def status
|
|
stat, _ = @env.status1
|
|
stat
|
|
end
|
|
|
|
def assert_no_control
|
|
assert !status['has_control'], "Thought it had control"
|
|
end
|
|
|
|
def assert_control
|
|
assert status['has_control'], "Didn't think it had control"
|
|
end
|
|
|
|
end # class TestDestErrorHandling
|