Skip to content

Commit db00fad

Browse files
committed
Inject infoDictionary to fix flakey tests.
1 parent 17f5a9b commit db00fad

File tree

2 files changed

+43
-26
lines changed

2 files changed

+43
-26
lines changed

Example/Core/Tests/FIROptionsTest.m

Lines changed: 28 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,9 @@ - (void)testAnalyticsOptions_combinatorial {
398397
if (![optionsMeasurementEnabled isEqual:[NSNull null]]) {
399398
optionsDictionary[kFIRIsMeasurementEnabled] = optionsMeasurementEnabled;
400399
}
400+
401+
// Temporarily mock the mainBundle. This should be improved in the future to prevent
402+
// collisions with other tests interacting with the mainBundle.
401403
FIROptions *options =
402404
[[FIROptions alloc] initInternalWithOptionsDictionary:optionsDictionary];
403405
if (![uniqueOptionsCombinations containsObject:optionsDictionary]) {
@@ -415,7 +417,8 @@ - (void)testAnalyticsOptions_combinatorial {
415417
if (![mainMeasurementEnabled isEqual:[NSNull null]]) {
416418
mainDictionary[kFIRIsMeasurementEnabled] = mainMeasurementEnabled;
417419
}
418-
OCMExpect([mainBundleMock infoDictionary]).andReturn(mainDictionary);
420+
421+
// Add mainDictionary to uniqueMainCombinations if it isn't included yet.
419422
if (![uniqueMainCombinations containsObject:mainDictionary]) {
420423
[uniqueMainCombinations addObject:mainDictionary];
421424
}
@@ -427,7 +430,10 @@ - (void)testAnalyticsOptions_combinatorial {
427430
NSMutableDictionary *expectedAnalyticsOptions =
428431
[[NSMutableDictionary alloc] initWithDictionary:optionsDictionary];
429432
[expectedAnalyticsOptions addEntriesFromDictionary:mainDictionary];
430-
XCTAssertEqualObjects(options.analyticsOptionsDictionary, expectedAnalyticsOptions);
433+
434+
NSDictionary *analyticsOptions =
435+
[options analyticsOptionsDictionaryWithInfoDictionary:mainDictionary];
436+
XCTAssertEqualObjects(analyticsOptions, expectedAnalyticsOptions);
431437

432438
combinationCount++;
433439
}

Firebase/Core/FIROptions.m

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,19 @@ @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:
76+
(NSDictionary *)infoDictionary;
77+
7078
/**
7179
* Throw exception if editing is locked when attempting to modify an option.
7280
*/
@@ -346,16 +354,15 @@ - (void)setBundleID:(NSString *)bundleID {
346354

347355
#pragma mark - Internal instance methods
348356

349-
- (NSDictionary *)analyticsOptionsDictionary {
357+
- (NSDictionary *)analyticsOptionsDictionaryWithInfoDictionary:(NSDictionary *)infoDictionary {
350358
dispatch_once(&_createAnalyticsOptionsDictionaryOnce, ^{
351359
NSMutableDictionary *tempAnalyticsOptions = [[NSMutableDictionary alloc] init];
352-
NSDictionary *mainInfoDictionary = [NSBundle mainBundle].infoDictionary;
353360
NSArray *measurementKeys = @[
354361
kFIRIsMeasurementEnabled, kFIRIsAnalyticsCollectionEnabled,
355362
kFIRIsAnalyticsCollectionDeactivated
356363
];
357364
for (NSString *key in measurementKeys) {
358-
id value = mainInfoDictionary[key] ?: self.optionsDictionary[key] ?: nil;
365+
id value = infoDictionary[key] ?: self.optionsDictionary[key] ?: nil;
359366
if (!value) {
360367
continue;
361368
}
@@ -366,6 +373,10 @@ - (NSDictionary *)analyticsOptionsDictionary {
366373
return _analyticsOptionsDictionary;
367374
}
368375

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

0 commit comments

Comments
 (0)