public void TestFailoverTransportConnectionControlHandling()
{
Uri uri = new Uri("failover:(mock://localhost:61613)?transport.randomize=false");
string reconnectTo = "mock://localhost:61616?transport.name=Reconnected";
string connectedBrokers = "mock://localhost:61617?transport.name=Broker1," +
"mock://localhost:61618?transport.name=Broker2";
FailoverTransportFactory factory = new FailoverTransportFactory();
using(ITransport transport = factory.CreateTransport(uri))
{
Assert.IsNotNull(transport);
transport.Command = OnCommand;
transport.Exception = OnException;
FailoverTransport failover = transport.Narrow(typeof(FailoverTransport)) as FailoverTransport;
Assert.IsNotNull(failover);
Assert.IsFalse(failover.Randomize);
failover.Resumed = OnResumed;
const int MAX_ATTEMPTS = 50;
transport.Start();
for(int i = 0; i < MAX_ATTEMPTS; ++i)
{
if(failover.IsConnected)
{
break;
}
Thread.Sleep(100);
}
Assert.IsTrue(failover.IsConnected);
// Ensure the current mock transport has the correct outgoing command handler
MockTransport mock = transport.Narrow(typeof(MockTransport)) as MockTransport;
Assert.IsNotNull(mock);
Assert.AreEqual(61613, mock.RemoteAddress.Port);
VerifyCommandHandlerSetting(transport, mock);
mock.OutgoingCommand = OnOutgoingCommand;
mock.InjectCommand(new ConnectionControl()
{
FaultTolerant = true,
ReconnectTo = reconnectTo,
ConnectedBrokers = connectedBrokers
});
// Give a bit of time for the Command to actually be processed.
Thread.Sleep(2000);
failover.Remove(true, "mock://localhost:61613");
mock = null;
for(int i = 0; i < MAX_ATTEMPTS; ++i)
{
mock = transport.Narrow(typeof(MockTransport)) as MockTransport;
if(mock != null)
{
break;
}
Thread.Sleep(100);
}
Assert.IsNotNull(mock, "Error reconnecting to failover broker.");
Assert.AreEqual(61616, mock.RemoteAddress.Port);
Assert.AreEqual("Reconnected", mock.Name);
}
}