Skip to content

Commit a580111

Browse files
authored
Reading FCM error code from the details section (#159)
* Reading FCM error code from the details section * Cleaned up test
1 parent a0ffae0 commit a580111

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

src/main/java/com/google/firebase/messaging/FirebaseMessaging.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858
public class FirebaseMessaging {
5959

6060
private static final String FCM_URL = "https://fcm.googleapis.com/v1/projects/%s/messages:send";
61+
private static final String FCM_ERROR_TYPE =
62+
"type.googleapis.com/google.firebase.fcm.v1.FcmErrorCode";
6163

6264
private static final String INTERNAL_ERROR = "internal-error";
6365
private static final String UNKNOWN_ERROR = "unknown-error";
@@ -261,11 +263,11 @@ private void handleSendHttpError(HttpResponseException e) throws FirebaseMessagi
261263
// ignored
262264
}
263265

264-
String code = FCM_ERROR_CODES.get(response.getString("status"));
266+
String code = FCM_ERROR_CODES.get(response.getErrorCode());
265267
if (code == null) {
266268
code = UNKNOWN_ERROR;
267269
}
268-
String msg = response.getString("message");
270+
String msg = response.getErrorMessage();
269271
if (Strings.isNullOrEmpty(msg)) {
270272
msg = String.format("Unexpected HTTP response with status: %d; body: %s",
271273
e.getStatusCode(), e.getContent());
@@ -388,9 +390,27 @@ private static class MessagingServiceErrorResponse {
388390
private Map<String, Object> error;
389391

390392

391-
String getString(String key) {
393+
String getErrorCode() {
394+
if (error == null) {
395+
return null;
396+
}
397+
Object details = error.get("details");
398+
if (details != null && details instanceof List) {
399+
for (Object detail : (List) details) {
400+
if (detail instanceof Map) {
401+
Map detailMap = (Map) detail;
402+
if (FCM_ERROR_TYPE.equals(detailMap.get("@type"))) {
403+
return (String) detailMap.get("errorCode");
404+
}
405+
}
406+
}
407+
}
408+
return (String) error.get("status");
409+
}
410+
411+
String getErrorMessage() {
392412
if (error != null) {
393-
return (String) error.get(key);
413+
return (String) error.get("message");
394414
}
395415
return null;
396416
}

src/test/java/com/google/firebase/messaging/FirebaseMessagingTest.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public void testNoProjectId() {
9797
}
9898

9999
@Test
100-
public void testNullMessage() throws Exception {
100+
public void testNullMessage() {
101101
FirebaseMessaging messaging = initDefaultMessaging();
102102
TestResponseInterceptor interceptor = new TestResponseInterceptor();
103103
messaging.setInterceptor(interceptor);
@@ -218,6 +218,31 @@ public void testSendErrorWithCanonicalCode() throws Exception {
218218
}
219219
}
220220

221+
@Test
222+
public void testSendErrorWithFcmErrorCode() throws Exception {
223+
MockLowLevelHttpResponse response = new MockLowLevelHttpResponse();
224+
FirebaseMessaging messaging = initMessaging(response);
225+
for (int code : HTTP_ERRORS) {
226+
response.setStatusCode(code).setContent(
227+
"{\"error\": {\"status\": \"INVALID_ARGUMENT\", \"message\": \"test error\", "
228+
+ "\"details\":[{\"@type\": \"type.googleapis.com/google.firebase.fcm"
229+
+ ".v1.FcmErrorCode\", \"errorCode\": \"UNREGISTERED\"}]}}");
230+
TestResponseInterceptor interceptor = new TestResponseInterceptor();
231+
messaging.setInterceptor(interceptor);
232+
try {
233+
messaging.sendAsync(Message.builder().setTopic("test-topic").build()).get();
234+
fail("No error thrown for HTTP error");
235+
} catch (ExecutionException e) {
236+
assertTrue(e.getCause() instanceof FirebaseMessagingException);
237+
FirebaseMessagingException error = (FirebaseMessagingException) e.getCause();
238+
assertEquals("registration-token-not-registered", error.getErrorCode());
239+
assertEquals("test error", error.getMessage());
240+
assertTrue(error.getCause() instanceof HttpResponseException);
241+
}
242+
checkRequestHeader(interceptor);
243+
}
244+
}
245+
221246
@Test
222247
public void testInvalidSubscribe() {
223248
FirebaseMessaging messaging = initDefaultMessaging();

0 commit comments

Comments
 (0)