From 6a94785d9a0bfcbb824f271c11024769edcded96 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Tue, 20 Dec 2016 17:15:00 -0200
Subject: [PATCH] Mark invitation unavailable to answer when creator dissolved
 the group

after the invitation.

Closes #876
---
 .../invitation/InviteeProtocolEngine.java     |  2 ++
 .../GroupInvitationIntegrationTest.java       |  5 +++-
 .../invitation/InviteeProtocolEngineTest.java | 24 ++++++++++++-------
 3 files changed, 21 insertions(+), 10 deletions(-)
 rename briar-core/src/test/java/org/briarproject/briar/privategroup/{ => invitation}/GroupInvitationIntegrationTest.java (98%)

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 e89e57b538..e9dcac5086 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 83eb59003f..7431ffe483 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 bc83f9053f..2e4c64ddb1 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,
-- 
GitLab