@@ -198,14 +198,76 @@ - (void)testWhenUseLocalRt_isUnDefined_shouldSkip_whenFallBackController_isValid
198198 XCTAssertTrue ([(MSIDSilentController *)controller skipLocalRt ]);
199199}
200200
201+
201202#if TARGET_OS_OSX
202- - (void )testWhenSsoExtensionIsEnabled_andXPCIsEnabled_controllersOrder_areCorrect
203+ - (void )testWhenSsoExtensionIsEnabled_andXpcIsPartiallyEnabled_andSsoExtensionIsDisabled_controllersOrder_areCorrect
203204{
204205 MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc ] initWithTestResponse: nil
205206 testError: nil
206207 testWebMSAuthResponse: nil ];
207208 MSIDRequestParameters *parameters = [self requestParameters ];
208- parameters.enableXpcFlow = YES ;
209+ parameters.xpcMode = MSIDXpcModeBackup;
210+ parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES ;
211+
212+ NSError *error;
213+ SEL selectorForMSIDSSOExtensionSilentTokenRequestController = NSSelectorFromString (@" canPerformRequest" );
214+ [MSIDTestSwizzle classMethod: selectorForMSIDSSOExtensionSilentTokenRequestController
215+ class: [MSIDSSOExtensionSilentTokenRequestController class ]
216+ block: (id )^(void )
217+ {
218+ return NO ;
219+ }];
220+
221+ SEL selectorForMSIDXpcSilentTokenRequestController = NSSelectorFromString (@" canPerformRequest" );
222+ [MSIDTestSwizzle classMethod: selectorForMSIDXpcSilentTokenRequestController
223+ class: [MSIDXpcSilentTokenRequestController class ]
224+ block: (id )^(void )
225+ {
226+ return YES ;
227+ }];
228+
229+ SEL selectorForMSIDRequestParameters = NSSelectorFromString (@" shouldUseBroker" );
230+ [MSIDTestSwizzle instanceMethod: selectorForMSIDRequestParameters
231+ class: [MSIDRequestParameters class ]
232+ block: (id )^(void )
233+ {
234+ return YES ;
235+ }];
236+
237+ id <MSIDRequestControlling> controller = [MSIDRequestControllerFactory silentControllerForParameters: parameters
238+ forceRefresh: NO
239+ skipLocalRt: MSIDSilentControllerForceSkippingLocalRt
240+ tokenRequestProvider: provider
241+ error: &error];
242+ // 1. Start with local signin controller to read cached tokens
243+ if (![controller isMemberOfClass: MSIDSilentController.class])
244+ {
245+ XCTFail ();
246+ }
247+
248+ XCTAssertTrue ([(MSIDSilentController *)controller skipLocalRt ]);
249+ XCTAssertFalse ([(MSIDSilentController *)controller forceRefresh ]);
250+
251+ MSIDBaseRequestController *baseController = (MSIDBaseRequestController *)controller;
252+
253+ // 2. When SsoExtension controller disabled, use local signin controller to refresh. XPC is ignore as it is in XPC backup mode
254+ if (![baseController.fallbackController isMemberOfClass: MSIDSilentController.class])
255+ {
256+ XCTFail ();
257+ }
258+
259+ baseController = (MSIDSilentController *)baseController.fallbackController ;
260+ XCTAssertTrue ([(MSIDSilentController *)baseController forceRefresh ]);
261+ XCTAssertTrue ([(MSIDSilentController *)baseController isLocalFallbackMode ]);
262+ }
263+
264+ - (void )testWhenSsoExtensionIsEnabled_andXpcIsPartiallyEnabled_andSsoExtensionIsEnabled_controllersOrder_areCorrect
265+ {
266+ MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc ] initWithTestResponse: nil
267+ testError: nil
268+ testWebMSAuthResponse: nil ];
269+ MSIDRequestParameters *parameters = [self requestParameters ];
270+ parameters.xpcMode = MSIDXpcModeBackup;
209271 parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES ;
210272
211273 NSError *error;
@@ -272,9 +334,77 @@ - (void)testWhenSsoExtensionIsEnabled_andXPCIsEnabled_controllersOrder_areCorrec
272334 XCTAssertTrue ([(MSIDSilentController *)baseController forceRefresh ]);
273335 XCTAssertTrue ([(MSIDSilentController *)baseController isLocalFallbackMode ]);
274336}
337+
338+ - (void )testWhenSsoExtensionIsEnabled_andXpcIsFullyEnabled_andSsoExtensionIsDisabled_controllersOrder_areCorrect
339+ {
340+ MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc ] initWithTestResponse: nil
341+ testError: nil
342+ testWebMSAuthResponse: nil ];
343+ MSIDRequestParameters *parameters = [self requestParameters ];
344+ parameters.xpcMode = MSIDXpcModeFull;
345+ parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES ;
346+
347+ NSError *error;
348+ SEL selectorForMSIDSSOExtensionSilentTokenRequestController = NSSelectorFromString (@" canPerformRequest" );
349+ [MSIDTestSwizzle classMethod: selectorForMSIDSSOExtensionSilentTokenRequestController
350+ class: [MSIDSSOExtensionSilentTokenRequestController class ]
351+ block: (id )^(void )
352+ {
353+ return NO ;
354+ }];
355+
356+ SEL selectorForMSIDXpcSilentTokenRequestController = NSSelectorFromString (@" canPerformRequest" );
357+ [MSIDTestSwizzle classMethod: selectorForMSIDXpcSilentTokenRequestController
358+ class: [MSIDXpcSilentTokenRequestController class ]
359+ block: (id )^(void )
360+ {
361+ return YES ;
362+ }];
363+
364+ SEL selectorForMSIDRequestParameters = NSSelectorFromString (@" shouldUseBroker" );
365+ [MSIDTestSwizzle instanceMethod: selectorForMSIDRequestParameters
366+ class: [MSIDRequestParameters class ]
367+ block: (id )^(void )
368+ {
369+ return YES ;
370+ }];
371+
372+ id <MSIDRequestControlling> controller = [MSIDRequestControllerFactory silentControllerForParameters: parameters
373+ forceRefresh: NO
374+ skipLocalRt: MSIDSilentControllerForceSkippingLocalRt
375+ tokenRequestProvider: provider
376+ error: &error];
377+ // 1. Start with local signin controller to read cached tokens
378+ if (![controller isMemberOfClass: MSIDSilentController.class])
379+ {
380+ XCTFail ();
381+ }
382+
383+ XCTAssertTrue ([(MSIDSilentController *)controller skipLocalRt ]);
384+ XCTAssertFalse ([(MSIDSilentController *)controller forceRefresh ]);
385+
386+ // 2. When local signin controller failed, use SsoExtension controller
387+ MSIDBaseRequestController *baseController = (MSIDBaseRequestController *)controller;
388+ if (![baseController.fallbackController isMemberOfClass: MSIDXpcSilentTokenRequestController.class])
389+ {
390+ XCTFail ();
391+ }
392+
393+ // 2. When SsoExtension controller failed, use Xpc Controller
394+ baseController = (MSIDXpcSilentTokenRequestController *)baseController.fallbackController ;
395+ if (![baseController.fallbackController isMemberOfClass: MSIDSilentController.class])
396+ {
397+ XCTFail ();
398+ }
399+
400+ // 3. When Xpc controller failed, use local signin controller to refresh
401+ baseController = (MSIDSilentController *)baseController.fallbackController ;
402+ XCTAssertTrue ([(MSIDSilentController *)baseController forceRefresh ]);
403+ XCTAssertTrue ([(MSIDSilentController *)baseController isLocalFallbackMode ]);
404+ }
275405#endif
276406
277- - (void )testWhenSsoExtensionIsEnabled_andXPCIsDisabled_controllersOrder_areCorrect
407+ - (void )testWhenSsoExtensionIsEnabled_andXpcIsDisabled_controllersOrder_areCorrect
278408{
279409 MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc ] initWithTestResponse: nil
280410 testError: nil
0 commit comments