Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 282
Create GIDFakeAuthStateMigration#529
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
camden-king
merged 16 commits into
camden-king/migration-bug-fixes
from
camden-king/create-GIDAuthStateMigrationFakeJun 18, 2025
Uh oh!
There was an error while loading. Please reload this page.
Merged
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
0974883
create fake
camden-king e5b86b5
Revert "only attempt migrations one time"
camden-king b5d9e45
update fake and create test
camden-king 31e8734
update fake and create test
camden-king a52d83b
remove unneeded local variable from GIDSignIn
camden-king 4397dd6
Attempt migrations once (#528)
camden-king 7a301c1
changes from review
camden-king 4d0707a
update comment + spacing
camden-king 6ef11d8
check signIn not nil
camden-king 69058b6
Update GIDAuthStateMigration to not perform migration when built for …
camden-king 645e281
update fake and create test
camden-king 7b9bac0
rebase
camden-king 26a118a
rebase
camden-king 59d1172
changes from review
camden-king e56d34f
changes from review
camden-king 1181124
removed line break
camden-king File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
27 changes: 27 additions & 0 deletions
27 GoogleSignIn/Sources/GIDAuthStateMigration/Fake/GIDFakeAuthStateMigration.h
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| /* | ||
| * Copyright 2025 Google LLC | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| #import "GoogleSignIn/Sources/GIDAuthStateMigration/GIDAuthStateMigration.h" | ||
| /// A fake |GIDAuthStateMigration| for testing. | ||
| @interface GIDFakeAuthStateMigration : GIDAuthStateMigration | ||
| /// Callback that is called when `migrateIfNeededWithTokenURL` is invoked. | ||
| @property (nonatomic, nullable) void (^migrationInvokedCallback) | ||
| (NSURL * _Nullable tokenURL, NSString * _Nullable callbackPath, NSString * _Nullable keychainName, | ||
| BOOL isFreshInstall); | ||
| @end |
42 changes: 42 additions & 0 deletions
42 GoogleSignIn/Sources/GIDAuthStateMigration/Fake/GIDFakeAuthStateMigration.m
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,42 @@ | ||
| /* | ||
| * Copyright 2025 Google LLC | ||
| * | ||
| * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| * you may not use this file except in compliance with the License. | ||
| * You may obtain a copy of the License at | ||
| * | ||
| * http://www.apache.org/licenses/LICENSE-2.0 | ||
| * | ||
| * Unless required by applicable law or agreed to in writing, software | ||
| * distributed under the License is distributed on an "AS IS" BASIS, | ||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| * See the License for the specific language governing permissions and | ||
| * limitations under the License. | ||
| */ | ||
| #import "GoogleSignIn/Sources/GIDAuthStateMigration/Fake/GIDFakeAuthStateMigration.h" | ||
| NS_ASSUME_NONNULL_BEGIN | ||
| @implementation GIDFakeAuthStateMigration | ||
| @synthesize migrationInvokedCallback = _migrationInvokedCallback; | ||
| - (instancetype)initWithKeychainStore:(GTMKeychainStore *)keychainStore { | ||
| self = [super initWithKeychainStore:keychainStore]; | ||
| return self; | ||
| } | ||
| - (void)migrateIfNeededWithTokenURL:(NSURL *)tokenURL | ||
| callbackPath:(NSString *)callbackPath | ||
| keychainName:(NSString *)keychainName | ||
| isFreshInstall:(BOOL)isFreshInstall { | ||
| if (_migrationInvokedCallback) { | ||
| _migrationInvokedCallback(tokenURL, callbackPath, keychainName, isFreshInstall); | ||
| } | ||
| return; | ||
| } | ||
| @end | ||
| NS_ASSUME_NONNULL_END | ||
File renamed without changes.
3 changes: 1 addition & 2 deletions
3 GoogleSignIn/Sources/GIDAuthStateMigration.m → ...on/Implementation/GIDAuthStateMigration.m
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -12,8 +12,7 @@ | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
| #import "GoogleSignIn/Sources/GIDAuthStateMigration.h" | ||
| #import "GoogleSignIn/Sources/GIDAuthStateMigration/GIDAuthStateMigration.h" | ||
camden-king marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| #import "GoogleSignIn/Sources/GIDSignInCallbackSchemes.h" | ||
| @import GTMAppAuth; | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -21,7 +21,7 @@ | ||
| #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDProfileData.h" | ||
| #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDSignInResult.h" | ||
| #import "GoogleSignIn/Sources/GIDAuthStateMigration.h" | ||
| #import "GoogleSignIn/Sources/GIDAuthStateMigration/GIDAuthStateMigration.h" | ||
| #import "GoogleSignIn/Sources/GIDEMMSupport.h" | ||
| #import "GoogleSignIn/Sources/GIDSignInInternalOptions.h" | ||
| #import "GoogleSignIn/Sources/GIDSignInPreferences.h" | ||
| @@ -490,15 +490,19 @@ + (GIDSignIn *)sharedInstance { | ||
| dispatch_once(&once, ^{ | ||
| GTMKeychainStore *keychainStore = | ||
| [[GTMKeychainStore alloc] initWithItemName:kGTMAppAuthKeychainName]; | ||
| GIDAuthStateMigration *authStateMigrationService = | ||
| [[GIDAuthStateMigration alloc] initWithKeychainStore:keychainStore]; | ||
| #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST | ||
| if (@available(iOS 14.0, *)) { | ||
| GIDAppCheck *appCheck = [GIDAppCheck appCheckUsingAppAttestProvider]; | ||
| sharedInstance = [[self alloc] initWithKeychainStore:keychainStore | ||
| authStateMigrationService:authStateMigrationService | ||
| appCheck:appCheck]; | ||
| } | ||
| #endif // TARGET_OS_IOS && !TARGET_OS_MACCATALYST | ||
| if (!sharedInstance) { | ||
| sharedInstance = [[self alloc] initWithKeychainStore:keychainStore]; | ||
| sharedInstance = [[self alloc] initWithKeychainStore:keychainStore | ||
| authStateMigrationService:authStateMigrationService]; | ||
| } | ||
| }); | ||
| return sharedInstance; | ||
| @@ -533,7 +537,8 @@ - (void)configureDebugProviderWithAPIKey:(NSString *)APIKey | ||
| #pragma mark - Private methods | ||
| - (instancetype)initWithKeychainStore:(GTMKeychainStore *)keychainStore { | ||
| - (instancetype)initWithKeychainStore:(GTMKeychainStore *)keychainStore | ||
| authStateMigrationService:(GIDAuthStateMigration *)authStateMigrationService { | ||
| self = [super init]; | ||
| if (self) { | ||
| // Get the bundle of the current executable. | ||
| @@ -561,20 +566,20 @@ - (instancetype)initWithKeychainStore:(GTMKeychainStore *)keychainStore { | ||
| tokenEndpoint:[NSURL URLWithString:tokenEndpointURL]]; | ||
| _keychainStore = keychainStore; | ||
| // Perform migration of auth state from old versions of the SDK if needed. | ||
| GIDAuthStateMigration *migration = | ||
| [[GIDAuthStateMigration alloc] initWithKeychainStore:_keychainStore]; | ||
| [migration migrateIfNeededWithTokenURL:_appAuthConfiguration.tokenEndpoint | ||
| callbackPath:kBrowserCallbackPath | ||
| keychainName:kGTMAppAuthKeychainName | ||
| isFreshInstall:isFreshInstall]; | ||
| [authStateMigrationService migrateIfNeededWithTokenURL:_appAuthConfiguration.tokenEndpoint | ||
camden-king marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| callbackPath:kBrowserCallbackPath | ||
| keychainName:kGTMAppAuthKeychainName | ||
| isFreshInstall:isFreshInstall]; | ||
| } | ||
| return self; | ||
| } | ||
| #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST | ||
| - (instancetype)initWithKeychainStore:(GTMKeychainStore *)keychainStore | ||
| authStateMigrationService:(GIDAuthStateMigration *)authStateMigrationService | ||
| appCheck:(GIDAppCheck *)appCheck { | ||
| self = [self initWithKeychainStore:keychainStore]; | ||
| self = [self initWithKeychainStore:keychainStore | ||
| authStateMigrationService:authStateMigrationService]; | ||
| if (self) { | ||
| _appCheck = appCheck; | ||
| _configureAppCheckCalled = NO; | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -40,6 +40,7 @@ | ||
| #import "GoogleSignIn/Sources/GIDEMMErrorHandler.h" | ||
| #endif // TARGET_OS_IOS && !TARGET_OS_MACCATALYST | ||
| #import "GoogleSignIn/Sources/GIDAuthStateMigration/Fake/GIDFakeAuthStateMigration.h" | ||
| #import "GoogleSignIn/Tests/Unit/GIDFakeFetcher.h" | ||
| #import "GoogleSignIn/Tests/Unit/GIDFakeFetcherService.h" | ||
| #import "GoogleSignIn/Tests/Unit/GIDFakeMainBundle.h" | ||
| @@ -221,6 +222,9 @@ @interface GIDSignInTest : XCTestCase { | ||
| // Whether callback block has been called. | ||
| BOOL _completionCalled; | ||
| // Fake for |GIDAuthStateMigration|. | ||
| GIDFakeAuthStateMigration *_authStateMigrationService; | ||
| // Fake fetcher service to emulate network requests. | ||
| GIDFakeFetcherService *_fetcherService; | ||
| @@ -331,6 +335,7 @@ - (void)setUp { | ||
| callback:COPY_TO_ARG_BLOCK(self->_savedTokenCallback)]); | ||
| // Fakes | ||
| _authStateMigrationService = [[GIDFakeAuthStateMigration alloc] init]; | ||
| _fetcherService = [[GIDFakeFetcherService alloc] init]; | ||
| _fakeMainBundle = [[GIDFakeMainBundle alloc] init]; | ||
| [_fakeMainBundle startFakingWithClientID:kClientId]; | ||
| @@ -339,7 +344,8 @@ - (void)setUp { | ||
| // Object under test | ||
| [[NSUserDefaults standardUserDefaults] setBool:YES forKey:kAppHasRunBeforeKey]; | ||
| _signIn = [[GIDSignIn alloc] initWithKeychainStore:_keychainStore]; | ||
| _signIn = [[GIDSignIn alloc] initWithKeychainStore:_keychainStore | ||
| authStateMigrationService:_authStateMigrationService]; | ||
| _hint = nil; | ||
| #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST | ||
| @@ -398,6 +404,7 @@ - (void)testConfigureSucceeds { | ||
| userDefaults:_testUserDefaults]; | ||
| GIDSignIn *signIn = [[GIDSignIn alloc] initWithKeychainStore:_keychainStore | ||
| authStateMigrationService:_authStateMigrationService | ||
| appCheck:appCheck]; | ||
| [signIn configureWithCompletion:^(NSError * _Nullable error) { | ||
| XCTAssertNil(error); | ||
| @@ -421,6 +428,7 @@ - (void)testConfigureFailsNoTokenOrError { | ||
| userDefaults:_testUserDefaults]; | ||
| GIDSignIn *signIn = [[GIDSignIn alloc] initWithKeychainStore:_keychainStore | ||
| authStateMigrationService:_authStateMigrationService | ||
| appCheck:appCheck]; | ||
| // Should fail if missing both token and error | ||
| @@ -439,7 +447,8 @@ - (void)testConfigureFailsNoTokenOrError { | ||
| - (void)testInitWithKeychainStore { | ||
| GTMKeychainStore *store = [[GTMKeychainStore alloc] initWithItemName:@"foo"]; | ||
| GIDSignIn *signIn; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store]; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store | ||
| authStateMigrationService:_authStateMigrationService]; | ||
| XCTAssertNotNil(signIn.configuration); | ||
| XCTAssertEqual(signIn.configuration.clientID, kClientId); | ||
| XCTAssertNil(signIn.configuration.serverClientID); | ||
| @@ -454,7 +463,8 @@ - (void)testInitWithKeychainStore_noConfig { | ||
| openIDRealm:nil]; | ||
| GTMKeychainStore *store = [[GTMKeychainStore alloc] initWithItemName:@"foo"]; | ||
| GIDSignIn *signIn; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store]; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store | ||
| authStateMigrationService:_authStateMigrationService]; | ||
| XCTAssertNil(signIn.configuration); | ||
| } | ||
| @@ -466,7 +476,8 @@ - (void)testInitWithKeychainStore_fullConfig { | ||
| GTMKeychainStore *store = [[GTMKeychainStore alloc] initWithItemName:@"foo"]; | ||
| GIDSignIn *signIn; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store]; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store | ||
| authStateMigrationService:_authStateMigrationService]; | ||
| XCTAssertNotNil(signIn.configuration); | ||
| XCTAssertEqual(signIn.configuration.clientID, kClientId); | ||
| XCTAssertEqual(signIn.configuration.serverClientID, kServerClientId); | ||
| @@ -481,10 +492,29 @@ - (void)testInitWithKeychainStore_invalidConfig { | ||
| openIDRealm:nil]; | ||
| GTMKeychainStore *store = [[GTMKeychainStore alloc] initWithItemName:@"foo"]; | ||
| GIDSignIn *signIn; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store]; | ||
| signIn = [[GIDSignIn alloc] initWithKeychainStore:store | ||
| authStateMigrationService:_authStateMigrationService]; | ||
| XCTAssertNil(signIn.configuration); | ||
| } | ||
| - (void)testInitWithKeychainStore_attemptsMigration { | ||
| NSString *expectedKeychainName = @"foo"; | ||
| XCTestExpectation *expectation = [self expectationWithDescription:@"Callback should be called."]; | ||
| _authStateMigrationService.migrationInvokedCallback = | ||
| ^(NSURL *tokenURL, NSString *callbackPath, NSString *keychainName, BOOL isFreshInstall) { | ||
| XCTAssertFalse(isFreshInstall); | ||
| [expectation fulfill]; | ||
| }; | ||
| GTMKeychainStore *store = [[GTMKeychainStore alloc] initWithItemName:expectedKeychainName]; | ||
| GIDSignIn *signIn = [[GIDSignIn alloc] initWithKeychainStore:store | ||
camden-king marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| authStateMigrationService:_authStateMigrationService]; | ||
| XCTAssertNotNil(signIn.configuration); | ||
| [self waitForExpectationsWithTimeout:1 handler:nil]; | ||
| } | ||
| - (void)testRestorePreviousSignInNoRefresh_hasPreviousUser { | ||
| [[[_authorization stub] andReturn:_authState] authState]; | ||
| #if TARGET_OS_IOS && !TARGET_OS_MACCATALYST | ||
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.