|
38 | 38 | import com.google.firebase.crashlytics.internal.NativeSessionFileProvider; |
39 | 39 | import com.google.firebase.crashlytics.internal.analytics.AnalyticsEventLogger; |
40 | 40 | import com.google.firebase.crashlytics.internal.metadata.LogFileManager; |
| 41 | +import com.google.firebase.crashlytics.internal.metadata.UserMetadata; |
41 | 42 | import com.google.firebase.crashlytics.internal.model.CrashlyticsReport; |
42 | 43 | import com.google.firebase.crashlytics.internal.persistence.FileStore; |
43 | 44 | import com.google.firebase.crashlytics.internal.settings.Settings; |
|
52 | 53 | import java.util.TreeSet; |
53 | 54 | import java.util.concurrent.Executor; |
54 | 55 | import java.util.concurrent.TimeUnit; |
| 56 | +import org.junit.Test; |
55 | 57 | import org.mockito.ArgumentCaptor; |
56 | 58 |
|
57 | 59 | public class CrashlyticsControllerTest extends CrashlyticsTestCase { |
@@ -101,22 +103,33 @@ private class ControllerBuilder { |
101 | 103 | private CrashlyticsNativeComponent nativeComponent = null; |
102 | 104 | private AnalyticsEventLogger analyticsEventLogger; |
103 | 105 | private SessionReportingCoordinator sessionReportingCoordinator; |
| 106 | + |
| 107 | + private CrashlyticsBackgroundWorker backgroundWorker; |
104 | 108 | private LogFileManager logFileManager = null; |
105 | 109 |
|
| 110 | + private UserMetadata userMetadata = null; |
| 111 | + |
106 | 112 | ControllerBuilder() { |
107 | 113 | dataCollectionArbiter = mockDataCollectionArbiter; |
108 | 114 | nativeComponent = mockNativeComponent; |
109 | 115 |
|
110 | 116 | analyticsEventLogger = mock(AnalyticsEventLogger.class); |
111 | 117 |
|
112 | 118 | sessionReportingCoordinator = mockSessionReportingCoordinator; |
| 119 | + |
| 120 | + backgroundWorker = new CrashlyticsBackgroundWorker(new SameThreadExecutorService()); |
113 | 121 | } |
114 | 122 |
|
115 | 123 | ControllerBuilder setDataCollectionArbiter(DataCollectionArbiter arbiter) { |
116 | 124 | dataCollectionArbiter = arbiter; |
117 | 125 | return this; |
118 | 126 | } |
119 | 127 |
|
| 128 | + ControllerBuilder setUserMetadata(UserMetadata userMetadata) { |
| 129 | + this.userMetadata = userMetadata; |
| 130 | + return this; |
| 131 | + } |
| 132 | + |
120 | 133 | public ControllerBuilder setNativeComponent(CrashlyticsNativeComponent nativeComponent) { |
121 | 134 | this.nativeComponent = nativeComponent; |
122 | 135 | return this; |
@@ -153,13 +166,13 @@ public CrashlyticsController build() { |
153 | 166 | final CrashlyticsController controller = |
154 | 167 | new CrashlyticsController( |
155 | 168 | testContext.getApplicationContext(), |
156 | | - new CrashlyticsBackgroundWorker(new SameThreadExecutorService()), |
| 169 | + backgroundWorker, |
157 | 170 | idManager, |
158 | 171 | dataCollectionArbiter, |
159 | 172 | testFileStore, |
160 | 173 | crashMarker, |
161 | 174 | appData, |
162 | | - null, |
| 175 | + userMetadata, |
163 | 176 | logFileManager, |
164 | 177 | sessionReportingCoordinator, |
165 | 178 | nativeComponent, |
@@ -210,6 +223,26 @@ public void testFatalException_callsSessionReportingCoordinatorPersistFatal() th |
210 | 223 | .persistFatalEvent(eq(fatal), eq(thread), eq(sessionId), anyLong()); |
211 | 224 | } |
212 | 225 |
|
| 226 | + @Test |
| 227 | + public void testOnDemandFatal_call() { |
| 228 | + Thread thread = Thread.currentThread(); |
| 229 | + Exception fatal = new RuntimeException("Fatal"); |
| 230 | + Thread.UncaughtExceptionHandler exceptionHandler = mock(Thread.UncaughtExceptionHandler.class); |
| 231 | + UserMetadata mockUserMetadata = mock(UserMetadata.class); |
| 232 | + when(mockSessionReportingCoordinator.listSortedOpenSessionIds()) |
| 233 | + .thenReturn(new TreeSet<>(Collections.singleton(SESSION_ID)).descendingSet()); |
| 234 | + |
| 235 | + final CrashlyticsController controller = |
| 236 | + builder() |
| 237 | + .setLogFileManager(new LogFileManager(testFileStore)) |
| 238 | + .setUserMetadata(mockUserMetadata) |
| 239 | + .build(); |
| 240 | + controller.enableExceptionHandling(SESSION_ID, exceptionHandler, testSettingsProvider); |
| 241 | + controller.logFatalException(thread, fatal); |
| 242 | + |
| 243 | + verify(mockUserMetadata).setNewSession(any(String.class)); |
| 244 | + } |
| 245 | + |
213 | 246 | public void testNativeCrashDataCausesNativeReport() throws Exception { |
214 | 247 | final String sessionId = "sessionId_1_new"; |
215 | 248 | final String previousSessionId = "sessionId_0_previous"; |
|
0 commit comments