Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -328,9 +328,10 @@ public void onUserId_writesUserToReportMetadata() {
public void onSessionsFinalize_finalizesReports() {
final String sessionId = "testSessionId";
reportManager.onBeginSession(sessionId, System.currentTimeMillis());
reportManager.finalizeSessions();
final long endedAt = System.currentTimeMillis();
reportManager.finalizeSessions(endedAt);

verify(reportPersistence).finalizeReports(sessionId);
verify(reportPersistence).finalizeReports(sessionId, endedAt);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ private static CrashlyticsReport.Session makeTestSession() {
return Session.builder()
.setGenerator("generator")
.setIdentifier("identifier")
.setStartedAt(0)
.setStartedAt(1L)
.setEndedAt(1L)
.setCrashed(true)
.setApp(makeTestApplication())
.setUser(User.builder().setIdentifier("user").build())
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,9 @@ public void testLoadFinalizeReports_noReports_returnsNothing() {
@Test
public void testLoadFinalizedReports_reportWithNoEvents_returnsNothing() {
final String sessionId = "testSession";
final long timestamp = System.currentTimeMillis();
reportPersistence.persistReport(makeTestReport(sessionId));
reportPersistence.finalizeReports(sessionId);
reportPersistence.finalizeReports(sessionId, timestamp);
assertTrue(reportPersistence.loadFinalizedReports().isEmpty());
}

Expand All @@ -88,12 +89,19 @@ public void testLoadFinalizedReports_reportThenEvent_returnsReportWithEvent() {

reportPersistence.persistReport(testReport);
reportPersistence.persistEvent(testEvent, sessionId);
reportPersistence.finalizeReports("skippedSession");

final long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(1, finalizedReports.size());
final CrashlyticsReport finalizedReport = finalizedReports.get(0);
assertEquals(testReport.withEvents(ImmutableList.from(testEvent)), finalizedReport);
assertEquals(
testReport
.withSessionEndFields(endedAt, false, null)
.withEvents(ImmutableList.from(testEvent)),
finalizedReport);
}

@Test
Expand All @@ -107,12 +115,18 @@ public void testLoadFinalizedReports_reportThenMultipleEvents_returnsReportWithM
reportPersistence.persistEvent(testEvent, sessionId);
reportPersistence.persistEvent(testEvent2, sessionId);

reportPersistence.finalizeReports("skippedSession");
final long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(1, finalizedReports.size());
final CrashlyticsReport finalizedReport = finalizedReports.get(0);
assertEquals(testReport.withEvents(ImmutableList.from(testEvent, testEvent2)), finalizedReport);
assertEquals(
testReport
.withSessionEndFields(endedAt, false, null)
.withEvents(ImmutableList.from(testEvent, testEvent2)),
finalizedReport);
}

@Test
Expand All @@ -130,22 +144,35 @@ public void testLoadFinalizedReports_reportThenMultipleEvents_returnsReportWithM
reportPersistence.persistEvent(testEvent1, sessionId1);
reportPersistence.persistEvent(testEvent2, sessionId2);

reportPersistence.finalizeReports("skippedSession");
final long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(2, finalizedReports.size());
final CrashlyticsReport finalizedReport1 = finalizedReports.get(1);
assertEquals(testReport1.withEvents(ImmutableList.from(testEvent1)), finalizedReport1);
assertEquals(
testReport1
.withSessionEndFields(endedAt, false, null)
.withEvents(ImmutableList.from(testEvent1)),
finalizedReport1);
final CrashlyticsReport finalizedReport2 = finalizedReports.get(0);
assertEquals(testReport2.withEvents(ImmutableList.from(testEvent2)), finalizedReport2);
assertEquals(
testReport2
.withSessionEndFields(endedAt, false, null)
.withEvents(ImmutableList.from(testEvent2)),
finalizedReport2);
}

@Test
public void testFinalizeReports_capsOpenSessions() throws IOException {
for (int i = 0; i < 10; i++) {
persistReportWithEvent(reportPersistence, "testSession" + i, true);
}
reportPersistence.finalizeReports("skippedSession");

final long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(8, finalizedReports.size());
Expand All @@ -157,7 +184,10 @@ public void testFinalizeReports_capsOldestSessionsFirst() throws IOException {
for (int i = 0; i < 16; i++) {
persistReportWithEvent(reportPersistence, "testSession" + format.format(i), true);
}
reportPersistence.finalizeReports("skippedSession");

final long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(8, finalizedReports.size());
Expand All @@ -182,11 +212,14 @@ public void testFinalizeReports_skipsCappingCurrentSession() throws IOException
for (int i = 0; i < 16; i++) {
persistReportWithEvent(reportPersistence, "testSession" + i, true);
}
reportPersistence.finalizeReports("testSession5");

final long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("testSession5", endedAt);
List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(8, finalizedReports.size());
persistReportWithEvent(reportPersistence, "testSession11", true);
reportPersistence.finalizeReports("testSession11");
reportPersistence.finalizeReports("testSession11", endedAt);
finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(9, finalizedReports.size());
}
Expand All @@ -199,7 +232,8 @@ public void testFinalizeReports_capsReports() throws IOException {
for (int i = 0; i < 10; i++) {
persistReportWithEvent(reportPersistence, "testSession" + i, true);
}
reportPersistence.finalizeReports("skippedSession");

reportPersistence.finalizeReports("skippedSession", 0L);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(4, finalizedReports.size());
Expand All @@ -221,7 +255,8 @@ public void testFinalizeReports_whenSettingsChanges_capsReports() throws IOExcep
for (int i = 0; i < 16; i++) {
persistReportWithEvent(reportPersistence, "testSession" + format.format(i), true);
}
reportPersistence.finalizeReports("skippedSession");

reportPersistence.finalizeReports("skippedSession", 0L);
List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(4, finalizedReports.size());
when(settingsMock.getSessionData()).thenReturn(sessionSettingsDataMockDifferentValues);
Expand All @@ -230,7 +265,7 @@ public void testFinalizeReports_whenSettingsChanges_capsReports() throws IOExcep
persistReportWithEvent(reportPersistence, "testSession" + i, true);
}

reportPersistence.finalizeReports("skippedSession");
reportPersistence.finalizeReports("skippedSession", 0L);

finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(8, finalizedReports.size());
Expand All @@ -248,7 +283,7 @@ public void testFinalizeReports_removesLowPriorityReportsFirst() throws IOExcept
persistReportWithEvent(reportPersistence, sessionId, priority);
}

reportPersistence.finalizeReports("skippedSession");
reportPersistence.finalizeReports("skippedSession", 0L);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(4, finalizedReports.size());
Expand All @@ -267,7 +302,7 @@ public void testFinalizeReports_removesOldestReportsFirst() throws IOException {
persistReportWithEvent(reportPersistence, sessionId, true);
}

reportPersistence.finalizeReports("skippedSession");
reportPersistence.finalizeReports("skippedSession", 0L);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(4, finalizedReports.size());
Expand Down Expand Up @@ -297,11 +332,13 @@ public void testLoadFinalizedReports_reportWithUserId_returnsReportWithProperUse
reportPersistence.persistReport(testReport);
reportPersistence.persistEvent(testEvent, sessionId);
reportPersistence.persistUserIdForSession(userId, sessionId);
reportPersistence.finalizeReports("skippedSession");

reportPersistence.finalizeReports("skippedSession", 0L);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(1, finalizedReports.size());
final CrashlyticsReport finalizedReport = finalizedReports.get(0);
assertNotNull(finalizedReport.getSession().getUser());
assertEquals(userId, finalizedReport.getSession().getUser().getIdentifier());
}

Expand All @@ -324,13 +361,15 @@ public void testLoadFinalizedReports_reportWithUserId_returnsReportWithProperUse
reportPersistence.persistUserIdForSession(userId1, sessionId1);
reportPersistence.persistUserIdForSession(userId2, sessionId2);

reportPersistence.finalizeReports("skippedSession");
reportPersistence.finalizeReports("skippedSession", 0L);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(2, finalizedReports.size());
final CrashlyticsReport finalizedReport1 = finalizedReports.get(1);
assertNotNull(finalizedReport1.getSession().getUser());
assertEquals(userId1, finalizedReport1.getSession().getUser().getIdentifier());
final CrashlyticsReport finalizedReport2 = finalizedReports.get(0);
assertNotNull(finalizedReport2.getSession().getUser());
assertEquals(userId2, finalizedReport2.getSession().getUser().getIdentifier());
}

Expand All @@ -342,7 +381,8 @@ public void testDeleteFinalizedReport_removesReports() {

reportPersistence.persistReport(testReport);
reportPersistence.persistEvent(testEvent, sessionId);
reportPersistence.finalizeReports("skippedSession");

reportPersistence.finalizeReports("skippedSession", 0L);

assertEquals(1, reportPersistence.loadFinalizedReports().size());

Expand All @@ -359,7 +399,8 @@ public void testDeleteFinalizedReport_withWrongSessionId_doesNotRemoveReports()

reportPersistence.persistReport(testReport);
reportPersistence.persistEvent(testEvent, sessionId);
reportPersistence.finalizeReports("skippedSession");

reportPersistence.finalizeReports("skippedSession", 0L);

assertEquals(1, reportPersistence.loadFinalizedReports().size());

Expand All @@ -382,7 +423,7 @@ public void testDeleteAllReports_removesAllReports() {
reportPersistence.persistEvent(testEvent1, sessionId1);
reportPersistence.persistEvent(testEvent2, sessionId2);

reportPersistence.finalizeReports("skippedSession");
reportPersistence.finalizeReports("skippedSession", 0L);

assertEquals(2, reportPersistence.loadFinalizedReports().size());

Expand Down Expand Up @@ -410,14 +451,19 @@ public void testPersistEvent_keepsAppropriateNumberOfMostRecentEvents() throws I
reportPersistence.persistEvent(testEvent3, sessionId);
reportPersistence.persistEvent(testEvent4, sessionId);
reportPersistence.persistEvent(testEvent5, sessionId);
reportPersistence.finalizeReports("skippedSession");

final long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(1, finalizedReports.size());
final CrashlyticsReport finalizedReport = finalizedReports.get(0);
assertEquals(4, finalizedReport.getSession().getEvents().size());
assertEquals(
testReport.withEvents(ImmutableList.from(testEvent2, testEvent3, testEvent4, testEvent5)),
testReport
.withSessionEndFields(endedAt, false, null)
.withEvents(ImmutableList.from(testEvent2, testEvent3, testEvent4, testEvent5)),
finalizedReport);
}

Expand Down Expand Up @@ -448,14 +494,19 @@ public void testPersistEvent_whenSettingsChanges_keepsAppropriateNumberOfMostRec
reportPersistence.persistEvent(testEvent3, sessionId);
reportPersistence.persistEvent(testEvent4, sessionId);
reportPersistence.persistEvent(testEvent5, sessionId);
reportPersistence.finalizeReports("skippedSession");

long endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports = reportPersistence.loadFinalizedReports();
assertEquals(1, finalizedReports.size());
final CrashlyticsReport finalizedReport = finalizedReports.get(0);
assertEquals(4, finalizedReport.getSession().getEvents().size());
assertEquals(
testReport.withEvents(ImmutableList.from(testEvent2, testEvent3, testEvent4, testEvent5)),
testReport
.withSessionEndFields(endedAt, false, null)
.withEvents(ImmutableList.from(testEvent2, testEvent3, testEvent4, testEvent5)),
finalizedReport);

when(settingsMock.getSessionData()).thenReturn(sessionSettingsDataMockDifferentValues);
Expand All @@ -479,23 +530,28 @@ public void testPersistEvent_whenSettingsChanges_keepsAppropriateNumberOfMostRec
reportPersistence.persistEvent(testEvent8, sessionId2);
reportPersistence.persistEvent(testEvent9, sessionId2);
reportPersistence.persistEvent(testEvent10, sessionId2);
reportPersistence.finalizeReports("skippedSession");

endedAt = System.currentTimeMillis();

reportPersistence.finalizeReports("skippedSession", endedAt);

final List<CrashlyticsReport> finalizedReports2 = reportPersistence.loadFinalizedReports();
assertEquals(2, finalizedReports2.size());
final CrashlyticsReport finalizedReport2 = finalizedReports2.get(0);
assertEquals(8, finalizedReport2.getSession().getEvents().size());
assertEquals(
testReport2.withEvents(
ImmutableList.from(
testEvent3,
testEvent4,
testEvent5,
testEvent6,
testEvent7,
testEvent8,
testEvent9,
testEvent10)),
testReport2
.withSessionEndFields(endedAt, false, null)
.withEvents(
ImmutableList.from(
testEvent3,
testEvent4,
testEvent5,
testEvent6,
testEvent7,
testEvent8,
testEvent9,
testEvent10)),
finalizedReport2);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ public Task<Void> call() throws Exception {
// We've fatally crashed, so write the marker file that indicates a crash occurred.
crashMarker.create();

long timestampSeconds = time.getTime() / 1000;
long timestampSeconds = getTimestampSeconds(time);
reportingCoordinator.persistFatalEvent(ex, thread, timestampSeconds);
writeFatal(thread, ex, timestampSeconds);

Expand Down Expand Up @@ -648,7 +648,7 @@ void writeNonFatalException(final Thread thread, final Throwable ex) {
@Override
public void run() {
if (!isHandlingException()) {
long timestampSeconds = time.getTime() / 1000;
long timestampSeconds = getTimestampSeconds(time);
reportingCoordinator.persistNonFatalEvent(ex, thread, timestampSeconds);
doWriteNonFatal(thread, ex, timestampSeconds);
}
Expand Down Expand Up @@ -802,7 +802,7 @@ boolean finalizeSessions(int maxCustomExceptionEvents) {
* class.
*/
private void doOpenSession() throws Exception {
final long startedAtSeconds = new Date().getTime() / 1000;
final long startedAtSeconds = getCurrentTimestampSeconds();
final String sessionIdentifier = new CLSUUID(idManager).toString();

Logger.getLogger().d("Opening a new session with ID " + sessionIdentifier);
Expand Down Expand Up @@ -860,7 +860,7 @@ private void doCloseSessions(int maxCustomExceptionEvents, boolean includeCurren

closeOpenSessions(sessionBeginFiles, offset, maxCustomExceptionEvents);

reportingCoordinator.finalizeSessions();
reportingCoordinator.finalizeSessions(getCurrentTimestampSeconds());
}

/**
Expand Down Expand Up @@ -1196,6 +1196,14 @@ private static void gzip(@NonNull byte[] bytes, @NonNull File path) throws IOExc
}
}

private static long getCurrentTimestampSeconds() {
return getTimestampSeconds(new Date());
}

private static long getTimestampSeconds(Date date) {
return date.getTime() / 1000;
}

/** Removes dashes in the Crashlytics session identifier to conform to Firebase constraints. */
private static String makeFirebaseSessionIdentifier(String sessionIdentifier) {
return sessionIdentifier.replaceAll("-", "");
Expand Down Expand Up @@ -1586,7 +1594,7 @@ private void synthesizeSessionFile(
Logger.getLogger().d("Collecting SessionStart data for session ID " + sessionId);
writeToCosFromFile(cos, sessionBeginFile);

cos.writeUInt64(4, new Date().getTime() / 1000);
cos.writeUInt64(4, getCurrentTimestampSeconds());
cos.writeBool(5, hasFatal);

cos.writeUInt32(11, ANALYZER_VERSION);
Expand Down
Loading