Skip to content

Inject infoDictionary to fix flakey tests. #664

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 15, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 26 additions & 22 deletions Example/Core/Tests/FIROptionsTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@

@interface FIROptions (Test)

@property(nonatomic, readonly) NSDictionary *analyticsOptionsDictionary;
- (nullable NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:
(nullable NSDictionary *)infoDictionary;

@end

Expand Down Expand Up @@ -263,22 +264,20 @@ - (void)testAnalyticsConstants {
}

- (void)testAnalyticsOptions {
id mainBundleMock = OCMPartialMock([NSBundle mainBundle]);

// No keys anywhere.
NSDictionary *optionsDictionary = nil;
FIROptions *options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
NSDictionary *mainDictionary = nil;
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
NSDictionary *expectedAnalyticsOptions = @{};
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
NSDictionary *analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:nil];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

optionsDictionary = @{};
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
mainDictionary = @{};
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
expectedAnalyticsOptions = @{};
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

// Main has no keys.
optionsDictionary = @{
Expand All @@ -288,9 +287,9 @@ - (void)testAnalyticsOptions {
};
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
mainDictionary = @{};
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
expectedAnalyticsOptions = optionsDictionary;
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

// Main overrides all the keys.
optionsDictionary = @{
Expand All @@ -304,9 +303,9 @@ - (void)testAnalyticsOptions {
kFIRIsAnalyticsCollectionEnabled : @NO,
kFIRIsMeasurementEnabled : @NO
};
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
expectedAnalyticsOptions = mainDictionary;
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

// Keys exist only in main.
optionsDictionary = @{};
Expand All @@ -316,9 +315,9 @@ - (void)testAnalyticsOptions {
kFIRIsAnalyticsCollectionEnabled : @YES,
kFIRIsMeasurementEnabled : @YES
};
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
expectedAnalyticsOptions = mainDictionary;
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

// Main overrides single keys.
optionsDictionary = @{
Expand All @@ -328,13 +327,13 @@ - (void)testAnalyticsOptions {
};
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
mainDictionary = @{ kFIRIsAnalyticsCollectionDeactivated : @NO };
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
expectedAnalyticsOptions = @{
kFIRIsAnalyticsCollectionDeactivated : @NO, // override
kFIRIsAnalyticsCollectionEnabled : @YES,
kFIRIsMeasurementEnabled : @YES
};
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

optionsDictionary = @{
kFIRIsAnalyticsCollectionDeactivated : @YES,
Expand All @@ -343,13 +342,13 @@ - (void)testAnalyticsOptions {
};
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
mainDictionary = @{ kFIRIsAnalyticsCollectionEnabled : @NO };
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
expectedAnalyticsOptions = @{
kFIRIsAnalyticsCollectionDeactivated : @YES,
kFIRIsAnalyticsCollectionEnabled : @NO, // override
kFIRIsMeasurementEnabled : @YES
};
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

optionsDictionary = @{
kFIRIsAnalyticsCollectionDeactivated : @YES,
Expand All @@ -358,18 +357,18 @@ - (void)testAnalyticsOptions {
};
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
mainDictionary = @{ kFIRIsMeasurementEnabled : @NO };
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
expectedAnalyticsOptions = @{
kFIRIsAnalyticsCollectionDeactivated : @YES,
kFIRIsAnalyticsCollectionEnabled : @YES,
kFIRIsMeasurementEnabled : @NO // override
};
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
}

- (void)testAnalyticsOptions_combinatorial {
// Complete combinatorial test.
id mainBundleMock = OCMPartialMock([NSBundle mainBundle]);

// Possible values for the flags in the plist, where NSNull means the flag is not present.
NSArray *values = @[ [NSNull null], @NO, @YES ];

Expand Down Expand Up @@ -398,6 +397,7 @@ - (void)testAnalyticsOptions_combinatorial {
if (![optionsMeasurementEnabled isEqual:[NSNull null]]) {
optionsDictionary[kFIRIsMeasurementEnabled] = optionsMeasurementEnabled;
}

FIROptions *options =
[[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
if (![uniqueOptionsCombinations containsObject:optionsDictionary]) {
Expand All @@ -415,7 +415,8 @@ - (void)testAnalyticsOptions_combinatorial {
if (![mainMeasurementEnabled isEqual:[NSNull null]]) {
mainDictionary[kFIRIsMeasurementEnabled] = mainMeasurementEnabled;
}
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);

// Add mainDictionary to uniqueMainCombinations if it isn't included yet.
if (![uniqueMainCombinations containsObject:mainDictionary]) {
[uniqueMainCombinations addObject:mainDictionary];
}
Expand All @@ -427,7 +428,10 @@ - (void)testAnalyticsOptions_combinatorial {
NSMutableDictionary *expectedAnalyticsOptions =
[[NSMutableDictionary alloc] initWithDictionary:optionsDictionary];
[expectedAnalyticsOptions addEntriesFromDictionary:mainDictionary];
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);

NSDictionary *analyticsOptions =
[options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);

combinationCount++;
}
Expand Down
18 changes: 14 additions & 4 deletions Firebase/Core/FIROptions.m
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,18 @@ @interface FIROptions ()
@property(nonatomic, readwrite) NSMutableDictionary *optionsDictionary;

/**
* Combination of analytics options from both the main plist and the GoogleService-Info.plist.
* Calls `analyticsOptionsDictionaryWithInfoDictionary:` using [NSBundle mainBundle].infoDictionary.
* It combines analytics options from both the infoDictionary and the GoogleService-Info.plist.
* Values which are present in the main plist override values from the GoogleService-Info.plist.
*/
@property(nonatomic, readonly) NSDictionary *analyticsOptionsDictionary;

/**
* Combination of analytics options from both the infoDictionary and the GoogleService-Info.plist.
* Values which are present in the infoDictionary override values from the GoogleService-Info.plist.
*/
- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary;

/**
* Throw exception if editing is locked when attempting to modify an option.
*/
Expand Down Expand Up @@ -346,16 +353,15 @@ - (void)setBundleID:(NSString *)bundleID {

#pragma mark - Internal instance methods

- (NSDictionary *)analyticsOptionsDictionary {
- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary {
dispatch_once(&_createAnalyticsOptionsDictionaryOnce, ^{
NSMutableDictionary *tempAnalyticsOptions = [[NSMutableDictionary alloc] init];
NSDictionary *mainInfoDictionary = [NSBundle mainBundle].infoDictionary;
NSArray *measurementKeys = @[
kFIRIsMeasurementEnabled, kFIRIsAnalyticsCollectionEnabled,
kFIRIsAnalyticsCollectionDeactivated
];
for (NSString *key in measurementKeys) {
id value = mainInfoDictionary[key] ?: self.optionsDictionary[key] ?: nil;
id value = infoDictionary[key] ?: self.optionsDictionary[key] ?: nil;
if (!value) {
continue;
}
Expand All @@ -366,6 +372,10 @@ - (NSDictionary *)analyticsOptionsDictionary {
return _analyticsOptionsDictionary;
}

- (NSDictionary *)analyticsOptionsDictionary {
return [self analyticsOptionsDictionaryWithInfoDictionary:[NSBundle mainBundle].infoDictionary];
}

/**
* Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in
* GoogleService-Info.plist. This uses the old plist flag IS_MEASUREMENT_ENABLED, which should still
Expand Down