diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java index e8673a60d..ca4c0c781 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/SocialBackupManagerImpl.java @@ -2,7 +2,6 @@ package org.briarproject.briar.socialbackup; import org.briarproject.bramble.api.FormatException; import org.briarproject.bramble.api.Pair; -import org.briarproject.bramble.api.client.BdfIncomingMessageHook; import org.briarproject.bramble.api.client.ClientHelper; import org.briarproject.bramble.api.client.ContactGroupFactory; import org.briarproject.bramble.api.contact.Contact; @@ -277,6 +276,7 @@ class SocialBackupManagerImpl extends ConversationClientImpl } } + @Override public Group getContactGroup(Contact c) { return contactGroupFactory.createContactGroup(CLIENT_ID, MAJOR_VERSION, c); @@ -294,11 +294,18 @@ class SocialBackupManagerImpl extends ConversationClientImpl new ArrayList<>(); for (Entry messageEntry : messages .entrySet()) { - BdfDictionary message = messageEntry.getValue(); - if (message.getLong(MSG_KEY_MESSAGE_TYPE).intValue() == + BdfDictionary meta = messageEntry.getValue(); + if (meta.getLong(MSG_KEY_MESSAGE_TYPE).intValue() == SHARD.getValue()) { - long timestamp = message.getLong(MSG_KEY_TIMESTAMP); - boolean isLocal = message.getBoolean(MSG_KEY_LOCAL); + boolean isLocal = meta.getBoolean(MSG_KEY_LOCAL); + long timestamp; + if (isLocal) { + timestamp = meta.getLong(MSG_KEY_TIMESTAMP); + } else { + Message message = clientHelper + .getMessage(txn, messageEntry.getKey()); + timestamp = message.getTimestamp(); + } List attachmentHeaders = new ArrayList<>(); ShardMessageHeader shardHeader = new ShardMessageHeader( @@ -420,6 +427,7 @@ class SocialBackupManagerImpl extends ConversationClientImpl BdfDictionary meta = BdfDictionary.of( new BdfEntry(MSG_KEY_MESSAGE_TYPE, BACKUP.getValue()), new BdfEntry(MSG_KEY_LOCAL, true), + new BdfEntry(MSG_KEY_TIMESTAMP, timestamp), new BdfEntry(MSG_KEY_VERSION, version)); clientHelper.addLocalMessage(txn, m, meta, true, false); } diff --git a/briar-core/src/test/java/org/briarproject/briar/socialbackup/SocialBackupIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/socialbackup/SocialBackupIntegrationTest.java index ab08030b5..15cff8af6 100644 --- a/briar-core/src/test/java/org/briarproject/briar/socialbackup/SocialBackupIntegrationTest.java +++ b/briar-core/src/test/java/org/briarproject/briar/socialbackup/SocialBackupIntegrationTest.java @@ -1,8 +1,11 @@ package org.briarproject.briar.socialbackup; +import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.test.TestDatabaseConfigModule; +import org.briarproject.briar.api.conversation.ConversationMessageHeader; import org.briarproject.briar.api.socialbackup.BackupMetadata; +import org.briarproject.briar.api.socialbackup.ShardMessageHeader; import org.briarproject.briar.api.socialbackup.SocialBackupManager; import org.briarproject.briar.test.BriarIntegrationTest; import org.briarproject.briar.test.BriarIntegrationTestComponent; @@ -10,25 +13,30 @@ import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent; import org.junit.Before; import org.junit.Test; +import java.util.Collection; import java.util.List; -import dagger.Provides; - import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; public class SocialBackupIntegrationTest extends BriarIntegrationTest { private SocialBackupManager socialBackupManager0; + private SocialBackupManager socialBackupManager1; + private SocialBackupManager socialBackupManager2; @Before @Override public void setUp() throws Exception { super.setUp(); socialBackupManager0 = c0.getSocialBackupManager(); + socialBackupManager1 = c1.getSocialBackupManager(); + socialBackupManager2 = c2.getSocialBackupManager(); } @Override @@ -73,5 +81,68 @@ public class SocialBackupIntegrationTest // Sync the shard and backup messages to the contacts sync0To1(2, true); sync0To2(2, true); + + Collection messages1At0 = + getMessages1At0(); + assertEquals(1, messages1At0.size()); + for (ConversationMessageHeader h : messages1At0) { + assertTrue(h instanceof ShardMessageHeader); + ShardMessageHeader s = (ShardMessageHeader) h; + assertTrue(s.isLocal()); + } + + Collection messages2At0 = + getMessages2At0(); + assertEquals(1, messages2At0.size()); + for (ConversationMessageHeader h : messages2At0) { + assertTrue(h instanceof ShardMessageHeader); + ShardMessageHeader s = (ShardMessageHeader) h; + assertTrue(s.isLocal()); + } + + // the shard message from 0 should have arrived at 1 + Collection messages0At1 = + getMessages0At1(); + assertEquals(1, messages0At1.size()); + for (ConversationMessageHeader h : messages0At1) { + assertTrue(h instanceof ShardMessageHeader); + ShardMessageHeader s = (ShardMessageHeader) h; + assertFalse(s.isLocal()); + } + + // the shard message from 0 should have arrived at 2 + Collection messages0At2 = + getMessages0At2(); + assertEquals(1, messages0At2.size()); + for (ConversationMessageHeader h : messages0At2) { + assertTrue(h instanceof ShardMessageHeader); + ShardMessageHeader s = (ShardMessageHeader) h; + assertFalse(s.isLocal()); + } } + + private Collection getMessages1At0() + throws DbException { + return db0.transactionWithResult(true, txn -> socialBackupManager0 + .getMessageHeaders(txn, contactId1From0)); + } + + private Collection getMessages2At0() + throws DbException { + return db0.transactionWithResult(true, txn -> socialBackupManager0 + .getMessageHeaders(txn, contactId2From0)); + } + + private Collection getMessages0At1() + throws DbException { + return db1.transactionWithResult(true, txn -> socialBackupManager1 + .getMessageHeaders(txn, contactId0From1)); + } + + private Collection getMessages0At2() + throws DbException { + return db1.transactionWithResult(true, txn -> socialBackupManager2 + .getMessageHeaders(txn, contactId0From2)); + } + }