16
16
17
17
import static com .google .common .truth .Truth .assertThat ;
18
18
import static com .google .firebase .appdistribution .FirebaseAppDistributionException .Status .AUTHENTICATION_CANCELED ;
19
+ import static com .google .firebase .appdistribution .FirebaseAppDistributionException .Status .UNKNOWN ;
19
20
import static com .google .firebase .appdistribution .impl .TestUtils .assertTaskFailure ;
20
21
import static com .google .firebase .appdistribution .impl .TestUtils .awaitAsyncOperations ;
21
22
import static com .google .firebase .appdistribution .impl .TestUtils .awaitTask ;
22
23
import static com .google .firebase .appdistribution .impl .TestUtils .awaitTaskFailure ;
23
24
import static org .junit .Assert .assertTrue ;
24
25
import static org .mockito .ArgumentMatchers .any ;
26
+ import static org .mockito .ArgumentMatchers .anyBoolean ;
27
+ import static org .mockito .Mockito .spy ;
25
28
import static org .mockito .Mockito .times ;
26
29
import static org .mockito .Mockito .verify ;
27
30
import static org .mockito .Mockito .verifyNoInteractions ;
41
44
import com .google .android .gms .tasks .Tasks ;
42
45
import com .google .firebase .FirebaseApp ;
43
46
import com .google .firebase .FirebaseOptions ;
47
+ import com .google .firebase .annotations .concurrent .Background ;
48
+ import com .google .firebase .annotations .concurrent .Blocking ;
44
49
import com .google .firebase .appdistribution .FirebaseAppDistributionException ;
45
50
import com .google .firebase .appdistribution .FirebaseAppDistributionException .Status ;
46
51
import com .google .firebase .appdistribution .impl .FirebaseAppDistributionServiceImplTest .TestActivity ;
@@ -83,12 +88,13 @@ public class TesterSignInManagerTest {
83
88
private TestActivity activity ;
84
89
private ShadowActivity shadowActivity ;
85
90
private ShadowPackageManager shadowPackageManager ;
86
- private ExecutorService blockingExecutor ;
91
+ @ Blocking private ExecutorService blockingExecutor = TestOnlyExecutors .blocking ();
92
+ @ Background private ExecutorService backgroundExecutor = TestOnlyExecutors .background ();
93
+ private SignInStorage signInStorage ;
87
94
88
95
@ Mock private Provider <FirebaseInstallationsApi > mockFirebaseInstallationsProvider ;
89
96
@ Mock private FirebaseInstallationsApi mockFirebaseInstallations ;
90
97
@ Mock private InstallationTokenResult mockInstallationTokenResult ;
91
- @ Mock private SignInStorage mockSignInStorage ;
92
98
@ Mock private FirebaseAppDistributionLifecycleNotifier mockLifecycleNotifier ;
93
99
@ Mock private SignInResultActivity mockSignInResultActivity ;
94
100
@@ -114,7 +120,8 @@ public void setUp() {
114
120
115
121
when (mockInstallationTokenResult .getToken ()).thenReturn (TEST_AUTH_TOKEN );
116
122
117
- when (mockSignInStorage .getSignInStatus ()).thenReturn (Tasks .forResult (false ));
123
+ signInStorage =
124
+ spy (new SignInStorage (ApplicationProvider .getApplicationContext (), backgroundExecutor ));
118
125
119
126
shadowPackageManager =
120
127
shadowOf (ApplicationProvider .getApplicationContext ().getPackageManager ());
@@ -137,21 +144,19 @@ public void setUp() {
137
144
shadowActivity = shadowOf (activity );
138
145
TestUtils .mockForegroundActivity (mockLifecycleNotifier , activity );
139
146
140
- blockingExecutor = TestOnlyExecutors .blocking ();
141
-
142
147
testerSignInManager =
143
148
new TesterSignInManager (
144
149
firebaseApp ,
145
150
mockFirebaseInstallationsProvider ,
146
- mockSignInStorage ,
151
+ signInStorage ,
147
152
mockLifecycleNotifier ,
148
153
blockingExecutor );
149
154
}
150
155
151
156
@ Test
152
157
public void signInTester_alreadySignedIn_doesNothing ()
153
158
throws FirebaseAppDistributionException , ExecutionException , InterruptedException {
154
- when ( mockSignInStorage . getSignInStatus ()). thenReturn ( Tasks . forResult (true ));
159
+ TestUtils . awaitTask ( signInStorage . setSignInStatus (true ));
155
160
156
161
Task signInTask = testerSignInManager .signInTester ();
157
162
awaitTask (signInTask );
@@ -181,7 +186,7 @@ public void signInTester_whenUnexpectedFailureInTask_failsWithUnknownError() {
181
186
182
187
Task signInTask = testerSignInManager .signInTester ();
183
188
184
- awaitTaskFailure (signInTask , Status . UNKNOWN , "Unknown" , unexpectedException );
189
+ awaitTaskFailure (signInTask , UNKNOWN , "Unknown" , unexpectedException );
185
190
}
186
191
187
192
@ Test
@@ -193,6 +198,7 @@ public void signInTester_whenChromeAvailable_opensCustomTab() throws Interrupted
193
198
shadowPackageManager .addResolveInfoForIntent (customTabIntent , resolveInfo );
194
199
195
200
testerSignInManager .signInTester ();
201
+ awaitAsyncOperations (backgroundExecutor );
196
202
awaitAsyncOperations (blockingExecutor );
197
203
198
204
verify (mockFirebaseInstallations , times (1 )).getId ();
@@ -207,6 +213,7 @@ public void signInTester_whenChromeNotAvailable_opensBrowserIntent() throws Inte
207
213
shadowPackageManager .addResolveInfoForIntent (browserIntent , resolveInfo );
208
214
209
215
testerSignInManager .signInTester ();
216
+ awaitAsyncOperations (backgroundExecutor );
210
217
awaitAsyncOperations (blockingExecutor );
211
218
212
219
verify (mockFirebaseInstallations , times (1 )).getId ();
@@ -219,6 +226,7 @@ public void signInTester_whenSignInCalledMultipleTimes_secondCallHasNoEffect()
219
226
testerSignInManager .signInTester ();
220
227
testerSignInManager .signInTester ();
221
228
229
+ awaitAsyncOperations (backgroundExecutor );
222
230
awaitAsyncOperations (blockingExecutor );
223
231
224
232
verify (mockFirebaseInstallationsProvider , times (1 )).get ();
@@ -228,18 +236,37 @@ public void signInTester_whenSignInCalledMultipleTimes_secondCallHasNoEffect()
228
236
public void signInTester_whenReturnFromSignIn_taskSucceeds ()
229
237
throws InterruptedException , FirebaseAppDistributionException , ExecutionException {
230
238
Task signInTask = testerSignInManager .signInTester ();
239
+ awaitAsyncOperations (backgroundExecutor );
240
+ awaitAsyncOperations (blockingExecutor );
231
241
232
242
// Simulate re-entering app after successful sign in, via SignInResultActivity
233
243
testerSignInManager .onActivityCreated (mockSignInResultActivity );
234
244
awaitTask (signInTask );
235
245
236
246
assertTrue (signInTask .isSuccessful ());
237
- verify (mockSignInStorage ).setSignInStatus (true );
247
+ assertThat (signInStorage .getSignInStatusBlocking ()).isTrue ();
248
+ }
249
+
250
+ @ Test
251
+ public void signInTester_whenStorageFailsToRecordSignInStatus_taskFails ()
252
+ throws InterruptedException {
253
+ Exception expectedException = new RuntimeException ("Error" );
254
+ when (signInStorage .setSignInStatus (anyBoolean ()))
255
+ .thenReturn (Tasks .forException (expectedException ));
256
+ Task signInTask = testerSignInManager .signInTester ();
257
+ awaitAsyncOperations (backgroundExecutor );
258
+ awaitAsyncOperations (blockingExecutor );
259
+
260
+ // Simulate re-entering app after successful sign in, via SignInResultActivity
261
+ testerSignInManager .onActivityCreated (mockSignInResultActivity );
262
+
263
+ awaitTaskFailure (signInTask , UNKNOWN , "Error storing tester sign in state" , expectedException );
238
264
}
239
265
240
266
@ Test
241
267
public void signInTester_whenAppReenteredDuringSignIn_taskFails () throws InterruptedException {
242
268
Task signInTask = testerSignInManager .signInTester ();
269
+ awaitAsyncOperations (backgroundExecutor );
243
270
awaitAsyncOperations (blockingExecutor );
244
271
245
272
// Simulate re-entering app before completing sign in
0 commit comments