package jReto.integration;
import jReto.meta.PeerConfiguration;
import jReto.util.Condition;
import jReto.util.OrderVerifier;
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.RemotePeer;
import de.tum.in.www1.jReto.connectivity.Transfer;
import de.tum.in.www1.jReto.util.CountDown;
import static org.junit.Assert.fail;
import static org.junit.Assert.assertFalse;
/**
* Tests whether OutTransfer.Handler and InTransfer.Handler methods are called, and whether they are called in the correct order.
* */
public class TransferHandlingTest {
@Test(timeout=1000)
public void testTransferHandlingDirect() {
new TransferHandlingTest().testTransferHandling(PeerConfiguration.directNeighborConfiguration());
}
@Test(timeout=1000)
public void testTransferHandling2Hop() {
new TransferHandlingTest().testTransferHandling(PeerConfiguration.twoHopRoutedConfiguration());
}
@Test(timeout=1000)
public void testTransferHandling4Hop() {
new TransferHandlingTest().testTransferHandling(PeerConfiguration.fourHopRoutedConfiguration());
}
@Test(timeout=1000)
public void testTransferHandlingNontrivial() {
new TransferHandlingTest().testTransferHandling(PeerConfiguration.nontrivial2HopNetworkConfiguration());
}
@Test(timeout=1000)
public void testTransferHandlingDisconnectedPeers() {
new TransferHandlingTest().testTransferHandling(PeerConfiguration.configurationWithDisconnectedPeers());
}
Condition inStartWasCalled = new Condition("onStart was called in inTransfer", true, true);
Condition outStartWasCalled = new Condition("onStart was called in outTransfer", true, true);
Condition inCompleteWasCalled = new Condition("onComplete was called in inTransfer", true, true);
Condition outCompleteWasCalled = new Condition("onComplete was called in outTransfer", true, true);
Condition inProgressUpdateGiven = new Condition("onBytesFinneshed called in inTransfer", false, false);
Condition outProgressUpdateGiven = new Condition("onBytesFinneshed called in outTransfer", false, false);
OrderVerifier orderVerifier = new OrderVerifier();
RunLoop runloop;
CountDown bothComplete = new CountDown(2, new Runnable() {
@Override
public void run() {
/* 5 */ orderVerifier.check(5);
runloop.stop();
Condition.verifyAll(inStartWasCalled, outStartWasCalled, inCompleteWasCalled, outCompleteWasCalled, inProgressUpdateGiven, outProgressUpdateGiven);
}
});
public void testTransferHandling(final PeerConfiguration configuration) {
this.runloop = configuration.runloop;
/* 1 */ orderVerifier.check(1);
configuration.startAndExecuteAfterDiscovery(() -> {
configuration.peer2.setIncomingConnectionHandler((peer, connection) -> {
/* 3 */ orderVerifier.check(3);
connection.setOnTransfer((c, transfer) -> {
transfer.setOnStart(t -> {
/* 3 */ orderVerifier.check(3);
inStartWasCalled.confirm();
});
transfer.setOnCompleteData((t, data) -> {
/* 4 */ orderVerifier.check(4);
inCompleteWasCalled.confirm();
bothComplete.countDown();
});
transfer.setOnCancel(t -> {
fail("No cancel should happen here.");
});
transfer.setOnProgress(t -> {
inProgressUpdateGiven.confirm();
assertFalse("onBytesFinnished calles may not occurr after a transfer was finnished (error with in transfer).", inCompleteWasCalled.isConfirmed());
});
});
});
RemotePeer destination = configuration.peer1.getPeers().stream().filter(p -> p.getUniqueIdentifier().equals(configuration.peer2.getUniqueIdentifier())).findFirst().get();
Connection connection = destination.connect();
Transfer transfer = connection.send(TestData.generate(10000));
transfer.setOnStart(t -> {
/* 3 */ orderVerifier.check(3);
outStartWasCalled.confirm();
});
transfer.setOnComplete(t -> {
/* 4 */ orderVerifier.check(3);
outCompleteWasCalled.confirm();
bothComplete.countDown();
});
transfer.setOnCancel(t -> {
fail("No cancel should happen here.");
});
transfer.setOnProgress(t -> {
outProgressUpdateGiven.confirm();
assertFalse("onBytesFinnished calles may not occurr after a transfer was finnished (error with out transfer).", outCompleteWasCalled.isConfirmed());
});
});
}
}