diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java index dd8dea976d4f15fdd8ef33ab7ebd55b08ca4b3f9..9e8d31a614f3c86f6633bae009e266dbc624c70c 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java @@ -668,7 +668,9 @@ class DatabaseComponentImpl<T> implements DatabaseComponent { acked.add(m); } } - transaction.attach(new MessagesAckedEvent(c, acked)); + if (acked.size() > 0) { + transaction.attach(new MessagesAckedEvent(c, acked)); + } } @Override diff --git a/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java b/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java index 03722734b01285b2d694c50e353e20a8c6dd6701..4dcc471ada1f6b79ef7b98081f98393f8a8cb38d 100644 --- a/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/client/QueueMessageFactoryImpl.java @@ -14,6 +14,7 @@ import javax.inject.Inject; import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_LENGTH; import static org.briarproject.bramble.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH; +import static org.briarproject.bramble.util.ByteUtils.INT_64_BYTES; import static org.briarproject.briar.api.client.QueueMessage.MAX_QUEUE_MESSAGE_BODY_LENGTH; import static org.briarproject.briar.api.client.QueueMessage.QUEUE_MESSAGE_HEADER_LENGTH; @@ -39,11 +40,14 @@ class QueueMessageFactoryImpl implements QueueMessageFactory { ByteUtils.writeUint64(queuePosition, raw, MESSAGE_HEADER_LENGTH); System.arraycopy(body, 0, raw, QUEUE_MESSAGE_HEADER_LENGTH, body.length); - byte[] timeBytes = new byte[ByteUtils.INT_64_BYTES]; + byte[] timeBytes = new byte[INT_64_BYTES]; ByteUtils.writeUint64(timestamp, timeBytes, 0); + byte[] bodyBytes = new byte[body.length + INT_64_BYTES]; + System.arraycopy(raw, MESSAGE_HEADER_LENGTH, bodyBytes, 0, + body.length + INT_64_BYTES); MessageId id = new MessageId( crypto.hash(MessageId.LABEL, groupId.getBytes(), timeBytes, - body)); + bodyBytes)); return new QueueMessage(id, groupId, timestamp, queuePosition, raw); } diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java index 06ff73e6838565efdd72f4b4e3df173aebb001fd..7a4f263f85bc1a6e0104314849abfce2a2e290a7 100644 --- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java @@ -19,6 +19,7 @@ import org.briarproject.bramble.api.event.EventListener; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; +import org.briarproject.bramble.api.plugin.TransportId; import org.briarproject.bramble.api.properties.TransportProperties; import org.briarproject.bramble.api.properties.TransportPropertyManager; import org.briarproject.bramble.api.sync.Group; @@ -360,6 +361,14 @@ public class IntroductionIntegrationTest eventWaiter.await(TIMEOUT, 1); assertTrue(listener0.response1Received); + // sync fake transport properties back to 1, so Message ACK can arrive + // and the assertDefaultUiMessages() check at the end will not fail + TransportProperties tp = new TransportProperties( + Collections.singletonMap("key", "value")); + c0.getTransportPropertyManager() + .mergeLocalProperties(new TransportId("fake"), tp); + sync0To1(1, true); + // sync second response sync2To0(1, true); eventWaiter.await(TIMEOUT, 1); @@ -836,14 +845,32 @@ public class IntroductionIntegrationTest } private void assertDefaultUiMessages() throws DbException { - assertEquals(2, introductionManager0.getIntroductionMessages( - contactId1From0).size()); - assertEquals(2, introductionManager0.getIntroductionMessages( - contactId2From0).size()); - assertEquals(2, introductionManager1.getIntroductionMessages( - contactId0From1).size()); - assertEquals(2, introductionManager2.getIntroductionMessages( - contactId0From2).size()); + Collection<IntroductionMessage> messages = + introductionManager0.getIntroductionMessages(contactId1From0); + assertEquals(2, messages.size()); + assertMessagesAreAcked(messages); + + messages = introductionManager0.getIntroductionMessages( + contactId2From0); + assertEquals(2, messages.size()); + assertMessagesAreAcked(messages); + + messages = introductionManager1.getIntroductionMessages( + contactId0From1); + assertEquals(2, messages.size()); + assertMessagesAreAcked(messages); + + messages = introductionManager2.getIntroductionMessages( + contactId0From2); + assertEquals(2, messages.size()); + assertMessagesAreAcked(messages); + } + + private void assertMessagesAreAcked( + Collection<IntroductionMessage> messages) { + for (IntroductionMessage msg : messages) { + if (msg.isLocal()) assertTrue(msg.isSeen()); + } } private void addListeners(boolean accept1, boolean accept2) {