From 0a6d724f2ce56e66cf58fe000f80d16c3a79776b Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Tue, 2 Aug 2022 11:22:15 -0400 Subject: [PATCH] Remove `GCMSender` --- service/config/sample.yml | 4 - .../WhisperServerConfiguration.java | 11 - .../textsecuregcm/WhisperServerService.java | 8 +- .../configuration/GcmConfiguration.java | 29 --- .../controllers/AccountController.java | 10 +- .../limits/PushChallengeManager.java | 10 +- .../textsecuregcm/push/GCMSender.java | 191 ------------------ .../textsecuregcm/push/MessageSender.java | 8 +- .../textsecuregcm/push/MessageSenderTest.java | 18 +- .../controllers/AccountControllerTest.java | 22 +- .../tests/push/GCMSenderTest.java | 141 ------------- 11 files changed, 37 insertions(+), 415 deletions(-) delete mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/configuration/GcmConfiguration.java delete mode 100644 service/src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java delete mode 100644 service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java diff --git a/service/config/sample.yml b/service/config/sample.yml index e1109e885..dee2414a7 100644 --- a/service/config/sample.yml +++ b/service/config/sample.yml @@ -202,10 +202,6 @@ apn: # Apple Push Notifications configuration AAAAAAAA -----END PRIVATE KEY----- -gcm: # GCM Configuration - senderId: 123456789 - apiKey: unset - fcm: # FCM configuration credentials: | { "json": true } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java index a4a6fedb6..3332b1b09 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java @@ -20,7 +20,6 @@ import org.whispersystems.textsecuregcm.configuration.AwsAttachmentsConfiguratio import org.whispersystems.textsecuregcm.configuration.BadgesConfiguration; import org.whispersystems.textsecuregcm.configuration.BoostConfiguration; import org.whispersystems.textsecuregcm.configuration.CdnConfiguration; -import org.whispersystems.textsecuregcm.configuration.DatabaseConfiguration; import org.whispersystems.textsecuregcm.configuration.DatadogConfiguration; import org.whispersystems.textsecuregcm.configuration.DirectoryConfiguration; import org.whispersystems.textsecuregcm.configuration.DirectoryV2Configuration; @@ -28,7 +27,6 @@ import org.whispersystems.textsecuregcm.configuration.DonationConfiguration; import org.whispersystems.textsecuregcm.configuration.DynamoDbClientConfiguration; import org.whispersystems.textsecuregcm.configuration.DynamoDbTables; import org.whispersystems.textsecuregcm.configuration.FcmConfiguration; -import org.whispersystems.textsecuregcm.configuration.GcmConfiguration; import org.whispersystems.textsecuregcm.configuration.GcpAttachmentsConfiguration; import org.whispersystems.textsecuregcm.configuration.GiftConfiguration; import org.whispersystems.textsecuregcm.configuration.MaxDeviceConfiguration; @@ -164,11 +162,6 @@ public class WhisperServerConfiguration extends Configuration { @JsonProperty private WebSocketConfiguration webSocket = new WebSocketConfiguration(); - @Valid - @NotNull - @JsonProperty - private GcmConfiguration gcm; - @Valid @NotNull @JsonProperty @@ -342,10 +335,6 @@ public class WhisperServerConfiguration extends Configuration { return limits; } - public GcmConfiguration getGcmConfiguration() { - return gcm; - } - public FcmConfiguration getFcmConfiguration() { return fcm; } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index f396a335a..dd1fca001 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -145,7 +145,6 @@ import org.whispersystems.textsecuregcm.push.APNSender; import org.whispersystems.textsecuregcm.push.ApnFallbackManager; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.push.FcmSender; -import org.whispersystems.textsecuregcm.push.GCMSender; import org.whispersystems.textsecuregcm.push.MessageSender; import org.whispersystems.textsecuregcm.push.ProvisioningManager; import org.whispersystems.textsecuregcm.push.ReceiptSender; @@ -449,7 +448,6 @@ public class WhisperServerService extends Application testDevices; private final RecaptchaClient recaptchaClient; - private final GCMSender gcmSender; + private final FcmSender fcmSender; private final APNSender apnSender; private final ExternalServiceCredentialGenerator backupServiceCredentialGenerator; @@ -153,7 +153,7 @@ public class AccountController { TurnTokenGenerator turnTokenGenerator, Map testDevices, RecaptchaClient recaptchaClient, - GCMSender gcmSender, + FcmSender fcmSender, APNSender apnSender, TwilioVerifyExperimentEnrollmentManager verifyExperimentEnrollmentManager, ChangeNumberManager changeNumberManager, @@ -168,7 +168,7 @@ public class AccountController { this.testDevices = testDevices; this.turnTokenGenerator = turnTokenGenerator; this.recaptchaClient = recaptchaClient; - this.gcmSender = gcmSender; + this.fcmSender = fcmSender; this.apnSender = apnSender; this.verifyExperimentEnrollmentManager = verifyExperimentEnrollmentManager; this.backupServiceCredentialGenerator = backupServiceCredentialGenerator; @@ -200,7 +200,7 @@ public class AccountController { pendingAccounts.store(number, storedVerificationCode); if ("fcm".equals(pushType)) { - gcmSender.sendMessage(new GcmMessage(pushToken, null, 0, GcmMessage.Type.CHALLENGE, Optional.of(storedVerificationCode.getPushCode()))); + fcmSender.sendMessage(new GcmMessage(pushToken, null, 0, GcmMessage.Type.CHALLENGE, Optional.of(storedVerificationCode.getPushCode()))); } else if ("apn".equals(pushType)) { apnSender.sendMessage(new ApnMessage(pushToken, null, 0, useVoip.orElse(true), ApnMessage.Type.CHALLENGE, Optional.of(storedVerificationCode.getPushCode()))); } else { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/limits/PushChallengeManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/PushChallengeManager.java index 182e2f7ec..548d85240 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/limits/PushChallengeManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/limits/PushChallengeManager.java @@ -17,7 +17,7 @@ import org.apache.commons.lang3.StringUtils; import org.whispersystems.textsecuregcm.push.APNSender; import org.whispersystems.textsecuregcm.push.ApnMessage; import org.whispersystems.textsecuregcm.push.ApnMessage.Type; -import org.whispersystems.textsecuregcm.push.GCMSender; +import org.whispersystems.textsecuregcm.push.FcmSender; import org.whispersystems.textsecuregcm.push.GcmMessage; import org.whispersystems.textsecuregcm.push.NotPushRegisteredException; import org.whispersystems.textsecuregcm.storage.Account; @@ -28,7 +28,7 @@ import org.whispersystems.textsecuregcm.util.ua.ClientPlatform; public class PushChallengeManager { private final APNSender apnSender; - private final GCMSender gcmSender; + private final FcmSender fcmSender; private final PushChallengeDynamoDb pushChallengeDynamoDb; @@ -45,11 +45,11 @@ public class PushChallengeManager { private static final String SUCCESS_TAG_NAME = "success"; private static final String SOURCE_COUNTRY_TAG_NAME = "sourceCountry"; - public PushChallengeManager(final APNSender apnSender, final GCMSender gcmSender, + public PushChallengeManager(final APNSender apnSender, final FcmSender fcmSender, final PushChallengeDynamoDb pushChallengeDynamoDb) { this.apnSender = apnSender; - this.gcmSender = gcmSender; + this.fcmSender = fcmSender; this.pushChallengeDynamoDb = pushChallengeDynamoDb; } @@ -71,7 +71,7 @@ public class PushChallengeManager { sent = true; if (StringUtils.isNotBlank(masterDevice.getGcmId())) { - gcmSender.sendMessage(new GcmMessage(masterDevice.getGcmId(), account.getUuid(), 0, GcmMessage.Type.RATE_LIMIT_CHALLENGE, Optional.of(tokenHex))); + fcmSender.sendMessage(new GcmMessage(masterDevice.getGcmId(), account.getUuid(), 0, GcmMessage.Type.RATE_LIMIT_CHALLENGE, Optional.of(tokenHex))); platform = ClientPlatform.ANDROID.name().toLowerCase(); } else if (StringUtils.isNotBlank(masterDevice.getApnId())) { apnSender.sendMessage(new ApnMessage(masterDevice.getApnId(), account.getUuid(), 0, false, Type.RATE_LIMIT_CHALLENGE, Optional.of(tokenHex))); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java deleted file mode 100644 index ba4db1d03..000000000 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/GCMSender.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2013-2020 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.whispersystems.textsecuregcm.push; - -import static com.codahale.metrics.MetricRegistry.name; - -import com.codahale.metrics.Meter; -import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.SharedMetricRegistries; -import com.google.common.annotations.VisibleForTesting; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.TimeUnit; -import io.micrometer.core.instrument.Metrics; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.whispersystems.gcm.server.Message; -import org.whispersystems.gcm.server.Result; -import org.whispersystems.gcm.server.Sender; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; -import org.whispersystems.textsecuregcm.storage.Account; -import org.whispersystems.textsecuregcm.storage.AccountsManager; -import org.whispersystems.textsecuregcm.storage.Device; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; -import org.whispersystems.textsecuregcm.util.Constants; -import org.whispersystems.textsecuregcm.util.SystemMapper; -import org.whispersystems.textsecuregcm.util.Util; - -public class GCMSender { - - private final Logger logger = LoggerFactory.getLogger(GCMSender.class); - - private final MetricRegistry metricRegistry = SharedMetricRegistries.getOrCreate(Constants.METRICS_NAME); - private final Meter success = metricRegistry.meter(name(getClass(), "sent", "success")); - private final Meter failure = metricRegistry.meter(name(getClass(), "sent", "failure")); - private final Meter unregistered = metricRegistry.meter(name(getClass(), "sent", "unregistered")); - private final Meter canonical = metricRegistry.meter(name(getClass(), "sent", "canonical")); - - private final String DOWNSTREAM_ERROR_COUNTER_NAME = name(GCMSender.class, "downstreamError"); - - private final Map outboundMeters = new HashMap<>() {{ - put("receipt", metricRegistry.meter(name(getClass(), "outbound", "receipt"))); - put("notification", metricRegistry.meter(name(getClass(), "outbound", "notification"))); - put("challenge", metricRegistry.meter(name(getClass(), "outbound", "challenge"))); - put("rateLimitChallenge", metricRegistry.meter(name(getClass(), "outbound", "rateLimitChallenge"))); - }}; - - private final AccountsManager accountsManager; - private final Sender signalSender; - private final ExecutorService executor; - - private final ExperimentEnrollmentManager experimentEnrollmentManager; - private final FcmSender fcmSender; - - public GCMSender(ExecutorService executor, AccountsManager accountsManager, String signalKey, ExperimentEnrollmentManager experimentEnrollmentManager, FcmSender fcmSender) { - this(executor, accountsManager, new Sender(signalKey, SystemMapper.getMapper(), 6), experimentEnrollmentManager, fcmSender); - - CircuitBreakerUtil.registerMetrics(metricRegistry, signalSender.getRetry(), Sender.class); - } - - @VisibleForTesting - public GCMSender(ExecutorService executor, AccountsManager accountsManager, Sender sender, ExperimentEnrollmentManager experimentEnrollmentManager, FcmSender fcmSender) { - this.accountsManager = accountsManager; - this.signalSender = sender; - this.executor = executor; - this.experimentEnrollmentManager = experimentEnrollmentManager; - this.fcmSender = fcmSender; - } - - public void sendMessage(GcmMessage message) { - final boolean useFcmSender = message.getUuid() - .map(uuid -> experimentEnrollmentManager.isEnrolled(uuid, "fcmSender")) - .orElse(false); - - if (useFcmSender) { - fcmSender.sendMessage(message); - } else { - Message.Builder builder = Message.newBuilder() - .withDestination(message.getGcmId()) - .withPriority("high"); - - String key; - - switch (message.getType()) { - case NOTIFICATION: - key = "notification"; - break; - case CHALLENGE: - key = "challenge"; - break; - case RATE_LIMIT_CHALLENGE: - key = "rateLimitChallenge"; - break; - default: - throw new AssertionError(); - } - - Message request = builder.withDataPart(key, message.getData().orElse("")).build(); - - CompletableFuture future = signalSender.send(request); - markOutboundMeter(key); - - future.handle((result, throwable) -> { - if (result != null && message.getType() != GcmMessage.Type.CHALLENGE) { - if (result.isUnregistered() || result.isInvalidRegistrationId()) { - executor.submit(() -> handleBadRegistration(message)); - } else if (result.hasCanonicalRegistrationId()) { - executor.submit(() -> handleCanonicalRegistrationId(message, result)); - } else if (!result.isSuccess()) { - executor.submit(() -> handleGenericError(message, result)); - } else { - success.mark(); - } - } else { - logger.warn("FCM Failed: " + throwable + ", " + throwable.getCause()); - } - - return null; - }); - } - } - - private void handleBadRegistration(GcmMessage message) { - Optional account = getAccountForEvent(message); - - if (account.isPresent()) { - //noinspection OptionalGetWithoutIsPresent - Device device = account.get().getDevice(message.getDeviceId()).get(); - - if (device.getUninstalledFeedbackTimestamp() == 0) { - accountsManager.updateDevice(account.get(), message.getDeviceId(), d -> - d.setUninstalledFeedbackTimestamp(Util.todayInMillis())); - } - } - - unregistered.mark(); - } - - private void handleCanonicalRegistrationId(GcmMessage message, Result result) { - logger.warn("Actually received 'CanonicalRegistrationId' ::: (canonical={}}), (original={}})", - result.getCanonicalRegistrationId(), message.getGcmId()); - - getAccountForEvent(message).ifPresent(account -> - accountsManager.updateDevice( - account, - message.getDeviceId(), - d -> d.setGcmId(result.getCanonicalRegistrationId()))); - - canonical.mark(); - } - - private void handleGenericError(GcmMessage message, Result result) { - logger.debug("Unrecoverable Error ::: (error={}}), (gcm_id={}}), (destination={}}), (device_id={}})", - result.getError(), message.getGcmId(), message.getUuid(), message.getDeviceId()); - - Metrics.counter(DOWNSTREAM_ERROR_COUNTER_NAME, "code", result.getError()).increment(); - failure.mark(); - } - - private Optional getAccountForEvent(GcmMessage message) { - Optional account = message.getUuid().flatMap(accountsManager::getByAccountIdentifier); - - if (account.isPresent()) { - Optional device = account.get().getDevice(message.getDeviceId()); - - if (device.isPresent()) { - if (message.getGcmId().equals(device.get().getGcmId())) { - - if (device.get().getPushTimestamp() == 0 || System.currentTimeMillis() > (device.get().getPushTimestamp() + TimeUnit.SECONDS.toMillis(10))) { - return account; - } - } - } - } - - return Optional.empty(); - } - - private void markOutboundMeter(String key) { - Meter meter = outboundMeters.get(key); - - if (meter != null) meter.mark(); - else logger.warn("Unknown outbound key: " + key); - } -} diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java index a3b3a719f..7e2118712 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java @@ -38,7 +38,7 @@ public class MessageSender implements Managed { private final ApnFallbackManager apnFallbackManager; private final ClientPresenceManager clientPresenceManager; private final MessagesManager messagesManager; - private final GCMSender gcmSender; + private final FcmSender fcmSender; private final APNSender apnSender; private final PushLatencyManager pushLatencyManager; @@ -50,14 +50,14 @@ public class MessageSender implements Managed { public MessageSender(ApnFallbackManager apnFallbackManager, ClientPresenceManager clientPresenceManager, MessagesManager messagesManager, - GCMSender gcmSender, + FcmSender fcmSender, APNSender apnSender, PushLatencyManager pushLatencyManager) { this.apnFallbackManager = apnFallbackManager; this.clientPresenceManager = clientPresenceManager; this.messagesManager = messagesManager; - this.gcmSender = gcmSender; + this.fcmSender = fcmSender; this.apnSender = apnSender; this.pushLatencyManager = pushLatencyManager; } @@ -122,7 +122,7 @@ public class MessageSender implements Managed { GcmMessage gcmMessage = new GcmMessage(device.getGcmId(), account.getUuid(), (int)device.getId(), GcmMessage.Type.NOTIFICATION, Optional.empty()); - gcmSender.sendMessage(gcmMessage); + fcmSender.sendMessage(gcmMessage); RedisOperation.unchecked(() -> pushLatencyManager.recordPushSent(account.getUuid(), device.getId(), false)); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java index fe334d926..4d0ae7353 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java @@ -37,7 +37,7 @@ class MessageSenderTest { private ClientPresenceManager clientPresenceManager; private MessagesManager messagesManager; - private GCMSender gcmSender; + private FcmSender fcmSender; private APNSender apnSender; private MessageSender messageSender; @@ -53,12 +53,12 @@ class MessageSenderTest { clientPresenceManager = mock(ClientPresenceManager.class); messagesManager = mock(MessagesManager.class); - gcmSender = mock(GCMSender.class); + fcmSender = mock(FcmSender.class); apnSender = mock(APNSender.class); messageSender = new MessageSender(mock(ApnFallbackManager.class), clientPresenceManager, messagesManager, - gcmSender, + fcmSender, apnSender, mock(PushLatencyManager.class)); @@ -80,7 +80,7 @@ class MessageSenderTest { assertTrue(envelopeArgumentCaptor.getValue().getEphemeral()); - verifyNoInteractions(gcmSender); + verifyNoInteractions(fcmSender); verifyNoInteractions(apnSender); } @@ -92,7 +92,7 @@ class MessageSenderTest { messageSender.sendMessage(account, device, message, true); verify(messagesManager, never()).insert(any(), anyLong(), any()); - verifyNoInteractions(gcmSender); + verifyNoInteractions(fcmSender); verifyNoInteractions(apnSender); } @@ -110,7 +110,7 @@ class MessageSenderTest { assertFalse(envelopeArgumentCaptor.getValue().getEphemeral()); assertEquals(message, envelopeArgumentCaptor.getValue()); - verifyNoInteractions(gcmSender); + verifyNoInteractions(fcmSender); verifyNoInteractions(apnSender); } @@ -122,7 +122,7 @@ class MessageSenderTest { messageSender.sendMessage(account, device, message, false); verify(messagesManager).insert(ACCOUNT_UUID, DEVICE_ID, message); - verify(gcmSender).sendMessage(any()); + verify(fcmSender).sendMessage(any()); verifyNoInteractions(apnSender); } @@ -134,7 +134,7 @@ class MessageSenderTest { messageSender.sendMessage(account, device, message, false); verify(messagesManager).insert(ACCOUNT_UUID, DEVICE_ID, message); - verifyNoInteractions(gcmSender); + verifyNoInteractions(fcmSender); verify(apnSender).sendMessage(any()); } @@ -146,7 +146,7 @@ class MessageSenderTest { messageSender.sendMessage(account, device, message, false); verify(messagesManager).insert(ACCOUNT_UUID, DEVICE_ID, message); - verifyNoInteractions(gcmSender); + verifyNoInteractions(fcmSender); verifyNoInteractions(apnSender); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java index f3bb64983..9875be1de 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/AccountControllerTest.java @@ -82,7 +82,7 @@ import org.whispersystems.textsecuregcm.mappers.NonNormalizedPhoneNumberResponse import org.whispersystems.textsecuregcm.mappers.RateLimitExceededExceptionMapper; import org.whispersystems.textsecuregcm.push.APNSender; import org.whispersystems.textsecuregcm.push.ApnMessage; -import org.whispersystems.textsecuregcm.push.GCMSender; +import org.whispersystems.textsecuregcm.push.FcmSender; import org.whispersystems.textsecuregcm.push.GcmMessage; import org.whispersystems.textsecuregcm.recaptcha.RecaptchaClient; import org.whispersystems.textsecuregcm.sms.SmsSender; @@ -147,7 +147,7 @@ class AccountControllerTest { private static Account senderHasStorage = mock(Account.class); private static Account senderTransfer = mock(Account.class); private static RecaptchaClient recaptchaClient = mock(RecaptchaClient.class); - private static GCMSender gcmSender = mock(GCMSender.class); + private static FcmSender fcmSender = mock(FcmSender.class); private static APNSender apnSender = mock(APNSender.class); private static ChangeNumberManager changeNumberManager = mock(ChangeNumberManager.class); @@ -179,7 +179,7 @@ class AccountControllerTest { turnTokenGenerator, Map.of(TEST_NUMBER, TEST_VERIFICATION_CODE), recaptchaClient, - gcmSender, + fcmSender, apnSender, verifyExperimentEnrollmentManager, changeNumberManager, @@ -322,7 +322,7 @@ class AccountControllerTest { senderHasStorage, senderTransfer, recaptchaClient, - gcmSender, + fcmSender, apnSender, verifyExperimentEnrollmentManager, changeNumberManager); @@ -341,7 +341,7 @@ class AccountControllerTest { ArgumentCaptor captor = ArgumentCaptor.forClass(GcmMessage.class); - verify(gcmSender, times(1)).sendMessage(captor.capture()); + verify(fcmSender, times(1)).sendMessage(captor.capture()); assertThat(captor.getValue().getGcmId()).isEqualTo("mytoken"); assertThat(captor.getValue().getData().isPresent()).isTrue(); assertThat(captor.getValue().getData().get().length()).isEqualTo(32); @@ -360,7 +360,7 @@ class AccountControllerTest { ArgumentCaptor captor = ArgumentCaptor.forClass(GcmMessage.class); - verify(gcmSender, times(1)).sendMessage(captor.capture()); + verify(fcmSender, times(1)).sendMessage(captor.capture()); assertThat(captor.getValue().getGcmId()).isEqualTo("mytoken"); assertThat(captor.getValue().getData().isPresent()).isTrue(); assertThat(captor.getValue().getData().get().length()).isEqualTo(32); @@ -386,7 +386,7 @@ class AccountControllerTest { assertThat(captor.getValue().getMessage()).contains("\"challenge\" : \"" + captor.getValue().getChallengeData().get() + "\""); assertThat(captor.getValue().isVoip()).isTrue(); - verifyNoMoreInteractions(gcmSender); + verifyNoMoreInteractions(fcmSender); } @Test @@ -408,7 +408,7 @@ class AccountControllerTest { assertThat(captor.getValue().getMessage()).contains("\"challenge\" : \"" + captor.getValue().getChallengeData().get() + "\""); assertThat(captor.getValue().isVoip()).isTrue(); - verifyNoMoreInteractions(gcmSender); + verifyNoMoreInteractions(fcmSender); } @Test @@ -430,7 +430,7 @@ class AccountControllerTest { assertThat(captor.getValue().getMessage()).contains("\"challenge\" : \"" + captor.getValue().getChallengeData().get() + "\""); assertThat(captor.getValue().isVoip()).isFalse(); - verifyNoMoreInteractions(gcmSender); + verifyNoMoreInteractions(fcmSender); } @Test @@ -443,7 +443,7 @@ class AccountControllerTest { assertThat(response.getStatus()).isEqualTo(400); assertThat(response.readEntity(String.class)).isBlank(); - verifyNoMoreInteractions(gcmSender); + verifyNoMoreInteractions(fcmSender); verifyNoMoreInteractions(apnSender); } @@ -462,7 +462,7 @@ class AccountControllerTest { assertThat(responseEntity.getOriginalNumber()).isEqualTo(number); assertThat(responseEntity.getNormalizedNumber()).isEqualTo("+447700900111"); - verifyNoMoreInteractions(gcmSender); + verifyNoMoreInteractions(fcmSender); verifyNoMoreInteractions(apnSender); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java deleted file mode 100644 index 9ba17e6b2..000000000 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2013-2020 Signal Messenger, LLC - * SPDX-License-Identifier: AGPL-3.0-only - */ - -package org.whispersystems.textsecuregcm.tests.push; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.Optional; -import java.util.UUID; -import java.util.concurrent.CompletableFuture; -import org.junit.jupiter.api.Test; -import org.whispersystems.gcm.server.Message; -import org.whispersystems.gcm.server.Result; -import org.whispersystems.gcm.server.Sender; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; -import org.whispersystems.textsecuregcm.push.FcmSender; -import org.whispersystems.textsecuregcm.push.GCMSender; -import org.whispersystems.textsecuregcm.push.GcmMessage; -import org.whispersystems.textsecuregcm.storage.Account; -import org.whispersystems.textsecuregcm.storage.AccountsManager; -import org.whispersystems.textsecuregcm.storage.Device; -import org.whispersystems.textsecuregcm.tests.util.AccountsHelper; -import org.whispersystems.textsecuregcm.tests.util.SynchronousExecutorService; -import org.whispersystems.textsecuregcm.util.Util; - -class GCMSenderTest { - - @Test - void testSendMessage() { - AccountsManager accountsManager = mock(AccountsManager.class); - Sender sender = mock(Sender.class ); - Result successResult = mock(Result.class ); - SynchronousExecutorService executorService = new SynchronousExecutorService(); - - when(successResult.isInvalidRegistrationId()).thenReturn(false); - when(successResult.isUnregistered()).thenReturn(false); - when(successResult.hasCanonicalRegistrationId()).thenReturn(false); - when(successResult.isSuccess()).thenReturn(true); - - AccountsHelper.setupMockUpdate(accountsManager); - - GcmMessage message = new GcmMessage("foo", UUID.randomUUID(), 1, GcmMessage.Type.NOTIFICATION, Optional.empty()); - GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender, mock(ExperimentEnrollmentManager.class), mock(FcmSender.class)); - - CompletableFuture successFuture = CompletableFuture.completedFuture(successResult); - - when(sender.send(any(Message.class))).thenReturn(successFuture); - - gcmSender.sendMessage(message); - - verify(sender, times(1)).send(any(Message.class)); - } - - @Test - void testSendUninstalled() { - UUID destinationUuid = UUID.randomUUID(); - String gcmId = "foo"; - - AccountsManager accountsManager = mock(AccountsManager.class); - Sender sender = mock(Sender.class ); - Result invalidResult = mock(Result.class ); - SynchronousExecutorService executorService = new SynchronousExecutorService(); - - Account destinationAccount = mock(Account.class); - Device destinationDevice = mock(Device.class ); - - AccountsHelper.setupMockUpdate(accountsManager); - - when(destinationAccount.getDevice(1)).thenReturn(Optional.of(destinationDevice)); - when(accountsManager.getByAccountIdentifier(destinationUuid)).thenReturn(Optional.of(destinationAccount)); - when(destinationDevice.getGcmId()).thenReturn(gcmId); - - when(invalidResult.isInvalidRegistrationId()).thenReturn(true); - when(invalidResult.isUnregistered()).thenReturn(false); - when(invalidResult.hasCanonicalRegistrationId()).thenReturn(false); - when(invalidResult.isSuccess()).thenReturn(true); - - GcmMessage message = new GcmMessage(gcmId, destinationUuid, 1, GcmMessage.Type.NOTIFICATION, Optional.empty()); - GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender, mock(ExperimentEnrollmentManager.class), mock(FcmSender.class)); - - CompletableFuture invalidFuture = CompletableFuture.completedFuture(invalidResult); - - when(sender.send(any(Message.class))).thenReturn(invalidFuture); - - gcmSender.sendMessage(message); - - verify(sender, times(1)).send(any(Message.class)); - verify(accountsManager, times(1)).getByAccountIdentifier(eq(destinationUuid)); - verify(accountsManager, times(1)).updateDevice(eq(destinationAccount), eq(1L), any()); - verify(destinationDevice, times(1)).setUninstalledFeedbackTimestamp(eq(Util.todayInMillis())); - } - - @Test - void testCanonicalId() { - UUID destinationUuid = UUID.randomUUID(); - String gcmId = "foo"; - String canonicalId = "bar"; - - AccountsManager accountsManager = mock(AccountsManager.class); - Sender sender = mock(Sender.class ); - Result canonicalResult = mock(Result.class ); - SynchronousExecutorService executorService = new SynchronousExecutorService(); - - Account destinationAccount = mock(Account.class ); - Device destinationDevice = mock(Device.class ); - - when(destinationAccount.getDevice(1)).thenReturn(Optional.of(destinationDevice)); - when(accountsManager.getByAccountIdentifier(destinationUuid)).thenReturn(Optional.of(destinationAccount)); - when(destinationDevice.getGcmId()).thenReturn(gcmId); - - AccountsHelper.setupMockUpdate(accountsManager); - - when(canonicalResult.isInvalidRegistrationId()).thenReturn(false); - when(canonicalResult.isUnregistered()).thenReturn(false); - when(canonicalResult.hasCanonicalRegistrationId()).thenReturn(true); - when(canonicalResult.isSuccess()).thenReturn(false); - when(canonicalResult.getCanonicalRegistrationId()).thenReturn(canonicalId); - - GcmMessage message = new GcmMessage(gcmId, destinationUuid, 1, GcmMessage.Type.NOTIFICATION, Optional.empty()); - GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender, mock(ExperimentEnrollmentManager.class), mock(FcmSender.class)); - - CompletableFuture invalidFuture = CompletableFuture.completedFuture(canonicalResult); - - when(sender.send(any(Message.class))).thenReturn(invalidFuture); - - gcmSender.sendMessage(message); - - verify(sender, times(1)).send(any(Message.class)); - verify(accountsManager, times(1)).getByAccountIdentifier(eq(destinationUuid)); - verify(accountsManager, times(1)).updateDevice(eq(destinationAccount), eq(1L), any()); - verify(destinationDevice, times(1)).setGcmId(eq(canonicalId)); - } - -}