Skip to content

Commit 2c0cacd

Browse files
authored
Inject infoDictionary to fix flakey tests. (#664)
* Inject infoDictionary to fix flakey tests. * Remove outdated comment, update format.
1 parent b15283b commit 2c0cacd

File tree

2 files changed

+40
-26
lines changed

2 files changed

+40
-26
lines changed

Example/Core/Tests/FIROptionsTest.m

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@
2525

2626
@interface FIROptions (Test)
2727

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

3031
@end
3132

@@ -263,22 +264,20 @@ - (void)testAnalyticsConstants {
263264
}
264265

265266
- (void)testAnalyticsOptions {
266-
id mainBundleMock = OCMPartialMock([NSBundle mainBundle]);
267-
268267
// No keys anywhere.
269268
NSDictionary *optionsDictionary = nil;
270269
FIROptions *options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
271270
NSDictionary *mainDictionary = nil;
272-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
273271
NSDictionary *expectedAnalyticsOptions = @{};
274-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
272+
NSDictionary *analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:nil];
273+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
275274

276275
optionsDictionary = @{};
277276
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
278277
mainDictionary = @{};
279-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
280278
expectedAnalyticsOptions = @{};
281-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
279+
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
280+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
282281

283282
// Main has no keys.
284283
optionsDictionary = @{
@@ -288,9 +287,9 @@ - (void)testAnalyticsOptions {
288287
};
289288
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
290289
mainDictionary = @{};
291-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
292290
expectedAnalyticsOptions = optionsDictionary;
293-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
291+
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
292+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
294293

295294
// Main overrides all the keys.
296295
optionsDictionary = @{
@@ -304,9 +303,9 @@ - (void)testAnalyticsOptions {
304303
kFIRIsAnalyticsCollectionEnabled : @NO,
305304
kFIRIsMeasurementEnabled : @NO
306305
};
307-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
308306
expectedAnalyticsOptions = mainDictionary;
309-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
307+
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
308+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
310309

311310
// Keys exist only in main.
312311
optionsDictionary = @{};
@@ -316,9 +315,9 @@ - (void)testAnalyticsOptions {
316315
kFIRIsAnalyticsCollectionEnabled : @YES,
317316
kFIRIsMeasurementEnabled : @YES
318317
};
319-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
320318
expectedAnalyticsOptions = mainDictionary;
321-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
319+
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
320+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
322321

323322
// Main overrides single keys.
324323
optionsDictionary = @{
@@ -328,13 +327,13 @@ - (void)testAnalyticsOptions {
328327
};
329328
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
330329
mainDictionary = @{ kFIRIsAnalyticsCollectionDeactivated : @NO };
331-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
332330
expectedAnalyticsOptions = @{
333331
kFIRIsAnalyticsCollectionDeactivated : @NO, // override
334332
kFIRIsAnalyticsCollectionEnabled : @YES,
335333
kFIRIsMeasurementEnabled : @YES
336334
};
337-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
335+
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
336+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
338337

339338
optionsDictionary = @{
340339
kFIRIsAnalyticsCollectionDeactivated : @YES,
@@ -343,13 +342,13 @@ - (void)testAnalyticsOptions {
343342
};
344343
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
345344
mainDictionary = @{ kFIRIsAnalyticsCollectionEnabled : @NO };
346-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
347345
expectedAnalyticsOptions = @{
348346
kFIRIsAnalyticsCollectionDeactivated : @YES,
349347
kFIRIsAnalyticsCollectionEnabled : @NO, // override
350348
kFIRIsMeasurementEnabled : @YES
351349
};
352-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
350+
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
351+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
353352

354353
optionsDictionary = @{
355354
kFIRIsAnalyticsCollectionDeactivated : @YES,
@@ -358,18 +357,18 @@ - (void)testAnalyticsOptions {
358357
};
359358
options = [[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
360359
mainDictionary = @{ kFIRIsMeasurementEnabled : @NO };
361-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
362360
expectedAnalyticsOptions = @{
363361
kFIRIsAnalyticsCollectionDeactivated : @YES,
364362
kFIRIsAnalyticsCollectionEnabled : @YES,
365363
kFIRIsMeasurementEnabled : @NO // override
366364
};
367-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
365+
analyticsOptions = [options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
366+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
368367
}
369368

370369
- (void)testAnalyticsOptions_combinatorial {
371370
// Complete combinatorial test.
372-
id mainBundleMock = OCMPartialMock([NSBundle mainBundle]);
371+
373372
// Possible values for the flags in the plist, where NSNull means the flag is not present.
374373
NSArray *values = @[ [NSNull null], @NO, @YES ];
375374

@@ -398,6 +397,7 @@ - (void)testAnalyticsOptions_combinatorial {
398397
if (![optionsMeasurementEnabled isEqual:[NSNull null]]) {
399398
optionsDictionary[kFIRIsMeasurementEnabled] = optionsMeasurementEnabled;
400399
}
400+
401401
FIROptions *options =
402402
[[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
403403
if (![uniqueOptionsCombinations containsObject:optionsDictionary]) {
@@ -415,7 +415,8 @@ - (void)testAnalyticsOptions_combinatorial {
415415
if (![mainMeasurementEnabled isEqual:[NSNull null]]) {
416416
mainDictionary[kFIRIsMeasurementEnabled] = mainMeasurementEnabled;
417417
}
418-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
418+
419+
// Add mainDictionary to uniqueMainCombinations if it isn't included yet.
419420
if (![uniqueMainCombinations containsObject:mainDictionary]) {
420421
[uniqueMainCombinations addObject:mainDictionary];
421422
}
@@ -427,7 +428,10 @@ - (void)testAnalyticsOptions_combinatorial {
427428
NSMutableDictionary *expectedAnalyticsOptions =
428429
[[NSMutableDictionary alloc] initWithDictionary:optionsDictionary];
429430
[expectedAnalyticsOptions addEntriesFromDictionary:mainDictionary];
430-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
431+
432+
NSDictionary *analyticsOptions =
433+
[options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
434+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
431435

432436
combinationCount++;
433437
}

Firebase/Core/FIROptions.m

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,18 @@ @interface FIROptions ()
6262
@property(nonatomic, readwrite) NSMutableDictionary *optionsDictionary;
6363

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

71+
/**
72+
* Combination of analytics options from both the infoDictionary and the GoogleService-Info.plist.
73+
* Values which are present in the infoDictionary override values from the GoogleService-Info.plist.
74+
*/
75+
- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary;
76+
7077
/**
7178
* Throw exception if editing is locked when attempting to modify an option.
7279
*/
@@ -346,16 +353,15 @@ - (void)setBundleID:(NSString *)bundleID {
346353

347354
#pragma mark - Internal instance methods
348355

349-
- (NSDictionary *)analyticsOptionsDictionary {
356+
- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary {
350357
dispatch_once(&_createAnalyticsOptionsDictionaryOnce, ^{
351358
NSMutableDictionary *tempAnalyticsOptions = [[NSMutableDictionary alloc] init];
352-
NSDictionary *mainInfoDictionary = [NSBundle mainBundle].infoDictionary;
353359
NSArray *measurementKeys = @[
354360
kFIRIsMeasurementEnabled, kFIRIsAnalyticsCollectionEnabled,
355361
kFIRIsAnalyticsCollectionDeactivated
356362
];
357363
for (NSString *key in measurementKeys) {
358-
id value = mainInfoDictionary[key] ?: self.optionsDictionary[key] ?: nil;
364+
id value = infoDictionary[key] ?: self.optionsDictionary[key] ?: nil;
359365
if (!value) {
360366
continue;
361367
}
@@ -366,6 +372,10 @@ - (NSDictionary *)analyticsOptionsDictionary {
366372
return _analyticsOptionsDictionary;
367373
}
368374

375+
- (NSDictionary *)analyticsOptionsDictionary {
376+
return [self analyticsOptionsDictionaryWithInfoDictionary:[NSBundle mainBundle].infoDictionary];
377+
}
378+
369379
/**
370380
* Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in
371381
* GoogleService-Info.plist. This uses the old plist flag IS_MEASUREMENT_ENABLED, which should still

0 commit comments

Comments
 (0)