From 6648e4fb46cea09daec2a44af299a1e971f85004 Mon Sep 17 00:00:00 2001 From: Akshat Gandhi <54901287+AkshatG6@users.noreply.github.com> Date: Wed, 3 Sep 2025 08:58:15 -0700 Subject: [PATCH 1/3] GIDTokenClaim Implementation + Unit Tests --- GoogleSignIn/Sources/GIDTokenClaim.m | 73 +++++++++++++++++++ .../Public/GoogleSignIn/GIDTokenClaim.h | 46 ++++++++++++ .../Public/GoogleSignIn/GoogleSignIn.h | 1 + GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m | 48 ++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 GoogleSignIn/Sources/GIDTokenClaim.m create mode 100644 GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h create mode 100644 GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m diff --git a/GoogleSignIn/Sources/GIDTokenClaim.m b/GoogleSignIn/Sources/GIDTokenClaim.m new file mode 100644 index 00000000..73964e7c --- /dev/null +++ b/GoogleSignIn/Sources/GIDTokenClaim.m @@ -0,0 +1,73 @@ +/* + * 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/Public/GoogleSignIn/GIDTokenClaim.h" + +// Private interface to declare the internal initializer +@interface GIDTokenClaim () + +- (instancetype)initWithName:(NSString *)name + essential:(BOOL)essential NS_DESIGNATED_INITIALIZER; + +@end + +@implementation GIDTokenClaim + +// Private designated initializer +- (instancetype)initWithName:(NSString *)name essential:(BOOL)essential { + self = [super init]; + if (self) { + _name = [name copy]; + _essential = essential; + } + return self; +} + +#pragma mark - Factory Methods + ++ (instancetype)authTimeClaim { + return [[self alloc] initWithName:@"auth_time" essential:NO]; +} + ++ (instancetype)essentialAuthTimeClaim { + return [[self alloc] initWithName:@"auth_time" essential:YES]; +} + +#pragma mark - NSObject + +- (BOOL)isEqual:(id)object { + // 1. Check if the other object is the same instance in memory. + if (self == object) { + return YES; + } + + // 2. Check if the other object is not a GIDTokenClaim instance. + if (![object isKindOfClass:[GIDTokenClaim class]]) { + return NO; + } + + // 3. Compare the properties that define equality. + GIDTokenClaim *other = (GIDTokenClaim *)object; + return [self.name isEqualToString:other.name] && + self.isEssential == other.isEssential; +} + +- (NSUInteger)hash { + // The hash value should be based on the same properties used in isEqual: + return self.name.hash ^ @(self.isEssential).hash; +} + +@end diff --git a/GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h b/GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h new file mode 100644 index 00000000..7033a23e --- /dev/null +++ b/GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h @@ -0,0 +1,46 @@ +/* + * 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 + +NS_ASSUME_NONNULL_BEGIN + +/** + * An object representing a single OIDC claim to be requested for an ID token. + */ +@interface GIDTokenClaim : NSObject + +/// The name of the claim, e.g., "auth_time". +@property (nonatomic, readonly) NSString *name; + +/// Whether the claim is requested as essential. +@property (nonatomic, readonly, getter=isEssential) BOOL essential; + +// Making initializers unavailable to force use of factory methods. +- (instancetype)init NS_UNAVAILABLE; + +#pragma mark - Factory Methods + +/// Creates a *non-essential* (voluntary) "auth_time" claim object. ++ (instancetype)authTimeClaim; + +/// Creates an *essential* "auth_time" claim object. ++ (instancetype)essentialAuthTimeClaim; + +@end + +NS_ASSUME_NONNULL_END + diff --git a/GoogleSignIn/Sources/Public/GoogleSignIn/GoogleSignIn.h b/GoogleSignIn/Sources/Public/GoogleSignIn/GoogleSignIn.h index 4fd17ede..02935be8 100644 --- a/GoogleSignIn/Sources/Public/GoogleSignIn/GoogleSignIn.h +++ b/GoogleSignIn/Sources/Public/GoogleSignIn/GoogleSignIn.h @@ -24,6 +24,7 @@ #import "GIDSignIn.h" #import "GIDToken.h" #import "GIDSignInResult.h" +#import "GIDTokenClaim.h" #if TARGET_OS_IOS || TARGET_OS_MACCATALYST #import "GIDSignInButton.h" #endif diff --git a/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m b/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m new file mode 100644 index 00000000..e0016861 --- /dev/null +++ b/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m @@ -0,0 +1,48 @@ +// 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 +#import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h" +@interface GIDTokenClaimTest : XCTestCase +@end + +@implementation GIDTokenClaimTest + +- (void)testAuthTimeClaim_PropertiesAreCorrect { + GIDTokenClaim *claim = [GIDTokenClaim authTimeClaim]; + XCTAssertEqualObjects(claim.name, @"auth_time"); + XCTAssertFalse(claim.isEssential); +} + +- (void)testEssentialAuthTimeClaim_PropertiesAreCorrect { + GIDTokenClaim *claim = [GIDTokenClaim essentialAuthTimeClaim]; + XCTAssertEqualObjects(claim.name, @"auth_time"); + XCTAssertTrue(claim.isEssential); +} + +- (void)testEquality_WithEqualClaims { + GIDTokenClaim *claim1 = [GIDTokenClaim authTimeClaim]; + GIDTokenClaim *claim2 = [GIDTokenClaim authTimeClaim]; + XCTAssertEqualObjects(claim1, claim2); + XCTAssertEqual(claim1.hash, claim2.hash); +} + +- (void)testEquality_WithUnequalClaims { + GIDTokenClaim *claim1 = [GIDTokenClaim authTimeClaim]; + GIDTokenClaim *claim2 = [GIDTokenClaim essentialAuthTimeClaim]; + XCTAssertNotEqualObjects(claim1, claim2); +} + +@end From 6ecc98ebeecbfbf9229ec27109a0ebdd04ffc80e Mon Sep 17 00:00:00 2001 From: Akshat Gandhi <54901287+AkshatG6@users.noreply.github.com> Date: Thu, 4 Sep 2025 10:39:03 -0700 Subject: [PATCH 2/3] Added const string in GIDTokenClaimTests --- GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m b/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m index e0016861..3de75ef2 100644 --- a/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m +++ b/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m @@ -15,6 +15,9 @@ #import #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h" + +static NSString *const kAuthTimeClaimName = @"auth_time"; + @interface GIDTokenClaimTest : XCTestCase @end @@ -22,13 +25,13 @@ @implementation GIDTokenClaimTest - (void)testAuthTimeClaim_PropertiesAreCorrect { GIDTokenClaim *claim = [GIDTokenClaim authTimeClaim]; - XCTAssertEqualObjects(claim.name, @"auth_time"); + XCTAssertEqualObjects(claim.name, kAuthTimeClaimName); XCTAssertFalse(claim.isEssential); } - (void)testEssentialAuthTimeClaim_PropertiesAreCorrect { GIDTokenClaim *claim = [GIDTokenClaim essentialAuthTimeClaim]; - XCTAssertEqualObjects(claim.name, @"auth_time"); + XCTAssertEqualObjects(claim.name, kAuthTimeClaimName); XCTAssertTrue(claim.isEssential); } From 9378563147408e05d90df29fd0fedf13f89ac5e5 Mon Sep 17 00:00:00 2001 From: Akshat Gandhi <54901287+AkshatG6@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:40:59 -0700 Subject: [PATCH 3/3] Updated GIDTokenClaim Implementation + Tests with const string --- GoogleSignIn/Sources/GIDTokenClaim.m | 6 ++++-- GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h | 2 ++ GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m | 2 -- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/GoogleSignIn/Sources/GIDTokenClaim.m b/GoogleSignIn/Sources/GIDTokenClaim.m index 73964e7c..61e83d6a 100644 --- a/GoogleSignIn/Sources/GIDTokenClaim.m +++ b/GoogleSignIn/Sources/GIDTokenClaim.m @@ -16,6 +16,8 @@ #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h" +NSString * const kAuthTimeClaimName = @"auth_time"; + // Private interface to declare the internal initializer @interface GIDTokenClaim () @@ -39,11 +41,11 @@ - (instancetype)initWithName:(NSString *)name essential:(BOOL)essential { #pragma mark - Factory Methods + (instancetype)authTimeClaim { - return [[self alloc] initWithName:@"auth_time" essential:NO]; + return [[self alloc] initWithName:kAuthTimeClaimName essential:NO]; } + (instancetype)essentialAuthTimeClaim { - return [[self alloc] initWithName:@"auth_time" essential:YES]; + return [[self alloc] initWithName:kAuthTimeClaimName essential:YES]; } #pragma mark - NSObject diff --git a/GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h b/GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h index 7033a23e..7a2351cb 100644 --- a/GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h +++ b/GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h @@ -18,6 +18,8 @@ NS_ASSUME_NONNULL_BEGIN +extern NSString *const kAuthTimeClaimName; + /** * An object representing a single OIDC claim to be requested for an ID token. */ diff --git a/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m b/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m index 3de75ef2..145e46f6 100644 --- a/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m +++ b/GoogleSignIn/Tests/Unit/GIDTokenClaimTest.m @@ -16,8 +16,6 @@ #import #import "GoogleSignIn/Sources/Public/GoogleSignIn/GIDTokenClaim.h" -static NSString *const kAuthTimeClaimName = @"auth_time"; - @interface GIDTokenClaimTest : XCTestCase @end