package jReto.integration; import static org.junit.Assert.*; import jReto.meta.PeerConfiguration; import jReto.util.TestData; import org.junit.Test; import de.tum.in.www1.jReto.Connection; import de.tum.in.www1.jReto.RemotePeer; import de.tum.in.www1.jReto.connectivity.Transfer; import de.tum.in.www1.jReto.util.CountDown; public class TransferCancellationTest { @Test(timeout=1000) public void testTransferDataIntegrityDirect() { new TransferCancellationTest().testTransferCancellation(PeerConfiguration.directNeighborConfiguration()); } @Test(timeout=1000) public void testTransferDataIntegrity2Hop() { new TransferCancellationTest().testTransferCancellation(PeerConfiguration.twoHopRoutedConfiguration()); } @Test(timeout=1000) public void testTransferDataIntegrity4Hop() { new TransferCancellationTest().testTransferCancellation(PeerConfiguration.fourHopRoutedConfiguration()); } @Test(timeout=1000) public void testTransferDataIntegrityNontrivial() { new TransferCancellationTest().testTransferCancellation(PeerConfiguration.nontrivial2HopNetworkConfiguration()); } @Test(timeout=1000) public void testTransferDataIntegrityDisconnectedPeers() { new TransferCancellationTest().testTransferCancellation(PeerConfiguration.configurationWithDisconnectedPeers()); } int dataLength = 1000000; boolean didCancel = false; public void testTransferCancellation(final PeerConfiguration peerConfiguration) { CountDown cancellationCountDown = new CountDown(2, () -> peerConfiguration.runloop.stop()); peerConfiguration.startAndExecuteAfterDiscovery(() -> { peerConfiguration.peer2.setIncomingConnectionHandler((connectingPeer, connection) -> { connection.setOnTransfer((c, transfer) -> { transfer.setOnCompleteData((t, data) -> {}); // We don't care about the data, but need to set a data handler to keep the transfer from complaining transfer.setOnComplete(t -> fail("Transfer should not complete.")); transfer.setOnCancel(t -> { assertTrue("transfer should have cancelled state", t.getIsCancelled()); assertFalse("transfer should not be completed", t.getIsCompleted()); cancellationCountDown.countDown(); }); transfer.setOnProgress(t -> { // When we get the first progress update, we cancel the transfer. if (!didCancel) { didCancel = true; peerConfiguration.runloop.execute(() -> { transfer.cancel(); }); } }); }); }); RemotePeer destination = peerConfiguration.peer1.getPeers().stream().filter(p -> p.getUniqueIdentifier().equals(peerConfiguration.peer2.getUniqueIdentifier())).findFirst().get(); Connection connection = destination.connect(); Transfer outTransfer = connection.send(TestData.generate(dataLength)); outTransfer.setOnComplete(t -> fail("Transfer should not complete.")); outTransfer.setOnCancel(t -> { assertTrue("transfer should have cancelled state", t.getIsCancelled()); assertFalse("transfer should not be completed", t.getIsCompleted()); cancellationCountDown.countDown(); }); }); } }