Ensure direct add members to a group removes any matching pending.

This commit is contained in:
Alan Evans 2020-07-07 12:00:09 -03:00 committed by Greyson Parrelli
parent 599e89b1f9
commit 99ff0c1e3c
2 changed files with 60 additions and 0 deletions

View File

@ -55,6 +55,16 @@ public final class DecryptedGroupUtil {
return uuidList; return uuidList;
} }
public static Set<ByteString> membersToUuidByteStringSet(Collection<DecryptedMember> membersList) {
Set<ByteString> uuidList = new HashSet<>(membersList.size());
for (DecryptedMember member : membersList) {
uuidList.add(member.getUuid());
}
return uuidList;
}
public static ArrayList<UUID> pendingToUuidList(Collection<DecryptedPendingMember> membersList) { public static ArrayList<UUID> pendingToUuidList(Collection<DecryptedPendingMember> membersList) {
ArrayList<UUID> uuidList = new ArrayList<>(membersList.size()); ArrayList<UUID> uuidList = new ArrayList<>(membersList.size());
@ -268,9 +278,22 @@ public final class DecryptedGroupUtil {
.build()); .build());
} }
removePendingMembersNowInGroup(builder);
return builder.setRevision(change.getRevision()).build(); return builder.setRevision(change.getRevision()).build();
} }
static void removePendingMembersNowInGroup(DecryptedGroup.Builder builder) {
Set<ByteString> allMembers = membersToUuidByteStringSet(builder.getMembersList());
for (int i = builder.getPendingMembersCount() - 1; i >= 0; i--) {
DecryptedPendingMember pendingMember = builder.getPendingMembers(i);
if (allMembers.contains(pendingMember.getUuid())) {
builder.removePendingMembers(i);
}
}
}
private static int indexOfUuid(List<DecryptedMember> memberList, ByteString uuid) { private static int indexOfUuid(List<DecryptedMember> memberList, ByteString uuid) {
for (int i = 0; i < memberList.size(); i++) { for (int i = 0; i < memberList.size(); i++) {
if(uuid.equals(memberList.get(i).getUuid())) return i; if(uuid.equals(memberList.get(i).getUuid())) return i;

View File

@ -269,6 +269,43 @@ public final class DecryptedGroupUtil_apply_Test {
newGroup); newGroup);
} }
@Test
public void skip_promote_pending_member_by_direct_add() throws DecryptedGroupUtil.NotAbleToApplyChangeException {
ProfileKey profileKey2 = randomProfileKey();
ProfileKey profileKey3 = randomProfileKey();
DecryptedMember member1 = member(UUID.randomUUID());
UUID pending2Uuid = UUID.randomUUID();
UUID pending3Uuid = UUID.randomUUID();
UUID pending4Uuid = UUID.randomUUID();
DecryptedPendingMember pending2 = pendingMember(pending2Uuid);
DecryptedPendingMember pending3 = pendingMember(pending3Uuid);
DecryptedPendingMember pending4 = pendingMember(pending4Uuid);
DecryptedMember member2 = member(pending2Uuid, profileKey2);
DecryptedMember member3 = member(pending3Uuid, profileKey3);
DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder()
.setRevision(10)
.addMembers(member1)
.addPendingMembers(pending2)
.addPendingMembers(pending3)
.addPendingMembers(pending4)
.build(),
DecryptedGroupChange.newBuilder()
.setRevision(11)
.addNewMembers(member2)
.addNewMembers(member3)
.build());
assertEquals(DecryptedGroup.newBuilder()
.setRevision(11)
.addMembers(member1)
.addMembers(member2)
.addMembers(member3)
.addPendingMembers(pending4)
.build(),
newGroup);
}
@Test @Test
public void title() throws DecryptedGroupUtil.NotAbleToApplyChangeException { public void title() throws DecryptedGroupUtil.NotAbleToApplyChangeException {
DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder() DecryptedGroup newGroup = DecryptedGroupUtil.apply(DecryptedGroup.newBuilder()