FIRAppCheckStorageTests.m 7.8 KB

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