package jReto.integration; import static org.junit.Assert.*; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import jReto.module.dummy.DummyAddress; import jReto.module.dummy.DummyConnection; import jReto.module.dummy.DummyModule; import jReto.module.dummy.DummyNetworkInterface; import jReto.util.RunLoop; import jReto.util.TestData; import org.junit.Test; import de.tum.in.www1.jReto.Connection; import de.tum.in.www1.jReto.LocalPeer; import de.tum.in.www1.jReto.connectivity.Transfer; /** * When a connection fails, a reconnect should be attempted and the transfer should complete successfully. * */ public class ReconnectTest { RunLoop runloop = new RunLoop(false); DummyNetworkInterface manager = new DummyNetworkInterface("test", runloop, 1024, 1); int dataLength = 100000; Set<DummyConnection> connections = new HashSet<>(); boolean sabotaged = false; boolean recordConnections = false; int count = 0; @Test(timeout=10000000) public void testReconnect() { manager.connectionCreatedHook = new DummyNetworkInterface.DummyConnectionCreatedHook() { @Override public void createdConnection(DummyAddress address, DummyConnection connection) { if (recordConnections) connections.add(connection); } }; LocalPeer localPeer1 = new LocalPeer(Arrays.asList(new DummyModule(manager, runloop)), runloop); LocalPeer localPeer2 = new LocalPeer(Arrays.asList(new DummyModule(manager, runloop)), runloop); localPeer1.start(discoveredPeer -> { recordConnections = true; Connection connection = discoveredPeer.connect(); recordConnections = false; Transfer transfer = connection.send(TestData.generate(dataLength)); transfer.setOnProgress(t -> { System.out.println("Finnished: "+t.getProgress() +" of "+t.getLength()); if (!sabotaged) { sabotaged = true; assertTrue(connections.size() > 0); System.out.println("Sent some data, sabotaging: "+connections.size()); for (DummyConnection dummyConnection : connections) dummyConnection.sabotage(); } }); }, p -> {}); localPeer2.start(p -> {}, p -> {}, (peer, connection) -> { connection.setOnTransfer((c, transfer) -> { transfer.setOnCompleteData((t, data) -> { TestData.verify(data, dataLength); System.out.println("Successfully finished!"); runloop.stop(); }); }); }); runloop.start(); } }