| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- /*
- * Copyright 2020 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 <XCTest/XCTest.h>
- #import <OCMock/OCMock.h>
- #import <TargetConditionals.h>
- #import "FirebaseAppCheck/Sources/Core/TokenRefresh/FIRAppCheckTokenRefresher.h"
- #import "FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheck.h"
- #import "FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckProviderFactory.h"
- #import "FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRAppCheckToken.h"
- #import "FirebaseAppCheck/Interop/FIRAppCheckInterop.h"
- #import "FirebaseAppCheck/Interop/FIRAppCheckTokenResultInterop.h"
- #import "FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRDeviceCheckProvider.h"
- #import "FirebaseAppCheck/Sources/Public/FirebaseAppCheck/FIRDeviceCheckProviderFactory.h"
- #import "FirebaseCore/Extension/FirebaseCoreInternal.h"
- NS_ASSUME_NONNULL_BEGIN
- #if FIR_DEVICE_CHECK_SUPPORTED_TARGETS
- @interface DummyAppCheckProvider : NSObject <FIRAppCheckProvider>
- @end
- @implementation DummyAppCheckProvider
- - (void)getTokenWithCompletion:(void (^)(FIRAppCheckToken *_Nullable, NSError *_Nullable))handler {
- FIRAppCheckToken *token = [[FIRAppCheckToken alloc] initWithToken:@"Token"
- expirationDate:[NSDate distantFuture]];
- handler(token, nil);
- }
- @end
- @interface AppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory>
- @end
- @implementation AppCheckProviderFactory
- - (nullable id<FIRAppCheckProvider>)createProviderWithApp:(nonnull FIRApp *)app {
- return [[DummyAppCheckProvider alloc] init];
- }
- @end
- @interface FIRAppCheckIntegrationTests : XCTestCase
- @property(nonatomic, nullable) id mockProviderFactory;
- @property(nonatomic, nullable) id mockAppCheckProvider;
- @property(nonatomic, nullable) id mockTokenRefresher;
- - (void)testDefaultAppCheckProvider FIR_DEVICE_CHECK_PROVIDER_AVAILABILITY;
- @end
- @implementation FIRAppCheckIntegrationTests
- - (void)setUp {
- [super setUp];
- // Disable token refresher to avoid any unexpected async tasks being scheduled.
- [self disableTokenRefresher];
- self.mockAppCheckProvider = OCMProtocolMock(@protocol(FIRAppCheckProvider));
- self.mockProviderFactory = OCMProtocolMock(@protocol(FIRAppCheckProviderFactory));
- }
- - (void)tearDown {
- [FIRApp resetApps];
- if (@available(iOS 11.0, macOS 10.15, macCatalyst 13.0, tvOS 11.0, watchOS 9.0, *)) {
- // Recover default provider factory.
- [FIRAppCheck setAppCheckProviderFactory:[[FIRDeviceCheckProviderFactory alloc] init]];
- }
- [self.mockTokenRefresher stopMocking];
- self.mockTokenRefresher = nil;
- [self.mockProviderFactory stopMocking];
- self.mockProviderFactory = nil;
- [self.mockAppCheckProvider stopMocking];
- self.mockAppCheckProvider = nil;
- [super tearDown];
- }
- - (void)testDefaultAppCheckProvider {
- NSString *appName = @"testDefaultAppCheckProvider";
- // 1. Expect FIRDeviceCheckProvider to be instantiated.
- id deviceCheckProviderMock = OCMClassMock([FIRDeviceCheckProvider class]);
- id appValidationArg = [OCMArg checkWithBlock:^BOOL(FIRApp *app) {
- XCTAssertEqualObjects(app.name, appName);
- return YES;
- }];
- OCMStub([deviceCheckProviderMock alloc]).andReturn(deviceCheckProviderMock);
- OCMExpect([deviceCheckProviderMock initWithApp:appValidationArg])
- .andReturn(deviceCheckProviderMock);
- // 2. Configure Firebase
- [self configureAppWithName:appName];
- FIRApp *app = [FIRApp appNamed:appName];
- XCTAssertNotNil(FIR_COMPONENT(FIRAppCheckInterop, app.container));
- // 3. Verify
- OCMVerifyAll(deviceCheckProviderMock);
- // 4. Cleanup
- // Recover default provider factory.
- [FIRAppCheck setAppCheckProviderFactory:[[FIRDeviceCheckProviderFactory alloc] init]];
- [deviceCheckProviderMock stopMocking];
- }
- // Tests that use the Keychain require a host app and Swift Package Manager
- // does not support adding a host app to test targets.
- #if !SWIFT_PACKAGE
- // Skip keychain tests on Catalyst and macOS. Tests are skipped because they
- // involve interactions with the keychain that require a provisioning profile.
- // See go/firebase-macos-keychain-popups for more details.
- #if !TARGET_OS_MACCATALYST && !TARGET_OS_OSX
- - (void)testSetAppCheckProviderFactoryWithDefaultApp {
- NSString *appName = kFIRDefaultAppName;
- // 1. Set App Check Provider Factory.
- [FIRAppCheck setAppCheckProviderFactory:self.mockProviderFactory];
- // 2. Expect factory to be used on [FIRApp configure].
- id appValidationArg = [OCMArg checkWithBlock:^BOOL(FIRApp *app) {
- XCTAssertEqual(app.name, appName);
- return YES;
- }];
- OCMExpect([self.mockProviderFactory createProviderWithApp:appValidationArg])
- .andReturn(self.mockAppCheckProvider);
- // 3. Configure FIRApp.
- [self configureAppWithName:appName];
- // 4. Expect App Check Provider to be called on getToken.
- FIRAppCheckToken *fakeToken = [[FIRAppCheckToken alloc] initWithToken:@"token"
- expirationDate:[NSDate distantFuture]];
- id completionBlockArg = [OCMArg invokeBlockWithArgs:fakeToken, [NSNull null], nil];
- OCMExpect([self.mockAppCheckProvider getTokenWithCompletion:completionBlockArg]);
- // 5. Call getToken and check the result.
- FIRApp *app = [FIRApp appNamed:appName];
- id<FIRAppCheckInterop> appCheck = FIR_COMPONENT(FIRAppCheckInterop, app.container);
- XCTestExpectation *completionExpectation =
- [self expectationWithDescription:@"completionExpectation"];
- [appCheck getTokenForcingRefresh:YES
- completion:^(id<FIRAppCheckTokenResultInterop> tokenResult) {
- [completionExpectation fulfill];
- XCTAssertNil(tokenResult.error);
- XCTAssertNotNil(tokenResult);
- XCTAssertEqualObjects(tokenResult.token, fakeToken.token);
- XCTAssertNil(tokenResult.error);
- }];
- [self waitForExpectations:@[ completionExpectation ] timeout:0.5];
- // 6. Verify mocks
- OCMVerifyAll(self.mockProviderFactory);
- OCMVerifyAll(self.mockAppCheckProvider);
- }
- #endif // !TARGET_OS_MACCATALYST && !TARGET_OS_OSX
- #endif // !SWIFT_PACKAGE
- #pragma mark - Helpers
- - (void)configureAppWithName:(NSString *)appName {
- FIROptions *options =
- [[FIROptions alloc] initWithGoogleAppID:@"1:100000000000:ios:aaaaaaaaaaaaaaaaaaaaaaaa"
- GCMSenderID:@"sender_id"];
- [FIRApp configureWithName:appName options:options];
- }
- - (void)usageExample {
- // Set a custom app check provider factory for the default FIRApp.
- [FIRAppCheck setAppCheckProviderFactory:[[AppCheckProviderFactory alloc] init]];
- [FIRApp configure];
- FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:@"path"];
- [FIRApp configureWithName:@"AppName" options:options];
- FIRApp *defaultApp = [FIRApp defaultApp];
- id<FIRAppCheckInterop> defaultAppCheck = FIR_COMPONENT(FIRAppCheckInterop, defaultApp.container);
- [defaultAppCheck getTokenForcingRefresh:NO
- completion:^(id<FIRAppCheckTokenResultInterop> tokenResult) {
- NSLog(@"Token: %@", tokenResult.token);
- if (tokenResult.error) {
- NSLog(@"Error: %@", tokenResult.error);
- }
- }];
- }
- - (void)disableTokenRefresher {
- self.mockTokenRefresher = OCMClassMock([FIRAppCheckTokenRefresher class]);
- OCMStub([self.mockTokenRefresher alloc]).andReturn(self.mockTokenRefresher);
- OCMStub([self.mockTokenRefresher initWithRefreshResult:[OCMArg any] settings:[OCMArg any]])
- .andReturn(self.mockTokenRefresher);
- }
- @end
- #endif // FIR_DEVICE_CHECK_SUPPORTED_TARGETS
- NS_ASSUME_NONNULL_END
|