From f42a9a20d8c77d89e659138fb6bdf1e4845f39a4 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 8 Mar 2021 11:40:44 -0300 Subject: [PATCH 1/2] Add a way to check for expected events and use it for private group auto-declines --- .../invitation/AutoDeleteIntegrationTest.java | 29 +++++++++- .../briar/test/BriarIntegrationTest.java | 2 +- .../briar/test/TestEventListener.java | 58 +++++++++++++++++++ 3 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 briar-core/src/test/java/org/briarproject/briar/test/TestEventListener.java diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AutoDeleteIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AutoDeleteIntegrationTest.java index b625f3192..d7e090866 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AutoDeleteIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AutoDeleteIntegrationTest.java @@ -4,10 +4,12 @@ import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.briar.api.autodelete.event.ConversationMessagesDeletedEvent; import org.briarproject.briar.api.conversation.ConversationManager.ConversationClient; import org.briarproject.briar.api.privategroup.GroupMessage; import org.briarproject.briar.api.privategroup.PrivateGroup; import org.briarproject.briar.api.privategroup.PrivateGroupManager; +import org.briarproject.briar.api.privategroup.event.GroupInvitationResponseReceivedEvent; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; @@ -21,6 +23,7 @@ import javax.annotation.Nullable; import static org.briarproject.bramble.api.cleanup.CleanupManager.BATCH_DELAY_MS; import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.MIN_AUTO_DELETE_TIMER_MS; import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; +import static org.briarproject.briar.test.TestEventListener.assertEvent; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -94,8 +97,15 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest { // When 0's timer has elapsed, the message should be deleted from 0's // view of the conversation but 1 should still see the message - c0.getTimeTravel().addCurrentTimeMillis(1); + ConversationMessagesDeletedEvent event = assertEvent(c0, + ConversationMessagesDeletedEvent.class, () -> + c0.getTimeTravel().addCurrentTimeMillis(1) + ); c1.getTimeTravel().addCurrentTimeMillis(1); + + // assert that the proper event got broadcast + assertEquals(contactId1From0, event.getContactId()); + assertGroupCount(c0, contactId1From0, 0, 0); assertEquals(0, getMessageHeaders(c0, contactId1From0).size()); assertGroupCount(c1, contactId0From1, 1, 1); @@ -118,7 +128,13 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest { // When 1's timer has elapsed, the message should be deleted from 1's // view of the conversation and the invitation auto-declined c0.getTimeTravel().addCurrentTimeMillis(1); - c1.getTimeTravel().addCurrentTimeMillis(1); + GroupInvitationResponseReceivedEvent e = assertEvent(c1, + GroupInvitationResponseReceivedEvent.class, () -> + c1.getTimeTravel().addCurrentTimeMillis(1) + ); + // assert that the proper event got broadcast + assertEquals(contactId0From1, e.getContactId()); + assertGroupCount(c0, contactId1From0, 0, 0); assertEquals(0, getMessageHeaders(c0, contactId1From0).size()); assertGroupCount(c1, contactId0From1, 1, 0); @@ -126,6 +142,7 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest { // The only message is not the same as before, but declined response assertNotEquals(messageId0, h.getId()); assertTrue(h instanceof GroupInvitationResponse); + assertEquals(h.getId(), e.getMessageHeader().getId()); assertFalse(((GroupInvitationResponse) h).wasAccepted()); assertTrue(((GroupInvitationResponse) h).isAutoDecline()); // The auto-decline message should have the expected timer @@ -260,7 +277,12 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest { // When 1's timer has elapsed, the message should be deleted from 1's // view of the conversation and the invitation auto-declined c0.getTimeTravel().addCurrentTimeMillis(1); - c1.getTimeTravel().addCurrentTimeMillis(1); + GroupInvitationResponseReceivedEvent event = assertEvent(c1, + GroupInvitationResponseReceivedEvent.class, + () -> c1.getTimeTravel().addCurrentTimeMillis(1) + ); + // assert that the proper event got broadcast + assertEquals(contactId0From1, event.getContactId()); assertGroupCount(c0, contactId1From0, 1, 0); assertEquals(1, getMessageHeaders(c0, contactId1From0).size()); // 1's total count is still 2, because of the added auto-decline @@ -273,6 +295,7 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest { } else { assertTrue(h instanceof GroupInvitationResponse); GroupInvitationResponse r = (GroupInvitationResponse) h; + assertEquals(h.getId(), event.getMessageHeader().getId()); // is auto-decline for 2nd invitation assertEquals(privateGroup.getId(), r.getShareableId()); assertTrue(r.isAutoDecline()); 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 47eff68cd..0bcdab2a9 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 @@ -566,7 +566,7 @@ public abstract class BriarIntegrationTest implements EventListener { + + @FunctionalInterface + public interface EventRunnable { + void run() throws Exception; + } + + public static T assertEvent( + BriarIntegrationTestComponent c, Class clazz, EventRunnable r) + throws Exception { + TestEventListener listener = new TestEventListener<>(clazz); + c.getEventBus().addListener(listener); + try { + r.run(); + waitForEvents(c); + return listener.assertAndGetEvent(); + } finally { + c.getEventBus().removeListener(listener); + } + } + + private TestEventListener(Class clazz) { + this.clazz = clazz; + } + + private final Class clazz; + + @Nullable + private T event; + + @Override + public void eventOccurred(Event e) { + if (e.getClass().equals(clazz)) { + assertNull("Event already received", event); + //noinspection unchecked + event = (T) e; + } + } + + private T assertAndGetEvent() { + assertNotNull("No event received", event); + return event; + } + +} From d3204ab3ee2b0aee43d7a684fb658cb4506fcd12 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 9 Mar 2021 10:11:15 -0300 Subject: [PATCH 2/2] Use AtomicReference in TestEventListener to store event --- .../briarproject/briar/test/TestEventListener.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/briar-core/src/test/java/org/briarproject/briar/test/TestEventListener.java b/briar-core/src/test/java/org/briarproject/briar/test/TestEventListener.java index 3f9ffba82..c4a52f701 100644 --- a/briar-core/src/test/java/org/briarproject/briar/test/TestEventListener.java +++ b/briar-core/src/test/java/org/briarproject/briar/test/TestEventListener.java @@ -4,7 +4,7 @@ import org.briarproject.bramble.api.event.Event; import org.briarproject.bramble.api.event.EventListener; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import javax.annotation.Nullable; +import java.util.concurrent.atomic.AtomicReference; import static org.briarproject.briar.test.BriarIntegrationTest.waitForEvents; import static org.junit.Assert.assertNotNull; @@ -38,21 +38,20 @@ public class TestEventListener implements EventListener { private final Class clazz; - @Nullable - private T event; + private final AtomicReference event = new AtomicReference<>(); @Override public void eventOccurred(Event e) { if (e.getClass().equals(clazz)) { - assertNull("Event already received", event); //noinspection unchecked - event = (T) e; + assertNull("Event already received", event.getAndSet((T) e)); } } private T assertAndGetEvent() { - assertNotNull("No event received", event); - return event; + T t = event.get(); + assertNotNull("No event received", t); + return t; } }