|
@@ -93,8 +93,6 @@ static NSString * const kDotReversedClientId = @"FakeClientID";
|
|
|
static NSString * const kClientId2 = @"FakeClientID2";
|
|
static NSString * const kClientId2 = @"FakeClientID2";
|
|
|
static NSString * const kServerClientId = @"FakeServerClientID";
|
|
static NSString * const kServerClientId = @"FakeServerClientID";
|
|
|
static NSString * const kLanguage = @"FakeLanguage";
|
|
static NSString * const kLanguage = @"FakeLanguage";
|
|
|
-static NSString * const kScope = @"FakeScope";
|
|
|
|
|
-static NSString * const kScope2 = @"FakeScope2";
|
|
|
|
|
static NSString * const kAuthCode = @"FakeAuthCode";
|
|
static NSString * const kAuthCode = @"FakeAuthCode";
|
|
|
static NSString * const kKeychainName = @"auth";
|
|
static NSString * const kKeychainName = @"auth";
|
|
|
static NSString * const kUserEmail = @"FakeUserEmail";
|
|
static NSString * const kUserEmail = @"FakeUserEmail";
|
|
@@ -135,13 +133,6 @@ static NSString * const kAppName = @"UnitTests";
|
|
|
static NSString * const kUserIDKey = @"userID";
|
|
static NSString * const kUserIDKey = @"userID";
|
|
|
static NSString * const kHostedDomainKey = @"hostedDomain";
|
|
static NSString * const kHostedDomainKey = @"hostedDomain";
|
|
|
static NSString * const kIDTokenExpirationKey = @"idTokenExp";
|
|
static NSString * const kIDTokenExpirationKey = @"idTokenExp";
|
|
|
-static NSString * const kScopeKey = @"scope";
|
|
|
|
|
-
|
|
|
|
|
-// Basic profile (Fat ID Token / userinfo endpoint) keys
|
|
|
|
|
-static NSString *const kBasicProfilePictureKey = @"picture";
|
|
|
|
|
-static NSString *const kBasicProfileNameKey = @"name";
|
|
|
|
|
-static NSString *const kBasicProfileGivenNameKey = @"given_name";
|
|
|
|
|
-static NSString *const kBasicProfileFamilyNameKey = @"family_name";
|
|
|
|
|
|
|
|
|
|
static NSString * const kCustomKeychainName = @"CUSTOM_KEYCHAIN_NAME";
|
|
static NSString * const kCustomKeychainName = @"CUSTOM_KEYCHAIN_NAME";
|
|
|
static NSString * const kAddActivity = @"http://schemas.google.com/AddActivity";
|
|
static NSString * const kAddActivity = @"http://schemas.google.com/AddActivity";
|
|
@@ -154,9 +145,6 @@ static NSString *const kTokenURL = @"https://oauth2.googleapis.com/token";
|
|
|
|
|
|
|
|
static NSString *const kFakeURL = @"http://foo.com";
|
|
static NSString *const kFakeURL = @"http://foo.com";
|
|
|
|
|
|
|
|
-static NSString *const kEMMSupport = @"1";
|
|
|
|
|
-
|
|
|
|
|
-static NSString *const kGrantedScope = @"grantedScope";
|
|
|
|
|
static NSString *const kNewScope = @"newScope";
|
|
static NSString *const kNewScope = @"newScope";
|
|
|
|
|
|
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
@@ -243,9 +231,6 @@ static NSString *const kNewScope = @"newScope";
|
|
|
// The completion to be used when testing `GIDSignIn`.
|
|
// The completion to be used when testing `GIDSignIn`.
|
|
|
GIDSignInCompletion _completion;
|
|
GIDSignInCompletion _completion;
|
|
|
|
|
|
|
|
- // The saved authorization request.
|
|
|
|
|
- OIDAuthorizationRequest *_savedAuthorizationRequest;
|
|
|
|
|
-
|
|
|
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
// The saved presentingViewController from the authorization request.
|
|
// The saved presentingViewController from the authorization request.
|
|
|
UIViewController *_savedPresentingViewController;
|
|
UIViewController *_savedPresentingViewController;
|
|
@@ -295,11 +280,11 @@ static NSString *const kNewScope = @"newScope";
|
|
|
_user = OCMStrictClassMock([GIDGoogleUser class]);
|
|
_user = OCMStrictClassMock([GIDGoogleUser class]);
|
|
|
_oidAuthorizationService = OCMStrictClassMock([OIDAuthorizationService class]);
|
|
_oidAuthorizationService = OCMStrictClassMock([OIDAuthorizationService class]);
|
|
|
OCMStub([_oidAuthorizationService
|
|
OCMStub([_oidAuthorizationService
|
|
|
- presentAuthorizationRequest:SAVE_TO_ARG_BLOCK(self->_savedAuthorizationRequest)
|
|
|
|
|
|
|
+ presentAuthorizationRequest:OCMOCK_ANY
|
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
- presentingViewController:SAVE_TO_ARG_BLOCK(self->_savedPresentingViewController)
|
|
|
|
|
|
|
+ presentingViewController:SAVE_TO_ARG_BLOCK(self->_savedPresentingViewController)
|
|
|
#elif TARGET_OS_OSX
|
|
#elif TARGET_OS_OSX
|
|
|
- presentingWindow:SAVE_TO_ARG_BLOCK(self->_savedPresentingWindow)
|
|
|
|
|
|
|
+ presentingWindow:SAVE_TO_ARG_BLOCK(self->_savedPresentingWindow)
|
|
|
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
callback:COPY_TO_ARG_BLOCK(self->_savedAuthorizationCallback)]);
|
|
callback:COPY_TO_ARG_BLOCK(self->_savedAuthorizationCallback)]);
|
|
|
OCMStub([self->_oidAuthorizationService
|
|
OCMStub([self->_oidAuthorizationService
|
|
@@ -527,108 +512,6 @@ static NSString *const kNewScope = @"newScope";
|
|
|
modalCancel:NO];
|
|
modalCancel:NO];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-- (void)testOAuthLogin_AdditionalScopes {
|
|
|
|
|
- NSString *expectedScopeString;
|
|
|
|
|
-
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:NO
|
|
|
|
|
- authError:nil
|
|
|
|
|
- tokenError:nil
|
|
|
|
|
- emmPasscodeInfoRequired:NO
|
|
|
|
|
- keychainError:NO
|
|
|
|
|
- restoredSignIn:NO
|
|
|
|
|
- oldAccessToken:NO
|
|
|
|
|
- modalCancel:NO
|
|
|
|
|
- useAdditionalScopes:YES
|
|
|
|
|
- additionalScopes:nil];
|
|
|
|
|
-
|
|
|
|
|
- expectedScopeString = [@[ @"email", @"profile" ] componentsJoinedByString:@" "];
|
|
|
|
|
- XCTAssertEqualObjects(_savedAuthorizationRequest.scope, expectedScopeString);
|
|
|
|
|
-
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:NO
|
|
|
|
|
- authError:nil
|
|
|
|
|
- tokenError:nil
|
|
|
|
|
- emmPasscodeInfoRequired:NO
|
|
|
|
|
- keychainError:NO
|
|
|
|
|
- restoredSignIn:NO
|
|
|
|
|
- oldAccessToken:NO
|
|
|
|
|
- modalCancel:NO
|
|
|
|
|
- useAdditionalScopes:YES
|
|
|
|
|
- additionalScopes:@[ kScope ]];
|
|
|
|
|
-
|
|
|
|
|
- expectedScopeString = [@[ kScope, @"email", @"profile" ] componentsJoinedByString:@" "];
|
|
|
|
|
- XCTAssertEqualObjects(_savedAuthorizationRequest.scope, expectedScopeString);
|
|
|
|
|
-
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:NO
|
|
|
|
|
- authError:nil
|
|
|
|
|
- tokenError:nil
|
|
|
|
|
- emmPasscodeInfoRequired:NO
|
|
|
|
|
- keychainError:NO
|
|
|
|
|
- restoredSignIn:NO
|
|
|
|
|
- oldAccessToken:NO
|
|
|
|
|
- modalCancel:NO
|
|
|
|
|
- useAdditionalScopes:YES
|
|
|
|
|
- additionalScopes:@[ kScope, kScope2 ]];
|
|
|
|
|
-
|
|
|
|
|
- expectedScopeString = [@[ kScope, kScope2, @"email", @"profile" ] componentsJoinedByString:@" "];
|
|
|
|
|
- XCTAssertEqualObjects(_savedAuthorizationRequest.scope, expectedScopeString);
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-- (void)testAddScopes {
|
|
|
|
|
- // Restore the previous sign-in account. This is the preparation for adding scopes.
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:NO
|
|
|
|
|
- authError:nil
|
|
|
|
|
- tokenError:nil
|
|
|
|
|
- emmPasscodeInfoRequired:NO
|
|
|
|
|
- keychainError:NO
|
|
|
|
|
- restoredSignIn:YES
|
|
|
|
|
- oldAccessToken:NO
|
|
|
|
|
- modalCancel:NO];
|
|
|
|
|
-
|
|
|
|
|
- XCTAssertNotNil(_signIn.currentUser);
|
|
|
|
|
-
|
|
|
|
|
- id profile = OCMStrictClassMock([GIDProfileData class]);
|
|
|
|
|
- OCMStub([profile email]).andReturn(kUserEmail);
|
|
|
|
|
-
|
|
|
|
|
- // Mock for the method `addScopes`.
|
|
|
|
|
- GIDConfiguration *configuration = [[GIDConfiguration alloc] initWithClientID:kClientId
|
|
|
|
|
- serverClientID:nil
|
|
|
|
|
- hostedDomain:nil
|
|
|
|
|
- openIDRealm:kOpenIDRealm];
|
|
|
|
|
- OCMStub([_user configuration]).andReturn(configuration);
|
|
|
|
|
- OCMStub([_user profile]).andReturn(profile);
|
|
|
|
|
- OCMStub([_user grantedScopes]).andReturn(@[kGrantedScope]);
|
|
|
|
|
-
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:YES
|
|
|
|
|
- authError:nil
|
|
|
|
|
- tokenError:nil
|
|
|
|
|
- emmPasscodeInfoRequired:NO
|
|
|
|
|
- keychainError:NO
|
|
|
|
|
- restoredSignIn:NO
|
|
|
|
|
- oldAccessToken:NO
|
|
|
|
|
- modalCancel:NO];
|
|
|
|
|
-
|
|
|
|
|
- NSArray<NSString *> *grantedScopes;
|
|
|
|
|
- NSString *grantedScopeString = _savedAuthorizationRequest.scope;
|
|
|
|
|
-
|
|
|
|
|
- if (grantedScopeString) {
|
|
|
|
|
- grantedScopeString = [grantedScopeString stringByTrimmingCharactersInSet:
|
|
|
|
|
- [NSCharacterSet whitespaceCharacterSet]];
|
|
|
|
|
- // Tokenize with space as a delimiter.
|
|
|
|
|
- NSMutableArray<NSString *> *parsedScopes =
|
|
|
|
|
- [[grantedScopeString componentsSeparatedByString:@" "] mutableCopy];
|
|
|
|
|
- // Remove empty strings.
|
|
|
|
|
- [parsedScopes removeObject:@""];
|
|
|
|
|
- grantedScopes = [parsedScopes copy];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- NSArray<NSString *> *expectedScopes = @[kNewScope, kGrantedScope];
|
|
|
|
|
- XCTAssertEqualObjects(grantedScopes, expectedScopes);
|
|
|
|
|
-
|
|
|
|
|
- [_user verify];
|
|
|
|
|
- [profile verify];
|
|
|
|
|
- [profile stopMocking];
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
- (void)testOpenIDRealm {
|
|
- (void)testOpenIDRealm {
|
|
|
_signIn.configuration = [[GIDConfiguration alloc] initWithClientID:kClientId
|
|
_signIn.configuration = [[GIDConfiguration alloc] initWithClientID:kClientId
|
|
|
serverClientID:nil
|
|
serverClientID:nil
|
|
@@ -648,41 +531,6 @@ static NSString *const kNewScope = @"newScope";
|
|
|
XCTAssertEqual(params[kOpenIDRealmKey], kOpenIDRealm, @"OpenID Realm should match.");
|
|
XCTAssertEqual(params[kOpenIDRealmKey], kOpenIDRealm, @"OpenID Realm should match.");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-- (void)testOAuthLogin_LoginHint {
|
|
|
|
|
- _hint = kUserEmail;
|
|
|
|
|
-
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:NO
|
|
|
|
|
- authError:nil
|
|
|
|
|
- tokenError:nil
|
|
|
|
|
- emmPasscodeInfoRequired:NO
|
|
|
|
|
- keychainError:NO
|
|
|
|
|
- restoredSignIn:NO
|
|
|
|
|
- oldAccessToken:NO
|
|
|
|
|
- modalCancel:NO];
|
|
|
|
|
-
|
|
|
|
|
- NSDictionary<NSString *, NSObject *> *params = _savedAuthorizationRequest.additionalParameters;
|
|
|
|
|
- XCTAssertEqualObjects(params[@"login_hint"], kUserEmail, @"login hint should match");
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-- (void)testOAuthLogin_HostedDomain {
|
|
|
|
|
- _signIn.configuration = [[GIDConfiguration alloc] initWithClientID:kClientId
|
|
|
|
|
- serverClientID:nil
|
|
|
|
|
- hostedDomain:kHostedDomain
|
|
|
|
|
- openIDRealm:nil];
|
|
|
|
|
-
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:NO
|
|
|
|
|
- authError:nil
|
|
|
|
|
- tokenError:nil
|
|
|
|
|
- emmPasscodeInfoRequired:NO
|
|
|
|
|
- keychainError:NO
|
|
|
|
|
- restoredSignIn:NO
|
|
|
|
|
- oldAccessToken:NO
|
|
|
|
|
- modalCancel:NO];
|
|
|
|
|
-
|
|
|
|
|
- NSDictionary<NSString *, NSObject *> *params = _savedAuthorizationRequest.additionalParameters;
|
|
|
|
|
- XCTAssertEqualObjects(params[@"hd"], kHostedDomain, @"hosted domain should match");
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
- (void)testOAuthLogin_ConsentCanceled {
|
|
- (void)testOAuthLogin_ConsentCanceled {
|
|
|
[self OAuthLoginWithAddScopesFlow:NO
|
|
[self OAuthLoginWithAddScopesFlow:NO
|
|
|
authError:@"access_denied"
|
|
authError:@"access_denied"
|
|
@@ -1011,15 +859,10 @@ static NSString *const kNewScope = @"newScope";
|
|
|
}
|
|
}
|
|
|
NSString *expectedOSVersion = [NSString stringWithFormat:@"%@ %@",
|
|
NSString *expectedOSVersion = [NSString stringWithFormat:@"%@ %@",
|
|
|
systemName, [UIDevice currentDevice].systemVersion];
|
|
systemName, [UIDevice currentDevice].systemVersion];
|
|
|
- NSDictionary<NSString *, NSObject *> *authParams =
|
|
|
|
|
- _savedAuthorizationRequest.additionalParameters;
|
|
|
|
|
|
|
+
|
|
|
NSDictionary<NSString *, NSString *> *tokenParams = _savedTokenRequest.additionalParameters;
|
|
NSDictionary<NSString *, NSString *> *tokenParams = _savedTokenRequest.additionalParameters;
|
|
|
if (_isEligibleForEMM) {
|
|
if (_isEligibleForEMM) {
|
|
|
- XCTAssertEqualObjects(authParams[@"emm_support"], kEMMSupport,
|
|
|
|
|
- @"EMM support should match in auth request");
|
|
|
|
|
- XCTAssertEqualObjects(authParams[@"device_os"], expectedOSVersion,
|
|
|
|
|
- @"OS version should match in auth request");
|
|
|
|
|
- XCTAssertEqualObjects(tokenParams[@"emm_support"], kEMMSupport,
|
|
|
|
|
|
|
+ XCTAssertEqualObjects(tokenParams[@"emm_support"], kEMMVersion,
|
|
|
@"EMM support should match in token request");
|
|
@"EMM support should match in token request");
|
|
|
XCTAssertEqualObjects(tokenParams[@"device_os"],
|
|
XCTAssertEqualObjects(tokenParams[@"device_os"],
|
|
|
expectedOSVersion,
|
|
expectedOSVersion,
|
|
@@ -1027,10 +870,6 @@ static NSString *const kNewScope = @"newScope";
|
|
|
XCTAssertNil(tokenParams[@"emm_passcode_info"],
|
|
XCTAssertNil(tokenParams[@"emm_passcode_info"],
|
|
|
@"no passcode info should be in token request");
|
|
@"no passcode info should be in token request");
|
|
|
} else {
|
|
} else {
|
|
|
- XCTAssertNil(authParams[@"emm_support"],
|
|
|
|
|
- @"EMM support should not be in auth request for unsupported OS");
|
|
|
|
|
- XCTAssertNil(authParams[@"device_os"],
|
|
|
|
|
- @"OS version should not be in auth request for unsupported OS");
|
|
|
|
|
XCTAssertNil(tokenParams[@"emm_support"],
|
|
XCTAssertNil(tokenParams[@"emm_support"],
|
|
|
@"EMM support should not be in token request for unsupported OS");
|
|
@"EMM support should not be in token request for unsupported OS");
|
|
|
XCTAssertNil(tokenParams[@"device_os"],
|
|
XCTAssertNil(tokenParams[@"device_os"],
|
|
@@ -1158,26 +997,6 @@ static NSString *const kNewScope = @"newScope";
|
|
|
XCTAssertEqualObjects(strings[1], token);
|
|
XCTAssertEqualObjects(strings[1], token);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-- (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
|
|
|
|
|
- authError:(NSString *)authError
|
|
|
|
|
- tokenError:(NSError *)tokenError
|
|
|
|
|
- emmPasscodeInfoRequired:(BOOL)emmPasscodeInfoRequired
|
|
|
|
|
- keychainError:(BOOL)keychainError
|
|
|
|
|
- restoredSignIn:(BOOL)restoredSignIn
|
|
|
|
|
- oldAccessToken:(BOOL)oldAccessToken
|
|
|
|
|
- modalCancel:(BOOL)modalCancel {
|
|
|
|
|
- [self OAuthLoginWithAddScopesFlow:addScopesFlow
|
|
|
|
|
- authError:authError
|
|
|
|
|
- tokenError:tokenError
|
|
|
|
|
- emmPasscodeInfoRequired:emmPasscodeInfoRequired
|
|
|
|
|
- keychainError:keychainError
|
|
|
|
|
- restoredSignIn:restoredSignIn
|
|
|
|
|
- oldAccessToken:oldAccessToken
|
|
|
|
|
- modalCancel:modalCancel
|
|
|
|
|
- useAdditionalScopes:NO
|
|
|
|
|
- additionalScopes:nil];
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
// The authorization flow with parameters to control which branches to take.
|
|
// The authorization flow with parameters to control which branches to take.
|
|
|
- (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
|
|
- (void)OAuthLoginWithAddScopesFlow:(BOOL)addScopesFlow
|
|
|
authError:(NSString *)authError
|
|
authError:(NSString *)authError
|
|
@@ -1186,9 +1005,7 @@ static NSString *const kNewScope = @"newScope";
|
|
|
keychainError:(BOOL)keychainError
|
|
keychainError:(BOOL)keychainError
|
|
|
restoredSignIn:(BOOL)restoredSignIn
|
|
restoredSignIn:(BOOL)restoredSignIn
|
|
|
oldAccessToken:(BOOL)oldAccessToken
|
|
oldAccessToken:(BOOL)oldAccessToken
|
|
|
- modalCancel:(BOOL)modalCancel
|
|
|
|
|
- useAdditionalScopes:(BOOL)useAdditionalScopes
|
|
|
|
|
- additionalScopes:(NSArray *)additionalScopes {
|
|
|
|
|
|
|
+ modalCancel:(BOOL)modalCancel {
|
|
|
if (restoredSignIn) {
|
|
if (restoredSignIn) {
|
|
|
// clearAndAuthenticateWithOptions
|
|
// clearAndAuthenticateWithOptions
|
|
|
[_keychainHandler saveAuthState:_authState];
|
|
[_keychainHandler saveAuthState:_authState];
|
|
@@ -1267,33 +1084,17 @@ static NSString *const kNewScope = @"newScope";
|
|
|
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
completion:completion];
|
|
completion:completion];
|
|
|
} else {
|
|
} else {
|
|
|
- if (useAdditionalScopes) {
|
|
|
|
|
-#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
|
|
- [_signIn signInWithPresentingViewController:_presentingViewController
|
|
|
|
|
-#elif TARGET_OS_OSX
|
|
|
|
|
- [_signIn signInWithPresentingWindow:_presentingWindow
|
|
|
|
|
-#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
|
|
- hint:_hint
|
|
|
|
|
- additionalScopes:additionalScopes
|
|
|
|
|
- completion:completion];
|
|
|
|
|
- } else {
|
|
|
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
- [_signIn signInWithPresentingViewController:_presentingViewController
|
|
|
|
|
|
|
+ [_signIn signInWithPresentingViewController:_presentingViewController
|
|
|
#elif TARGET_OS_OSX
|
|
#elif TARGET_OS_OSX
|
|
|
- [_signIn signInWithPresentingWindow:_presentingWindow
|
|
|
|
|
|
|
+ [_signIn signInWithPresentingWindow:_presentingWindow
|
|
|
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#endif // TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
- hint:_hint
|
|
|
|
|
- completion:completion];
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ hint:_hint
|
|
|
|
|
+ completion:completion];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
[_authState verify];
|
|
[_authState verify];
|
|
|
-
|
|
|
|
|
- XCTAssertNotNil(_savedAuthorizationRequest);
|
|
|
|
|
- NSDictionary<NSString *, NSObject *> *params = _savedAuthorizationRequest.additionalParameters;
|
|
|
|
|
- XCTAssertEqualObjects(params[@"include_granted_scopes"], @"true");
|
|
|
|
|
- XCTAssertEqualObjects(params[kSDKVersionLoggingParameter], GIDVersion());
|
|
|
|
|
- XCTAssertEqualObjects(params[kEnvironmentLoggingParameter], GIDEnvironment());
|
|
|
|
|
|
|
+
|
|
|
XCTAssertNotNil(_savedAuthorizationCallback);
|
|
XCTAssertNotNil(_savedAuthorizationCallback);
|
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
#if TARGET_OS_IOS || TARGET_OS_MACCATALYST
|
|
|
XCTAssertEqual(_savedPresentingViewController, _presentingViewController);
|
|
XCTAssertEqual(_savedPresentingViewController, _presentingViewController);
|