Skip to content

Commit 96b702f

Browse files
authored
Migrate to Firebase common executors (#6128)
Migrate to Firebase common executors. Use the new `CrashlyticsWorker` for common and disk write workers.
1 parent 705d7a3 commit 96b702f

19 files changed

+348
-229
lines changed

firebase-crashlytics/firebase-crashlytics.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ dependencies {
9898
testImplementation(libs.mockito.core)
9999
testImplementation(libs.robolectric)
100100
testImplementation(libs.truth)
101+
testImplementation(project(":integ-testing"))
101102

102103
androidTestImplementation(libs.androidx.test.core)
103104
androidTestImplementation(libs.androidx.test.runner)

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

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@
3434
import com.google.android.gms.tasks.TaskCompletionSource;
3535
import com.google.android.gms.tasks.Tasks;
3636
import com.google.firebase.FirebaseApp;
37+
import com.google.firebase.concurrent.TestOnlyExecutors;
3738
import com.google.firebase.crashlytics.internal.CrashlyticsNativeComponent;
3839
import com.google.firebase.crashlytics.internal.CrashlyticsTestCase;
40+
import com.google.firebase.crashlytics.internal.CrashlyticsWorker;
3941
import com.google.firebase.crashlytics.internal.DevelopmentPlatformProvider;
4042
import com.google.firebase.crashlytics.internal.NativeSessionFileProvider;
4143
import com.google.firebase.crashlytics.internal.analytics.AnalyticsEventLogger;
@@ -55,13 +57,15 @@
5557
import java.util.TreeSet;
5658
import java.util.concurrent.Executor;
5759
import java.util.concurrent.TimeUnit;
58-
import org.junit.Test;
5960
import org.mockito.ArgumentCaptor;
6061

6162
public class CrashlyticsControllerTest extends CrashlyticsTestCase {
6263
private static final String GOOGLE_APP_ID = "google:app:id";
6364
private static final String SESSION_ID = "session_id";
6465

66+
private final CrashlyticsWorker commonWorker =
67+
new CrashlyticsWorker(TestOnlyExecutors.background());
68+
6569
private Context testContext;
6670
private IdManager idManager;
6771
private SettingsProvider testSettingsProvider;
@@ -99,14 +103,19 @@ protected void setUp() throws Exception {
99103
when(testSettingsProvider.getSettingsAsync()).thenReturn(Tasks.forResult(testSettings));
100104
}
101105

106+
@Override
107+
protected void tearDown() throws Exception {
108+
super.tearDown();
109+
commonWorker.await();
110+
}
111+
102112
/** A convenience class for building CrashlyticsController instances for testing. */
103113
private class ControllerBuilder {
104114
private DataCollectionArbiter dataCollectionArbiter;
105115
private CrashlyticsNativeComponent nativeComponent = null;
106116
private AnalyticsEventLogger analyticsEventLogger;
107117
private SessionReportingCoordinator sessionReportingCoordinator;
108118

109-
private CrashlyticsBackgroundWorker backgroundWorker;
110119
private LogFileManager logFileManager = null;
111120

112121
private UserMetadata userMetadata = null;
@@ -118,8 +127,6 @@ private class ControllerBuilder {
118127
analyticsEventLogger = mock(AnalyticsEventLogger.class);
119128

120129
sessionReportingCoordinator = mockSessionReportingCoordinator;
121-
122-
backgroundWorker = new CrashlyticsBackgroundWorker(new SameThreadExecutorService());
123130
}
124131

125132
ControllerBuilder setDataCollectionArbiter(DataCollectionArbiter arbiter) {
@@ -168,7 +175,7 @@ public CrashlyticsController build() {
168175
final CrashlyticsController controller =
169176
new CrashlyticsController(
170177
testContext.getApplicationContext(),
171-
backgroundWorker,
178+
commonWorker,
172179
idManager,
173180
dataCollectionArbiter,
174181
testFileStore,
@@ -208,6 +215,8 @@ public void testWriteNonFatal_callsSessionReportingCoordinatorPersistNonFatal()
208215
controller.writeNonFatalException(thread, nonFatal);
209216
controller.doCloseSessions(testSettingsProvider);
210217

218+
commonWorker.await();
219+
211220
verify(mockSessionReportingCoordinator)
212221
.persistNonFatalEvent(eq(nonFatal), eq(thread), eq(sessionId), anyLong());
213222
}
@@ -228,9 +237,8 @@ public void testFatalException_callsSessionReportingCoordinatorPersistFatal() th
228237
.persistFatalEvent(eq(fatal), eq(thread), eq(sessionId), anyLong());
229238
}
230239

231-
@Test
232240
@SdkSuppress(minSdkVersion = 30) // ApplicationExitInfo
233-
public void testOnDemandFatal_callLogFatalException() {
241+
public void testOnDemandFatal_callLogFatalException() throws Exception {
234242
Thread thread = Thread.currentThread();
235243
Exception fatal = new RuntimeException("Fatal");
236244
Thread.UncaughtExceptionHandler exceptionHandler = mock(Thread.UncaughtExceptionHandler.class);
@@ -246,6 +254,8 @@ public void testOnDemandFatal_callLogFatalException() {
246254
controller.enableExceptionHandling(SESSION_ID, exceptionHandler, testSettingsProvider);
247255
controller.logFatalException(thread, fatal);
248256

257+
commonWorker.await();
258+
249259
verify(mockUserMetadata).setNewSession(not(eq(SESSION_ID)));
250260
}
251261

@@ -323,17 +333,20 @@ public File getOsFile() {
323333
final CrashlyticsController controller =
324334
builder().setNativeComponent(mockNativeComponent).setLogFileManager(logFileManager).build();
325335

326-
controller.finalizeSessions(testSettingsProvider);
336+
commonWorker.submit(() -> controller.finalizeSessions(testSettingsProvider));
337+
commonWorker.await();
338+
327339
verify(mockSessionReportingCoordinator)
328340
.finalizeSessionWithNativeEvent(eq(previousSessionId), any(), any());
329341
verify(mockSessionReportingCoordinator, never())
330342
.finalizeSessionWithNativeEvent(eq(sessionId), any(), any());
331343
}
332344

333345
@SdkSuppress(minSdkVersion = 30) // ApplicationExitInfo
334-
public void testMissingNativeComponentCausesNoReports() {
346+
public void testMissingNativeComponentCausesNoReports() throws Exception {
335347
final CrashlyticsController controller = createController();
336-
controller.finalizeSessions(testSettingsProvider);
348+
commonWorker.submit(() -> controller.finalizeSessions(testSettingsProvider));
349+
commonWorker.await();
337350

338351
List<String> sessions = testFileStore.getAllOpenSessionIds();
339352
for (String sessionId : sessions) {
@@ -384,7 +397,8 @@ public void testFinalizeSessionAfterCrashOk() throws Exception {
384397
testSettingsProvider, Thread.currentThread(), new RuntimeException());
385398

386399
// This should not throw.
387-
controller.finalizeSessions(testSettingsProvider);
400+
commonWorker.submit(() -> controller.finalizeSessions(testSettingsProvider));
401+
commonWorker.await();
388402
}
389403

390404
@SdkSuppress(minSdkVersion = 30) // ApplicationExitInfo
@@ -535,7 +549,7 @@ public void testUploadDisabledThenEnabled() throws Exception {
535549
}
536550

537551
@SdkSuppress(minSdkVersion = 30) // ApplicationExitInfo
538-
public void testFatalEvent_sendsAppExceptionEvent() {
552+
public void testFatalEvent_sendsAppExceptionEvent() throws Exception {
539553
final String sessionId = "sessionId";
540554
final LogFileManager logFileManager = new LogFileManager(testFileStore);
541555
final AnalyticsEventLogger mockFirebaseAnalyticsLogger = mock(AnalyticsEventLogger.class);
@@ -548,10 +562,14 @@ public void testFatalEvent_sendsAppExceptionEvent() {
548562
when(mockSessionReportingCoordinator.listSortedOpenSessionIds())
549563
.thenReturn(new TreeSet<>(Collections.singleton(sessionId)));
550564

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();
555573

556574
assertFirebaseAnalyticsCrashEvent(mockFirebaseAnalyticsLogger);
557575
}

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@
2727
import com.google.android.gms.tasks.Tasks;
2828
import com.google.firebase.FirebaseApp;
2929
import com.google.firebase.FirebaseOptions;
30+
import com.google.firebase.concurrent.TestOnlyExecutors;
3031
import com.google.firebase.crashlytics.internal.CrashlyticsNativeComponent;
3132
import com.google.firebase.crashlytics.internal.CrashlyticsNativeComponentDeferredProxy;
3233
import com.google.firebase.crashlytics.internal.CrashlyticsTestCase;
34+
import com.google.firebase.crashlytics.internal.CrashlyticsWorker;
3335
import com.google.firebase.crashlytics.internal.DevelopmentPlatformProvider;
3436
import com.google.firebase.crashlytics.internal.RemoteConfigDeferredProxy;
3537
import com.google.firebase.crashlytics.internal.analytics.UnavailableAnalyticsEventLogger;
@@ -44,7 +46,6 @@
4446
import java.io.IOException;
4547
import java.util.ArrayList;
4648
import java.util.List;
47-
import java.util.concurrent.ExecutorService;
4849

4950
public class CrashlyticsCoreInitializationTest extends CrashlyticsTestCase {
5051

@@ -89,8 +90,9 @@ private static final class CoreBuilder {
8990
private IdManager idManager;
9091
private CrashlyticsNativeComponent nativeComponent;
9192
private DataCollectionArbiter arbiter;
92-
private ExecutorService crashHandlerExecutor;
9393
private FileStore fileStore;
94+
private CrashlyticsWorker commonWorker;
95+
private CrashlyticsWorker diskWriteWorker;
9496

9597
public CoreBuilder(Context context, FirebaseOptions firebaseOptions) {
9698
app = mock(FirebaseApp.class);
@@ -119,7 +121,8 @@ public void whenAvailable(
119121
arbiter = mock(DataCollectionArbiter.class);
120122
when(arbiter.isAutomaticDataCollectionEnabled()).thenReturn(true);
121123

122-
crashHandlerExecutor = new SameThreadExecutorService();
124+
commonWorker = new CrashlyticsWorker(TestOnlyExecutors.background());
125+
diskWriteWorker = new CrashlyticsWorker(TestOnlyExecutors.background());
123126
fileStore = new FileStore(context);
124127
}
125128

@@ -142,9 +145,10 @@ public CrashlyticsCore build() {
142145
new DisabledBreadcrumbSource(),
143146
new UnavailableAnalyticsEventLogger(),
144147
fileStore,
145-
crashHandlerExecutor,
146148
mock(CrashlyticsAppQualitySessionsSubscriber.class),
147-
mock(RemoteConfigDeferredProxy.class));
149+
mock(RemoteConfigDeferredProxy.class),
150+
commonWorker,
151+
diskWriteWorker);
148152
}
149153
}
150154

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
import com.google.android.gms.tasks.Tasks;
2929
import com.google.firebase.FirebaseApp;
3030
import com.google.firebase.FirebaseOptions;
31+
import com.google.firebase.concurrent.TestOnlyExecutors;
3132
import com.google.firebase.crashlytics.BuildConfig;
3233
import com.google.firebase.crashlytics.internal.CrashlyticsNativeComponent;
3334
import com.google.firebase.crashlytics.internal.CrashlyticsNativeComponentDeferredProxy;
3435
import com.google.firebase.crashlytics.internal.CrashlyticsTestCase;
36+
import com.google.firebase.crashlytics.internal.CrashlyticsWorker;
3537
import com.google.firebase.crashlytics.internal.DevelopmentPlatformProvider;
3638
import com.google.firebase.crashlytics.internal.RemoteConfigDeferredProxy;
3739
import com.google.firebase.crashlytics.internal.analytics.UnavailableAnalyticsEventLogger;
@@ -427,9 +429,10 @@ CrashlyticsCore build(Context context) {
427429
breadcrumbSource,
428430
new UnavailableAnalyticsEventLogger(),
429431
new FileStore(context),
430-
new SameThreadExecutorService(),
431432
mock(CrashlyticsAppQualitySessionsSubscriber.class),
432-
mock(RemoteConfigDeferredProxy.class));
433+
mock(RemoteConfigDeferredProxy.class),
434+
new CrashlyticsWorker(TestOnlyExecutors.background()),
435+
new CrashlyticsWorker(TestOnlyExecutors.background()));
433436
return crashlyticsCore;
434437
}
435438
}

0 commit comments

Comments
 (0)