44
55@import LocalAuthentication;
66@import XCTest;
7+ @import local_auth_ios;
78
89#import < OCMock/OCMock.h>
910
10- #if __has_include(<local_auth/FLTLocalAuthPlugin.h>)
11- #import < local_auth/FLTLocalAuthPlugin.h>
12- #else
13- @import local_auth_ios;
14- #endif
11+ // Set a long timeout to avoid flake due to slow CI.
12+ static const NSTimeInterval kTimeout = 30.0 ;
1513
16- // Private API needed for tests.
17- @interface FLTLocalAuthPlugin (Test)
18- - (void )setAuthContextOverrides : (NSArray <LAContext *> *)authContexts ;
14+ /* *
15+ * A context factory that returns preset contexts.
16+ */
17+ @interface StubAuthContextFactory : NSObject <FLAAuthContextFactory>
18+ @property (copy , nonatomic ) NSMutableArray *contexts;
19+ - (instancetype )initWithContexts : (NSArray *)contexts ;
1920@end
2021
21- // Set a long timeout to avoid flake due to slow CI.
22- static const NSTimeInterval kTimeout = 30.0 ;
22+ @implementation StubAuthContextFactory
23+
24+ - (instancetype )initWithContexts : (NSArray *)contexts {
25+ self = [super init ];
26+ if (self) {
27+ _contexts = [contexts mutableCopy ];
28+ }
29+ return self;
30+ }
31+
32+ - (LAContext *)createAuthContext {
33+ NSAssert (self.contexts.count > 0 , @" Insufficient test contexts provided" );
34+ LAContext *context = [self .contexts firstObject ];
35+ [self .contexts removeObjectAtIndex: 0 ];
36+ return context;
37+ }
38+
39+ @end
40+
41+ #pragma mark -
2342
2443@interface FLTLocalAuthPluginTests : XCTestCase
2544@end
@@ -31,9 +50,10 @@ - (void)setUp {
3150}
3251
3352- (void )testSuccessfullAuthWithBiometrics {
34- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
3553 id mockAuthContext = OCMClassMock ([LAContext class ]);
36- plugin.authContextOverrides = @[ mockAuthContext ];
54+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
55+ initWithContextFactory: [[StubAuthContextFactory alloc ]
56+ initWithContexts: @[ mockAuthContext ]]];
3757
3858 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
3959 NSString *reason = @" a reason" ;
@@ -70,9 +90,10 @@ - (void)testSuccessfullAuthWithBiometrics {
7090}
7191
7292- (void )testSuccessfullAuthWithoutBiometrics {
73- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
7493 id mockAuthContext = OCMClassMock ([LAContext class ]);
75- plugin.authContextOverrides = @[ mockAuthContext ];
94+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
95+ initWithContextFactory: [[StubAuthContextFactory alloc ]
96+ initWithContexts: @[ mockAuthContext ]]];
7697
7798 const LAPolicy policy = LAPolicyDeviceOwnerAuthentication;
7899 NSString *reason = @" a reason" ;
@@ -109,9 +130,10 @@ - (void)testSuccessfullAuthWithoutBiometrics {
109130}
110131
111132- (void )testFailedAuthWithBiometrics {
112- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
113133 id mockAuthContext = OCMClassMock ([LAContext class ]);
114- plugin.authContextOverrides = @[ mockAuthContext ];
134+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
135+ initWithContextFactory: [[StubAuthContextFactory alloc ]
136+ initWithContexts: @[ mockAuthContext ]]];
115137
116138 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
117139 NSString *reason = @" a reason" ;
@@ -147,9 +169,10 @@ - (void)testFailedAuthWithBiometrics {
147169}
148170
149171- (void )testFailedWithUnknownErrorCode {
150- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
151172 id mockAuthContext = OCMClassMock ([LAContext class ]);
152- plugin.authContextOverrides = @[ mockAuthContext ];
173+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
174+ initWithContextFactory: [[StubAuthContextFactory alloc ]
175+ initWithContexts: @[ mockAuthContext ]]];
153176
154177 const LAPolicy policy = LAPolicyDeviceOwnerAuthentication;
155178 NSString *reason = @" a reason" ;
@@ -185,9 +208,10 @@ - (void)testFailedWithUnknownErrorCode {
185208}
186209
187210- (void )testSystemCancelledWithoutStickyAuth {
188- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
189211 id mockAuthContext = OCMClassMock ([LAContext class ]);
190- plugin.authContextOverrides = @[ mockAuthContext ];
212+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
213+ initWithContextFactory: [[StubAuthContextFactory alloc ]
214+ initWithContexts: @[ mockAuthContext ]]];
191215
192216 const LAPolicy policy = LAPolicyDeviceOwnerAuthentication;
193217 NSString *reason = @" a reason" ;
@@ -225,9 +249,10 @@ - (void)testSystemCancelledWithoutStickyAuth {
225249}
226250
227251- (void )testFailedAuthWithoutBiometrics {
228- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
229252 id mockAuthContext = OCMClassMock ([LAContext class ]);
230- plugin.authContextOverrides = @[ mockAuthContext ];
253+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
254+ initWithContextFactory: [[StubAuthContextFactory alloc ]
255+ initWithContexts: @[ mockAuthContext ]]];
231256
232257 const LAPolicy policy = LAPolicyDeviceOwnerAuthentication;
233258 NSString *reason = @" a reason" ;
@@ -263,9 +288,10 @@ - (void)testFailedAuthWithoutBiometrics {
263288}
264289
265290- (void )testLocalizedFallbackTitle {
266- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
267291 id mockAuthContext = OCMClassMock ([LAContext class ]);
268- plugin.authContextOverrides = @[ mockAuthContext ];
292+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
293+ initWithContextFactory: [[StubAuthContextFactory alloc ]
294+ initWithContexts: @[ mockAuthContext ]]];
269295
270296 const LAPolicy policy = LAPolicyDeviceOwnerAuthentication;
271297 NSString *reason = @" a reason" ;
@@ -303,9 +329,10 @@ - (void)testLocalizedFallbackTitle {
303329}
304330
305331- (void )testSkippedLocalizedFallbackTitle {
306- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
307332 id mockAuthContext = OCMClassMock ([LAContext class ]);
308- plugin.authContextOverrides = @[ mockAuthContext ];
333+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
334+ initWithContextFactory: [[StubAuthContextFactory alloc ]
335+ initWithContexts: @[ mockAuthContext ]]];
309336
310337 const LAPolicy policy = LAPolicyDeviceOwnerAuthentication;
311338 NSString *reason = @" a reason" ;
@@ -340,9 +367,10 @@ - (void)testSkippedLocalizedFallbackTitle {
340367}
341368
342369- (void )testDeviceSupportsBiometrics_withEnrolledHardware {
343- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
344370 id mockAuthContext = OCMClassMock ([LAContext class ]);
345- plugin.authContextOverrides = @[ mockAuthContext ];
371+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
372+ initWithContextFactory: [[StubAuthContextFactory alloc ]
373+ initWithContexts: @[ mockAuthContext ]]];
346374
347375 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
348376 OCMStub ([mockAuthContext canEvaluatePolicy: policy error: [OCMArg setTo: nil ]]).andReturn (YES );
@@ -362,9 +390,10 @@ - (void)testDeviceSupportsBiometrics_withEnrolledHardware {
362390}
363391
364392- (void )testDeviceSupportsBiometrics_withNonEnrolledHardware {
365- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
366393 id mockAuthContext = OCMClassMock ([LAContext class ]);
367- plugin.authContextOverrides = @[ mockAuthContext ];
394+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
395+ initWithContextFactory: [[StubAuthContextFactory alloc ]
396+ initWithContexts: @[ mockAuthContext ]]];
368397
369398 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
370399 void (^canEvaluatePolicyHandler)(NSInvocation *) = ^(NSInvocation *invocation) {
@@ -396,9 +425,10 @@ - (void)testDeviceSupportsBiometrics_withNonEnrolledHardware {
396425}
397426
398427- (void )testDeviceSupportsBiometrics_withNoBiometricHardware {
399- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
400428 id mockAuthContext = OCMClassMock ([LAContext class ]);
401- plugin.authContextOverrides = @[ mockAuthContext ];
429+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
430+ initWithContextFactory: [[StubAuthContextFactory alloc ]
431+ initWithContexts: @[ mockAuthContext ]]];
402432
403433 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
404434 void (^canEvaluatePolicyHandler)(NSInvocation *) = ^(NSInvocation *invocation) {
@@ -430,9 +460,10 @@ - (void)testDeviceSupportsBiometrics_withNoBiometricHardware {
430460}
431461
432462- (void )testGetEnrolledBiometrics_withFaceID {
433- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
434463 id mockAuthContext = OCMClassMock ([LAContext class ]);
435- plugin.authContextOverrides = @[ mockAuthContext ];
464+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
465+ initWithContextFactory: [[StubAuthContextFactory alloc ]
466+ initWithContexts: @[ mockAuthContext ]]];
436467
437468 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
438469 OCMStub ([mockAuthContext canEvaluatePolicy: policy error: [OCMArg setTo: nil ]]).andReturn (YES );
@@ -454,9 +485,10 @@ - (void)testGetEnrolledBiometrics_withFaceID {
454485}
455486
456487- (void )testGetEnrolledBiometrics_withTouchID {
457- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
458488 id mockAuthContext = OCMClassMock ([LAContext class ]);
459- plugin.authContextOverrides = @[ mockAuthContext ];
489+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
490+ initWithContextFactory: [[StubAuthContextFactory alloc ]
491+ initWithContexts: @[ mockAuthContext ]]];
460492
461493 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
462494 OCMStub ([mockAuthContext canEvaluatePolicy: policy error: [OCMArg setTo: nil ]]).andReturn (YES );
@@ -478,9 +510,10 @@ - (void)testGetEnrolledBiometrics_withTouchID {
478510}
479511
480512- (void )testGetEnrolledBiometrics_withoutEnrolledHardware {
481- FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ] init ];
482513 id mockAuthContext = OCMClassMock ([LAContext class ]);
483- plugin.authContextOverrides = @[ mockAuthContext ];
514+ FLTLocalAuthPlugin *plugin = [[FLTLocalAuthPlugin alloc ]
515+ initWithContextFactory: [[StubAuthContextFactory alloc ]
516+ initWithContexts: @[ mockAuthContext ]]];
484517
485518 const LAPolicy policy = LAPolicyDeviceOwnerAuthenticationWithBiometrics;
486519 void (^canEvaluatePolicyHandler)(NSInvocation *) = ^(NSInvocation *invocation) {
0 commit comments