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-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java b/briar-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java index 4707ba8caae827b560ceeb733def586de35f31fc..8cbbceb320f8f7e84aac251e2fa5a2a03c62596e 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/client/BaseMessageHeader.java @@ -13,18 +13,18 @@ public abstract class BaseMessageHeader { private final MessageId id; private final GroupId groupId; private final long timestamp; - private final boolean local, read, sent, seen; + private final boolean local, sent, seen, read; public BaseMessageHeader(MessageId id, GroupId groupId, long timestamp, - boolean local, boolean read, boolean sent, boolean seen) { + boolean local, boolean sent, boolean seen, boolean read) { this.id = id; this.groupId = groupId; this.timestamp = timestamp; this.local = local; - this.read = read; this.sent = sent; this.seen = seen; + this.read = read; } public MessageId getId() { @@ -43,10 +43,6 @@ public abstract class BaseMessageHeader { return local; } - public boolean isRead() { - return read; - } - public boolean isSent() { return sent; } @@ -55,4 +51,8 @@ public abstract class BaseMessageHeader { return seen; } + public boolean isRead() { + return read; + } + } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java index 680a955ff144a92c48e9f455f5f81c8444146b49..861469a3a4d0c8eb6b9f34b5c6e5247db98fe995 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/introduction/IntroductionMessage.java @@ -22,7 +22,7 @@ public class IntroductionMessage extends BaseMessageHeader { GroupId groupId, int role, long time, boolean local, boolean sent, boolean seen, boolean read) { - super(messageId, groupId, time, local, read, sent, seen); + super(messageId, groupId, time, local, sent, seen, read); this.sessionId = sessionId; this.messageId = messageId; this.role = role; diff --git a/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java b/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java index bc0003177f986b71878fa1df82f808d59410719a..9caf3bd5608ad561953fb4a17cd111607d382b6e 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/messaging/PrivateMessageHeader.java @@ -14,7 +14,7 @@ public class PrivateMessageHeader extends BaseMessageHeader { public PrivateMessageHeader(MessageId id, GroupId groupId, long timestamp, boolean local, boolean read, boolean sent, boolean seen) { - super(id, groupId, timestamp, local, read, sent, seen); + super(id, groupId, timestamp, local, sent, seen, read); } } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java index 4bdc394559767cdd4603ba07d39659bc81111835..df93ebdfab831f585bf16cac400582ce42ff5264 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/sharing/InvitationMessage.java @@ -20,7 +20,7 @@ public class InvitationMessage extends BaseMessageHeader { boolean local, boolean sent, boolean seen, boolean read, SessionId sessionId, ContactId contactId) { - super(id, groupId, time, local, read, sent, seen); + super(id, groupId, time, local, sent, seen, read); this.sessionId = sessionId; this.contactId = contactId; } 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) {