Prefer remote value for profile sharing for groups during storage sync.

master
Greyson Parrelli 2020-10-06 18:43:00 -04:00
parent 441a6d3fe7
commit ab2235fc88
5 changed files with 12 additions and 80 deletions

View File

@ -38,7 +38,7 @@ final class GroupV1ConflictMerger implements StorageSyncHelper.ConflictMerger<Si
public @NonNull SignalGroupV1Record merge(@NonNull SignalGroupV1Record remote, @NonNull SignalGroupV1Record local, @NonNull StorageSyncHelper.KeyGenerator keyGenerator) {
byte[] unknownFields = remote.serializeUnknownFields();
boolean blocked = remote.isBlocked();
boolean profileSharing = remote.isProfileSharingEnabled() || local.isProfileSharingEnabled();
boolean profileSharing = remote.isProfileSharingEnabled();
boolean archived = remote.isArchived();
boolean matchesRemote = Arrays.equals(unknownFields, remote.serializeUnknownFields()) && blocked == remote.isBlocked() && profileSharing == remote.isProfileSharingEnabled() && archived == remote.isArchived();

View File

@ -38,7 +38,7 @@ final class GroupV2ConflictMerger implements StorageSyncHelper.ConflictMerger<Si
public @NonNull SignalGroupV2Record merge(@NonNull SignalGroupV2Record remote, @NonNull SignalGroupV2Record local, @NonNull StorageSyncHelper.KeyGenerator keyGenerator) {
byte[] unknownFields = remote.serializeUnknownFields();
boolean blocked = remote.isBlocked();
boolean profileSharing = remote.isProfileSharingEnabled() || local.isProfileSharingEnabled();
boolean profileSharing = remote.isProfileSharingEnabled();
boolean archived = remote.isArchived();
boolean matchesRemote = Arrays.equals(unknownFields, remote.serializeUnknownFields()) && blocked == remote.isBlocked() && profileSharing == remote.isProfileSharingEnabled() && archived == remote.isArchived();

View File

@ -25,7 +25,7 @@ public final class GroupV1ConflictMergerTest {
}
@Test
public void merge_alwaysPreferRemote_exceptProfileSharingIsEitherOr() {
public void merge_alwaysPreferRemote() {
SignalGroupV1Record remote = new SignalGroupV1Record.Builder(byteArray(1), byteArray(100))
.setBlocked(false)
.setProfileSharingEnabled(false)
@ -39,8 +39,9 @@ public final class GroupV1ConflictMergerTest {
SignalGroupV1Record merged = new GroupV1ConflictMerger(Collections.singletonList(local)).merge(remote, local, KEY_GENERATOR);
assertArrayEquals(GENERATED_KEY, merged.getId().getRaw());
assertArrayEquals(remote.getId().getRaw(), merged.getId().getRaw());
assertArrayEquals(byteArray(100), merged.getGroupId());
assertFalse(merged.isProfileSharingEnabled());
assertFalse(merged.isBlocked());
assertFalse(merged.isArchived());
}
@ -64,24 +65,6 @@ public final class GroupV1ConflictMergerTest {
}
@Test
public void merge_returnLocalIfEndResultMatchesLocal() {
SignalGroupV1Record remote = new SignalGroupV1Record.Builder(byteArray(1), byteArray(100))
.setBlocked(false)
.setProfileSharingEnabled(false)
.setArchived(false)
.build();
SignalGroupV1Record local = new SignalGroupV1Record.Builder(byteArray(2), byteArray(100))
.setBlocked(false)
.setProfileSharingEnabled(true)
.setArchived(false)
.build();
SignalGroupV1Record merged = new GroupV1ConflictMerger(Collections.singletonList(local)).merge(remote, local, mock(KeyGenerator.class));
assertEquals(local, merged);
}
@Test
public void merge_excludeBadGroupId() {
SignalGroupV1Record badRemote = new SignalGroupV1Record.Builder(byteArray(1), badGroupKey(99))
.setBlocked(false)

View File

@ -25,7 +25,7 @@ public final class GroupV2ConflictMergerTest {
}
@Test
public void merge_alwaysPreferRemote_exceptProfileSharingIsEitherOr() {
public void merge_alwaysPreferRemote() {
SignalGroupV2Record remote = new SignalGroupV2Record.Builder(byteArray(1), groupKey(100))
.setBlocked(false)
.setProfileSharingEnabled(false)
@ -39,8 +39,9 @@ public final class GroupV2ConflictMergerTest {
SignalGroupV2Record merged = new GroupV2ConflictMerger(Collections.singletonList(local)).merge(remote, local, KEY_GENERATOR);
assertArrayEquals(GENERATED_KEY, merged.getId().getRaw());
assertArrayEquals(remote.getId().getRaw(), merged.getId().getRaw());
assertArrayEquals(groupKey(100), merged.getMasterKeyBytes());
assertFalse(merged.isProfileSharingEnabled());
assertFalse(merged.isBlocked());
assertFalse(merged.isArchived());
}
@ -63,24 +64,6 @@ public final class GroupV2ConflictMergerTest {
assertEquals(remote, merged);
}
@Test
public void merge_returnLocalIfEndResultMatchesLocal() {
SignalGroupV2Record remote = new SignalGroupV2Record.Builder(byteArray(1), groupKey(100))
.setBlocked(false)
.setProfileSharingEnabled(false)
.setArchived(false)
.build();
SignalGroupV2Record local = new SignalGroupV2Record.Builder(byteArray(2), groupKey(100))
.setBlocked(false)
.setProfileSharingEnabled(true)
.setArchived(false)
.build();
SignalGroupV2Record merged = new GroupV2ConflictMerger(Collections.singletonList(local)).merge(remote, local, mock(KeyGenerator.class));
assertEquals(local, merged);
}
@Test
public void merge_excludeBadGroupId() {
SignalGroupV2Record badRemote = new SignalGroupV2Record.Builder(byteArray(1), badGroupKey(99))

View File

@ -260,38 +260,6 @@ public final class StorageSyncHelperTest {
assertTrue(result.getRemoteDeletes().isEmpty());
}
@Test
public void resolveConflict_group_v1_sameAsLocal() {
SignalGroupV1Record remote1 = groupV1(1, 1, true, false);
SignalGroupV1Record local1 = groupV1(2, 1, true, true);
MergeResult result = StorageSyncHelper.resolveConflict(recordSetOf(remote1), recordSetOf(local1));
SignalGroupV1Record expectedMerge = groupV1(2, 1, true, true);
assertTrue(result.getLocalContactInserts().isEmpty());
assertTrue(result.getLocalGroupV1Updates().isEmpty());
assertTrue(result.getRemoteInserts().isEmpty());
assertEquals(setOf(recordUpdate(remote1, expectedMerge)), result.getRemoteUpdates());
assertTrue(result.getRemoteDeletes().isEmpty());
}
@Test
public void resolveConflict_group_v2_sameAsLocal() {
SignalGroupV2Record remote1 = groupV2(1, 2, true, false);
SignalGroupV2Record local1 = groupV2(2, 2, true, true);
MergeResult result = StorageSyncHelper.resolveConflict(recordSetOf(remote1), recordSetOf(local1));
SignalGroupV2Record expectedMerge = groupV2(2, 2, true, true);
assertTrue(result.getLocalContactInserts().isEmpty());
assertTrue(result.getLocalGroupV2Updates().isEmpty());
assertTrue(result.getRemoteInserts().isEmpty());
assertEquals(setOf(recordUpdate(remote1, expectedMerge)), result.getRemoteUpdates());
assertTrue(result.getRemoteDeletes().isEmpty());
}
@Test
public void resolveConflict_unknowns() {
SignalStorageRecord account = SignalStorageRecord.forAccount(account(99));
@ -332,7 +300,7 @@ public final class StorageSyncHelperTest {
SignalStorageRecord unknownRemote = unknown(13);
SignalStorageRecord unknownLocal = unknown(14);
StorageSyncHelper.setTestKeyGenerator(new TestGenerator(111, 222, 333));
StorageSyncHelper.setTestKeyGenerator(new TestGenerator(111));
Set<SignalStorageRecord> remoteOnly = recordSetOf(remote1, remote2, remote3, remote4, remote5, remote6, unknownRemote);
Set<SignalStorageRecord> localOnly = recordSetOf(local1, local2, local3, local4, local5, local6, unknownLocal);
@ -341,15 +309,13 @@ public final class StorageSyncHelperTest {
SignalContactRecord merge1 = contact(2, UUID_A, E164_A, "a");
SignalContactRecord merge2 = contact(111, UUID_B, E164_B, "b");
SignalGroupV1Record merge4 = groupV1(222, 1, true, true);
SignalGroupV2Record merge5 = groupV2(333, 2, true, true);
assertEquals(setOf(remote3), result.getLocalContactInserts());
assertEquals(setOf(update(local2, merge2)), result.getLocalContactUpdates());
assertEquals(setOf(update(local4, merge4)), result.getLocalGroupV1Updates());
assertEquals(setOf(update(local5, merge5)), result.getLocalGroupV2Updates());
assertEquals(setOf(update(local4, remote4)), result.getLocalGroupV1Updates());
assertEquals(setOf(update(local5, remote5)), result.getLocalGroupV2Updates());
assertEquals(setOf(SignalStorageRecord.forContact(local3)), result.getRemoteInserts());
assertEquals(setOf(recordUpdate(remote1, merge1), recordUpdate(remote2, merge2), recordUpdate(remote4, merge4), recordUpdate(remote5, merge5)), result.getRemoteUpdates());
assertEquals(setOf(recordUpdate(remote1, merge1), recordUpdate(remote2, merge2)), result.getRemoteUpdates());
assertEquals(Optional.of(update(local6, remote6)), result.getLocalAccountUpdate());
assertEquals(setOf(unknownRemote), result.getLocalUnknownInserts());
assertEquals(setOf(unknownLocal), result.getLocalUnknownDeletes());