Migrate away from placeholder revision to support exporting pending approval groups.

This commit is contained in:
Cody Henthorne
2025-07-03 10:11:12 -04:00
committed by Alex Hart
parent dc8e93a9d3
commit 5ce5326721
16 changed files with 102 additions and 36 deletions

View File

@@ -121,9 +121,10 @@ class GroupStateTestData(private val masterKey: GroupMasterKey, private val grou
pendingMembers: List<DecryptedPendingMember> = emptyList(),
requestingMembers: List<DecryptedRequestingMember> = emptyList(),
inviteLinkPassword: ByteArray = ByteArray(0),
disappearingMessageTimer: DecryptedTimer = DecryptedTimer()
disappearingMessageTimer: DecryptedTimer = DecryptedTimer(),
isPlaceholderGroup: Boolean = false
) {
localState = decryptedGroup(revision, title, avatar, description, accessControl, members, pendingMembers, requestingMembers, inviteLinkPassword, disappearingMessageTimer)
localState = decryptedGroup(revision, title, avatar, description, accessControl, members, pendingMembers, requestingMembers, inviteLinkPassword, disappearingMessageTimer, isPlaceholderGroup)
groupRecord = groupRecord(masterKey, localState!!, active = active)
}
@@ -209,7 +210,8 @@ fun decryptedGroup(
pendingMembers: List<DecryptedPendingMember> = emptyList(),
requestingMembers: List<DecryptedRequestingMember> = emptyList(),
inviteLinkPassword: ByteArray = ByteArray(0),
disappearingMessageTimer: DecryptedTimer = DecryptedTimer()
disappearingMessageTimer: DecryptedTimer = DecryptedTimer(),
isPlaceholderGroup: Boolean = false
): DecryptedGroup {
return DecryptedGroup(
accessControl = accessControl,
@@ -222,6 +224,7 @@ fun decryptedGroup(
revision = revision,
members = members,
pendingMembers = pendingMembers,
requestingMembers = requestingMembers
requestingMembers = requestingMembers,
isPlaceholderGroup = isPlaceholderGroup
)
}

View File

@@ -543,7 +543,8 @@ class GroupStatePatcherTest {
@Test
fun no_repair_change_is_posted_if_the_local_state_is_a_placeholder() {
val currentState = DecryptedGroup.Builder()
.revision(GroupStatePatcher.PLACEHOLDER_REVISION)
.revision(0)
.isPlaceholderGroup(true)
.title("Incorrect group title, Revision " + 6)
.build()
val log6 = serverLogEntry(6)
@@ -574,7 +575,8 @@ class GroupStatePatcherTest {
.aciBytes(ServiceId.ACI.from(UUID.randomUUID()).toByteString())
.build()
val currentState = DecryptedGroup.Builder()
.revision(GroupStatePatcher.PLACEHOLDER_REVISION)
.revision(0)
.isPlaceholderGroup(true)
.title("Group Revision " + 8)
.members(listOf(newMember))
.build()
@@ -684,7 +686,8 @@ class GroupStatePatcherTest {
.aciBytes(ServiceId.ACI.from(UUID.randomUUID()).toByteString())
.build()
val currentState = DecryptedGroup.Builder()
.revision(GroupStatePatcher.PLACEHOLDER_REVISION)
.revision(0)
.isPlaceholderGroup(true)
.title("Incorrect group title")
.avatar("Incorrect group avatar")
.members(listOf(newMember))

View File

@@ -662,9 +662,10 @@ class GroupsV2StateProcessorTest {
fun `when request to join group is approved, with no group changes after approved, then update from server to revision we were added`() {
given {
localState(
revision = GroupsV2StateProcessor.PLACEHOLDER_REVISION,
revision = 0,
title = "Beam me up",
requestingMembers = listOf(requestingMember(selfAci))
requestingMembers = listOf(requestingMember(selfAci)),
isPlaceholderGroup = true
)
changeSet {
@@ -703,9 +704,10 @@ class GroupsV2StateProcessorTest {
fun `when request to join group is approved, with group changes occurring after approved, then update from server to revision we were added, and then schedule pulling additional changes later`() {
given {
localState(
revision = GroupsV2StateProcessor.PLACEHOLDER_REVISION,
revision = 0,
title = "Beam me up",
requestingMembers = listOf(requestingMember(selfAci))
requestingMembers = listOf(requestingMember(selfAci)),
isPlaceholderGroup = true
)
changeSet {
changeLog(3) {