GACAppCheckStorageTests.m 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /*
  2. * Copyright 2020 Google LLC
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #import <TargetConditionals.h>
  17. // Tests that use the Keychain require a host app and Swift Package Manager
  18. // does not support adding a host app to test targets.
  19. #if !SWIFT_PACKAGE
  20. // Skip keychain tests on Catalyst and macOS. Tests are skipped because they
  21. // involve interactions with the keychain that require a provisioning profile.
  22. // See go/firebase-macos-keychain-popups for more details.
  23. #if !TARGET_OS_MACCATALYST && !TARGET_OS_OSX
  24. #import <XCTest/XCTest.h>
  25. #import <OCMock/OCMock.h>
  26. #import <GoogleUtilities/GULKeychainStorage.h>
  27. #import "FBLPromise+Testing.h"
  28. #import "AppCheck/Sources/Core/Storage/GACAppCheckStorage.h"
  29. #import "AppCheck/Sources/Core/Errors/GACAppCheckErrorUtil.h"
  30. #import "AppCheck/Sources/Public/AppCheck/GACAppCheckToken.h"
  31. static NSString *const kAppName = @"GACAppCheckStorageTestsApp";
  32. static NSString *const kGoogleAppID = @"1:100000000000:ios:aaaaaaaaaaaaaaaaaaaaaaaa";
  33. @interface GACAppCheckStorageTests : XCTestCase
  34. @property(nonatomic) NSString *tokenKey;
  35. @property(nonatomic) GACAppCheckStorage *storage;
  36. @end
  37. @implementation GACAppCheckStorageTests
  38. - (void)setUp {
  39. [super setUp];
  40. self.tokenKey = [self tokenKeyWithGoogleAppID:kGoogleAppID];
  41. self.storage = [[GACAppCheckStorage alloc] initWithTokenKey:self.tokenKey accessGroup:nil];
  42. }
  43. - (void)tearDown {
  44. self.storage = nil;
  45. [super tearDown];
  46. }
  47. - (void)testSetAndGetToken {
  48. GACAppCheckToken *tokenToStore = [[GACAppCheckToken alloc] initWithToken:@"token"
  49. expirationDate:[NSDate distantPast]
  50. receivedAtDate:[NSDate date]];
  51. FBLPromise *setPromise = [self.storage setToken:tokenToStore];
  52. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  53. XCTAssertEqualObjects(setPromise.value, tokenToStore);
  54. XCTAssertNil(setPromise.error);
  55. __auto_type getPromise = [self.storage getToken];
  56. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  57. XCTAssertEqualObjects(getPromise.value.token, tokenToStore.token);
  58. XCTAssertEqualObjects(getPromise.value.expirationDate, tokenToStore.expirationDate);
  59. XCTAssertEqualObjects(getPromise.value.receivedAtDate, tokenToStore.receivedAtDate);
  60. XCTAssertNil(getPromise.error);
  61. }
  62. - (void)testRemoveToken {
  63. FBLPromise *setPromise = [self.storage setToken:nil];
  64. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  65. XCTAssertEqualObjects(setPromise.value, nil);
  66. XCTAssertNil(setPromise.error);
  67. __auto_type getPromise = [self.storage getToken];
  68. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  69. XCTAssertNil(getPromise.value);
  70. XCTAssertNil(getPromise.error);
  71. }
  72. - (void)testGetToken_KeychainError {
  73. // 1. Set up storage mock.
  74. id mockKeychainStorage = OCMClassMock([GULKeychainStorage class]);
  75. GACAppCheckStorage *storage = [[GACAppCheckStorage alloc] initWithTokenKey:self.tokenKey
  76. keychainStorage:mockKeychainStorage
  77. accessGroup:nil];
  78. // 2. Create and expect keychain error.
  79. NSError *gulsKeychainError = [NSError errorWithDomain:@"com.guls.keychain" code:-1 userInfo:nil];
  80. OCMExpect([mockKeychainStorage getObjectForKey:[OCMArg any]
  81. objectClass:[OCMArg any]
  82. accessGroup:[OCMArg any]])
  83. .andReturn([FBLPromise resolvedWith:gulsKeychainError]);
  84. // 3. Get token and verify results.
  85. __auto_type getPromise = [storage getToken];
  86. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  87. XCTAssertNotNil(getPromise.error);
  88. XCTAssertEqualObjects(getPromise.error,
  89. [GACAppCheckErrorUtil keychainErrorWithError:gulsKeychainError]);
  90. // 4. Verify storage mock.
  91. OCMVerifyAll(mockKeychainStorage);
  92. }
  93. - (void)testSetToken_KeychainError {
  94. // 1. Set up storage mock.
  95. id mockKeychainStorage = OCMClassMock([GULKeychainStorage class]);
  96. GACAppCheckStorage *storage = [[GACAppCheckStorage alloc] initWithTokenKey:self.tokenKey
  97. keychainStorage:mockKeychainStorage
  98. accessGroup:nil];
  99. // 2. Create and expect keychain error.
  100. NSError *gulsKeychainError = [NSError errorWithDomain:@"com.guls.keychain" code:-1 userInfo:nil];
  101. OCMExpect([mockKeychainStorage setObject:[OCMArg any]
  102. forKey:[OCMArg any]
  103. accessGroup:[OCMArg any]])
  104. .andReturn([FBLPromise resolvedWith:gulsKeychainError]);
  105. // 3. Set token and verify results.
  106. GACAppCheckToken *tokenToStore = [[GACAppCheckToken alloc] initWithToken:@"token"
  107. expirationDate:[NSDate distantPast]
  108. receivedAtDate:[NSDate date]];
  109. __auto_type getPromise = [storage setToken:tokenToStore];
  110. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  111. XCTAssertNotNil(getPromise.error);
  112. XCTAssertEqualObjects(getPromise.error,
  113. [GACAppCheckErrorUtil keychainErrorWithError:gulsKeychainError]);
  114. // 4. Verify storage mock.
  115. OCMVerifyAll(mockKeychainStorage);
  116. }
  117. - (void)testRemoveToken_KeychainError {
  118. // 1. Set up storage mock.
  119. id mockKeychainStorage = OCMClassMock([GULKeychainStorage class]);
  120. GACAppCheckStorage *storage = [[GACAppCheckStorage alloc] initWithTokenKey:self.tokenKey
  121. keychainStorage:mockKeychainStorage
  122. accessGroup:nil];
  123. // 2. Create and expect keychain error.
  124. NSError *gulsKeychainError = [NSError errorWithDomain:@"com.guls.keychain" code:-1 userInfo:nil];
  125. OCMExpect([mockKeychainStorage removeObjectForKey:[OCMArg any] accessGroup:[OCMArg any]])
  126. .andReturn([FBLPromise resolvedWith:gulsKeychainError]);
  127. // 3. Remove token and verify results.
  128. __auto_type getPromise = [storage setToken:nil];
  129. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  130. XCTAssertNotNil(getPromise.error);
  131. XCTAssertEqualObjects(getPromise.error,
  132. [GACAppCheckErrorUtil keychainErrorWithError:gulsKeychainError]);
  133. // 4. Verify storage mock.
  134. OCMVerifyAll(mockKeychainStorage);
  135. }
  136. - (void)testSetTokenPerApp {
  137. // 1. Set token with a storage.
  138. GACAppCheckToken *tokenToStore = [[GACAppCheckToken alloc] initWithToken:@"token"
  139. expirationDate:[NSDate distantPast]
  140. receivedAtDate:[NSDate date]];
  141. FBLPromise *setPromise = [self.storage setToken:tokenToStore];
  142. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  143. XCTAssertEqualObjects(setPromise.value, tokenToStore);
  144. XCTAssertNil(setPromise.error);
  145. // 2. Try to read the token with another storage.
  146. NSString *tokenKey =
  147. [self tokenKeyWithGoogleAppID:@"1:200000000000:ios:aaaaaaaaaaaaaaaaaaaaaaaa"];
  148. GACAppCheckStorage *storage2 = [[GACAppCheckStorage alloc] initWithTokenKey:tokenKey
  149. accessGroup:nil];
  150. __auto_type getPromise = [storage2 getToken];
  151. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  152. XCTAssertNil(getPromise.value);
  153. XCTAssertNil(getPromise.error);
  154. }
  155. #pragma mark - Private Helpers
  156. - (NSString *)tokenKeyWithGoogleAppID:(NSString *)googleAppID {
  157. return [NSString stringWithFormat:@"app_check_token.%@.%@", kAppName, googleAppID];
  158. }
  159. @end
  160. #endif // !TARGET_OS_MACCATALYST && !TARGET_OS_OSX
  161. #endif // !SWIFT_PACKAGE