FIRAppCheckStorageTests.m 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  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 "FirebaseAppCheck/Sources/Core/Storage/FIRAppCheckStorage.h"
  29. #import "FirebaseAppCheck/Sources/Core/Errors/FIRAppCheckErrorUtil.h"
  30. #import "FirebaseAppCheck/Sources/Core/FIRAppCheckToken+Internal.h"
  31. @interface FIRAppCheckStorageTests : XCTestCase
  32. @property(nonatomic) NSString *appName;
  33. @property(nonatomic) NSString *appID;
  34. @property(nonatomic) FIRAppCheckStorage *storage;
  35. @end
  36. @implementation FIRAppCheckStorageTests
  37. - (void)setUp {
  38. [super setUp];
  39. self.appName = @"FIRAppCheckStorageTestsApp";
  40. self.appID = @"1:100000000000:ios:aaaaaaaaaaaaaaaaaaaaaaaa";
  41. self.storage = [[FIRAppCheckStorage alloc] initWithAppName:self.appName
  42. appID:self.appID
  43. accessGroup:nil];
  44. }
  45. - (void)tearDown {
  46. self.storage = nil;
  47. [super tearDown];
  48. }
  49. - (void)testSetAndGetToken {
  50. FIRAppCheckToken *tokenToStore = [[FIRAppCheckToken alloc] initWithToken:@"token"
  51. expirationDate:[NSDate distantPast]
  52. receivedAtDate:[NSDate date]];
  53. FBLPromise *setPromise = [self.storage setToken:tokenToStore];
  54. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  55. XCTAssertEqualObjects(setPromise.value, tokenToStore);
  56. XCTAssertNil(setPromise.error);
  57. __auto_type getPromise = [self.storage getToken];
  58. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  59. XCTAssertEqualObjects(getPromise.value.token, tokenToStore.token);
  60. XCTAssertEqualObjects(getPromise.value.expirationDate, tokenToStore.expirationDate);
  61. XCTAssertEqualObjects(getPromise.value.receivedAtDate, tokenToStore.receivedAtDate);
  62. XCTAssertNil(getPromise.error);
  63. }
  64. - (void)testRemoveToken {
  65. FBLPromise *setPromise = [self.storage setToken:nil];
  66. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  67. XCTAssertEqualObjects(setPromise.value, nil);
  68. XCTAssertNil(setPromise.error);
  69. __auto_type getPromise = [self.storage getToken];
  70. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  71. XCTAssertNil(getPromise.value);
  72. XCTAssertNil(getPromise.error);
  73. }
  74. - (void)testGetToken_KeychainError {
  75. // 1. Set up storage mock.
  76. id mockKeychainStorage = OCMClassMock([GULKeychainStorage class]);
  77. FIRAppCheckStorage *storage = [[FIRAppCheckStorage alloc] initWithAppName:self.appName
  78. appID:self.appID
  79. keychainStorage:mockKeychainStorage
  80. accessGroup:nil];
  81. // 2. Create and expect keychain error.
  82. NSError *gulsKeychainError = [NSError errorWithDomain:@"com.guls.keychain" code:-1 userInfo:nil];
  83. OCMExpect([mockKeychainStorage getObjectForKey:[OCMArg any]
  84. objectClass:[OCMArg any]
  85. accessGroup:[OCMArg any]])
  86. .andReturn([FBLPromise resolvedWith:gulsKeychainError]);
  87. // 3. Get token and verify results.
  88. __auto_type getPromise = [storage getToken];
  89. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  90. XCTAssertNotNil(getPromise.error);
  91. XCTAssertEqualObjects(getPromise.error,
  92. [FIRAppCheckErrorUtil keychainErrorWithError:gulsKeychainError]);
  93. // 4. Verify storage mock.
  94. OCMVerifyAll(mockKeychainStorage);
  95. }
  96. - (void)testSetToken_KeychainError {
  97. // 1. Set up storage mock.
  98. id mockKeychainStorage = OCMClassMock([GULKeychainStorage class]);
  99. FIRAppCheckStorage *storage = [[FIRAppCheckStorage alloc] initWithAppName:self.appName
  100. appID:self.appID
  101. keychainStorage:mockKeychainStorage
  102. accessGroup:nil];
  103. // 2. Create and expect keychain error.
  104. NSError *gulsKeychainError = [NSError errorWithDomain:@"com.guls.keychain" code:-1 userInfo:nil];
  105. OCMExpect([mockKeychainStorage setObject:[OCMArg any]
  106. forKey:[OCMArg any]
  107. accessGroup:[OCMArg any]])
  108. .andReturn([FBLPromise resolvedWith:gulsKeychainError]);
  109. // 3. Set token and verify results.
  110. FIRAppCheckToken *tokenToStore = [[FIRAppCheckToken alloc] initWithToken:@"token"
  111. expirationDate:[NSDate distantPast]
  112. receivedAtDate:[NSDate date]];
  113. __auto_type getPromise = [storage setToken:tokenToStore];
  114. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  115. XCTAssertNotNil(getPromise.error);
  116. XCTAssertEqualObjects(getPromise.error,
  117. [FIRAppCheckErrorUtil keychainErrorWithError:gulsKeychainError]);
  118. // 4. Verify storage mock.
  119. OCMVerifyAll(mockKeychainStorage);
  120. }
  121. - (void)testRemoveToken_KeychainError {
  122. // 1. Set up storage mock.
  123. id mockKeychainStorage = OCMClassMock([GULKeychainStorage class]);
  124. FIRAppCheckStorage *storage = [[FIRAppCheckStorage alloc] initWithAppName:self.appName
  125. appID:self.appID
  126. keychainStorage:mockKeychainStorage
  127. accessGroup:nil];
  128. // 2. Create and expect keychain error.
  129. NSError *gulsKeychainError = [NSError errorWithDomain:@"com.guls.keychain" code:-1 userInfo:nil];
  130. OCMExpect([mockKeychainStorage removeObjectForKey:[OCMArg any] accessGroup:[OCMArg any]])
  131. .andReturn([FBLPromise resolvedWith:gulsKeychainError]);
  132. // 3. Remove token and verify results.
  133. __auto_type getPromise = [storage setToken:nil];
  134. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  135. XCTAssertNotNil(getPromise.error);
  136. XCTAssertEqualObjects(getPromise.error,
  137. [FIRAppCheckErrorUtil keychainErrorWithError:gulsKeychainError]);
  138. // 4. Verify storage mock.
  139. OCMVerifyAll(mockKeychainStorage);
  140. }
  141. - (void)testSetTokenPerApp {
  142. // 1. Set token with a storage.
  143. FIRAppCheckToken *tokenToStore = [[FIRAppCheckToken alloc] initWithToken:@"token"
  144. expirationDate:[NSDate distantPast]
  145. receivedAtDate:[NSDate date]];
  146. FBLPromise *setPromise = [self.storage setToken:tokenToStore];
  147. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  148. XCTAssertEqualObjects(setPromise.value, tokenToStore);
  149. XCTAssertNil(setPromise.error);
  150. // 2. Try to read the token with another storage.
  151. FIRAppCheckStorage *storage2 =
  152. [[FIRAppCheckStorage alloc] initWithAppName:self.appName
  153. appID:@"1:200000000000:ios:aaaaaaaaaaaaaaaaaaaaaaaa"
  154. accessGroup:nil];
  155. __auto_type getPromise = [storage2 getToken];
  156. XCTAssert(FBLWaitForPromisesWithTimeout(0.5));
  157. XCTAssertNil(getPromise.value);
  158. XCTAssertNil(getPromise.error);
  159. }
  160. @end
  161. #endif // !TARGET_OS_MACCATALYST && !TARGET_OS_OSX
  162. #endif // !SWIFT_PACKAGE