Skip to content

Commit 3d231e2

Browse files
committed
Base ndk sessions on non-ndk sessions
1 parent 9173669 commit 3d231e2

File tree

7 files changed

+70
-43
lines changed

7 files changed

+70
-43
lines changed

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/CrashlyticsControllerTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
import java.util.List;
6868
import java.util.UUID;
6969
import java.util.concurrent.TimeUnit;
70-
import org.junit.Test;
7170
import org.mockito.ArgumentCaptor;
7271
import org.mockito.Mockito;
7372

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinatorTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,12 @@ public void testFinalizeSessionWithNativeEvent_createsCrashlyticsReportWithNativ
332332
String byteBackedSessionName = "byte";
333333
BytesBackedNativeSessionFile byteSession =
334334
new BytesBackedNativeSessionFile(byteBackedSessionName, testBytes);
335-
when(dataCapture.captureReportData()).thenReturn(makeIncompleteReport());
336-
337335
reportManager.finalizeSessionWithNativeEvent("id", Arrays.asList(byteSession));
338336

339-
ArgumentCaptor<CrashlyticsReport> report = ArgumentCaptor.forClass(CrashlyticsReport.class);
340-
verify(reportPersistence).finalizeSessionWithNativeEvent(eq("id"), report.capture());
341-
CrashlyticsReport.FilesPayload ndkPayloadFinalized = report.getValue().getNdkPayload();
337+
ArgumentCaptor<CrashlyticsReport.FilesPayload> filesPayload =
338+
ArgumentCaptor.forClass(CrashlyticsReport.FilesPayload.class);
339+
verify(reportPersistence).finalizeSessionWithNativeEvent(eq("id"), filesPayload.capture());
340+
CrashlyticsReport.FilesPayload ndkPayloadFinalized = filesPayload.getValue();
342341
assertEquals(1, ndkPayloadFinalized.getFiles().size());
343342
assertEquals(testBytes, ndkPayloadFinalized.getFiles().get(0).getContents());
344343
assertEquals(byteBackedSessionName, ndkPayloadFinalized.getFiles().get(0).getFilename());

firebase-crashlytics/src/androidTest/java/com/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistenceTest.java

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -307,27 +307,28 @@ public void testFinalizeReports_removesLowPriorityReportsFirst() throws IOExcept
307307

308308
@Test
309309
public void testFinalizeReports_prioritizesNativeAndNonnativeFatals() throws IOException {
310-
CrashlyticsReport report = makeTestNativeReport();
310+
311+
CrashlyticsReport.FilesPayload filesPayload = makeFilePayload();
311312
reportPersistence =
312313
new CrashlyticsReportPersistence(
313314
folder.newFolder(), getSettingsMock(4, VERY_LARGE_UPPER_LIMIT));
314315

315-
reportPersistence.finalizeSessionWithNativeEvent("testSession1native", report);
316+
persistReportWithEvent(reportPersistence, "testSession1", true);
317+
reportPersistence.finalizeSessionWithNativeEvent("testSession1", filesPayload);
316318
persistReportWithEvent(reportPersistence, "testSession2low", false);
317319
persistReportWithEvent(reportPersistence, "testSession3low", false);
318-
persistReportWithEvent(reportPersistence, "testSession4high", true);
319-
persistReportWithEvent(reportPersistence, "testSession5high", true);
320-
reportPersistence.finalizeSessionWithNativeEvent("testSession6native", report);
320+
persistReportWithEvent(reportPersistence, "testSession4", true);
321+
reportPersistence.finalizeSessionWithNativeEvent("testSession4", filesPayload);
321322
reportPersistence.finalizeReports("skippedSession", 0L);
322323

324+
List<CrashlyticsReportWithSessionId> finalizedReports =
325+
reportPersistence.loadFinalizedReports();
323326
Set<String> reportNames = new HashSet<>();
324-
for (CrashlyticsReportWithSessionId finalizedReport : reportPersistence.loadFinalizedReports()) {
327+
for (CrashlyticsReportWithSessionId finalizedReport : finalizedReports) {
325328
reportNames.add(finalizedReport.getSessionId());
326329
}
327-
assertEquals(
328-
Sets.newSet(
329-
"testSession1native", "testSession4high", "testSession5high", "testSession6native"),
330-
reportNames);
330+
assertEquals(Sets.newSet("testSession1", "testSession4"), reportNames);
331+
assertEquals(4, finalizedReports.size());
331332
}
332333

333334
@Test
@@ -416,17 +417,19 @@ public void testLoadFinalizedReports_reportWithUserId_returnsReportWithProperUse
416417

417418
@Test
418419
public void testFinalizeSessionWithNativeEvent_writesNativeSessions() {
419-
CrashlyticsReport report = makeTestNativeReport();
420+
final CrashlyticsReport testReport = makeTestReport("sessionId");
421+
reportPersistence.persistReport(testReport);
422+
CrashlyticsReport.FilesPayload filesPayload = makeFilePayload();
420423
List<CrashlyticsReportWithSessionId> finalizedReports =
421424
reportPersistence.loadFinalizedReports();
422425

423426
assertEquals(0, finalizedReports.size());
424427

425-
reportPersistence.finalizeSessionWithNativeEvent("sessionId", report);
428+
reportPersistence.finalizeSessionWithNativeEvent("sessionId", filesPayload);
426429

427430
finalizedReports = reportPersistence.loadFinalizedReports();
428431
assertEquals(1, finalizedReports.size());
429-
assertEquals(report, finalizedReports.get(0).getReport());
432+
assertEquals(filesPayload, finalizedReports.get(0).getReport().getNdkPayload());
430433
}
431434

432435
@Test
@@ -636,18 +639,31 @@ private static CrashlyticsReport makeTestReport(String sessionId) {
636639
return makeIncompleteReport().setSession(makeTestSession(sessionId)).build();
637640
}
638641

642+
private static CrashlyticsReport.FilesPayload makeFilePayload() {
643+
byte[] testContents = {0, 2, 20, 10};
644+
return CrashlyticsReport.FilesPayload.builder()
645+
.setOrgId("orgId")
646+
.setFiles(
647+
ImmutableList.from(
648+
CrashlyticsReport.FilesPayload.File.builder()
649+
.setContents(testContents)
650+
.setFilename("bytes")
651+
.build()))
652+
.build();
653+
}
654+
639655
private static CrashlyticsReport makeTestNativeReport() {
640656
byte[] testContents = {0, 2, 20, 10};
641657
CrashlyticsReport.FilesPayload filesPayload =
642-
CrashlyticsReport.FilesPayload.builder()
643-
.setOrgId("orgId")
644-
.setFiles(
645-
ImmutableList.from(
646-
CrashlyticsReport.FilesPayload.File.builder()
647-
.setContents(testContents)
648-
.setFilename("bytes")
649-
.build()))
650-
.build();
658+
CrashlyticsReport.FilesPayload.builder()
659+
.setOrgId("orgId")
660+
.setFiles(
661+
ImmutableList.from(
662+
CrashlyticsReport.FilesPayload.File.builder()
663+
.setContents(testContents)
664+
.setFilename("bytes")
665+
.build()))
666+
.build();
651667

652668
return makeIncompleteReport().setNdkPayload(filesPayload).build();
653669
}

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/FileBackedNativeSessionFile.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import androidx.annotation.NonNull;
1818
import androidx.annotation.Nullable;
19-
2019
import com.google.firebase.crashlytics.internal.model.CrashlyticsReport;
2120
import java.io.ByteArrayOutputStream;
2221
import java.io.File;
@@ -60,10 +59,7 @@ public InputStream getStream() {
6059
public CrashlyticsReport.FilesPayload.File asFilePayload() {
6160
byte[] bytes = asBytes();
6261
return bytes != null
63-
? CrashlyticsReport.FilesPayload.File.builder()
64-
.setContents(bytes)
65-
.setFilename(name)
66-
.build()
62+
? CrashlyticsReport.FilesPayload.File.builder().setContents(bytes).setFilename(name).build()
6763
: null;
6864
}
6965

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/common/SessionReportingCoordinator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@ public void finalizeSessionWithNativeEvent(
138138

139139
filesPayloadBuilder.setFiles(ImmutableList.from(nativeFiles));
140140

141-
reportPersistence.finalizeSessionWithNativeEvent(
142-
sessionId, dataCapture.captureReportData().withNdkPayload(filesPayloadBuilder.build()));
141+
reportPersistence.finalizeSessionWithNativeEvent(sessionId, filesPayloadBuilder.build());
143142
} catch (Exception e) {
144143
throw new RuntimeException(e);
145144
}

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/model/CrashlyticsReport.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,7 @@ public CrashlyticsReport withOrganizationId(@NonNull String organizationId) {
150150
*/
151151
@NonNull
152152
public CrashlyticsReport withNdkPayload(@NonNull FilesPayload filesPayload) {
153-
if (getType() == Type.JAVA) {
154-
throw new IllegalStateException(
155-
"Cannot add an NDK payload to a report with an existing Session.");
156-
}
157-
158-
return toBuilder().setNdkPayload(filesPayload).build();
153+
return toBuilder().setSession(null).setNdkPayload(filesPayload).build();
159154
}
160155

161156
/**

firebase-crashlytics/src/main/java/com/google/firebase/crashlytics/internal/persistence/CrashlyticsReportPersistence.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,32 @@ public void deleteFinalizedReport(String sessionId) {
170170
}
171171

172172
public void finalizeSessionWithNativeEvent(
173-
String sessionId, CrashlyticsReport crashlyticsReport) {
173+
String sessionId, CrashlyticsReport.FilesPayload build) {
174174
final File outputDirectory = prepareDirectory(nativeReportsDirectory);
175-
writeTextFile(new File(outputDirectory, sessionId), TRANSFORM.reportToJson(crashlyticsReport));
175+
176+
File sessionFile = new File(getSessionDirectoryById(sessionId), REPORT_FILE_NAME);
177+
178+
if (!sessionFile.exists()) {
179+
return;
180+
}
181+
182+
String textFile = readTextFile(sessionFile);
183+
184+
if (textFile == null) {
185+
return;
186+
}
187+
188+
CrashlyticsReport report = TRANSFORM.reportFromJson(textFile);
189+
190+
// In the unlikely event the open non-native report has been cleaned up,
191+
// we no longer can retrieve the relevant context about the session.
192+
if (report == null) {
193+
return;
194+
}
195+
196+
report = report.withNdkPayload(build);
197+
198+
writeTextFile(new File(outputDirectory, sessionId), TRANSFORM.reportToJson(report));
176199
}
177200

178201
// TODO: Deal with potential runtime exceptions

0 commit comments

Comments
 (0)