diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index 3479e6512..f396a335a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -144,6 +144,7 @@ import org.whispersystems.textsecuregcm.providers.RedisClusterHealthCheck; 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; @@ -447,7 +448,8 @@ public class WhisperServerService extends Application experimentEnrollmentManager.isEnrolled(uuid, "fcmSender")) + .orElse(false); - String key; + if (useFcmSender) { + fcmSender.sendMessage(message); + } else { + Message.Builder builder = Message.newBuilder() + .withDestination(message.getGcmId()) + .withPriority("high"); - switch (message.getType()) { - case NOTIFICATION: key = "notification"; break; - case CHALLENGE: key = "challenge"; break; - case RATE_LIMIT_CHALLENGE: key = "rateLimitChallenge"; break; - default: throw new AssertionError(); - } + String key; - 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()); + switch (message.getType()) { + case NOTIFICATION: + key = "notification"; + break; + case CHALLENGE: + key = "challenge"; + break; + case RATE_LIMIT_CHALLENGE: + key = "rateLimitChallenge"; + break; + default: + throw new AssertionError(); } - return null; - }); + 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) { 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 index 8afa8bd98..9ba17e6b2 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/push/GCMSenderTest.java @@ -19,6 +19,8 @@ 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; @@ -45,7 +47,7 @@ class GCMSenderTest { AccountsHelper.setupMockUpdate(accountsManager); GcmMessage message = new GcmMessage("foo", UUID.randomUUID(), 1, GcmMessage.Type.NOTIFICATION, Optional.empty()); - GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender); + GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender, mock(ExperimentEnrollmentManager.class), mock(FcmSender.class)); CompletableFuture successFuture = CompletableFuture.completedFuture(successResult); @@ -81,7 +83,7 @@ class GCMSenderTest { when(invalidResult.isSuccess()).thenReturn(true); GcmMessage message = new GcmMessage(gcmId, destinationUuid, 1, GcmMessage.Type.NOTIFICATION, Optional.empty()); - GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender); + GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender, mock(ExperimentEnrollmentManager.class), mock(FcmSender.class)); CompletableFuture invalidFuture = CompletableFuture.completedFuture(invalidResult); @@ -122,7 +124,7 @@ class GCMSenderTest { when(canonicalResult.getCanonicalRegistrationId()).thenReturn(canonicalId); GcmMessage message = new GcmMessage(gcmId, destinationUuid, 1, GcmMessage.Type.NOTIFICATION, Optional.empty()); - GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender); + GCMSender gcmSender = new GCMSender(executorService, accountsManager, sender, mock(ExperimentEnrollmentManager.class), mock(FcmSender.class)); CompletableFuture invalidFuture = CompletableFuture.completedFuture(canonicalResult);