Remember when declines were automatic due to deletion

so they can be shown differently for sender
This commit is contained in:
Torsten Grote
2021-03-01 17:00:16 -03:00
parent a8cff454ec
commit 4d3482e40e
25 changed files with 218 additions and 124 deletions

View File

@@ -194,7 +194,7 @@ abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
context.checking(new Expectations() {{
oneOf(messageEncoder).encodeMetadata(type, privateGroupId,
message.getTimestamp(), true, true, visible, false, false,
NO_AUTO_DELETE_TIMER);
NO_AUTO_DELETE_TIMER, false);
will(returnValue(meta));
oneOf(clientHelper).addLocalMessage(txn, message, meta, true,
false);

View File

@@ -5,7 +5,6 @@ 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.conversation.ConversationManager.ConversationClient;
import org.briarproject.briar.api.conversation.ConversationMessageHeader;
import org.briarproject.briar.api.privategroup.GroupMessage;
import org.briarproject.briar.api.privategroup.PrivateGroup;
import org.briarproject.briar.api.privategroup.PrivateGroupManager;
@@ -17,8 +16,6 @@ import org.briarproject.briar.test.BriarIntegrationTestComponent;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import javax.annotation.Nullable;
import static org.briarproject.bramble.api.cleanup.CleanupManager.BATCH_DELAY_MS;
@@ -28,6 +25,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
@@ -104,10 +102,9 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
assertEquals(1, getMessageHeaders(c1, contactId0From1).size());
// 1 marks the message as read - this starts 1's timer
final MessageId messageId =
final MessageId messageId0 =
getMessageHeaders(c1, contactId0From1).get(0).getId();
markMessageRead(c1, contact0From1, messageId);
waitForEvents(c1);
markMessageRead(c1, contact0From1, messageId0);
assertGroupCount(c1, contactId0From1, 1, 0);
// Before 1's timer elapses, 1 should still see the message
@@ -127,9 +124,10 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
assertGroupCount(c1, contactId0From1, 1, 0);
forEachHeader(c1, contactId0From1, 1, h -> {
// The only message is not the same as before, but declined response
assertNotEquals(messageId, h.getId());
assertNotEquals(messageId0, h.getId());
assertTrue(h instanceof GroupInvitationResponse);
assertFalse(((GroupInvitationResponse) h).wasAccepted());
assertTrue(((GroupInvitationResponse) h).isAutoDecline());
// The auto-decline message should have the expected timer
assertEquals(MIN_AUTO_DELETE_TIMER_MS,
h.getAutoDeleteTimer());
@@ -162,10 +160,9 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
assertEquals(0, getMessageHeaders(c1, contactId0From1).size());
// 0 marks the message as read - this starts 0's timer
MessageId messageId0 =
MessageId messageId1 =
getMessageHeaders(c0, contactId1From0).get(0).getId();
markMessageRead(c0, contact1From0, messageId0);
waitForEvents(c0);
markMessageRead(c0, contact1From0, messageId1);
assertGroupCount(c0, contactId1From0, 1, 0);
// Before 0's timer elapses, 0 should still see the message
@@ -174,7 +171,7 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
assertEquals(1, getMessageHeaders(c0, contactId1From0).size());
// 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
// view of the conversation
c0.getTimeTravel().addCurrentTimeMillis(1);
assertGroupCount(c0, contactId1From0, 0, 0);
assertEquals(0, getMessageHeaders(c0, contactId1From0).size());
@@ -196,6 +193,7 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
sendInvitation(pg, contact1From0.getId(), null);
sync0To1(1, true);
ack1To0(1);
waitForEvents(c0);
// The message should have been added the views of the conversation
assertGroupCount(c0, contactId1From0, 1, 0);
@@ -239,25 +237,24 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
assertGroupCount(c0, contactId1From0, 1, 0);
assertEquals(1, getMessageHeaders(c0, contactId1From0).size());
assertGroupCount(c1, contactId0From1, 2, 2);
List<ConversationMessageHeader> headers1 =
getMessageHeaders(c1, contactId0From1);
assertEquals(2, headers1.size());
assertEquals(2, getMessageHeaders(c1, contactId0From1).size());
// 1 marks the message as read - this starts 1's timer
ConversationMessageHeader header = headers1.get(1); // newer message
assertEquals(privateGroup,
((GroupInvitationRequest) header).getNameable());
MessageId messageId = header.getId();
markMessageRead(c1, contact0From1, messageId);
waitForEvents(c1);
assertGroupCount(c1, contactId0From1, 2, 1);
// 1 marks all the message as read - this starts 1's timer for 2nd msg
forEachHeader(c1, contactId0From1, 2, h -> {
try {
markMessageRead(c1, contact0From1, h.getId());
} catch (Exception e) {
fail();
}
});
assertGroupCount(c1, contactId0From1, 2, 0);
// Before 1's timer elapses, 1 should still see the message
c0.getTimeTravel().addCurrentTimeMillis(timerLatency - 1);
c1.getTimeTravel().addCurrentTimeMillis(timerLatency - 1);
assertGroupCount(c0, contactId1From0, 1, 0);
assertEquals(1, getMessageHeaders(c0, contactId1From0).size());
assertGroupCount(c1, contactId0From1, 2, 1);
assertGroupCount(c1, contactId0From1, 2, 0);
assertEquals(2, getMessageHeaders(c1, contactId0From1).size());
// When 1's timer has elapsed, the message should be deleted from 1's
@@ -266,7 +263,8 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
c1.getTimeTravel().addCurrentTimeMillis(1);
assertGroupCount(c0, contactId1From0, 1, 0);
assertEquals(1, getMessageHeaders(c0, contactId1From0).size());
assertGroupCount(c1, contactId0From1, 2, 1);
// 1's total count is still 2, because of the added auto-decline
assertGroupCount(c1, contactId0From1, 2, 0);
forEachHeader(c1, contactId0From1, 2, h -> {
if (h instanceof GroupInvitationRequest) {
// the request is for the first invitation
@@ -277,6 +275,7 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
GroupInvitationResponse r = (GroupInvitationResponse) h;
// is auto-decline for 2nd invitation
assertEquals(privateGroup.getId(), r.getShareableId());
assertTrue(r.isAutoDecline());
assertFalse(r.wasAccepted());
}
});
@@ -288,34 +287,48 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
waitForEvents(c1);
// 0 marks the message as read - this starts 0's timer
GroupInvitationResponse autoDeclineMessage = (GroupInvitationResponse)
getMessageHeaders(c1, contactId0From1).get(1);
getMessageHeaders(c0, contactId1From0).get(1);
markMessageRead(c0, contact1From0, autoDeclineMessage.getId());
waitForEvents(c0);
assertGroupCount(c0, contactId1From0, 2, 0);
assertGroupCount(c1, contactId0From1, 2, 1);
assertGroupCount(c1, contactId0From1, 2, 0);
// Timer of auto-decline elapses for both peers at the same time
c0.getTimeTravel().addCurrentTimeMillis(timerLatency);
c1.getTimeTravel().addCurrentTimeMillis(timerLatency);
assertGroupCount(c0, contactId1From0, 1, 0);
assertGroupCount(c1, contactId0From1, 1, 1);
assertGroupCount(c1, contactId0From1, 1, 0);
// 1 responds to first invitation (that had no timer)
groupInvitationManager1.respondToInvitation(contactId0From1, pg, true);
// Sync the accept response message to 0
sync1To0(1, true);
// Sync the ack to 1 - this starts 1's timer
ack0To1(1);
// Sync the ack (and creator's join messages (group + protocol) to 1
// this starts 1's timer
sync0To1(2, true);
waitForEvents(c1);
assertGroupCount(c0, contactId1From0, 2, 1);
assertGroupCount(c1, contactId0From1, 2, 1);
assertGroupCount(c1, contactId0From1, 2, 0);
forEachHeader(c1, contactId0From1, 2, h -> {
if (h instanceof GroupInvitationRequest) {
// the request is for the first invitation
assertEquals(pg.getId(),
((GroupInvitationRequest) h).getNameable().getId());
} else {
assertTrue(h instanceof GroupInvitationResponse);
GroupInvitationResponse r = (GroupInvitationResponse) h;
// is accept for 1nd invitation
assertEquals(pg.getId(), r.getShareableId());
assertFalse(r.isAutoDecline());
assertTrue(r.wasAccepted());
}
});
// Before 1's timer elapses, 1 should still see the message
c0.getTimeTravel().addCurrentTimeMillis(timerLatency - 1);
c1.getTimeTravel().addCurrentTimeMillis(timerLatency - 1);
assertGroupCount(c0, contactId1From0, 2, 1);
assertEquals(2, getMessageHeaders(c0, contactId1From0).size());
assertGroupCount(c1, contactId0From1, 2, 1);
assertGroupCount(c1, contactId0From1, 2, 0);
assertEquals(2, getMessageHeaders(c1, contactId0From1).size());
// When 1's timer has elapsed, the message should be deleted from 1's
@@ -324,12 +337,43 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
c1.getTimeTravel().addCurrentTimeMillis(1);
assertGroupCount(c0, contactId1From0, 2, 1);
assertEquals(2, getMessageHeaders(c0, contactId1From0).size());
assertGroupCount(c1, contactId0From1, 1, 1);
assertGroupCount(c1, contactId0From1, 1, 0);
forEachHeader(c1, contactId0From1, 1, h -> {
assertTrue(h instanceof GroupInvitationRequest);
assertTrue(((GroupInvitationRequest) h).wasAnswered());
assertTrue(((GroupInvitationRequest) h).canBeOpened());
});
// 0 reads all messages
forEachHeader(c0, contactId1From0, 2, h -> {
try {
if (!h.isRead()) markMessageRead(c0, contact1From0, h.getId());
} catch (Exception e) {
fail();
}
});
assertGroupCount(c0, contactId1From0, 2, 0);
// Before 0's timer elapses, 0 should still see the messages
c0.getTimeTravel().addCurrentTimeMillis(timerLatency - 1);
c1.getTimeTravel().addCurrentTimeMillis(timerLatency - 1);
assertGroupCount(c0, contactId1From0, 2, 0);
assertGroupCount(c1, contactId0From1, 1, 0);
// When 0's timer has elapsed, the messages should be deleted from 0's
// view of the conversation, only the initial invitation remains
c0.getTimeTravel().addCurrentTimeMillis(1);
c1.getTimeTravel().addCurrentTimeMillis(1);
assertGroupCount(c0, contactId1From0, 1, 0);
assertEquals(1, getMessageHeaders(c0, contactId1From0).size());
assertGroupCount(c1, contactId0From1, 1, 0);
assertEquals(1, getMessageHeaders(c1, contactId0From1).size());
// 1 joined the PrivateGroup
assertEquals(pg,
c1.getPrivateGroupManager().getPrivateGroup(pg.getId()));
assertFalse(groupInvitationManager0
.isInvitationAllowed(contact1From0, pg.getId()));
}
@Test
@@ -363,8 +407,8 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
// 1 responds to invitation
groupInvitationManager1
.respondToInvitation(contactId0From1, privateGroup, true);
// Sync the accept response message to 0
.respondToInvitation(contactId0From1, privateGroup, false);
// Sync the decline response message to 0
sync1To0(1, true);
// Sync the ack to 1 - this starts 1's timer
ack0To1(1);
@@ -373,18 +417,19 @@ public class AutoDeleteIntegrationTest extends AbstractAutoDeleteTest {
assertGroupCount(c1, contactId0From1, 2, 0);
// 0 marks the message as read - this starts 0's timer
GroupInvitationResponse autoDeclineMessage = (GroupInvitationResponse)
getMessageHeaders(c1, contactId0From1).get(1);
markMessageRead(c0, contact1From0, autoDeclineMessage.getId());
waitForEvents(c0);
GroupInvitationResponse message1 = (GroupInvitationResponse)
getMessageHeaders(c0, contactId1From0).get(0);
markMessageRead(c0, contact1From0, message1.getId());
assertGroupCount(c0, contactId1From0, 1, 0);
assertGroupCount(c1, contactId0From1, 2, 0);
// 1 joined the PrivateGroup
assertEquals(privateGroup, c1.getPrivateGroupManager()
.getPrivateGroup(privateGroup.getId()));
assertFalse(groupInvitationManager0
.isInvitationAllowed(contact1From0, privateGroup.getId()));
// both peers delete all messages after their timers expire
c0.getTimeTravel().addCurrentTimeMillis(timerLatency);
c1.getTimeTravel().addCurrentTimeMillis(timerLatency);
assertGroupCount(c0, contactId1From0, 0, 0);
assertEquals(0, getMessageHeaders(c0, contactId1From0).size());
assertGroupCount(c1, contactId0From1, 0, 0);
assertEquals(0, getMessageHeaders(c1, contactId0From1).size());
}
private PrivateGroup addPrivateGroup(String name, long timestamp)

View File

@@ -123,19 +123,19 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest {
@Test
public void testOnLeaveActionFromStart() throws Exception {
CreatorSession session = getDefaultSession(START);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromDissolved() throws Exception {
CreatorSession session = getDefaultSession(DISSOLVED);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromError() throws Exception {
CreatorSession session = getDefaultSession(ERROR);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
@@ -143,7 +143,7 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest {
CreatorSession session = getDefaultSession(INVITED);
expectOnLocalLeave();
CreatorSession newSession = engine.onLeaveAction(txn, session);
CreatorSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(DISSOLVED, newSession.getState());
assertEquals(messageId, newSession.getLastLocalMessageId());
assertEquals(lastRemoteMessageId, newSession.getLastRemoteMessageId());
@@ -157,7 +157,7 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest {
CreatorSession session = getDefaultSession(JOINED);
expectOnLocalLeave();
CreatorSession newSession = engine.onLeaveAction(txn, session);
CreatorSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(DISSOLVED, newSession.getState());
assertEquals(messageId, newSession.getLastLocalMessageId());
assertEquals(lastRemoteMessageId, newSession.getLastRemoteMessageId());
@@ -171,7 +171,7 @@ public class CreatorProtocolEngineTest extends AbstractProtocolEngineTest {
CreatorSession session = getDefaultSession(LEFT);
expectOnLocalLeave();
CreatorSession newSession = engine.onLeaveAction(txn, session);
CreatorSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(DISSOLVED, newSession.getState());
assertEquals(messageId, newSession.getLastLocalMessageId());
assertEquals(lastRemoteMessageId, newSession.getLastRemoteMessageId());

View File

@@ -593,7 +593,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
.parseInviteeSession(contactGroup.getId(), bdfSession);
will(returnValue(inviteeSession));
if (accept) oneOf(inviteeEngine).onJoinAction(txn, inviteeSession);
else oneOf(inviteeEngine).onLeaveAction(txn, inviteeSession);
else oneOf(inviteeEngine).onLeaveAction(txn, inviteeSession, false);
will(returnValue(inviteeSession));
}});
expectStoreSession(inviteeSession, storageMessage.getId());
@@ -653,10 +653,10 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
long time1 = 1L, time2 = 2L;
MessageMetadata messageMetadata1 =
new MessageMetadata(INVITE, privateGroup.getId(), time1, true,
true, true, false, true, NO_AUTO_DELETE_TIMER);
true, true, false, true, NO_AUTO_DELETE_TIMER, false);
MessageMetadata messageMetadata2 =
new MessageMetadata(JOIN, privateGroup.getId(), time2, true,
true, true, true, false, NO_AUTO_DELETE_TIMER);
true, true, true, false, NO_AUTO_DELETE_TIMER, false);
InviteMessage invite =
new InviteMessage(message.getId(), contactGroup.getId(),
privateGroup.getId(), time1, "name", author,
@@ -876,7 +876,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
oneOf(sessionParser)
.parseCreatorSession(contactGroup.getId(), bdfSession);
will(returnValue(creatorSession));
oneOf(creatorEngine).onLeaveAction(txn, creatorSession);
oneOf(creatorEngine).onLeaveAction(txn, creatorSession, false);
will(returnValue(creatorSession));
// session 2
oneOf(sessionParser).getRole(bdfSession2);
@@ -884,7 +884,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
oneOf(sessionParser)
.parseInviteeSession(contactGroup2.getId(), bdfSession2);
will(returnValue(inviteeSession));
oneOf(inviteeEngine).onLeaveAction(txn, inviteeSession);
oneOf(inviteeEngine).onLeaveAction(txn, inviteeSession, false);
will(returnValue(inviteeSession));
// session 3
oneOf(sessionParser).getRole(bdfSession3);
@@ -892,7 +892,7 @@ public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
oneOf(sessionParser)
.parsePeerSession(contactGroup3.getId(), bdfSession3);
will(returnValue(peerSession));
oneOf(peerEngine).onLeaveAction(txn, peerSession);
oneOf(peerEngine).onLeaveAction(txn, peerSession, false);
will(returnValue(peerSession));
}});

View File

@@ -636,8 +636,7 @@ public class GroupInvitationValidatorTest extends ValidatorTestCase {
long autoDeleteTimer, BdfDictionary metadata) {
context.checking(new Expectations() {{
oneOf(messageEncoder).encodeMetadata(type, message.getGroupId(),
message.getTimestamp(), false, false, false, false, false,
autoDeleteTimer);
message.getTimestamp(), autoDeleteTimer);
will(returnValue(metadata));
}});
}

View File

@@ -193,25 +193,25 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
@Test
public void testOnLeaveActionFromStart() throws Exception {
InviteeSession session = getDefaultSession(START);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromLeft() throws Exception {
InviteeSession session = getDefaultSession(LEFT);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromDissolved() throws Exception {
InviteeSession session = getDefaultSession(DISSOLVED);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromError() throws Exception {
InviteeSession session = getDefaultSession(ERROR);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
@@ -223,7 +223,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
}});
InviteeSession session = getDefaultSession(INVITED);
InviteeSession newSession = engine.onLeaveAction(txn, session);
InviteeSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(START, newSession.getState());
assertSessionRecordedSentMessage(newSession);
@@ -245,7 +245,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
expectSendLeaveMessage(false);
expectSetPrivateGroupVisibility(INVISIBLE);
InviteeSession session = getDefaultSession(ACCEPTED);
InviteeSession newSession = engine.onLeaveAction(txn, session);
InviteeSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(LEFT, newSession.getState());
assertSessionRecordedSentMessage(newSession);
@@ -257,7 +257,7 @@ public class InviteeProtocolEngineTest extends AbstractProtocolEngineTest {
expectSendLeaveMessage(false);
expectSetPrivateGroupVisibility(INVISIBLE);
InviteeSession session = getDefaultSession(JOINED);
InviteeSession newSession = engine.onLeaveAction(txn, session);
InviteeSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(LEFT, newSession.getState());
assertSessionRecordedSentMessage(newSession);

View File

@@ -145,31 +145,31 @@ public class PeerProtocolEngineTest extends AbstractProtocolEngineTest {
@Test
public void testOnLeaveActionFromStart() throws Exception {
PeerSession session = getDefaultSession(START);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromAwaitMember() throws Exception {
PeerSession session = getDefaultSession(AWAIT_MEMBER);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromNeitherJoined() throws Exception {
PeerSession session = getDefaultSession(NEITHER_JOINED);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromLocalLeft() throws Exception {
PeerSession session = getDefaultSession(LOCAL_LEFT);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
public void testOnLeaveActionFromError() throws Exception {
PeerSession session = getDefaultSession(ERROR);
assertEquals(session, engine.onLeaveAction(txn, session));
assertEquals(session, engine.onLeaveAction(txn, session, false));
}
@Test
@@ -178,7 +178,7 @@ public class PeerProtocolEngineTest extends AbstractProtocolEngineTest {
expectSendLeaveMessage(false);
expectSetPrivateGroupVisibility(INVISIBLE);
PeerSession newSession = engine.onLeaveAction(txn, session);
PeerSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(NEITHER_JOINED, newSession.getState());
assertSessionRecordedSentMessage(newSession);
@@ -191,7 +191,7 @@ public class PeerProtocolEngineTest extends AbstractProtocolEngineTest {
expectSendLeaveMessage(false);
expectSetPrivateGroupVisibility(INVISIBLE);
PeerSession newSession = engine.onLeaveAction(txn, session);
PeerSession newSession = engine.onLeaveAction(txn, session, false);
assertEquals(LOCAL_LEFT, newSession.getState());
assertSessionRecordedSentMessage(newSession);