From d5853e84036842e24b2c17c54ac01fe69bc9c5f7 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Wed, 16 Jun 2021 12:26:54 +0100 Subject: [PATCH] Add integration test for eager retransmission. --- .../test/TestDuplexTransportConnection.java | 2 +- .../test/TestTransportConnectionWriter.java | 7 +- .../SimplexMessagingIntegrationTest.java | 64 ++++++++++++++++--- .../briar/test/BriarIntegrationTest.java | 4 +- 4 files changed, 62 insertions(+), 15 deletions(-) diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestDuplexTransportConnection.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDuplexTransportConnection.java index 0ed6f9045..83ec8129e 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/TestDuplexTransportConnection.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDuplexTransportConnection.java @@ -25,7 +25,7 @@ public class TestDuplexTransportConnection @SuppressWarnings("WeakerAccess") public TestDuplexTransportConnection(InputStream in, OutputStream out) { reader = new TestTransportConnectionReader(in); - writer = new TestTransportConnectionWriter(out); + writer = new TestTransportConnectionWriter(out, false); } @Override diff --git a/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java index bf382e8e5..44e570fd7 100644 --- a/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java +++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestTransportConnectionWriter.java @@ -15,10 +15,13 @@ public class TestTransportConnectionWriter implements TransportConnectionWriter { private final OutputStream out; + private final boolean lossyAndCheap; private final CountDownLatch disposed = new CountDownLatch(1); - public TestTransportConnectionWriter(OutputStream out) { + public TestTransportConnectionWriter(OutputStream out, + boolean lossyAndCheap) { this.out = out; + this.lossyAndCheap = lossyAndCheap; } public CountDownLatch getDisposedLatch() { @@ -37,7 +40,7 @@ public class TestTransportConnectionWriter @Override public boolean isLossyAndCheap() { - return false; + return lossyAndCheap; } @Override diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java index 16e540e95..aedefb63a 100644 --- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java @@ -11,7 +11,9 @@ import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.lifecycle.LifecycleManager; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; +import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.event.MessageStateChangedEvent; +import org.briarproject.bramble.api.sync.event.MessagesSentEvent; import org.briarproject.bramble.test.TestDatabaseConfigModule; import org.briarproject.bramble.test.TestTransportConnectionReader; import org.briarproject.bramble.test.TestTransportConnectionWriter; @@ -71,7 +73,16 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { } @Test - public void testWriteAndRead() throws Exception { + public void testWriteAndReadWithLazyRetransmission() throws Exception { + testWriteAndRead(false); + } + + @Test + public void testWriteAndReadWithEagerRetransmission() throws Exception { + testWriteAndRead(true); + } + + private void testWriteAndRead(boolean eager) throws Exception { // Create the identities Identity aliceIdentity = alice.getIdentityManager().createIdentity("Alice"); @@ -86,16 +97,20 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { bob.getEventBus().addListener(listener); // Alice sends a private message to Bob sendMessage(alice, bobId); - // Sync Alice's client versions and transport properties - read(bob, write(alice, bobId), 2); - // Sync Bob's client versions and transport properties - read(alice, write(bob, aliceId), 2); - // Sync the private message and the attachment - read(bob, write(alice, bobId), 2); + // Sync Alice's client versions + read(bob, write(alice, bobId, eager, 1), 1); + // Sync Bob's client versions + read(alice, write(bob, aliceId, eager, 1), 1); + // Sync Alice's client versions, the private message and the attachment + read(bob, write(alice, bobId, eager, 3), 3); // Bob should have received the private message assertTrue(listener.messageAdded); // Bob should have received the attachment assertTrue(listener.attachmentAdded); + // Sync messages from Alice to Bob again. If using eager + // retransmission, the three unacked messages should be sent again. + // They're all duplicates, so no further deliveries should occur + read(bob, write(alice, bobId, eager, eager ? 3 : 0), 0); } private ContactId setUp(SimplexMessagingIntegrationTestComponent device, @@ -149,15 +164,24 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { } private byte[] write(SimplexMessagingIntegrationTestComponent device, - ContactId contactId) throws Exception { + ContactId contactId, boolean eager, int transmissions) + throws Exception { + // Listen for message transmissions + MessageTransmissionListener listener = + new MessageTransmissionListener(transmissions); + device.getEventBus().addListener(listener); // Write the outgoing stream ByteArrayOutputStream out = new ByteArrayOutputStream(); TestTransportConnectionWriter writer = - new TestTransportConnectionWriter(out); + new TestTransportConnectionWriter(out, eager); device.getConnectionManager().manageOutgoingConnection(contactId, SIMPLEX_TRANSPORT_ID, writer); // Wait for the writer to be disposed writer.getDisposedLatch().await(TIMEOUT_MS, MILLISECONDS); + // Check that the expected number of messages were sent + assertTrue(listener.sent.await(TIMEOUT_MS, MILLISECONDS)); + // Clean up the listener + device.getEventBus().removeListener(listener); // Return the contents of the stream return out.toByteArray(); } @@ -178,6 +202,24 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { deleteTestDirectory(testDir); } + @NotNullByDefault + private static class MessageTransmissionListener implements EventListener { + + private final CountDownLatch sent; + + private MessageTransmissionListener(int transmissions) { + sent = new CountDownLatch(transmissions); + } + + @Override + public void eventOccurred(Event e) { + if (e instanceof MessagesSentEvent) { + MessagesSentEvent m = (MessagesSentEvent) e; + for (MessageId ignored : m.getMessageIds()) sent.countDown(); + } + } + } + @NotNullByDefault private static class MessageDeliveryListener implements EventListener { @@ -191,7 +233,9 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { public void eventOccurred(Event e) { if (e instanceof MessageStateChangedEvent) { MessageStateChangedEvent m = (MessageStateChangedEvent) e; - if (m.getState().equals(DELIVERED)) delivered.countDown(); + if (!m.isLocal() && m.getState().equals(DELIVERED)) { + delivered.countDown(); + } } } } diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java index 0bcdab2a9..e493b4fa5 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java @@ -429,7 +429,7 @@ public abstract class BriarIntegrationTest