19
19
#import < OCMock/OCMock.h>
20
20
#import " FBLPromise+Testing.h"
21
21
22
+ #import " FirebaseAppCheck/Sources/Core/Errors/FIRAppCheckErrorUtil.h"
22
23
#import " FirebaseAppCheck/Sources/Core/FIRAppCheckToken+Internal.h"
23
24
#import " FirebaseAppCheck/Sources/DeviceCheckProvider/API/FIRDeviceCheckAPIService.h"
24
25
#import " FirebaseAppCheck/Sources/DeviceCheckProvider/FIRDeviceCheckTokenGenerator.h"
@@ -98,22 +99,25 @@ - (void)testInitWithIncompleteApp {
98
99
}
99
100
100
101
- (void )testGetTokenSuccess {
101
- // 1. Expect device token to be generated.
102
+ // 1. Expect FIRDeviceCheckTokenGenerator.isSupported.
103
+ OCMExpect ([self .fakeTokenGenerator isSupported ]).andReturn (YES );
104
+
105
+ // 2. Expect device token to be generated.
102
106
NSData *deviceToken = [NSData data ];
103
107
id generateTokenArg = [OCMArg invokeBlockWithArgs: deviceToken, [NSNull null ], nil ];
104
108
OCMExpect ([self .fakeTokenGenerator generateTokenWithCompletionHandler: generateTokenArg]);
105
109
106
- // 2 . Expect FAA token to be requested.
110
+ // 3 . Expect FAA token to be requested.
107
111
FIRAppCheckToken *validToken = [[FIRAppCheckToken alloc ] initWithToken: @" valid_token"
108
112
expirationDate: [NSDate distantFuture ]
109
113
receivedAtDate: [NSDate date ]];
110
114
OCMExpect ([self .fakeAPIService appCheckTokenWithDeviceToken: deviceToken])
111
115
.andReturn ([FBLPromise resolvedWith: validToken]);
112
116
113
- // 3 . Expect backoff wrapper to be used.
117
+ // 4 . Expect backoff wrapper to be used.
114
118
self.fakeBackoffWrapper .backoffExpectation = [self expectationWithDescription: @" Backoff" ];
115
119
116
- // 4 . Call getToken and validate the result.
120
+ // 5 . Call getToken and validate the result.
117
121
XCTestExpectation *completionExpectation =
118
122
[self expectationWithDescription: @" completionExpectation" ];
119
123
[self .provider
@@ -129,7 +133,7 @@ - (void)testGetTokenSuccess {
129
133
timeout: 0.5
130
134
enforceOrder: YES ];
131
135
132
- // 5 . Verify.
136
+ // 6 . Verify.
133
137
XCTAssertNil (self.fakeBackoffWrapper .operationError );
134
138
FIRAppCheckToken *wrapperResult =
135
139
[self .fakeBackoffWrapper.operationResult isKindOfClass: [FIRAppCheckToken class ]]
@@ -141,6 +145,52 @@ - (void)testGetTokenSuccess {
141
145
OCMVerifyAll (self.fakeTokenGenerator );
142
146
}
143
147
148
+ - (void )testGetTokenWhenDeviceCheckIsNotSupported {
149
+ NSError *expectedError =
150
+ [FIRAppCheckErrorUtil unsupportedAttestationProvider: @" DeviceCheckProvider" ];
151
+
152
+ // 0.1. Expect backoff wrapper to be used.
153
+ self.fakeBackoffWrapper .backoffExpectation = [self expectationWithDescription: @" Backoff" ];
154
+
155
+ // 0.2. Expect default error handler to be used.
156
+ XCTestExpectation *errorHandlerExpectation = [self expectationWithDescription: @" Error handler" ];
157
+ self.fakeBackoffWrapper .defaultErrorHandler = ^FIRAppCheckBackoffType (NSError *_Nonnull error) {
158
+ XCTAssertEqualObjects (error, expectedError);
159
+ [errorHandlerExpectation fulfill ];
160
+ return FIRAppCheckBackoffType1Day;
161
+ };
162
+
163
+ // 1. Expect FIRDeviceCheckTokenGenerator.isSupported.
164
+ OCMExpect ([self .fakeTokenGenerator isSupported ]).andReturn (NO );
165
+
166
+ // 2. Don't expect DeviceCheck token to be generated or FAA token to be requested.
167
+ OCMReject ([self .fakeTokenGenerator generateTokenWithCompletionHandler: OCMOCK_ANY]);
168
+ OCMReject ([self .fakeAPIService appCheckTokenWithDeviceToken: OCMOCK_ANY]);
169
+
170
+ // 3. Call getToken and validate the result.
171
+ XCTestExpectation *completionExpectation =
172
+ [self expectationWithDescription: @" completionExpectation" ];
173
+ [self .provider
174
+ getTokenWithCompletion: ^(FIRAppCheckToken *_Nullable token, NSError *_Nullable error) {
175
+ [completionExpectation fulfill ];
176
+ XCTAssertNil (token);
177
+ XCTAssertEqualObjects (error, expectedError);
178
+ }];
179
+
180
+ [self waitForExpectations: @[
181
+ self .fakeBackoffWrapper.backoffExpectation, errorHandlerExpectation, completionExpectation
182
+ ]
183
+ timeout: 0.5
184
+ enforceOrder: YES ];
185
+
186
+ // 4. Verify.
187
+ OCMVerifyAll (self.fakeAPIService );
188
+ OCMVerifyAll (self.fakeTokenGenerator );
189
+
190
+ XCTAssertEqualObjects (self.fakeBackoffWrapper .operationError , expectedError);
191
+ XCTAssertNil (self.fakeBackoffWrapper .operationResult );
192
+ }
193
+
144
194
- (void )testGetTokenWhenDeviceTokenFails {
145
195
NSError *deviceTokenError = [NSError errorWithDomain: @" FIRDeviceCheckProviderTests"
146
196
code: -1
@@ -157,14 +207,17 @@ - (void)testGetTokenWhenDeviceTokenFails {
157
207
return FIRAppCheckBackoffType1Day;
158
208
};
159
209
160
- // 1. Expect device token to be generated.
210
+ // 1. Expect FIRDeviceCheckTokenGenerator.isSupported.
211
+ OCMExpect ([self .fakeTokenGenerator isSupported ]).andReturn (YES );
212
+
213
+ // 2. Expect device token to be generated.
161
214
id generateTokenArg = [OCMArg invokeBlockWithArgs: [NSNull null ], deviceTokenError, nil ];
162
215
OCMExpect ([self .fakeTokenGenerator generateTokenWithCompletionHandler: generateTokenArg]);
163
216
164
- // 2 . Don't expect FAA token to be requested.
217
+ // 3 . Don't expect FAA token to be requested.
165
218
OCMReject ([self .fakeAPIService appCheckTokenWithDeviceToken: [OCMArg any ]]);
166
219
167
- // 3 . Call getToken and validate the result.
220
+ // 4 . Call getToken and validate the result.
168
221
XCTestExpectation *completionExpectation =
169
222
[self expectationWithDescription: @" completionExpectation" ];
170
223
[self .provider
@@ -180,7 +233,7 @@ - (void)testGetTokenWhenDeviceTokenFails {
180
233
timeout: 0.5
181
234
enforceOrder: YES ];
182
235
183
- // 4 . Verify.
236
+ // 5 . Verify.
184
237
OCMVerifyAll (self.fakeAPIService );
185
238
OCMVerifyAll (self.fakeTokenGenerator );
186
239
@@ -204,18 +257,21 @@ - (void)testGetTokenWhenAPIServiceFails {
204
257
return FIRAppCheckBackoffType1Day;
205
258
};
206
259
207
- // 1. Expect device token to be generated.
260
+ // 1. Expect FIRDeviceCheckTokenGenerator.isSupported.
261
+ OCMExpect ([self .fakeTokenGenerator isSupported ]).andReturn (YES );
262
+
263
+ // 2. Expect device token to be generated.
208
264
NSData *deviceToken = [NSData data ];
209
265
id generateTokenArg = [OCMArg invokeBlockWithArgs: deviceToken, [NSNull null ], nil ];
210
266
OCMExpect ([self .fakeTokenGenerator generateTokenWithCompletionHandler: generateTokenArg]);
211
267
212
- // 2 . Expect FAA token to be requested.
268
+ // 3 . Expect FAA token to be requested.
213
269
FBLPromise *rejectedPromise = [FBLPromise pendingPromise ];
214
270
[rejectedPromise reject: APIServiceError];
215
271
OCMExpect ([self .fakeAPIService appCheckTokenWithDeviceToken: deviceToken])
216
272
.andReturn (rejectedPromise);
217
273
218
- // 3 . Call getToken and validate the result.
274
+ // 4 . Call getToken and validate the result.
219
275
XCTestExpectation *completionExpectation =
220
276
[self expectationWithDescription: @" completionExpectation" ];
221
277
[self .provider
@@ -231,7 +287,7 @@ - (void)testGetTokenWhenAPIServiceFails {
231
287
timeout: 0.5
232
288
enforceOrder: YES ];
233
289
234
- // 4 . Verify.
290
+ // 5 . Verify.
235
291
OCMVerifyAll (self.fakeAPIService );
236
292
OCMVerifyAll (self.fakeTokenGenerator );
237
293
0 commit comments