diff --git a/firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransformTest.java b/firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransformTest.java index 64d54d31ea3..820ba750db0 100644 --- a/firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransformTest.java +++ b/firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransformTest.java @@ -58,6 +58,15 @@ public void testReportToJsonAndBack_with_developmentPlatform_equals() throws IOE assertEquals(reifiedReport, testReport); } + @Test + public void testReportToJsonAndBack_with_appExitInfo_equals() throws IOException { + final CrashlyticsReport testReport = makeTestReport(false).withAppExitInfo(makeAppExitInfo()); + final String testReportJson = transform.reportToJson(testReport); + final CrashlyticsReport reifiedReport = transform.reportFromJson(testReportJson); + assertNotSame(reifiedReport, testReport); + assertEquals(reifiedReport, testReport); + } + @Test public void testEventToJsonAndBack_equals() throws IOException { final CrashlyticsReport.Session.Event testEvent = makeTestEvent(); @@ -67,6 +76,16 @@ public void testEventToJsonAndBack_equals() throws IOException { assertEquals(reifiedEvent, testEvent); } + @Test + public void testAppExitInfoToJsonAndBack_equals() throws IOException { + final CrashlyticsReport.ApplicationExitInfo testAppExitInfo = makeAppExitInfo(); + final String testAppExitInfoJson = transform.appExitInfoToJson(testAppExitInfo); + final CrashlyticsReport.ApplicationExitInfo reifiedAppExitInfo = + transform.applicationExitInfoFromJson(testAppExitInfoJson); + assertNotSame(reifiedAppExitInfo, testAppExitInfo); + assertEquals(reifiedAppExitInfo, testAppExitInfo); + } + private static CrashlyticsReport makeTestReport(boolean useDevelopmentPlatform) { return CrashlyticsReport.builder() .setSdkVersion("sdkVersion") @@ -192,4 +211,14 @@ private static ImmutableList makeTestFrames() { .setImportance(4) .build()); } + + private static CrashlyticsReport.ApplicationExitInfo makeAppExitInfo() { + return CrashlyticsReport.ApplicationExitInfo.builder() + .setTraceFile("trace") + .setTimestamp(1L) + .setImportance(1) + .setReasonCode(1) + .setProcessName("test") + .build(); + } } diff --git a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform.java b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform.java index 4e0651112aa..2b545abe6a6 100644 --- a/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform.java +++ b/firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/model/serialization/CrashlyticsReportJsonTransform.java @@ -47,6 +47,12 @@ public String eventToJson(@NonNull CrashlyticsReport.Session.Event event) { return CRASHLYTICS_REPORT_JSON_ENCODER.encode(event); } + @NonNull + public String appExitInfoToJson( + @NonNull CrashlyticsReport.ApplicationExitInfo applicationExitInfo) { + return CRASHLYTICS_REPORT_JSON_ENCODER.encode(applicationExitInfo); + } + @NonNull public CrashlyticsReport reportFromJson(@NonNull String json) throws IOException { try (JsonReader jsonReader = new JsonReader(new StringReader(json))) { @@ -65,6 +71,16 @@ public CrashlyticsReport.Session.Event eventFromJson(@NonNull String json) throw } } + @NonNull + public CrashlyticsReport.ApplicationExitInfo applicationExitInfoFromJson(@NonNull String json) + throws IOException { + try (JsonReader jsonReader = new JsonReader(new StringReader(json))) { + return parseAppExitInfo(jsonReader); + } catch (IllegalStateException e) { + throw new IOException(e); + } + } + @NonNull private static CrashlyticsReport parseReport(@NonNull JsonReader jsonReader) throws IOException { final CrashlyticsReport.Builder builder = CrashlyticsReport.builder(); @@ -97,6 +113,9 @@ private static CrashlyticsReport parseReport(@NonNull JsonReader jsonReader) thr case "ndkPayload": builder.setNdkPayload(parseNdkPayload(jsonReader)); break; + case "appExitInfo": + builder.setAppExitInfo(parseAppExitInfo(jsonReader)); + break; default: jsonReader.skipValue(); break; @@ -184,6 +203,40 @@ private static CrashlyticsReport.FilesPayload parseNdkPayload(@NonNull JsonReade return builder.build(); } + @NonNull + private static CrashlyticsReport.ApplicationExitInfo parseAppExitInfo( + @NonNull JsonReader jsonReader) throws IOException { + final CrashlyticsReport.ApplicationExitInfo.Builder builder = + CrashlyticsReport.ApplicationExitInfo.builder(); + + jsonReader.beginObject(); + while (jsonReader.hasNext()) { + String name = jsonReader.nextName(); + switch (name) { + case "processName": + builder.setProcessName(jsonReader.nextString()); + break; + case "reasonCode": + builder.setReasonCode(jsonReader.nextInt()); + break; + case "importance": + builder.setImportance(jsonReader.nextInt()); + break; + case "timestamp": + builder.setTimestamp(jsonReader.nextLong()); + break; + case "traceFile": + builder.setTraceFile(jsonReader.nextString()); + break; + default: + jsonReader.skipValue(); + break; + } + } + jsonReader.endObject(); + return builder.build(); + } + @NonNull private static CrashlyticsReport.FilesPayload.File parseFile(@NonNull JsonReader jsonReader) throws IOException {