diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java index e89e57b53849568a519044caf579b12ffa6adbd6..e9dcac50860d4d7ed40bb0b04674c2716449c526 100644 --- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java +++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngine.java @@ -269,6 +269,8 @@ class InviteeProtocolEngine extends AbstractProtocolEngine<InviteeSession> { // The dependency, if any, must be the last remote message if (!isValidDependency(s, m.getPreviousMessageId())) return abort(txn, s); + // Mark any invite messages in the session unavailable to answer + markInvitesUnavailableToAnswer(txn, s); // Move to the DISSOLVED state return new InviteeSession(s.getContactGroupId(), s.getPrivateGroupId(), s.getLastLocalMessageId(), m.getId(), s.getLocalTimestamp(), diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java similarity index 98% rename from briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java index 83eb59003fca5f49a6030a33b90981c29cbcaac5..7431ffe483f160022bbf03d1ea51507a3e8b5c45 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationIntegrationTest.java @@ -1,4 +1,4 @@ -package org.briarproject.briar.privategroup; +package org.briarproject.briar.privategroup.invitation; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.sync.Group; @@ -329,6 +329,9 @@ public class GroupInvitationIntegrationTest // Creator's leave message is delivered to invitee sync0To1(1, true); + // invitee should have no more open invitations + assertTrue(groupInvitationManager1.getInvitations().isEmpty()); + // Invitee declines invitation, but it's no longer open - no exception // as the action has succeeded assertEquals(0, groupManager1.getPrivateGroups().size()); diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java index bc83f9053fb1c3a989186e78efa85762b7023dde..2e4c64ddb195b12e99cd89f3793cc0b417b61e1c 100644 --- a/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java @@ -651,6 +651,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { assertTrue(session.getLastRemoteMessageId() .equals(properLeaveMessage.getPreviousMessageId())); + expectMarkInvitesUnavailableToAnswer(); InviteeSession newSession = engine.onLeaveMessage(txn, session, properLeaveMessage); @@ -680,6 +681,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { assertTrue(session.getLastRemoteMessageId() .equals(properLeaveMessage.getPreviousMessageId())); + expectMarkInvitesUnavailableToAnswer(); InviteeSession newSession = engine.onLeaveMessage(txn, session, properLeaveMessage); @@ -701,7 +703,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { public void testOnAbortMessageWhenNotSubscribed() throws Exception { InviteeSession session = getDefaultSession(START); - expectAbortWhenSubscribedToGroup(); + expectAbortWhenNotSubscribedToGroup(); InviteeSession newSession = engine.onAbortMessage(txn, session, abortMessage); assertSessionAborted(session, newSession); @@ -711,7 +713,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { public void testOnAbortMessageWhenSubscribed() throws Exception { InviteeSession session = getDefaultSession(START); - expectAbortWhenNotSubscribedToGroup(); + expectAbortWhenSubscribedToGroup(); InviteeSession newSession = engine.onAbortMessage(txn, session, abortMessage); assertSessionAborted(session, newSession); @@ -739,6 +741,17 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { } private void expectAbort(boolean subscribed) throws Exception { + expectMarkInvitesUnavailableToAnswer(); + if (subscribed) { + expectIsSubscribedPrivateGroup(); + expectSetPrivateGroupVisibility(INVISIBLE); + } else { + expectIsNotSubscribedPrivateGroup(); + } + expectSendAbortMessage(); + } + + private void expectMarkInvitesUnavailableToAnswer() throws Exception { final BdfDictionary query = BdfDictionary.of(new BdfEntry("query", "")); final BdfDictionary meta = BdfDictionary.of(new BdfEntry("meta", "")); final Map<MessageId, BdfDictionary> invites = @@ -752,13 +765,6 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest { will(returnValue(invites)); }}); expectMarkMessageAvailableToAnswer(lastRemoteMessageId, false); - if (subscribed) { - expectIsSubscribedPrivateGroup(); - expectSetPrivateGroupVisibility(INVISIBLE); - } else { - expectIsNotSubscribedPrivateGroup(); - } - expectSendAbortMessage(); } private void assertSessionAborted(InviteeSession oldSession,