Files
firebase-ios-sdk/FirebaseRemoteConfig/Tests/Unit/FIRRemoteConfigComponentTest.m
T

196 lines
7.7 KiB
Objective-C
Raw Normal View History

2019-08-21 14:26:41 -07:00
/*
* Copyright 2019 Google
*
* 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 "FirebaseCore/Sources/Private/FirebaseCoreInternal.h"
2019-08-21 14:26:41 -07:00
#import "FirebaseRemoteConfig/Sources/FIRRemoteConfigComponent.h"
2019-09-11 10:55:39 -07:00
#import "FirebaseRemoteConfig/Sources/Private/FIRRemoteConfig_Private.h"
2019-08-21 14:26:41 -07:00
#import "FirebaseRemoteConfig/Tests/Unit/RCNTestUtilities.h"
@interface FIRRemoteConfigComponentTest : XCTestCase
@end
@implementation FIRRemoteConfigComponentTest
- (void)tearDown {
[super tearDown];
// Clear out any apps that were called with `configure`.
[FIRApp resetApps];
}
- (void)testRCInstanceCreationAndCaching {
// Create the provider to vend Remote Config instances.
FIRRemoteConfigComponent *provider = [self providerForTest];
// Create a Remote Config instance from the provider.
NSString *sharedNamespace = @"some_namespace";
FIRRemoteConfig *config = [provider remoteConfigForNamespace:sharedNamespace];
XCTAssertNotNil(config);
// Fetch an instance with the same namespace - should be the same instance.
FIRRemoteConfig *sameConfig = [provider remoteConfigForNamespace:sharedNamespace];
XCTAssertNotNil(sameConfig);
XCTAssertEqual(config, sameConfig);
}
- (void)testRCSeparateInstancesForDifferentNamespaces {
// Create the provider to vend Remote Config instances.
FIRRemoteConfigComponent *provider = [self providerForTest];
// Create a Remote Config instance from the provider.
FIRRemoteConfig *config = [provider remoteConfigForNamespace:@"namespace1"];
XCTAssertNotNil(config);
// Fetch another instance with a different namespace.
FIRRemoteConfig *config2 = [provider remoteConfigForNamespace:@"namespace2"];
XCTAssertNotNil(config2);
XCTAssertNotEqual(config, config2);
}
- (void)testRCSeparateInstancesForDifferentApps {
FIRRemoteConfigComponent *provider = [self providerForTest];
// Create a Remote Config instance from the provider.
NSString *sharedNamespace = @"some_namespace";
FIRRemoteConfig *config = [provider remoteConfigForNamespace:sharedNamespace];
XCTAssertNotNil(config);
// Use a new app and new povider, ensure the instances with the same namespace are different.
NSString *secondAppName = [provider.app.name stringByAppendingString:@"2"];
FIRApp *secondApp = [[FIRApp alloc] initInstanceWithName:secondAppName
options:[self fakeOptions]];
FIRRemoteConfigComponent *separateProvider =
[[FIRRemoteConfigComponent alloc] initWithApp:secondApp];
FIRRemoteConfig *separateConfig = [separateProvider remoteConfigForNamespace:sharedNamespace];
XCTAssertNotNil(separateConfig);
XCTAssertNotEqual(config, separateConfig);
}
- (void)testInitialization {
// Explicitly instantiate the component here in case the providerForTest ever changes to mock
// something.
NSString *appName = [self generatedTestAppName];
FIRApp *app = [[FIRApp alloc] initInstanceWithName:appName options:[self fakeOptions]];
FIRRemoteConfigComponent *provider = [[FIRRemoteConfigComponent alloc] initWithApp:app];
XCTAssertNotNil(provider);
XCTAssertNotNil(provider.app);
}
- (void)testRegistersAsLibrary {
XCTAssertEqual([FIRRemoteConfigComponent componentsToRegister].count, 1);
// Configure a test FIRApp for fetching an instance of the FIRRemoteConfigProvider.
NSString *appName = [self generatedTestAppName];
[FIRApp configureWithName:appName options:[self fakeOptions]];
FIRApp *app = [FIRApp appNamed:appName];
// Attempt to fetch the component and verify it's a valid instance.
id<FIRRemoteConfigProvider> provider = FIR_COMPONENT(FIRRemoteConfigProvider, app.container);
XCTAssertNotNil(provider);
// Ensure that the instance that comes from the container is cached.
id<FIRRemoteConfigProvider> sameProvider = FIR_COMPONENT(FIRRemoteConfigProvider, app.container);
XCTAssertNotNil(sameProvider);
XCTAssertEqual(provider, sameProvider);
}
- (void)testThrowsWithEmptyGoogleAppID {
FIROptions *options = [self fakeOptions];
options.googleAppID = @"";
// Create the provider to vend Remote Config instances.
NSString *appName = [self generatedTestAppName];
FIRApp *app = [[FIRApp alloc] initInstanceWithName:appName options:options];
FIRRemoteConfigComponent *component = [[FIRRemoteConfigComponent alloc] initWithApp:app];
// Creating a Remote Config instance should fail since the googleAppID is empty.
XCTAssertThrows([component remoteConfigForNamespace:@"some_namespace"]);
}
- (void)testThrowsWithNilGoogleAppID {
FIROptions *options = [self fakeOptions];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
options.googleAppID = nil;
#pragma clang diagnostic pop
// Create the provider to vend Remote Config instances.
NSString *appName = [self generatedTestAppName];
FIRApp *app = [[FIRApp alloc] initInstanceWithName:appName options:options];
FIRRemoteConfigComponent *component = [[FIRRemoteConfigComponent alloc] initWithApp:app];
// Creating a Remote Config instance should fail since the googleAppID is nil.
XCTAssertThrows([component remoteConfigForNamespace:@"some_namespace"]);
}
- (void)testThrowsWithEmptyGCMSenderID {
FIROptions *options = [self fakeOptions];
options.GCMSenderID = @"";
// Create the provider to vend Remote Config instances.
NSString *appName = [self generatedTestAppName];
FIRApp *app = [[FIRApp alloc] initInstanceWithName:appName options:options];
FIRRemoteConfigComponent *component = [[FIRRemoteConfigComponent alloc] initWithApp:app];
// Creating a Remote Config instance should fail since the GCMSenderID is empty.
XCTAssertThrows([component remoteConfigForNamespace:@"some_namespace"]);
}
- (void)testThrowsWithNilGCMSenderID {
FIROptions *options = [self fakeOptions];
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
options.GCMSenderID = nil;
#pragma clang diagnostic pop
// Create the provider to vend Remote Config instances.
NSString *appName = [self generatedTestAppName];
FIRApp *app = [[FIRApp alloc] initInstanceWithName:appName options:options];
FIRRemoteConfigComponent *component = [[FIRRemoteConfigComponent alloc] initWithApp:app];
// Creating a Remote Config instance should fail since the GCMSenderID is nil.
XCTAssertThrows([component remoteConfigForNamespace:@"some_namespace"]);
}
#pragma mark - Helpers
- (FIROptions *)fakeOptions {
FIROptions *options = [[FIROptions alloc] initWithGoogleAppID:@"1:123:ios:123abc"
GCMSenderID:@"correct_gcm_sender_id"];
options.APIKey = @"api-key";
options.projectID = @"project-id";
return options;
2019-08-21 14:26:41 -07:00
}
- (NSString *)generatedTestAppName {
return [RCNTestUtilities generatedTestAppNameForTest:self.name];
}
- (FIRRemoteConfigComponent *)providerForTest {
// Create the provider to vend Remote Config instances.
NSString *appName = [self generatedTestAppName];
FIROptions *options = [[self fakeOptions] copy];
FIRApp *app = [[FIRApp alloc] initInstanceWithName:appName options:options];
FIRRemoteConfigComponent *provider = [[FIRRemoteConfigComponent alloc] initWithApp:app];
XCTAssertNotNil(provider);
XCTAssert(provider.app.options.googleAppID.length != 0);
XCTAssert(provider.app.options.GCMSenderID.length != 0);
return provider;
}
@end