From 92f035bc2aadcc5e5b3aa821bde586a789d51d62 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Thu, 2 Sep 2021 13:03:35 -0400 Subject: [PATCH] Add a "change number" device/account capability --- .../controllers/DeviceController.java | 1 + .../entities/UserCapabilities.java | 18 ++++++- .../textsecuregcm/storage/Account.java | 8 ++++ .../textsecuregcm/storage/Device.java | 10 +++- .../storage/AccountsDynamoDbTest.java | 2 +- ...ConcurrentModificationIntegrationTest.java | 2 +- .../textsecuregcm/storage/DeviceTest.java | 2 +- .../controllers/DeviceControllerTest.java | 41 +++++++++++++--- .../controllers/MessageControllerTest.java | 8 ++-- .../controllers/ProfileControllerTest.java | 2 + .../tests/storage/AccountTest.java | 47 +++++++++++++++---- .../tests/storage/AccountsManagerTest.java | 2 +- .../tests/storage/AccountsTest.java | 2 +- .../tests/util/AccountsHelper.java | 4 ++ 14 files changed, 121 insertions(+), 28 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java index f9d2308cc..24d4789c2 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java @@ -228,6 +228,7 @@ public class DeviceController { private boolean isCapabilityDowngrade(Account account, DeviceCapabilities capabilities, String userAgent) { boolean isDowngrade = false; + isDowngrade |= account.isChangeNumberSupported() && !capabilities.isChangeNumber(); isDowngrade |= account.isAnnouncementGroupSupported() && !capabilities.isAnnouncementGroup(); isDowngrade |= account.isSenderKeySupported() && !capabilities.isSenderKey(); isDowngrade |= account.isGv1MigrationSupported() && !capabilities.isGv1Migration(); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java index 4431d856e..c07ef023a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/UserCapabilities.java @@ -15,7 +15,8 @@ public class UserCapabilities { account.isGroupsV2Supported(), account.isGv1MigrationSupported(), account.isSenderKeySupported(), - account.isAnnouncementGroupSupported()); + account.isAnnouncementGroupSupported(), + account.isChangeNumberSupported()); } @JsonProperty @@ -30,13 +31,22 @@ public class UserCapabilities { @JsonProperty private boolean announcementGroup; + @JsonProperty + private boolean changeNumber; + public UserCapabilities() {} - public UserCapabilities(boolean gv2, boolean gv1Migration, final boolean senderKey, final boolean announcementGroup) { + public UserCapabilities(final boolean gv2, + boolean gv1Migration, + final boolean senderKey, + final boolean announcementGroup, + final boolean changeNumber) { + this.gv2 = gv2; this.gv1Migration = gv1Migration; this.senderKey = senderKey; this.announcementGroup = announcementGroup; + this.changeNumber = changeNumber; } public boolean isGv2() { @@ -54,4 +64,8 @@ public class UserCapabilities { public boolean isAnnouncementGroup() { return announcementGroup; } + + public boolean isChangeNumber() { + return changeNumber; + } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java index 090c38cbd..23815f0c8 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java @@ -180,6 +180,14 @@ public class Account { .allMatch(device -> device.getCapabilities() != null && device.getCapabilities().isAnnouncementGroup()); } + public boolean isChangeNumberSupported() { + requireNotStale(); + + return devices.stream() + .filter(Device::isEnabled) + .allMatch(device -> device.getCapabilities() != null && device.getCapabilities().isChangeNumber()); + } + public boolean isEnabled() { requireNotStale(); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java index 1e63ee40f..403b100cd 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Device.java @@ -279,10 +279,13 @@ public class Device { @JsonProperty private boolean announcementGroup; + @JsonProperty + private boolean changeNumber; + public DeviceCapabilities() {} public DeviceCapabilities(boolean gv2, final boolean gv2_2, final boolean gv2_3, boolean storage, boolean transfer, - boolean gv1Migration, final boolean senderKey, final boolean announcementGroup) { + boolean gv1Migration, final boolean senderKey, final boolean announcementGroup, final boolean changeNumber) { this.gv2 = gv2; this.gv2_2 = gv2_2; this.gv2_3 = gv2_3; @@ -291,6 +294,7 @@ public class Device { this.gv1Migration = gv1Migration; this.senderKey = senderKey; this.announcementGroup = announcementGroup; + this.changeNumber = changeNumber; } public boolean isGv2() { @@ -324,5 +328,9 @@ public class Device { public boolean isAnnouncementGroup() { return announcementGroup; } + + public boolean isChangeNumber() { + return changeNumber; + } } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java index 5cb0b51b9..68014a845 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsDynamoDbTest.java @@ -511,7 +511,7 @@ class AccountsDynamoDbTest { SignedPreKey signedPreKey = new SignedPreKey(random.nextInt(), "testPublicKey-" + random.nextInt(), "testSignature-" + random.nextInt()); return new Device(id, "testName-" + random.nextInt(), "testAuthToken-" + random.nextInt(), "testSalt-" + random.nextInt(), "testGcmId-" + random.nextInt(), "testApnId-" + random.nextInt(), "testVoipApnId-" + random.nextInt(), random.nextBoolean(), random.nextInt(), signedPreKey, random.nextInt(), random.nextInt(), "testUserAgent-" + random.nextInt() , 0, new Device.DeviceCapabilities(random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), - random.nextBoolean(), random.nextBoolean())); + random.nextBoolean(), random.nextBoolean(), random.nextBoolean())); } private Account generateAccount(String number, UUID uuid) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java index ee705642d..30b21a28b 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java @@ -192,7 +192,7 @@ class AccountsManagerConcurrentModificationIntegrationTest { "testUserAgent-" + random.nextInt(), 0, new Device.DeviceCapabilities(random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), - random.nextBoolean(), random.nextBoolean()))); + random.nextBoolean(), random.nextBoolean(), random.nextBoolean()))); }); uuid = account.getUuid(); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java index 2a123d0d9..43c9cca6f 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/DeviceTest.java @@ -70,7 +70,7 @@ public class DeviceTest { @Parameters(method = "argumentsForTestIsGroupsV2Supported") public void testIsGroupsV2Supported(final boolean master, final String apnId, final boolean gv2Capability, final boolean gv2_2Capability, final boolean gv2_3Capability, final boolean expectGv2Supported) { final Device.DeviceCapabilities capabilities = new Device.DeviceCapabilities(gv2Capability, gv2_2Capability, gv2_3Capability, false, false, false, - false, false); + false, false, false); final Device device = new Device(master ? 1 : 2, "test", "auth-token", "salt", null, apnId, null, false, 1, null, 0, 0, "user-agent", 0, capabilities); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java index 10c87a92e..dfb380d03 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java @@ -121,6 +121,7 @@ class DeviceControllerTest { when(account.isGv1MigrationSupported()).thenReturn(true); when(account.isSenderKeySupported()).thenReturn(true); when(account.isAnnouncementGroupSupported()).thenReturn(true); + when(account.isChangeNumberSupported()).thenReturn(true); when(pendingDevicesManager.getCodeForNumber(AuthHelper.VALID_NUMBER)).thenReturn( Optional.of(new StoredVerificationCode("5678901", System.currentTimeMillis(), null, null))); @@ -259,7 +260,7 @@ class DeviceControllerTest { @ParameterizedTest @MethodSource void deviceDowngradeCapabilitiesTest(final String userAgent, final boolean gv2, final boolean gv2_2, final boolean gv2_3, final int expectedStatus) { - DeviceCapabilities deviceCapabilities = new DeviceCapabilities(gv2, gv2_2, gv2_3, true, false, true, true, true); + DeviceCapabilities deviceCapabilities = new DeviceCapabilities(gv2, gv2_2, gv2_3, true, false, true, true, true, true); AccountAttributes accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); Response response = resources.getJerseyTest() .target("/v1/devices/5678901") @@ -299,7 +300,7 @@ class DeviceControllerTest { @Test void deviceDowngradeGv1MigrationTest() { - DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, true, false, false, true, true); + DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, true, false, false, true, true, true); AccountAttributes accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); Response response = resources.getJerseyTest() .target("/v1/devices/5678901") @@ -310,7 +311,7 @@ class DeviceControllerTest { assertThat(response.getStatus()).isEqualTo(409); - deviceCapabilities = new DeviceCapabilities(true, true, true, true, false, true, true, true); + deviceCapabilities = new DeviceCapabilities(true, true, true, true, false, true, true, true, true); accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); response = resources.getJerseyTest() .target("/v1/devices/5678901") @@ -324,7 +325,7 @@ class DeviceControllerTest { @Test void deviceDowngradeSenderKeyTest() { - DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, false, true); + DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, false, true, true); AccountAttributes accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); Response response = resources @@ -336,7 +337,7 @@ class DeviceControllerTest { .put(Entity.entity(accountAttributes, MediaType.APPLICATION_JSON_TYPE)); assertThat(response.getStatus()).isEqualTo(409); - deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, true); + deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, true, true); accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); response = resources .getJerseyTest() @@ -350,7 +351,7 @@ class DeviceControllerTest { @Test void deviceDowngradeAnnouncementGroupTest() { - DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, false); + DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, false, true); AccountAttributes accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); Response response = resources @@ -362,7 +363,33 @@ class DeviceControllerTest { .put(Entity.entity(accountAttributes, MediaType.APPLICATION_JSON_TYPE)); assertThat(response.getStatus()).isEqualTo(409); - deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, true); + deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, true, true); + accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); + response = resources + .getJerseyTest() + .target("/v1/devices/5678901") + .request() + .header("Authorization", AuthHelper.getProvisioningAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD)) + .header("User-Agent", "Signal-Android/5.42.8675309 Android/30") + .put(Entity.entity(accountAttributes, MediaType.APPLICATION_JSON_TYPE)); + assertThat(response.getStatus()).isEqualTo(200); + } + + @Test + void deviceDowngradeChangeNumberTest() { + DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, true, false); + AccountAttributes accountAttributes = + new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); + Response response = resources + .getJerseyTest() + .target("/v1/devices/5678901") + .request() + .header("Authorization", AuthHelper.getProvisioningAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD)) + .header("User-Agent", "Signal-Android/5.42.8675309 Android/30") + .put(Entity.entity(accountAttributes, MediaType.APPLICATION_JSON_TYPE)); + assertThat(response.getStatus()).isEqualTo(409); + + deviceCapabilities = new DeviceCapabilities(true, true, true, true, true, true, true, true, true); accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); response = resources .getJerseyTest() diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java index 6d8375ee4..015a23bb6 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java @@ -158,22 +158,22 @@ class MessageControllerTest { add(new Device(1, null, "foo", "bar", "isgcm", null, null, false, 111, new SignedPreKey(333, "baz", "boop"), System.currentTimeMillis(), System.currentTimeMillis(), "Test", 0, new Device.DeviceCapabilities(true, false, false, true, true, false, - false, false))); + false, false, false))); }}; Set multiDeviceList = new HashSet<>() {{ add(new Device(1, null, "foo", "bar", "isgcm", null, null, false, 222, new SignedPreKey(111, "foo", "bar"), System.currentTimeMillis(), System.currentTimeMillis(), "Test", 0, new Device.DeviceCapabilities(true, false, false, true, false, false, - false, false))); + false, false, false))); add(new Device(2, null, "foo", "bar", "isgcm", null, null, false, 333, new SignedPreKey(222, "oof", "rab"), System.currentTimeMillis(), System.currentTimeMillis(), "Test", 0, new Device.DeviceCapabilities(true, false, false, true, false, false, - false, false))); + false, false, false))); add(new Device(3, null, "foo", "bar", "isgcm", null, null, false, 444, null, System.currentTimeMillis() - TimeUnit.DAYS.toMillis(31), System.currentTimeMillis(), "Test", 0, new Device.DeviceCapabilities(false, false, false, false, false, false, - false, false))); + false, false, false))); }}; Account singleDeviceAccount = new Account(SINGLE_DEVICE_RECIPIENT, SINGLE_DEVICE_UUID, singleDeviceList, "1234".getBytes()); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java index ba65adfad..466987375 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/ProfileControllerTest.java @@ -130,6 +130,7 @@ class ProfileControllerTest { when(profileAccount.isGv1MigrationSupported()).thenReturn(false); when(profileAccount.isSenderKeySupported()).thenReturn(false); when(profileAccount.isAnnouncementGroupSupported()).thenReturn(false); + when(profileAccount.isChangeNumberSupported()).thenReturn(false); when(profileAccount.getCurrentProfileVersion()).thenReturn(Optional.empty()); Account capabilitiesAccount = mock(Account.class); @@ -142,6 +143,7 @@ class ProfileControllerTest { when(capabilitiesAccount.isGv1MigrationSupported()).thenReturn(true); when(capabilitiesAccount.isSenderKeySupported()).thenReturn(true); when(capabilitiesAccount.isAnnouncementGroupSupported()).thenReturn(true); + when(capabilitiesAccount.isChangeNumberSupported()).thenReturn(true); when(accountsManager.get(AuthHelper.VALID_NUMBER_TWO)).thenReturn(Optional.of(profileAccount)); when(accountsManager.get(AuthHelper.VALID_UUID_TWO)).thenReturn(Optional.of(profileAccount)); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java index d53ad861d..93bf16ec9 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountTest.java @@ -49,6 +49,10 @@ class AccountTest { private final Device announcementGroupIncapableDevice = mock(Device.class); private final Device announcementGroupIncapableExpiredDevice = mock(Device.class); + private final Device changeNumberCapableDevice = mock(Device.class); + private final Device changeNumberIncapableDevice = mock(Device.class); + private final Device changeNumberIncapableExpiredDevice = mock(Device.class); + @BeforeEach void setup() { when(oldMasterDevice.getLastSeen()).thenReturn(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(366)); @@ -84,40 +88,52 @@ class AccountTest { when(gv2IncapableExpiredDevice.isEnabled()).thenReturn(false); when(gv1MigrationCapableDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, true, false, false)); + new DeviceCapabilities(true, true, true, true, true, true, false, false, false)); when(gv1MigrationCapableDevice.isEnabled()).thenReturn(true); when(gv1MigrationIncapableDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, false, false, false)); + new DeviceCapabilities(true, true, true, true, true, false, false, false, false)); when(gv1MigrationIncapableDevice.isEnabled()).thenReturn(true); when(gv1MigrationIncapableExpiredDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, false, false, false)); + new DeviceCapabilities(true, true, true, true, true, false, false, false, false)); when(gv1MigrationIncapableExpiredDevice.isEnabled()).thenReturn(false); when(senderKeyCapableDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, true, true, false)); + new DeviceCapabilities(true, true, true, true, true, true, true, false, false)); when(senderKeyCapableDevice.isEnabled()).thenReturn(true); when(senderKeyIncapableDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, true, false, false)); + new DeviceCapabilities(true, true, true, true, true, true, false, false, false)); when(senderKeyIncapableDevice.isEnabled()).thenReturn(true); when(senderKeyIncapableExpiredDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, true, false, false)); + new DeviceCapabilities(true, true, true, true, true, true, false, false, false)); when(senderKeyIncapableExpiredDevice.isEnabled()).thenReturn(false); when(announcementGroupCapableDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, true, true, true)); + new DeviceCapabilities(true, true, true, true, true, true, true, true, false)); when(announcementGroupCapableDevice.isEnabled()).thenReturn(true); when(announcementGroupIncapableDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, true, true, false)); + new DeviceCapabilities(true, true, true, true, true, true, true, false, false)); when(announcementGroupIncapableDevice.isEnabled()).thenReturn(true); when(announcementGroupIncapableExpiredDevice.getCapabilities()).thenReturn( - new DeviceCapabilities(true, true, true, true, true, true, true, false)); + new DeviceCapabilities(true, true, true, true, true, true, true, false, false)); when(announcementGroupIncapableExpiredDevice.isEnabled()).thenReturn(false); + + when(changeNumberCapableDevice.getCapabilities()).thenReturn( + new DeviceCapabilities(true, true, true, true, true, true, true, false, true)); + when(changeNumberCapableDevice.isEnabled()).thenReturn(true); + + when(changeNumberIncapableDevice.getCapabilities()).thenReturn( + new DeviceCapabilities(true, true, true, true, true, true, true, false, false)); + when(changeNumberIncapableDevice.isEnabled()).thenReturn(true); + + when(changeNumberIncapableExpiredDevice.getCapabilities()).thenReturn( + new DeviceCapabilities(true, true, true, true, true, true, true, false, false)); + when(changeNumberIncapableExpiredDevice.isEnabled()).thenReturn(false); } @Test @@ -275,6 +291,19 @@ class AccountTest { "1234".getBytes(StandardCharsets.UTF_8)).isAnnouncementGroupSupported()).isTrue(); } + @Test + void isChangeNumberSupported() { + assertThat(new Account("+18005551234", UUID.randomUUID(), + Set.of(changeNumberCapableDevice), + "1234".getBytes(StandardCharsets.UTF_8)).isChangeNumberSupported()).isTrue(); + assertThat(new Account("+18005551234", UUID.randomUUID(), + Set.of(changeNumberCapableDevice, changeNumberIncapableDevice), + "1234".getBytes(StandardCharsets.UTF_8)).isChangeNumberSupported()).isFalse(); + assertThat(new Account("+18005551234", UUID.randomUUID(), + Set.of(changeNumberCapableDevice, changeNumberIncapableExpiredDevice), + "1234".getBytes(StandardCharsets.UTF_8)).isChangeNumberSupported()).isTrue(); + } + @Test void stale() { final Account account = new Account("+14151234567", UUID.randomUUID(), Collections.emptySet(), new byte[0]); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java index fbc5edc36..f4a9678ea 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java @@ -606,7 +606,7 @@ class AccountsManagerTest { @ValueSource(booleans = {true, false}) void testCreateWithStorageCapability(final boolean hasStorage) throws InterruptedException { final AccountAttributes attributes = new AccountAttributes(false, 0, null, null, true, - new DeviceCapabilities(false, false, false, hasStorage, false, false, false, false)); + new DeviceCapabilities(false, false, false, hasStorage, false, false, false, false, false)); final Account account = accountsManager.create("+18005550123", "password", null, attributes); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java index fafeff036..ef75a88b1 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsTest.java @@ -325,7 +325,7 @@ public class AccountsTest { SignedPreKey signedPreKey = new SignedPreKey(random.nextInt(), "testPublicKey-" + random.nextInt(), "testSignature-" + random.nextInt()); return new Device(id, "testName-" + random.nextInt(), "testAuthToken-" + random.nextInt(), "testSalt-" + random.nextInt(), "testGcmId-" + random.nextInt(), "testApnId-" + random.nextInt(), "testVoipApnId-" + random.nextInt(), random.nextBoolean(), random.nextInt(), signedPreKey, random.nextInt(), random.nextInt(), "testUserAgent-" + random.nextInt() , 0, new Device.DeviceCapabilities(random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), random.nextBoolean(), - random.nextBoolean(), random.nextBoolean())); + random.nextBoolean(), random.nextBoolean(), random.nextBoolean())); } private Account generateAccount(String number, UUID uuid) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/AccountsHelper.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/AccountsHelper.java index fe5db145a..aac16352a 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/AccountsHelper.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/util/AccountsHelper.java @@ -141,6 +141,10 @@ public class AccountsHelper { when(updatedAccount.isAnnouncementGroupSupported()).thenAnswer(stubbing); break; } + case "isChangeNumberSupported": { + when(updatedAccount.isChangeNumberSupported()).thenAnswer(stubbing); + break; + } case "getEnabledDeviceCount": { when(updatedAccount.getEnabledDeviceCount()).thenAnswer(stubbing); break;