34
34
import com .google .android .gms .tasks .TaskCompletionSource ;
35
35
import com .google .android .gms .tasks .Tasks ;
36
36
import com .google .firebase .FirebaseApp ;
37
+ import com .google .firebase .concurrent .TestOnlyExecutors ;
37
38
import com .google .firebase .crashlytics .internal .CrashlyticsNativeComponent ;
38
39
import com .google .firebase .crashlytics .internal .CrashlyticsTestCase ;
40
+ import com .google .firebase .crashlytics .internal .CrashlyticsWorker ;
39
41
import com .google .firebase .crashlytics .internal .DevelopmentPlatformProvider ;
40
42
import com .google .firebase .crashlytics .internal .NativeSessionFileProvider ;
41
43
import com .google .firebase .crashlytics .internal .analytics .AnalyticsEventLogger ;
55
57
import java .util .TreeSet ;
56
58
import java .util .concurrent .Executor ;
57
59
import java .util .concurrent .TimeUnit ;
58
- import org .junit .Test ;
59
60
import org .mockito .ArgumentCaptor ;
60
61
61
62
public class CrashlyticsControllerTest extends CrashlyticsTestCase {
62
63
private static final String GOOGLE_APP_ID = "google:app:id" ;
63
64
private static final String SESSION_ID = "session_id" ;
64
65
66
+ private final CrashlyticsWorker commonWorker =
67
+ new CrashlyticsWorker (TestOnlyExecutors .background ());
68
+
65
69
private Context testContext ;
66
70
private IdManager idManager ;
67
71
private SettingsProvider testSettingsProvider ;
@@ -99,14 +103,19 @@ protected void setUp() throws Exception {
99
103
when (testSettingsProvider .getSettingsAsync ()).thenReturn (Tasks .forResult (testSettings ));
100
104
}
101
105
106
+ @ Override
107
+ protected void tearDown () throws Exception {
108
+ super .tearDown ();
109
+ commonWorker .await ();
110
+ }
111
+
102
112
/** A convenience class for building CrashlyticsController instances for testing. */
103
113
private class ControllerBuilder {
104
114
private DataCollectionArbiter dataCollectionArbiter ;
105
115
private CrashlyticsNativeComponent nativeComponent = null ;
106
116
private AnalyticsEventLogger analyticsEventLogger ;
107
117
private SessionReportingCoordinator sessionReportingCoordinator ;
108
118
109
- private CrashlyticsBackgroundWorker backgroundWorker ;
110
119
private LogFileManager logFileManager = null ;
111
120
112
121
private UserMetadata userMetadata = null ;
@@ -118,8 +127,6 @@ private class ControllerBuilder {
118
127
analyticsEventLogger = mock (AnalyticsEventLogger .class );
119
128
120
129
sessionReportingCoordinator = mockSessionReportingCoordinator ;
121
-
122
- backgroundWorker = new CrashlyticsBackgroundWorker (new SameThreadExecutorService ());
123
130
}
124
131
125
132
ControllerBuilder setDataCollectionArbiter (DataCollectionArbiter arbiter ) {
@@ -168,7 +175,7 @@ public CrashlyticsController build() {
168
175
final CrashlyticsController controller =
169
176
new CrashlyticsController (
170
177
testContext .getApplicationContext (),
171
- backgroundWorker ,
178
+ commonWorker ,
172
179
idManager ,
173
180
dataCollectionArbiter ,
174
181
testFileStore ,
@@ -208,6 +215,8 @@ public void testWriteNonFatal_callsSessionReportingCoordinatorPersistNonFatal()
208
215
controller .writeNonFatalException (thread , nonFatal );
209
216
controller .doCloseSessions (testSettingsProvider );
210
217
218
+ commonWorker .await ();
219
+
211
220
verify (mockSessionReportingCoordinator )
212
221
.persistNonFatalEvent (eq (nonFatal ), eq (thread ), eq (sessionId ), anyLong ());
213
222
}
@@ -228,9 +237,8 @@ public void testFatalException_callsSessionReportingCoordinatorPersistFatal() th
228
237
.persistFatalEvent (eq (fatal ), eq (thread ), eq (sessionId ), anyLong ());
229
238
}
230
239
231
- @ Test
232
240
@ SdkSuppress (minSdkVersion = 30 ) // ApplicationExitInfo
233
- public void testOnDemandFatal_callLogFatalException () {
241
+ public void testOnDemandFatal_callLogFatalException () throws Exception {
234
242
Thread thread = Thread .currentThread ();
235
243
Exception fatal = new RuntimeException ("Fatal" );
236
244
Thread .UncaughtExceptionHandler exceptionHandler = mock (Thread .UncaughtExceptionHandler .class );
@@ -246,6 +254,8 @@ public void testOnDemandFatal_callLogFatalException() {
246
254
controller .enableExceptionHandling (SESSION_ID , exceptionHandler , testSettingsProvider );
247
255
controller .logFatalException (thread , fatal );
248
256
257
+ commonWorker .await ();
258
+
249
259
verify (mockUserMetadata ).setNewSession (not (eq (SESSION_ID )));
250
260
}
251
261
@@ -323,17 +333,20 @@ public File getOsFile() {
323
333
final CrashlyticsController controller =
324
334
builder ().setNativeComponent (mockNativeComponent ).setLogFileManager (logFileManager ).build ();
325
335
326
- controller .finalizeSessions (testSettingsProvider );
336
+ commonWorker .submit (() -> controller .finalizeSessions (testSettingsProvider ));
337
+ commonWorker .await ();
338
+
327
339
verify (mockSessionReportingCoordinator )
328
340
.finalizeSessionWithNativeEvent (eq (previousSessionId ), any (), any ());
329
341
verify (mockSessionReportingCoordinator , never ())
330
342
.finalizeSessionWithNativeEvent (eq (sessionId ), any (), any ());
331
343
}
332
344
333
345
@ SdkSuppress (minSdkVersion = 30 ) // ApplicationExitInfo
334
- public void testMissingNativeComponentCausesNoReports () {
346
+ public void testMissingNativeComponentCausesNoReports () throws Exception {
335
347
final CrashlyticsController controller = createController ();
336
- controller .finalizeSessions (testSettingsProvider );
348
+ commonWorker .submit (() -> controller .finalizeSessions (testSettingsProvider ));
349
+ commonWorker .await ();
337
350
338
351
List <String > sessions = testFileStore .getAllOpenSessionIds ();
339
352
for (String sessionId : sessions ) {
@@ -384,7 +397,8 @@ public void testFinalizeSessionAfterCrashOk() throws Exception {
384
397
testSettingsProvider , Thread .currentThread (), new RuntimeException ());
385
398
386
399
// This should not throw.
387
- controller .finalizeSessions (testSettingsProvider );
400
+ commonWorker .submit (() -> controller .finalizeSessions (testSettingsProvider ));
401
+ commonWorker .await ();
388
402
}
389
403
390
404
@ SdkSuppress (minSdkVersion = 30 ) // ApplicationExitInfo
@@ -535,7 +549,7 @@ public void testUploadDisabledThenEnabled() throws Exception {
535
549
}
536
550
537
551
@ SdkSuppress (minSdkVersion = 30 ) // ApplicationExitInfo
538
- public void testFatalEvent_sendsAppExceptionEvent () {
552
+ public void testFatalEvent_sendsAppExceptionEvent () throws Exception {
539
553
final String sessionId = "sessionId" ;
540
554
final LogFileManager logFileManager = new LogFileManager (testFileStore );
541
555
final AnalyticsEventLogger mockFirebaseAnalyticsLogger = mock (AnalyticsEventLogger .class );
@@ -548,10 +562,14 @@ public void testFatalEvent_sendsAppExceptionEvent() {
548
562
when (mockSessionReportingCoordinator .listSortedOpenSessionIds ())
549
563
.thenReturn (new TreeSet <>(Collections .singleton (sessionId )));
550
564
551
- controller .openSession (SESSION_ID );
552
- controller .handleUncaughtException (
553
- testSettingsProvider , Thread .currentThread (), new RuntimeException ("Fatal" ));
554
- controller .finalizeSessions (testSettingsProvider );
565
+ commonWorker .submit (
566
+ () -> {
567
+ controller .openSession (SESSION_ID );
568
+ controller .handleUncaughtException (
569
+ testSettingsProvider , Thread .currentThread (), new RuntimeException ("Fatal" ));
570
+ controller .finalizeSessions (testSettingsProvider );
571
+ });
572
+ commonWorker .await ();
555
573
556
574
assertFirebaseAnalyticsCrashEvent (mockFirebaseAnalyticsLogger );
557
575
}
0 commit comments