Skip to content

Commit 019d5d3

Browse files
Kai SongKai Song
authored andcommitted
add UTs to check fallback controlers' order
1 parent 7721a7c commit 019d5d3

File tree

3 files changed

+153
-19
lines changed

3 files changed

+153
-19
lines changed

IdentityCore/src/controllers/MSIDRequestControllerFactory.m

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,28 +183,28 @@ @implementation MSIDRequestControllerFactory
183183
}
184184
}
185185

186-
MSIDSilentController *localController = [[MSIDSilentController alloc] initWithRequestParameters:parameters
186+
MSIDSilentController *silentController = [[MSIDSilentController alloc] initWithRequestParameters:parameters
187187
forceRefresh:forceRefresh
188188
tokenRequestProvider:tokenRequestProvider
189189
fallbackInteractiveController:fallbackController
190190
error:error];
191-
if (!localController) return nil;
191+
if (!silentController) return nil;
192192

193193
switch (skipLocalRt) {
194194
case MSIDSilentControllerForceSkippingLocalRt:
195-
localController.skipLocalRt = YES;
195+
silentController.skipLocalRt = YES;
196196
break;
197197
case MSIDSilentControllerForceUsingLocalRt:
198-
localController.skipLocalRt = NO;
198+
silentController.skipLocalRt = NO;
199199
break;
200200
case MSIDSilentControllerUndefinedLocalRtUsage:
201-
if (fallbackController) localController.skipLocalRt = YES;
201+
if (fallbackController) silentController.skipLocalRt = YES;
202202
break;
203203
default:
204204
break;
205205
}
206206

207-
return localController;
207+
return silentController;
208208

209209
}
210210

IdentityCore/src/util/MSIDXpcSingleSignOnProvider.m

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ - (void)canPerformAuthorization:(NSURL *)url
7070

7171
@protocol MSIDXpcBrokerDispatcherProtocol <NSObject>
7272

73-
- (void)getBrokerInstanceEndpointWithRequestInfo:(NSDictionary <NSString *, id> * _Nullable)requestInfo
74-
reply:(void (^)(NSXPCListenerEndpoint * _Nullable listenerEndpoint, NSDictionary * _Nullable params, NSError * _Nullable error))reply;
73+
- (void)getBrokerInstanceEndpointWithReply:(void (^)(NSXPCListenerEndpoint * _Nullable listenerEndpoint, NSDictionary * _Nullable params, NSError * _Nullable error))reply;
7574
@end
7675

7776
typedef void (^NSXPCListenerEndpointCompletionBlock)(id<MSIDXpcBrokerInstanceProtocol> _Nullable xpcService, NSXPCConnection * _Nullable directConnection, NSError *error);
@@ -114,16 +113,6 @@ - (void)handleRequestParam:(NSDictionary *)requestParam
114113
[directConnection suspend];
115114
[directConnection invalidate];
116115

117-
// MSIDBrokerCryptoProvider *cryptoProvider = [[MSIDBrokerCryptoProvider alloc] initWithEncryptionKey:[NSData msidDataFromBase64UrlEncodedString:brokerKey]];
118-
// NSError *jsonResponseError = nil;
119-
// NSDictionary *jsonResponse = [cryptoProvider decryptBrokerResponse:replyParam correlationId:context.correlationId error:&jsonResponseError];
120-
// if (jsonResponseError)
121-
// {
122-
// MSID_LOG_WITH_CTX_PII(MSIDLogLevelError, nil, @"[Entra broker] CLIENT received operationResponse but failed to decrypt it with error: %@", jsonResponseError);
123-
// if (continueBlock) continueBlock(nil, callbackError);
124-
// return;
125-
// }
126-
127116
BOOL forceRunOnBackgroundQueue = [[replyParam objectForKey:MSID_BROKER_OPERATION_KEY] isEqualToString:@"refresh"];
128117
[self forceRunOnBackgroundQueue:forceRunOnBackgroundQueue dispatchBlock:^{
129118
if (callbackError)
@@ -153,6 +142,7 @@ - (void)handleRequestParam:(NSDictionary *)requestParam
153142

154143
+ (BOOL)canPerformRequest
155144
{
145+
// This will be upgraded in item: xxx
156146
// Synchronously entering this class method
157147
@synchronized (self) {
158148
dispatch_group_t group = dispatch_group_create();
@@ -301,7 +291,7 @@ - (void)getXpcService:(NSXPCListenerEndpointCompletionBlock)continueBlock
301291
if (continueBlock) continueBlock(nil, nil, xpcUnexpectedError);
302292
}];
303293

304-
[parentXpcService getBrokerInstanceEndpointWithRequestInfo:@{} reply:^(NSXPCListenerEndpoint * _Nullable listenerEndpoint, NSDictionary<NSString *, id> * _Nullable __unused params, NSError * _Nullable error) {
294+
[parentXpcService getBrokerInstanceEndpointWithReply:^(NSXPCListenerEndpoint * _Nullable listenerEndpoint, NSDictionary<NSString *, id> * _Nullable __unused params, NSError * _Nullable error) {
305295
[connection suspend];
306296
[connection invalidate];
307297
if (error)

IdentityCore/tests/MSIDRequestControllerFactoryTests.m

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,15 @@
3333
#import "MSIDSSOExtensionSilentTokenRequestController.h"
3434
#import "MSIDTestSwizzle.h"
3535
#import "MSIDRequestParameters+Broker.h"
36+
#if TARGET_OS_OSX
37+
#import "MSIDXpcSilentTokenRequestController.h"
38+
#endif
39+
40+
@interface MSIDBaseRequestController (Testing)
41+
42+
@property (nonatomic, readwrite) id<MSIDRequestControlling> fallbackController;
43+
44+
@end
3645

3746
@interface MSIDRequestControllerFactoryTests : XCTestCase
3847

@@ -189,6 +198,141 @@ - (void)testWhenUseLocalRt_isUnDefined_shouldSkip_whenFallBackController_isValid
189198
XCTAssertTrue([(MSIDSilentController *)controller skipLocalRt]);
190199
}
191200

201+
#if TARGET_OS_OSX
202+
- (void)testWhenSsoExtensionIsEnabled_andXPCIsEnabled_controllersOrder_areCorrect
203+
{
204+
MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc] initWithTestResponse:nil
205+
testError:nil
206+
testWebMSAuthResponse:nil];
207+
MSIDRequestParameters *parameters = [self requestParameters];
208+
parameters.enableXpcFlow = YES;
209+
parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES;
210+
211+
NSError *error;
212+
SEL selectorForMSIDSSOExtensionSilentTokenRequestController = NSSelectorFromString(@"canPerformRequest");
213+
[MSIDTestSwizzle classMethod:selectorForMSIDSSOExtensionSilentTokenRequestController
214+
class:[MSIDSSOExtensionSilentTokenRequestController class]
215+
block:(id)^(void)
216+
{
217+
return YES;
218+
}];
219+
220+
SEL selectorForMSIDXpcSilentTokenRequestController = NSSelectorFromString(@"canPerformRequest");
221+
[MSIDTestSwizzle classMethod:selectorForMSIDXpcSilentTokenRequestController
222+
class:[MSIDXpcSilentTokenRequestController class]
223+
block:(id)^(void)
224+
{
225+
return YES;
226+
}];
227+
228+
SEL selectorForMSIDRequestParameters = NSSelectorFromString(@"shouldUseBroker");
229+
[MSIDTestSwizzle instanceMethod:selectorForMSIDRequestParameters
230+
class:[MSIDRequestParameters class]
231+
block:(id)^(void)
232+
{
233+
return YES;
234+
}];
235+
236+
id<MSIDRequestControlling> controller = [MSIDRequestControllerFactory silentControllerForParameters:parameters
237+
forceRefresh:NO
238+
skipLocalRt:MSIDSilentControllerForceSkippingLocalRt
239+
tokenRequestProvider:provider
240+
error:&error];
241+
// 1. Start with local signin controller to read cached tokens
242+
if (![controller isMemberOfClass:MSIDSilentController.class])
243+
{
244+
XCTFail();
245+
}
246+
247+
XCTAssertTrue([(MSIDSilentController *)controller skipLocalRt]);
248+
XCTAssertFalse([(MSIDSilentController *)controller forceRefresh]);
249+
250+
MSIDBaseRequestController *baseController = (MSIDBaseRequestController *)controller;
251+
if (![baseController.fallbackController isMemberOfClass:MSIDSSOExtensionSilentTokenRequestController.class])
252+
{
253+
XCTFail();
254+
}
255+
256+
// 2. When local signin controller failed, use SsoExtension controller
257+
baseController = (MSIDSSOExtensionSilentTokenRequestController *)baseController.fallbackController;
258+
if (![baseController.fallbackController isMemberOfClass:MSIDXpcSilentTokenRequestController.class])
259+
{
260+
XCTFail();
261+
}
262+
263+
// 3. When SsoExtension controller failed, use Xpc Controller
264+
baseController = (MSIDXpcSilentTokenRequestController *)baseController.fallbackController;
265+
if (![baseController.fallbackController isMemberOfClass:MSIDSilentController.class])
266+
{
267+
XCTFail();
268+
}
269+
270+
// 4. When Xpc controller failed, use local signin controller to refresh
271+
baseController = (MSIDSilentController *)baseController.fallbackController;
272+
XCTAssertTrue([(MSIDSilentController *)baseController forceRefresh]);
273+
XCTAssertTrue([(MSIDSilentController *)baseController isLocalFallbackMode]);
274+
}
275+
#endif
276+
277+
- (void)testWhenSsoExtensionIsEnabled_andXPCIsDisabled_controllersOrder_areCorrect
278+
{
279+
MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc] initWithTestResponse:nil
280+
testError:nil
281+
testWebMSAuthResponse:nil];
282+
MSIDRequestParameters *parameters = [self requestParameters];
283+
parameters.allowUsingLocalCachedRtWhenSsoExtFailed = YES;
284+
285+
NSError *error;
286+
SEL selectorForMSIDSSOExtensionSilentTokenRequestController = NSSelectorFromString(@"canPerformRequest");
287+
[MSIDTestSwizzle classMethod:selectorForMSIDSSOExtensionSilentTokenRequestController
288+
class:[MSIDSSOExtensionSilentTokenRequestController class]
289+
block:(id)^(void)
290+
{
291+
return YES;
292+
}];
293+
294+
SEL selectorForMSIDRequestParameters = NSSelectorFromString(@"shouldUseBroker");
295+
[MSIDTestSwizzle instanceMethod:selectorForMSIDRequestParameters
296+
class:[MSIDRequestParameters class]
297+
block:(id)^(void)
298+
{
299+
return YES;
300+
}];
301+
302+
303+
id<MSIDRequestControlling> controller = [MSIDRequestControllerFactory silentControllerForParameters:parameters
304+
forceRefresh:NO
305+
skipLocalRt:MSIDSilentControllerForceSkippingLocalRt
306+
tokenRequestProvider:provider
307+
error:&error];
308+
// 1. Start with local signin controller to read cached tokens
309+
if (![controller isMemberOfClass:MSIDSilentController.class])
310+
{
311+
XCTFail();
312+
}
313+
314+
XCTAssertTrue([(MSIDSilentController *)controller skipLocalRt]);
315+
XCTAssertFalse([(MSIDSilentController *)controller forceRefresh]);
316+
317+
// 2. When local signin controller failed, use SsoExtension controller
318+
MSIDBaseRequestController *baseController = (MSIDBaseRequestController *)controller;
319+
if (![baseController.fallbackController isMemberOfClass:MSIDSSOExtensionSilentTokenRequestController.class])
320+
{
321+
XCTFail();
322+
}
323+
324+
// 3. When SsoExtension controller failed, use local signin controller to refresh
325+
baseController = (MSIDSSOExtensionSilentTokenRequestController *)baseController.fallbackController;
326+
if (![baseController.fallbackController isMemberOfClass:MSIDSilentController.class])
327+
{
328+
XCTFail();
329+
}
330+
331+
baseController = (MSIDSilentController *)baseController.fallbackController;
332+
XCTAssertTrue([(MSIDSilentController *)baseController forceRefresh]);
333+
XCTAssertTrue([(MSIDSilentController *)baseController isLocalFallbackMode]);
334+
}
335+
192336
- (void)testWhenUseLocalRt_isUnDefined_shouldNotSkip_whenFallBackController_isNotValid
193337
{
194338
MSIDTestTokenRequestProvider *provider = [[MSIDTestTokenRequestProvider alloc] initWithTestResponse:nil

0 commit comments

Comments
 (0)