From ed972a0037150eec4250a64272924a7e5f88ca4a Mon Sep 17 00:00:00 2001 From: Ravi Khadiwala Date: Mon, 8 Jan 2024 17:03:55 -0600 Subject: [PATCH] Fix archive listing directory prefix order --- .../textsecuregcm/backup/BackupManager.java | 2 +- .../backup/BackupManagerTest.java | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupManager.java index ff2c67701..924bc831c 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupManager.java @@ -335,7 +335,7 @@ public CompletionStage list( .withDescription("credential does not support list operation") .asRuntimeException(); } - final String mediaPrefix = "%s/%s/".formatted(MEDIA_DIRECTORY_NAME, encodeBackupIdForCdn(backupUser)); + final String mediaPrefix = "%s/%s/".formatted(encodeBackupIdForCdn(backupUser), MEDIA_DIRECTORY_NAME); return remoteStorageManager.list(mediaPrefix, cursor, limit) .thenApply(result -> new ListMediaResult( diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/backup/BackupManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/backup/BackupManagerTest.java index b419e3897..7f6335289 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/backup/BackupManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/backup/BackupManagerTest.java @@ -29,17 +29,20 @@ import java.util.Arrays; import java.util.Base64; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; import javax.annotation.Nullable; +import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.ValueSource; import org.signal.libsignal.protocol.ecc.Curve; import org.signal.libsignal.protocol.ecc.ECKeyPair; import org.signal.libsignal.zkgroup.VerificationFailedException; @@ -380,6 +383,32 @@ public void quotaEnforcement( } } + @ParameterizedTest + @ValueSource(strings = {"", "cursor"}) + public void list(final String cursorVal) { + final Optional cursor = Optional.of(cursorVal).filter(StringUtils::isNotBlank); + final AuthenticatedBackupUser backupUser = backupUser(TestRandomUtil.nextBytes(16), BackupTier.MEDIA); + final String backupMediaPrefix = "%s/%s/".formatted( + BackupManager.encodeBackupIdForCdn(backupUser), + BackupManager.MEDIA_DIRECTORY_NAME); + + when(remoteStorageManager.cdnNumber()).thenReturn(13); + when(remoteStorageManager.list(eq(backupMediaPrefix), eq(cursor), eq(17L))) + .thenReturn(CompletableFuture.completedFuture(new RemoteStorageManager.ListResult( + List.of(new RemoteStorageManager.ListResult.Entry("aaa", 123)), + Optional.of("newCursor") + ))); + + final BackupManager.ListMediaResult result = backupManager.list(backupUser, cursor, 17) + .toCompletableFuture().join(); + assertThat(result.media()).hasSize(1); + assertThat(result.media().get(0).cdn()).isEqualTo(13); + assertThat(result.media().get(0).key()).isEqualTo(Base64.getDecoder().decode("aaa".getBytes(StandardCharsets.UTF_8))); + assertThat(result.media().get(0).length()).isEqualTo(123); + assertThat(result.cursor()).get().isEqualTo("newCursor"); + + } + private Map getBackupItem(final AuthenticatedBackupUser backupUser) { return DYNAMO_DB_EXTENSION.getDynamoDbClient().getItem(GetItemRequest.builder() .tableName(DynamoDbExtensionSchema.Tables.BACKUPS.tableName())