From 77ce10ccdad2dab804da06e012d22e88c5b303cb Mon Sep 17 00:00:00 2001 From: hiranya911 Date: Wed, 28 Mar 2018 17:39:43 -0700 Subject: [PATCH 1/2] Reading FCM error code from the details section --- .../firebase/messaging/FirebaseMessaging.java | 28 ++++++++++++++++--- .../messaging/FirebaseMessagingTest.java | 25 +++++++++++++++++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/google/firebase/messaging/FirebaseMessaging.java b/src/main/java/com/google/firebase/messaging/FirebaseMessaging.java index c068004fb..21ab3898f 100644 --- a/src/main/java/com/google/firebase/messaging/FirebaseMessaging.java +++ b/src/main/java/com/google/firebase/messaging/FirebaseMessaging.java @@ -58,6 +58,8 @@ public class FirebaseMessaging { private static final String FCM_URL = "https://fcm.googleapis.com/v1/projects/%s/messages:send"; + private static final String FCM_ERROR_TYPE = + "type.googleapis.com/google.firebase.fcm.v1.FcmErrorCode"; private static final String INTERNAL_ERROR = "internal-error"; private static final String UNKNOWN_ERROR = "unknown-error"; @@ -261,11 +263,11 @@ private void handleSendHttpError(HttpResponseException e) throws FirebaseMessagi // ignored } - String code = FCM_ERROR_CODES.get(response.getString("status")); + String code = FCM_ERROR_CODES.get(response.getErrorCode()); if (code == null) { code = UNKNOWN_ERROR; } - String msg = response.getString("message"); + String msg = response.getErrorMessage(); if (Strings.isNullOrEmpty(msg)) { msg = String.format("Unexpected HTTP response with status: %d; body: %s", e.getStatusCode(), e.getContent()); @@ -388,9 +390,27 @@ private static class MessagingServiceErrorResponse { private Map error; - String getString(String key) { + String getErrorCode() { + if (error == null) { + return null; + } + Object details = error.get("details"); + if (details != null && details instanceof List) { + for (Object detail : (List) details) { + if (detail instanceof Map) { + Map detailMap = (Map) detail; + if (FCM_ERROR_TYPE.equals(detailMap.get("@type"))) { + return (String) detailMap.get("errorCode"); + } + } + } + } + return (String) error.get("status"); + } + + String getErrorMessage() { if (error != null) { - return (String) error.get(key); + return (String) error.get("message"); } return null; } diff --git a/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java b/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java index 3eb154503..46edb7d28 100644 --- a/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java +++ b/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java @@ -218,6 +218,31 @@ public void testSendErrorWithCanonicalCode() throws Exception { } } + @Test + public void testSendErrorWithFcmErrorCode() throws Exception { + MockLowLevelHttpResponse response = new MockLowLevelHttpResponse(); + FirebaseMessaging messaging = initMessaging(response); + for (int code : HTTP_ERRORS) { + response.setStatusCode(code).setContent( + "{\"error\": {\"status\": \"INVALID_ARGUMENT\", \"message\": \"test error\", " + + "\"details\":[{\"@type\": \"type.googleapis.com/google.firebase.fcm" + + ".v1.FcmErrorCode\", \"errorCode\": \"UNREGISTERED\"}]}}"); + TestResponseInterceptor interceptor = new TestResponseInterceptor(); + messaging.setInterceptor(interceptor); + try { + messaging.sendAsync(Message.builder().setTopic("test-topic").build()).get(); + fail("No error thrown for HTTP error"); + } catch (ExecutionException e) { + assertTrue(e.getCause() instanceof FirebaseMessagingException); + FirebaseMessagingException error = (FirebaseMessagingException) e.getCause(); + assertEquals("registration-token-not-registered", error.getErrorCode()); + assertEquals("test error", error.getMessage()); + assertTrue(error.getCause() instanceof HttpResponseException); + } + checkRequestHeader(interceptor); + } + } + @Test public void testInvalidSubscribe() { FirebaseMessaging messaging = initDefaultMessaging(); From e952811f71e190a46883524825a4bbac72deea2e Mon Sep 17 00:00:00 2001 From: hiranya911 Date: Wed, 28 Mar 2018 22:14:49 -0700 Subject: [PATCH 2/2] Cleaned up test --- .../google/firebase/messaging/FirebaseMessagingTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java b/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java index 46edb7d28..2872d8a19 100644 --- a/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java +++ b/src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java @@ -97,7 +97,7 @@ public void testNoProjectId() { } @Test - public void testNullMessage() throws Exception { + public void testNullMessage() { FirebaseMessaging messaging = initDefaultMessaging(); TestResponseInterceptor interceptor = new TestResponseInterceptor(); messaging.setInterceptor(interceptor); @@ -224,9 +224,9 @@ public void testSendErrorWithFcmErrorCode() throws Exception { FirebaseMessaging messaging = initMessaging(response); for (int code : HTTP_ERRORS) { response.setStatusCode(code).setContent( - "{\"error\": {\"status\": \"INVALID_ARGUMENT\", \"message\": \"test error\", " + - "\"details\":[{\"@type\": \"type.googleapis.com/google.firebase.fcm" + - ".v1.FcmErrorCode\", \"errorCode\": \"UNREGISTERED\"}]}}"); + "{\"error\": {\"status\": \"INVALID_ARGUMENT\", \"message\": \"test error\", " + + "\"details\":[{\"@type\": \"type.googleapis.com/google.firebase.fcm" + + ".v1.FcmErrorCode\", \"errorCode\": \"UNREGISTERED\"}]}}"); TestResponseInterceptor interceptor = new TestResponseInterceptor(); messaging.setInterceptor(interceptor); try {