Add DeletedAccounts DynamoDB table
This commit is contained in:
parent
fc1541591a
commit
a315c9be92
|
@ -89,6 +89,10 @@ accountsDynamoDb: # DynamoDB table configuration
|
||||||
tableName:
|
tableName:
|
||||||
phoneNumberTableName:
|
phoneNumberTableName:
|
||||||
|
|
||||||
|
deletedAccountsDynamoDb: # DynamoDb table configuration
|
||||||
|
region:
|
||||||
|
tableName:
|
||||||
|
|
||||||
migrationDeletedAccountsDynamoDb: # DynamoDB table configuration
|
migrationDeletedAccountsDynamoDb: # DynamoDB table configuration
|
||||||
region:
|
region:
|
||||||
tableName:
|
tableName:
|
||||||
|
|
|
@ -157,6 +157,11 @@ public class WhisperServerConfiguration extends Configuration {
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
private DynamoDbConfiguration migrationRetryAccountsDynamoDb;
|
private DynamoDbConfiguration migrationRetryAccountsDynamoDb;
|
||||||
|
|
||||||
|
@Valid
|
||||||
|
@NotNull
|
||||||
|
@JsonProperty
|
||||||
|
private DynamoDbConfiguration deletedAccountsDynamoDb;
|
||||||
|
|
||||||
@Valid
|
@Valid
|
||||||
@NotNull
|
@NotNull
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
|
@ -381,6 +386,10 @@ public class WhisperServerConfiguration extends Configuration {
|
||||||
return migrationRetryAccountsDynamoDb;
|
return migrationRetryAccountsDynamoDb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DynamoDbConfiguration getDeletedAccountsDynamoDbConfiguration() {
|
||||||
|
return deletedAccountsDynamoDb;
|
||||||
|
}
|
||||||
|
|
||||||
public DatabaseConfiguration getAbuseDatabaseConfiguration() {
|
public DatabaseConfiguration getAbuseDatabaseConfiguration() {
|
||||||
return abuseDatabase;
|
return abuseDatabase;
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,6 +155,7 @@ import org.whispersystems.textsecuregcm.storage.AccountsDynamoDb;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsDynamoDbMigrator;
|
import org.whispersystems.textsecuregcm.storage.AccountsDynamoDbMigrator;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
||||||
import org.whispersystems.textsecuregcm.storage.ActiveUserCounter;
|
import org.whispersystems.textsecuregcm.storage.ActiveUserCounter;
|
||||||
|
import org.whispersystems.textsecuregcm.storage.DeletedAccounts;
|
||||||
import org.whispersystems.textsecuregcm.storage.DirectoryReconciler;
|
import org.whispersystems.textsecuregcm.storage.DirectoryReconciler;
|
||||||
import org.whispersystems.textsecuregcm.storage.DirectoryReconciliationClient;
|
import org.whispersystems.textsecuregcm.storage.DirectoryReconciliationClient;
|
||||||
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
||||||
|
@ -331,6 +332,9 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
|
||||||
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create(),
|
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create(),
|
||||||
accountsDynamoDbMigrationThreadPool);
|
accountsDynamoDbMigrationThreadPool);
|
||||||
|
|
||||||
|
DynamoDbClient deletedAccountsDynamoDbClient = DynamoDbFromConfig.client(config.getDeletedAccountsDynamoDbConfiguration(),
|
||||||
|
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
||||||
|
|
||||||
DynamoDbClient recentlyDeletedAccountsDynamoDb = DynamoDbFromConfig.client(config.getMigrationDeletedAccountsDynamoDbConfiguration(),
|
DynamoDbClient recentlyDeletedAccountsDynamoDb = DynamoDbFromConfig.client(config.getMigrationDeletedAccountsDynamoDbConfiguration(),
|
||||||
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
||||||
|
|
||||||
|
@ -349,6 +353,7 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
|
||||||
DynamoDbClient pendingDevicesDynamoDbClient = DynamoDbFromConfig.client(config.getPendingDevicesDynamoDbConfiguration(),
|
DynamoDbClient pendingDevicesDynamoDbClient = DynamoDbFromConfig.client(config.getPendingDevicesDynamoDbConfiguration(),
|
||||||
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
||||||
|
|
||||||
|
DeletedAccounts deletedAccounts = new DeletedAccounts(deletedAccountsDynamoDbClient, config.getDeletedAccountsDynamoDbConfiguration().getTableName());
|
||||||
MigrationDeletedAccounts migrationDeletedAccounts = new MigrationDeletedAccounts(recentlyDeletedAccountsDynamoDb, config.getMigrationDeletedAccountsDynamoDbConfiguration().getTableName());
|
MigrationDeletedAccounts migrationDeletedAccounts = new MigrationDeletedAccounts(recentlyDeletedAccountsDynamoDb, config.getMigrationDeletedAccountsDynamoDbConfiguration().getTableName());
|
||||||
MigrationRetryAccounts migrationRetryAccounts = new MigrationRetryAccounts(migrationRetryAccountsDynamoDb, config.getMigrationRetryAccountsDynamoDbConfiguration().getTableName());
|
MigrationRetryAccounts migrationRetryAccounts = new MigrationRetryAccounts(migrationRetryAccountsDynamoDb, config.getMigrationRetryAccountsDynamoDbConfiguration().getTableName());
|
||||||
|
|
||||||
|
@ -431,7 +436,7 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
|
||||||
PushLatencyManager pushLatencyManager = new PushLatencyManager(metricsCluster);
|
PushLatencyManager pushLatencyManager = new PushLatencyManager(metricsCluster);
|
||||||
ReportMessageManager reportMessageManager = new ReportMessageManager(reportMessageDynamoDb, Metrics.globalRegistry);
|
ReportMessageManager reportMessageManager = new ReportMessageManager(reportMessageDynamoDb, Metrics.globalRegistry);
|
||||||
MessagesManager messagesManager = new MessagesManager(messagesDynamoDb, messagesCache, pushLatencyManager, reportMessageManager);
|
MessagesManager messagesManager = new MessagesManager(messagesDynamoDb, messagesCache, pushLatencyManager, reportMessageManager);
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
RemoteConfigsManager remoteConfigsManager = new RemoteConfigsManager(remoteConfigs);
|
RemoteConfigsManager remoteConfigsManager = new RemoteConfigsManager(remoteConfigs);
|
||||||
DeadLetterHandler deadLetterHandler = new DeadLetterHandler(accountsManager, messagesManager);
|
DeadLetterHandler deadLetterHandler = new DeadLetterHandler(accountsManager, messagesManager);
|
||||||
DispatchManager dispatchManager = new DispatchManager(pubSubClientFactory, Optional.of(deadLetterHandler));
|
DispatchManager dispatchManager = new DispatchManager(pubSubClientFactory, Optional.of(deadLetterHandler));
|
||||||
|
|
|
@ -71,6 +71,7 @@ public class AccountsManager {
|
||||||
private final Accounts accounts;
|
private final Accounts accounts;
|
||||||
private final AccountsDynamoDb accountsDynamoDb;
|
private final AccountsDynamoDb accountsDynamoDb;
|
||||||
private final FaultTolerantRedisCluster cacheCluster;
|
private final FaultTolerantRedisCluster cacheCluster;
|
||||||
|
private final DeletedAccounts deletedAccounts;
|
||||||
private final DirectoryQueue directoryQueue;
|
private final DirectoryQueue directoryQueue;
|
||||||
private final KeysDynamoDb keysDynamoDb;
|
private final KeysDynamoDb keysDynamoDb;
|
||||||
private final MessagesManager messagesManager;
|
private final MessagesManager messagesManager;
|
||||||
|
@ -97,14 +98,18 @@ public class AccountsManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public AccountsManager(Accounts accounts, AccountsDynamoDb accountsDynamoDb, FaultTolerantRedisCluster cacheCluster, final DirectoryQueue directoryQueue,
|
public AccountsManager(Accounts accounts, AccountsDynamoDb accountsDynamoDb, FaultTolerantRedisCluster cacheCluster,
|
||||||
|
final DeletedAccounts deletedAccounts,
|
||||||
|
final DirectoryQueue directoryQueue,
|
||||||
final KeysDynamoDb keysDynamoDb, final MessagesManager messagesManager, final UsernamesManager usernamesManager,
|
final KeysDynamoDb keysDynamoDb, final MessagesManager messagesManager, final UsernamesManager usernamesManager,
|
||||||
final ProfilesManager profilesManager, final SecureStorageClient secureStorageClient,
|
final ProfilesManager profilesManager, final SecureStorageClient secureStorageClient,
|
||||||
final SecureBackupClient secureBackupClient,
|
final SecureBackupClient secureBackupClient,
|
||||||
final ExperimentEnrollmentManager experimentEnrollmentManager, final DynamicConfigurationManager dynamicConfigurationManager) {
|
final ExperimentEnrollmentManager experimentEnrollmentManager,
|
||||||
|
final DynamicConfigurationManager dynamicConfigurationManager) {
|
||||||
this.accounts = accounts;
|
this.accounts = accounts;
|
||||||
this.accountsDynamoDb = accountsDynamoDb;
|
this.accountsDynamoDb = accountsDynamoDb;
|
||||||
this.cacheCluster = cacheCluster;
|
this.cacheCluster = cacheCluster;
|
||||||
|
this.deletedAccounts = deletedAccounts;
|
||||||
this.directoryQueue = directoryQueue;
|
this.directoryQueue = directoryQueue;
|
||||||
this.keysDynamoDb = keysDynamoDb;
|
this.keysDynamoDb = keysDynamoDb;
|
||||||
this.messagesManager = messagesManager;
|
this.messagesManager = messagesManager;
|
||||||
|
@ -263,6 +268,8 @@ public class AccountsManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deletedAccounts.put(account.getUuid(), account.getNumber());
|
||||||
|
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
logger.warn("Failed to delete account", e);
|
logger.warn("Failed to delete account", e);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2013-2021 Signal Messenger, LLC
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
package org.whispersystems.textsecuregcm.storage;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import org.whispersystems.textsecuregcm.util.AttributeValues;
|
||||||
|
import org.whispersystems.textsecuregcm.util.Pair;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.DeleteRequest;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.PutItemRequest;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.WriteRequest;
|
||||||
|
|
||||||
|
public class DeletedAccounts extends AbstractDynamoDbStore {
|
||||||
|
|
||||||
|
// uuid, primary key
|
||||||
|
static final String KEY_ACCOUNT_UUID = "U";
|
||||||
|
static final String ATTR_ACCOUNT_E164 = "P";
|
||||||
|
|
||||||
|
private final String tableName;
|
||||||
|
|
||||||
|
public DeletedAccounts(final DynamoDbClient dynamoDb, final String tableName) {
|
||||||
|
|
||||||
|
super(dynamoDb);
|
||||||
|
this.tableName = tableName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put(UUID uuid, String e164) {
|
||||||
|
db().putItem(PutItemRequest.builder()
|
||||||
|
.tableName(tableName)
|
||||||
|
.item(Map.of(
|
||||||
|
KEY_ACCOUNT_UUID, AttributeValues.fromUUID(uuid),
|
||||||
|
ATTR_ACCOUNT_E164, AttributeValues.fromString(e164)))
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Pair<UUID, String>> list(final int max) {
|
||||||
|
|
||||||
|
final ScanRequest scanRequest = ScanRequest.builder()
|
||||||
|
.tableName(tableName)
|
||||||
|
.limit(max)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return scan(scanRequest, max)
|
||||||
|
.stream()
|
||||||
|
.map(item -> new Pair<>(
|
||||||
|
AttributeValues.getUUID(item, KEY_ACCOUNT_UUID, null),
|
||||||
|
AttributeValues.getString(item, ATTR_ACCOUNT_E164, null)))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void delete(final List<UUID> uuidsToDelete) {
|
||||||
|
|
||||||
|
writeInBatches(uuidsToDelete, (uuids -> {
|
||||||
|
|
||||||
|
final List<WriteRequest> deletes = uuids.stream()
|
||||||
|
.map(uuid -> WriteRequest.builder().deleteRequest(
|
||||||
|
DeleteRequest.builder().key(Map.of(KEY_ACCOUNT_UUID, AttributeValues.fromUUID(uuid))).build()).build())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
executeTableWriteItemsUntilComplete(Map.of(tableName, deletes));
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -7,8 +7,6 @@ package org.whispersystems.textsecuregcm.workers;
|
||||||
|
|
||||||
import static com.codahale.metrics.MetricRegistry.name;
|
import static com.codahale.metrics.MetricRegistry.name;
|
||||||
|
|
||||||
import com.amazonaws.ClientConfiguration;
|
|
||||||
import com.amazonaws.auth.InstanceProfileCredentialsProvider;
|
|
||||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||||
import io.dropwizard.Application;
|
import io.dropwizard.Application;
|
||||||
import io.dropwizard.cli.EnvironmentCommand;
|
import io.dropwizard.cli.EnvironmentCommand;
|
||||||
|
@ -39,6 +37,7 @@ import org.whispersystems.textsecuregcm.storage.Accounts;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsDynamoDb;
|
import org.whispersystems.textsecuregcm.storage.AccountsDynamoDb;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsManager.DeletionReason;
|
import org.whispersystems.textsecuregcm.storage.AccountsManager.DeletionReason;
|
||||||
|
import org.whispersystems.textsecuregcm.storage.DeletedAccounts;
|
||||||
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
||||||
import org.whispersystems.textsecuregcm.storage.FaultTolerantDatabase;
|
import org.whispersystems.textsecuregcm.storage.FaultTolerantDatabase;
|
||||||
import org.whispersystems.textsecuregcm.storage.KeysDynamoDb;
|
import org.whispersystems.textsecuregcm.storage.KeysDynamoDb;
|
||||||
|
@ -112,6 +111,8 @@ public class DeleteUserCommand extends EnvironmentCommand<WhisperServerConfigura
|
||||||
DynamoDbAsyncClient accountsDynamoDbAsyncClient = DynamoDbFromConfig.asyncClient(configuration.getAccountsDynamoDbConfiguration(),
|
DynamoDbAsyncClient accountsDynamoDbAsyncClient = DynamoDbFromConfig.asyncClient(configuration.getAccountsDynamoDbConfiguration(),
|
||||||
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create(),
|
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create(),
|
||||||
accountsDynamoDbMigrationThreadPool);
|
accountsDynamoDbMigrationThreadPool);
|
||||||
|
DynamoDbClient deletedAccountsDynamoDbClient = DynamoDbFromConfig.client(configuration.getDeletedAccountsDynamoDbConfiguration(),
|
||||||
|
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
||||||
|
|
||||||
FaultTolerantRedisCluster cacheCluster = new FaultTolerantRedisCluster("main_cache_cluster", configuration.getCacheClusterConfiguration(), redisClusterClientResources);
|
FaultTolerantRedisCluster cacheCluster = new FaultTolerantRedisCluster("main_cache_cluster", configuration.getCacheClusterConfiguration(), redisClusterClientResources);
|
||||||
|
|
||||||
|
@ -132,6 +133,7 @@ public class DeleteUserCommand extends EnvironmentCommand<WhisperServerConfigura
|
||||||
DynamoDbClient migrationRetryAccountsDynamoDb = DynamoDbFromConfig.client(configuration.getMigrationRetryAccountsDynamoDbConfiguration(),
|
DynamoDbClient migrationRetryAccountsDynamoDb = DynamoDbFromConfig.client(configuration.getMigrationRetryAccountsDynamoDbConfiguration(),
|
||||||
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider.create());
|
||||||
|
|
||||||
|
DeletedAccounts deletedAccounts = new DeletedAccounts(deletedAccountsDynamoDbClient, configuration.getDeletedAccountsDynamoDbConfiguration().getTableName());
|
||||||
MigrationDeletedAccounts migrationDeletedAccounts = new MigrationDeletedAccounts(migrationDeletedAccountsDynamoDb, configuration.getMigrationDeletedAccountsDynamoDbConfiguration().getTableName());
|
MigrationDeletedAccounts migrationDeletedAccounts = new MigrationDeletedAccounts(migrationDeletedAccountsDynamoDb, configuration.getMigrationDeletedAccountsDynamoDbConfiguration().getTableName());
|
||||||
MigrationRetryAccounts migrationRetryAccounts = new MigrationRetryAccounts(migrationRetryAccountsDynamoDb, configuration.getMigrationRetryAccountsDynamoDbConfiguration().getTableName());
|
MigrationRetryAccounts migrationRetryAccounts = new MigrationRetryAccounts(migrationRetryAccountsDynamoDb, configuration.getMigrationRetryAccountsDynamoDbConfiguration().getTableName());
|
||||||
|
|
||||||
|
@ -155,7 +157,7 @@ public class DeleteUserCommand extends EnvironmentCommand<WhisperServerConfigura
|
||||||
ReportMessageDynamoDb reportMessageDynamoDb = new ReportMessageDynamoDb(reportMessagesDynamoDb, configuration.getReportMessageDynamoDbConfiguration().getTableName());
|
ReportMessageDynamoDb reportMessageDynamoDb = new ReportMessageDynamoDb(reportMessagesDynamoDb, configuration.getReportMessageDynamoDbConfiguration().getTableName());
|
||||||
ReportMessageManager reportMessageManager = new ReportMessageManager(reportMessageDynamoDb, Metrics.globalRegistry);
|
ReportMessageManager reportMessageManager = new ReportMessageManager(reportMessageDynamoDb, Metrics.globalRegistry);
|
||||||
MessagesManager messagesManager = new MessagesManager(messagesDynamoDb, messagesCache, pushLatencyManager, reportMessageManager);
|
MessagesManager messagesManager = new MessagesManager(messagesDynamoDb, messagesCache, pushLatencyManager, reportMessageManager);
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
|
|
||||||
for (String user: users) {
|
for (String user: users) {
|
||||||
Optional<Account> account = accountsManager.get(user);
|
Optional<Account> account = accountsManager.get(user);
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2013-2021 Signal Messenger, LLC
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
package org.whispersystems.textsecuregcm.storage;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||||
|
import org.whispersystems.textsecuregcm.util.Pair;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition;
|
||||||
|
import software.amazon.awssdk.services.dynamodb.model.ScalarAttributeType;
|
||||||
|
|
||||||
|
class DeletedAccountsTest {
|
||||||
|
|
||||||
|
@RegisterExtension
|
||||||
|
static DynamoDbExtension dynamoDbExtension = DynamoDbExtension.builder()
|
||||||
|
.tableName("deleted_accounts_test")
|
||||||
|
.hashKey(DeletedAccounts.KEY_ACCOUNT_UUID)
|
||||||
|
.attributeDefinition(AttributeDefinition.builder()
|
||||||
|
.attributeName(DeletedAccounts.KEY_ACCOUNT_UUID)
|
||||||
|
.attributeType(ScalarAttributeType.B).build())
|
||||||
|
.build();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void test() {
|
||||||
|
|
||||||
|
final DeletedAccounts deletedAccounts = new DeletedAccounts(dynamoDbExtension.getDynamoDbClient(),
|
||||||
|
dynamoDbExtension.getTableName());
|
||||||
|
|
||||||
|
UUID firstUuid = UUID.randomUUID();
|
||||||
|
UUID secondUuid = UUID.randomUUID();
|
||||||
|
|
||||||
|
String firstNumber = "+14152221234";
|
||||||
|
String secondNumber = "+14152225678";
|
||||||
|
|
||||||
|
assertTrue(deletedAccounts.list(1).isEmpty());
|
||||||
|
|
||||||
|
deletedAccounts.put(firstUuid, firstNumber);
|
||||||
|
deletedAccounts.put(secondUuid, secondNumber);
|
||||||
|
|
||||||
|
assertEquals(1, deletedAccounts.list(1).size());
|
||||||
|
|
||||||
|
assertTrue(deletedAccounts.list(10).containsAll(
|
||||||
|
List.of(
|
||||||
|
new Pair<>(firstUuid, firstNumber),
|
||||||
|
new Pair<>(secondUuid, secondNumber))));
|
||||||
|
|
||||||
|
deletedAccounts.delete(List.of(firstUuid, secondUuid));
|
||||||
|
|
||||||
|
assertTrue(deletedAccounts.list(10).isEmpty());
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,6 +41,7 @@ import org.whispersystems.textsecuregcm.storage.Account;
|
||||||
import org.whispersystems.textsecuregcm.storage.Accounts;
|
import org.whispersystems.textsecuregcm.storage.Accounts;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsDynamoDb;
|
import org.whispersystems.textsecuregcm.storage.AccountsDynamoDb;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
||||||
|
import org.whispersystems.textsecuregcm.storage.DeletedAccounts;
|
||||||
import org.whispersystems.textsecuregcm.storage.Device;
|
import org.whispersystems.textsecuregcm.storage.Device;
|
||||||
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
||||||
import org.whispersystems.textsecuregcm.storage.KeysDynamoDb;
|
import org.whispersystems.textsecuregcm.storage.KeysDynamoDb;
|
||||||
|
@ -70,6 +71,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -85,7 +87,8 @@ class AccountsManagerTest {
|
||||||
when(commands.get(eq("AccountMap::+14152222222"))).thenReturn(uuid.toString());
|
when(commands.get(eq("AccountMap::+14152222222"))).thenReturn(uuid.toString());
|
||||||
when(commands.get(eq("Account3::" + uuid.toString()))).thenReturn("{\"number\": \"+14152222222\", \"name\": \"test\"}");
|
when(commands.get(eq("Account3::" + uuid.toString()))).thenReturn("{\"number\": \"+14152222222\", \"name\": \"test\"}");
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
Optional<Account> account = accountsManager.get("+14152222222");
|
Optional<Account> account = accountsManager.get("+14152222222");
|
||||||
|
|
||||||
assertTrue(account.isPresent());
|
assertTrue(account.isPresent());
|
||||||
|
@ -120,6 +123,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -134,7 +138,8 @@ class AccountsManagerTest {
|
||||||
|
|
||||||
when(commands.get(eq("Account3::" + uuid.toString()))).thenReturn("{\"number\": \"+14152222222\", \"name\": \"test\"}");
|
when(commands.get(eq("Account3::" + uuid.toString()))).thenReturn("{\"number\": \"+14152222222\", \"name\": \"test\"}");
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
Optional<Account> account = accountsManager.get(uuid);
|
Optional<Account> account = accountsManager.get(uuid);
|
||||||
|
|
||||||
assertTrue(account.isPresent());
|
assertTrue(account.isPresent());
|
||||||
|
@ -157,6 +162,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -172,7 +178,8 @@ class AccountsManagerTest {
|
||||||
when(commands.get(eq("AccountMap::+14152222222"))).thenReturn(null);
|
when(commands.get(eq("AccountMap::+14152222222"))).thenReturn(null);
|
||||||
when(accounts.get(eq("+14152222222"))).thenReturn(Optional.of(account));
|
when(accounts.get(eq("+14152222222"))).thenReturn(Optional.of(account));
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
Optional<Account> retrieved = accountsManager.get("+14152222222");
|
Optional<Account> retrieved = accountsManager.get("+14152222222");
|
||||||
|
|
||||||
assertTrue(retrieved.isPresent());
|
assertTrue(retrieved.isPresent());
|
||||||
|
@ -198,6 +205,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -213,7 +221,8 @@ class AccountsManagerTest {
|
||||||
when(commands.get(eq("Account3::" + uuid))).thenReturn(null);
|
when(commands.get(eq("Account3::" + uuid))).thenReturn(null);
|
||||||
when(accounts.get(eq(uuid))).thenReturn(Optional.of(account));
|
when(accounts.get(eq(uuid))).thenReturn(Optional.of(account));
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
Optional<Account> retrieved = accountsManager.get(uuid);
|
Optional<Account> retrieved = accountsManager.get(uuid);
|
||||||
|
|
||||||
assertTrue(retrieved.isPresent());
|
assertTrue(retrieved.isPresent());
|
||||||
|
@ -238,6 +247,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -253,7 +263,8 @@ class AccountsManagerTest {
|
||||||
when(commands.get(eq("AccountMap::+14152222222"))).thenThrow(new RedisException("Connection lost!"));
|
when(commands.get(eq("AccountMap::+14152222222"))).thenThrow(new RedisException("Connection lost!"));
|
||||||
when(accounts.get(eq("+14152222222"))).thenReturn(Optional.of(account));
|
when(accounts.get(eq("+14152222222"))).thenReturn(Optional.of(account));
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
Optional<Account> retrieved = accountsManager.get("+14152222222");
|
Optional<Account> retrieved = accountsManager.get("+14152222222");
|
||||||
|
|
||||||
assertTrue(retrieved.isPresent());
|
assertTrue(retrieved.isPresent());
|
||||||
|
@ -278,6 +289,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -293,7 +305,8 @@ class AccountsManagerTest {
|
||||||
when(commands.get(eq("Account3::" + uuid))).thenThrow(new RedisException("Connection lost!"));
|
when(commands.get(eq("Account3::" + uuid))).thenThrow(new RedisException("Connection lost!"));
|
||||||
when(accounts.get(eq(uuid))).thenReturn(Optional.of(account));
|
when(accounts.get(eq(uuid))).thenReturn(Optional.of(account));
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
Optional<Account> retrieved = accountsManager.get(uuid);
|
Optional<Account> retrieved = accountsManager.get(uuid);
|
||||||
|
|
||||||
assertTrue(retrieved.isPresent());
|
assertTrue(retrieved.isPresent());
|
||||||
|
@ -318,6 +331,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -332,7 +346,8 @@ class AccountsManagerTest {
|
||||||
|
|
||||||
when(commands.get(eq("Account3::" + uuid))).thenReturn(null);
|
when(commands.get(eq("Account3::" + uuid))).thenReturn(null);
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
|
|
||||||
assertEquals(0, account.getDynamoDbMigrationVersion());
|
assertEquals(0, account.getDynamoDbMigrationVersion());
|
||||||
|
|
||||||
|
@ -353,6 +368,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -368,7 +384,8 @@ class AccountsManagerTest {
|
||||||
when(commands.get(eq("Account3::" + uuid))).thenReturn(null);
|
when(commands.get(eq("Account3::" + uuid))).thenReturn(null);
|
||||||
doThrow(ConditionalCheckFailedException.class).when(accountsDynamoDb).update(any(Account.class));
|
doThrow(ConditionalCheckFailedException.class).when(accountsDynamoDb).update(any(Account.class));
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
|
|
||||||
assertEquals(0, account.getDynamoDbMigrationVersion());
|
assertEquals(0, account.getDynamoDbMigrationVersion());
|
||||||
|
|
||||||
|
@ -390,6 +407,7 @@ class AccountsManagerTest {
|
||||||
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
FaultTolerantRedisCluster cacheCluster = RedisClusterHelper.buildMockRedisCluster(commands);
|
||||||
Accounts accounts = mock(Accounts.class);
|
Accounts accounts = mock(Accounts.class);
|
||||||
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
AccountsDynamoDb accountsDynamoDb = mock(AccountsDynamoDb.class);
|
||||||
|
DeletedAccounts deletedAccounts = mock(DeletedAccounts.class);
|
||||||
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
DirectoryQueue directoryQueue = mock(DirectoryQueue.class);
|
||||||
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
KeysDynamoDb keysDynamoDb = mock(KeysDynamoDb.class);
|
||||||
MessagesManager messagesManager = mock(MessagesManager.class);
|
MessagesManager messagesManager = mock(MessagesManager.class);
|
||||||
|
@ -398,7 +416,8 @@ class AccountsManagerTest {
|
||||||
SecureBackupClient secureBackupClient = mock(SecureBackupClient.class);
|
SecureBackupClient secureBackupClient = mock(SecureBackupClient.class);
|
||||||
SecureStorageClient secureStorageClient = mock(SecureStorageClient.class);
|
SecureStorageClient secureStorageClient = mock(SecureStorageClient.class);
|
||||||
|
|
||||||
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
AccountsManager accountsManager = new AccountsManager(accounts, accountsDynamoDb, cacheCluster, deletedAccounts,
|
||||||
|
directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient, experimentEnrollmentManager, dynamicConfigurationManager);
|
||||||
|
|
||||||
assertEquals(Optional.empty(), accountsManager.compareAccounts(Optional.empty(), Optional.empty()));
|
assertEquals(Optional.empty(), accountsManager.compareAccounts(Optional.empty(), Optional.empty()));
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue