mirror of
https://github.com/signalapp/Signal-Server
synced 2026-04-21 21:58:06 +01:00
Add test for round-trip AccountsManager JSON serialization
This commit is contained in:
@@ -31,6 +31,8 @@ import static org.mockito.Mockito.when;
|
||||
import io.lettuce.core.RedisException;
|
||||
import io.lettuce.core.cluster.api.async.RedisAdvancedClusterAsyncCommands;
|
||||
import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands;
|
||||
import java.io.InputStream;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.Clock;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
@@ -39,6 +41,7 @@ import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
@@ -1328,6 +1331,46 @@ class AccountsManagerTest {
|
||||
assertThrows(AssertionError.class, () -> accountsManager.update(account, a -> a.setUsernameHash(USERNAME_HASH_1)));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testJsonRoundTripSerialization() throws Exception {
|
||||
String originalJson;
|
||||
try (InputStream inputStream = getClass().getResourceAsStream(
|
||||
"AccountsManagerTest-testJsonRoundTripSerialization.json")) {
|
||||
Objects.requireNonNull(inputStream);
|
||||
originalJson = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
|
||||
}
|
||||
|
||||
final Account originalAccount = AccountsManager.parseAccountJson(originalJson,
|
||||
UUID.fromString("111111-1111-1111-1111-111111111111")).orElseThrow();
|
||||
|
||||
final String serialized = AccountsManager.writeRedisAccountJson(originalAccount);
|
||||
final Account parsedAccount = AccountsManager.parseAccountJson(serialized, originalAccount.getUuid()).orElseThrow();
|
||||
|
||||
assertEquals(originalAccount.getUuid(), parsedAccount.getUuid());
|
||||
assertEquals(originalAccount.getPhoneNumberIdentifier(), parsedAccount.getPhoneNumberIdentifier());
|
||||
assertEquals(originalAccount.getIdentityKey(IdentityType.ACI), parsedAccount.getIdentityKey(IdentityType.ACI));
|
||||
assertEquals(originalAccount.getIdentityKey(IdentityType.PNI), parsedAccount.getIdentityKey(IdentityType.PNI));
|
||||
assertEquals(originalAccount.getNumber(), parsedAccount.getNumber());
|
||||
assertArrayEquals(originalAccount.getUnidentifiedAccessKey().orElseThrow(),
|
||||
parsedAccount.getUnidentifiedAccessKey().orElseThrow());
|
||||
assertEquals(originalAccount.isDiscoverableByPhoneNumber(), parsedAccount.isDiscoverableByPhoneNumber());
|
||||
assertEquals(originalAccount.isUnrestrictedUnidentifiedAccess(), parsedAccount.isUnrestrictedUnidentifiedAccess());
|
||||
|
||||
assertEquals(originalAccount.getDevices().size(), parsedAccount.getDevices().size());
|
||||
|
||||
final Device originalDevice = originalAccount.getMasterDevice().orElseThrow();
|
||||
final Device parsedDevice = parsedAccount.getMasterDevice().orElseThrow();
|
||||
|
||||
assertEquals(originalDevice.getId(), parsedDevice.getId());
|
||||
assertEquals(originalDevice.getSignedPreKey(IdentityType.ACI), parsedDevice.getSignedPreKey(IdentityType.ACI));
|
||||
assertEquals(originalDevice.getSignedPreKey(IdentityType.PNI), parsedDevice.getSignedPreKey(IdentityType.PNI));
|
||||
assertEquals(originalDevice.getRegistrationId(), parsedDevice.getRegistrationId());
|
||||
assertEquals(originalDevice.getPhoneNumberIdentityRegistrationId(),
|
||||
parsedDevice.getPhoneNumberIdentityRegistrationId());
|
||||
assertEquals(originalDevice.getCapabilities(), parsedDevice.getCapabilities());
|
||||
assertEquals(originalDevice.getFetchesMessages(), parsedDevice.getFetchesMessages());
|
||||
}
|
||||
|
||||
private void setReservationHash(final Account account, final byte[] reservedUsernameHash) {
|
||||
account.setReservedUsernameHash(reservedUsernameHash);
|
||||
}
|
||||
|
||||
@@ -183,13 +183,13 @@ class AccountsTest {
|
||||
accounts.create(account);
|
||||
|
||||
final UUID linkHandle = UUID.randomUUID();
|
||||
final byte[] encruptedUsername = RandomUtils.nextBytes(32);
|
||||
accountsManager.update(account, a -> a.setUsernameLinkDetails(linkHandle, encruptedUsername));
|
||||
final byte[] encryptedUsername = RandomUtils.nextBytes(32);
|
||||
accountsManager.update(account, a -> a.setUsernameLinkDetails(linkHandle, encryptedUsername));
|
||||
|
||||
final Optional<Account> maybeAccount = accountsManager.getByUsernameLinkHandle(linkHandle);
|
||||
assertTrue(maybeAccount.isPresent());
|
||||
assertTrue(maybeAccount.get().getEncryptedUsername().isPresent());
|
||||
assertArrayEquals(encruptedUsername, maybeAccount.get().getEncryptedUsername().get());
|
||||
assertArrayEquals(encryptedUsername, maybeAccount.get().getEncryptedUsername().get());
|
||||
|
||||
// making some unrelated change and updating account to check that username link data is still there
|
||||
final Optional<Account> accountToChange = accountsManager.getByAccountIdentifier(account.getUuid());
|
||||
@@ -198,7 +198,7 @@ class AccountsTest {
|
||||
final Optional<Account> accountAfterChange = accountsManager.getByUsernameLinkHandle(linkHandle);
|
||||
assertTrue(accountAfterChange.isPresent());
|
||||
assertTrue(accountAfterChange.get().getEncryptedUsername().isPresent());
|
||||
assertArrayEquals(encruptedUsername, accountAfterChange.get().getEncryptedUsername().get());
|
||||
assertArrayEquals(encryptedUsername, accountAfterChange.get().getEncryptedUsername().get());
|
||||
|
||||
// now deleting the link
|
||||
final Optional<Account> accountToDeleteLink = accountsManager.getByAccountIdentifier(account.getUuid());
|
||||
|
||||
Reference in New Issue
Block a user