FPRRemoteConfigFlagsTest.m 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204
  1. // Copyright 2020 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #import <GoogleUtilities/GULUserDefaults.h>
  15. #import <XCTest/XCTest.h>
  16. #import "FirebasePerformance/Sources/Configurations/FPRConfigurations+Private.h"
  17. #import "FirebasePerformance/Sources/Configurations/FPRConfigurations.h"
  18. #import "FirebasePerformance/Sources/Configurations/FPRRemoteConfigFlags+Private.h"
  19. #import "FirebasePerformance/Sources/Configurations/FPRRemoteConfigFlags.h"
  20. #import "FirebasePerformance/Tests/Unit/Configurations/FPRFakeRemoteConfig.h"
  21. static NSInteger const kLogSource = 462; // LogRequest_LogSource_Fireperf
  22. @interface FPRRemoteConfigFlagsTest : XCTestCase
  23. @end
  24. @implementation FPRRemoteConfigFlagsTest
  25. /** Validates if the instance creation works. */
  26. - (void)testInstanceCreation {
  27. XCTAssertNotNil([FPRRemoteConfigFlags sharedInstance]);
  28. #pragma clang diagnostic push
  29. #pragma clang diagnostic ignored "-Wnonnull"
  30. XCTAssertNotNil([[FPRRemoteConfigFlags alloc] initWithRemoteConfig:nil]);
  31. #pragma clang diagnostic pop
  32. }
  33. /** Validate the singleton nature of the object. */
  34. - (void)testObjectEquality {
  35. XCTAssertEqual([FPRRemoteConfigFlags sharedInstance], [FPRRemoteConfigFlags sharedInstance]);
  36. }
  37. - (void)testCacheResetAfterEverySuccessfulFetch {
  38. // Initialize the remote config and config flags
  39. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  40. FPRRemoteConfigFlags *configFlags =
  41. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  42. configFlags.userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  43. // Provide expected remote config values
  44. FIRRemoteConfigValue *boolRCValueFromRemote =
  45. [[FIRRemoteConfigValue alloc] initWithData:[@"true" dataUsingEncoding:NSUTF8StringEncoding]
  46. source:FIRRemoteConfigSourceRemote];
  47. [remoteConfig.configValues setObject:boolRCValueFromRemote forKey:@"fpr_enabled"];
  48. FIRRemoteConfigValue *floatRCValueFromRemote =
  49. [[FIRRemoteConfigValue alloc] initWithData:[@"0.1" dataUsingEncoding:NSUTF8StringEncoding]
  50. source:FIRRemoteConfigSourceRemote];
  51. [remoteConfig.configValues setObject:floatRCValueFromRemote
  52. forKey:@"fpr_vc_session_sampling_rate"];
  53. // Trigger the RC config fetch
  54. remoteConfig.fetchStatus = FIRRemoteConfigFetchStatusSuccess;
  55. remoteConfig.lastFetchTime = nil;
  56. configFlags.appStartConfigFetchDelayInSeconds = 0.0;
  57. [configFlags update];
  58. // Verify the expected remote config values
  59. NSString *fprEnabledConfigKey =
  60. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_enabled"];
  61. XCTAssertNotNil([configFlags.userDefaults objectForKey:fprEnabledConfigKey]);
  62. XCTAssertEqual([[configFlags.userDefaults objectForKey:fprEnabledConfigKey] boolValue], true);
  63. NSString *fprSamplingConfigKey =
  64. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_session_sampling_rate"];
  65. XCTAssertNotNil([configFlags.userDefaults objectForKey:fprSamplingConfigKey]);
  66. XCTAssertEqualWithAccuracy(
  67. [[configFlags.userDefaults objectForKey:fprSamplingConfigKey] floatValue], 0.1, 0.001);
  68. // Provide another expected remote config values (different than what was previously provided)
  69. [remoteConfig.configValues removeAllObjects];
  70. FIRRemoteConfigValue *floatRCValueFromRemote2 =
  71. [[FIRRemoteConfigValue alloc] initWithData:[@"0.2" dataUsingEncoding:NSUTF8StringEncoding]
  72. source:FIRRemoteConfigSourceRemote];
  73. [remoteConfig.configValues setObject:floatRCValueFromRemote2
  74. forKey:@"fpr_vc_session_sampling_rate"];
  75. // Retrigger the RC config fetch
  76. remoteConfig.fetchStatus = FIRRemoteConfigFetchStatusSuccess;
  77. remoteConfig.lastFetchTime = nil;
  78. [configFlags update];
  79. // Verify the new expected remote config values
  80. XCTAssertNil([configFlags.userDefaults objectForKey:fprEnabledConfigKey]);
  81. XCTAssertNotNil([configFlags.userDefaults objectForKey:fprSamplingConfigKey]);
  82. XCTAssertEqualWithAccuracy(
  83. [[configFlags.userDefaults objectForKey:fprSamplingConfigKey] floatValue], 0.2, 0.001);
  84. }
  85. /** Validate the configuration update happens. */
  86. - (void)testConfigUpdate {
  87. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  88. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusNoFetchYet;
  89. remoteConfig.lastFetchTime = nil;
  90. FPRRemoteConfigFlags *configFlags =
  91. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  92. remoteConfig.fetchStatus = FIRRemoteConfigFetchStatusSuccess;
  93. configFlags.appStartConfigFetchDelayInSeconds = 0.0;
  94. [configFlags update];
  95. XCTAssertNotNil(configFlags.lastFetchedTime);
  96. }
  97. /** Validate the configuration update does not happen during app start. */
  98. - (void)testConfigFetchDoesNotHappenDuringAppStart {
  99. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  100. remoteConfig.lastFetchTime = nil;
  101. NSTimeInterval appStartConfigFetchDelay = 5.0;
  102. FPRRemoteConfigFlags *configFlags =
  103. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  104. remoteConfig.lastFetchTime = nil;
  105. configFlags.lastFetchedTime = nil;
  106. configFlags.applicationStartTime = [NSDate date];
  107. configFlags.appStartConfigFetchDelayInSeconds = appStartConfigFetchDelay;
  108. configFlags.lastFetchStatus = FIRRemoteConfigFetchStatusNoFetchYet;
  109. XCTestExpectation *expectation =
  110. [self expectationWithDescription:@"Dummy expectation to wait for the fetch delay."];
  111. dispatch_after(
  112. dispatch_time(DISPATCH_TIME_NOW, (int64_t)((appStartConfigFetchDelay - 2) * NSEC_PER_SEC)),
  113. dispatch_get_main_queue(), ^{
  114. [configFlags update];
  115. [expectation fulfill];
  116. XCTAssertTrue(configFlags.lastFetchStatus == FIRRemoteConfigFetchStatusNoFetchYet);
  117. });
  118. [self waitForExpectationsWithTimeout:(appStartConfigFetchDelay) handler:nil];
  119. }
  120. /** Validate the configuration update happens after a delay during app start. */
  121. - (void)testConfigFetchAfterDelayDuringAppStart {
  122. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  123. remoteConfig.lastFetchTime = nil;
  124. NSTimeInterval appStartConfigFetchDelay = 3.0;
  125. FPRRemoteConfigFlags *configFlags =
  126. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  127. remoteConfig.lastFetchTime = nil;
  128. configFlags.lastFetchedTime = nil;
  129. configFlags.applicationStartTime = [NSDate date];
  130. configFlags.appStartConfigFetchDelayInSeconds = appStartConfigFetchDelay;
  131. configFlags.lastFetchStatus = FIRRemoteConfigFetchStatusNoFetchYet;
  132. XCTestExpectation *expectation =
  133. [self expectationWithDescription:@"Dummy expectation to wait for the fetch delay."];
  134. dispatch_after(
  135. dispatch_time(DISPATCH_TIME_NOW, (int64_t)((appStartConfigFetchDelay + 2) * NSEC_PER_SEC)),
  136. dispatch_get_main_queue(), ^{
  137. [configFlags update];
  138. [expectation fulfill];
  139. XCTAssertTrue(configFlags.lastFetchStatus == FIRRemoteConfigFetchStatusSuccess);
  140. });
  141. [self waitForExpectationsWithTimeout:(appStartConfigFetchDelay + 3) handler:nil];
  142. }
  143. /** Validate the configuration update does not happen immediately after fetching. */
  144. - (void)testConfigUpdateDoesNotHappenImmediately {
  145. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  146. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusNoFetchYet;
  147. remoteConfig.lastFetchTime = nil;
  148. FPRRemoteConfigFlags *configFlags =
  149. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  150. remoteConfig.fetchStatus = FIRRemoteConfigFetchStatusSuccess;
  151. configFlags.appStartConfigFetchDelayInSeconds = 0.0;
  152. [configFlags update];
  153. XCTAssertNotNil(configFlags.lastFetchedTime);
  154. // Try updating the flags again and make sure last fetched time has not changed.
  155. NSDate *lastFetchedTime = remoteConfig.lastFetchTime;
  156. NSDate *lastActivatedTime = configFlags.lastFetchedTime;
  157. [configFlags update];
  158. XCTAssertEqualWithAccuracy([lastFetchedTime timeIntervalSinceReferenceDate],
  159. [remoteConfig.lastFetchTime timeIntervalSinceReferenceDate], 0.1);
  160. XCTAssertEqualWithAccuracy([lastActivatedTime timeIntervalSinceReferenceDate],
  161. [configFlags.lastFetchedTime timeIntervalSinceReferenceDate], 0.1);
  162. }
  163. /** Validate the configuration update does not happen immediately after fetching. */
  164. - (void)testConfigUpdateHappensIfIntialFetchHasNotHappened {
  165. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  166. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusNoFetchYet;
  167. remoteConfig.lastFetchTime = nil;
  168. FPRRemoteConfigFlags *configFlags =
  169. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  170. remoteConfig.fetchStatus = FIRRemoteConfigFetchStatusSuccess;
  171. configFlags.appStartConfigFetchDelayInSeconds = 0.0;
  172. [configFlags update];
  173. XCTAssertNotNil(configFlags.lastFetchedTime);
  174. // Try updating the flags again and make sure last fetched time has not changed.
  175. NSDate *lastFetchedTime = remoteConfig.lastFetchTime;
  176. [configFlags update];
  177. XCTAssertEqualObjects(lastFetchedTime, remoteConfig.lastFetchTime);
  178. }
  179. /** Validate the configuration fetch does not happen immediately on initialization. */
  180. - (void)testConfigFetchHappensDoesNotHappenImmediately {
  181. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  182. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusNoFetchYet;
  183. remoteConfig.lastFetchTime = nil;
  184. FPRRemoteConfigFlags *configFlags =
  185. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  186. // Setting the status to success. Calling update on the config flags should trigger updation of
  187. // fetch time. Fetch would trigger activation.
  188. remoteConfig.fetchStatus = FIRRemoteConfigFetchStatusSuccess;
  189. NSDate *lastActivatedTime = configFlags.lastFetchedTime;
  190. [configFlags update];
  191. XCTAssert([configFlags.lastFetchedTime timeIntervalSinceDate:lastActivatedTime] == 0);
  192. }
  193. /** Validate the configuration fetch happens after initial delay. */
  194. - (void)testConfigFetchHappensAfterDelay {
  195. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  196. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusNoFetchYet;
  197. remoteConfig.lastFetchTime = nil;
  198. FPRRemoteConfigFlags *configFlags =
  199. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  200. configFlags.appStartConfigFetchDelayInSeconds = 0.0;
  201. remoteConfig.fetchStatus = FIRRemoteConfigFetchStatusSuccess;
  202. XCTestExpectation *expectation =
  203. [self expectationWithDescription:@"Dummy expectation to wait for the fetch delay."];
  204. dispatch_after(
  205. dispatch_time(DISPATCH_TIME_NOW,
  206. (int64_t)((kFPRMinAppStartConfigFetchDelayInSeconds + 5) * NSEC_PER_SEC)),
  207. dispatch_get_main_queue(), ^{
  208. [configFlags update];
  209. [expectation fulfill];
  210. XCTAssertNotNil(configFlags.lastFetchedTime);
  211. XCTAssertNotNil(remoteConfig.lastFetchTime);
  212. });
  213. [self waitForExpectationsWithTimeout:(kFPRMinAppStartConfigFetchDelayInSeconds + 6) handler:nil];
  214. }
  215. #pragma mark - App config related tests
  216. /** Validates if the fetch for the SDK enabled config happens from cache, else return default value.
  217. */
  218. - (void)testConfigFetchForSDKEnabledFromCache {
  219. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  220. FPRRemoteConfigFlags *configFlags =
  221. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  222. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  223. configFlags.userDefaults = userDefaults;
  224. NSString *configKey = [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_enabled"];
  225. [userDefaults setObject:@(false) forKey:configKey];
  226. XCTAssertEqual([configFlags performanceSDKEnabledWithDefaultValue:true], false);
  227. [userDefaults removeObjectForKey:configKey];
  228. XCTAssertEqual([configFlags performanceSDKEnabledWithDefaultValue:true], true);
  229. }
  230. /** Validates if the caching works for SDK enabled remote config. */
  231. - (void)testConfigCacheForSDKEnabled {
  232. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  233. FPRRemoteConfigFlags *configFlags =
  234. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  235. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  236. configFlags.userDefaults = userDefaults;
  237. [configFlags resetCache];
  238. NSData *valueData = [@"false" dataUsingEncoding:NSUTF8StringEncoding];
  239. FIRRemoteConfigValue *value =
  240. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  241. [remoteConfig.configValues setObject:value forKey:@"fpr_enabled"];
  242. [configFlags cacheConfigValues];
  243. XCTAssertEqual([configFlags performanceSDKEnabledWithDefaultValue:true], true);
  244. [configFlags resetCache];
  245. valueData = [@"false" dataUsingEncoding:NSUTF8StringEncoding];
  246. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  247. [remoteConfig.configValues setObject:value forKey:@"fpr_enabled"];
  248. [configFlags cacheConfigValues];
  249. XCTAssertEqual([configFlags performanceSDKEnabledWithDefaultValue:true], false);
  250. [configFlags resetCache];
  251. valueData = [@"false" dataUsingEncoding:NSUTF8StringEncoding];
  252. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  253. [remoteConfig.configValues setObject:value forKey:@"fpr_enabled"];
  254. [configFlags cacheConfigValues];
  255. XCTAssertEqual([configFlags performanceSDKEnabledWithDefaultValue:true], true);
  256. [configFlags resetCache];
  257. }
  258. /** Validates if the fetch for the log source config happens from cache, else return default value.
  259. */
  260. - (void)testConfigFetchForLogSourceFromCache {
  261. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  262. FPRRemoteConfigFlags *configFlags =
  263. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  264. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  265. configFlags.userDefaults = userDefaults;
  266. NSString *configKey = [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_log_source"];
  267. [userDefaults setObject:@(100) forKey:configKey];
  268. XCTAssertEqual([configFlags logSourceWithDefaultValue:kLogSource], 100);
  269. [userDefaults removeObjectForKey:configKey];
  270. XCTAssertEqual([configFlags logSourceWithDefaultValue:kLogSource], kLogSource);
  271. }
  272. /** Validates if the caching works for log source remote config. */
  273. - (void)testConfigCacheForLogSource {
  274. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  275. FPRRemoteConfigFlags *configFlags =
  276. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  277. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  278. configFlags.userDefaults = userDefaults;
  279. [configFlags resetCache];
  280. NSData *valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  281. FIRRemoteConfigValue *value =
  282. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  283. [remoteConfig.configValues setObject:value forKey:@"fpr_log_source"];
  284. [configFlags cacheConfigValues];
  285. XCTAssertEqual([configFlags logSourceWithDefaultValue:kLogSource], kLogSource);
  286. [configFlags resetCache];
  287. valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  288. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  289. [remoteConfig.configValues setObject:value forKey:@"fpr_log_source"];
  290. [configFlags cacheConfigValues];
  291. XCTAssertEqual([configFlags logSourceWithDefaultValue:kLogSource], 100);
  292. [configFlags resetCache];
  293. valueData = [@"200" dataUsingEncoding:NSUTF8StringEncoding];
  294. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  295. [remoteConfig.configValues setObject:value forKey:@"fpr_log_source"];
  296. [configFlags cacheConfigValues];
  297. XCTAssertEqual([configFlags logSourceWithDefaultValue:kLogSource], kLogSource);
  298. [configFlags resetCache];
  299. }
  300. #pragma mark - Rate limiting configs related tests.
  301. /** Validates if the fetch for the rate limit duration config happens from cache, else return
  302. * default value. */
  303. - (void)testConfigFetchForRateLimitDurationFromCache {
  304. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  305. FPRRemoteConfigFlags *configFlags =
  306. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  307. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  308. configFlags.userDefaults = userDefaults;
  309. NSString *configKey =
  310. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_time_limit_sec"];
  311. [userDefaults setObject:@(100) forKey:configKey];
  312. XCTAssertEqual([configFlags rateLimitTimeDurationWithDefaultValue:200], 100);
  313. [userDefaults removeObjectForKey:configKey];
  314. XCTAssertEqual([configFlags rateLimitTimeDurationWithDefaultValue:200], 200);
  315. }
  316. /** Validates if the caching works for rate limit duration remote config. */
  317. - (void)testConfigCacheForRateLimitDuration {
  318. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  319. FPRRemoteConfigFlags *configFlags =
  320. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  321. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  322. configFlags.userDefaults = userDefaults;
  323. [configFlags resetCache];
  324. NSData *valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  325. FIRRemoteConfigValue *value =
  326. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  327. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_time_limit_sec"];
  328. [configFlags cacheConfigValues];
  329. XCTAssertEqual([configFlags rateLimitTimeDurationWithDefaultValue:200], 200);
  330. [configFlags resetCache];
  331. valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  332. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  333. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_time_limit_sec"];
  334. [configFlags cacheConfigValues];
  335. XCTAssertEqual([configFlags rateLimitTimeDurationWithDefaultValue:200], 100);
  336. [configFlags resetCache];
  337. valueData = [@"200" dataUsingEncoding:NSUTF8StringEncoding];
  338. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  339. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_time_limit_sec"];
  340. [configFlags cacheConfigValues];
  341. XCTAssertEqual([configFlags rateLimitTimeDurationWithDefaultValue:200], 200);
  342. [configFlags resetCache];
  343. }
  344. /** Validates if the fetch for the trace count in foreground config happens from cache, else return
  345. * default value. */
  346. - (void)testConfigFetchForTraceEventCountInForegroundFromCache {
  347. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  348. FPRRemoteConfigFlags *configFlags =
  349. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  350. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  351. configFlags.userDefaults = userDefaults;
  352. NSString *configKey =
  353. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_trace_event_count_fg"];
  354. [userDefaults setObject:@(100) forKey:configKey];
  355. XCTAssertEqual([configFlags rateLimitTraceCountInForegroundWithDefaultValue:200], 100);
  356. [userDefaults removeObjectForKey:configKey];
  357. XCTAssertEqual([configFlags rateLimitTraceCountInForegroundWithDefaultValue:200], 200);
  358. }
  359. /** Validates if the caching works for trace event count in foreground remote config. */
  360. - (void)testConfigCacheForTraceEventCountInForeground {
  361. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  362. FPRRemoteConfigFlags *configFlags =
  363. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  364. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  365. configFlags.userDefaults = userDefaults;
  366. [configFlags resetCache];
  367. NSData *valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  368. FIRRemoteConfigValue *value =
  369. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  370. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_trace_event_count_fg"];
  371. [configFlags cacheConfigValues];
  372. XCTAssertEqual([configFlags rateLimitTraceCountInForegroundWithDefaultValue:200], 200);
  373. [configFlags resetCache];
  374. valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  375. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  376. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_trace_event_count_fg"];
  377. [configFlags cacheConfigValues];
  378. XCTAssertEqual([configFlags rateLimitTraceCountInForegroundWithDefaultValue:200], 100);
  379. [configFlags resetCache];
  380. valueData = [@"200" dataUsingEncoding:NSUTF8StringEncoding];
  381. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  382. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_trace_event_count_fg"];
  383. [configFlags cacheConfigValues];
  384. XCTAssertEqual([configFlags rateLimitTraceCountInForegroundWithDefaultValue:200], 200);
  385. [configFlags resetCache];
  386. }
  387. /** Validates if the fetch for the trace count in foreground config happens from cache, else return
  388. * default value. */
  389. - (void)testConfigFetchForTraceEventCountInBackgroundFromCache {
  390. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  391. FPRRemoteConfigFlags *configFlags =
  392. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  393. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  394. configFlags.userDefaults = userDefaults;
  395. NSString *configKey =
  396. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_trace_event_count_bg"];
  397. [userDefaults setObject:@(100) forKey:configKey];
  398. XCTAssertEqual([configFlags rateLimitTraceCountInBackgroundWithDefaultValue:200], 100);
  399. [userDefaults removeObjectForKey:configKey];
  400. XCTAssertEqual([configFlags rateLimitTraceCountInBackgroundWithDefaultValue:200], 200);
  401. }
  402. /** Validates if the caching works for trace event count in foreground remote config. */
  403. - (void)testConfigCacheForTraceEventCountInBackground {
  404. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  405. FPRRemoteConfigFlags *configFlags =
  406. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  407. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  408. configFlags.userDefaults = userDefaults;
  409. [configFlags resetCache];
  410. NSData *valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  411. FIRRemoteConfigValue *value =
  412. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  413. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_trace_event_count_bg"];
  414. [configFlags cacheConfigValues];
  415. XCTAssertEqual([configFlags rateLimitTraceCountInBackgroundWithDefaultValue:200], 200);
  416. [configFlags resetCache];
  417. valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  418. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  419. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_trace_event_count_bg"];
  420. [configFlags cacheConfigValues];
  421. XCTAssertEqual([configFlags rateLimitTraceCountInBackgroundWithDefaultValue:200], 100);
  422. [configFlags resetCache];
  423. valueData = [@"200" dataUsingEncoding:NSUTF8StringEncoding];
  424. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  425. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_trace_event_count_bg"];
  426. [configFlags cacheConfigValues];
  427. XCTAssertEqual([configFlags rateLimitTraceCountInBackgroundWithDefaultValue:200], 200);
  428. [configFlags resetCache];
  429. }
  430. /** Validates if the fetch for the network trace count in foreground config happens from cache, else
  431. * return default value. */
  432. - (void)testConfigFetchForNetworkTraceEventCountInForegroundFromCache {
  433. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  434. FPRRemoteConfigFlags *configFlags =
  435. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  436. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  437. configFlags.userDefaults = userDefaults;
  438. NSString *configKey = [NSString
  439. stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_network_request_event_count_fg"];
  440. [userDefaults setObject:@(100) forKey:configKey];
  441. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInForegroundWithDefaultValue:200], 100);
  442. [userDefaults removeObjectForKey:configKey];
  443. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInForegroundWithDefaultValue:200], 200);
  444. }
  445. /** Validates if the caching works for network trace event count in foreground remote config. */
  446. - (void)testConfigCacheForNetworkTraceEventCountInForeground {
  447. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  448. FPRRemoteConfigFlags *configFlags =
  449. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  450. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  451. configFlags.userDefaults = userDefaults;
  452. [configFlags resetCache];
  453. NSData *valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  454. FIRRemoteConfigValue *value =
  455. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  456. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_network_request_event_count_fg"];
  457. [configFlags cacheConfigValues];
  458. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInForegroundWithDefaultValue:200], 200);
  459. [configFlags resetCache];
  460. valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  461. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  462. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_network_request_event_count_fg"];
  463. [configFlags cacheConfigValues];
  464. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInForegroundWithDefaultValue:200], 100);
  465. [configFlags resetCache];
  466. valueData = [@"200" dataUsingEncoding:NSUTF8StringEncoding];
  467. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  468. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_network_request_event_count_fg"];
  469. [configFlags cacheConfigValues];
  470. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInForegroundWithDefaultValue:200], 200);
  471. [configFlags resetCache];
  472. }
  473. /** Validates if the fetch for the trace count in foreground config happens from cache, else return
  474. * default value. */
  475. - (void)testConfigFetchForNetworkTraceEventCountInBackgroundFromCache {
  476. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  477. FPRRemoteConfigFlags *configFlags =
  478. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  479. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  480. configFlags.userDefaults = userDefaults;
  481. NSString *configKey = [NSString
  482. stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_network_request_event_count_bg"];
  483. [userDefaults setObject:@(100) forKey:configKey];
  484. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInBackgroundWithDefaultValue:200], 100);
  485. [userDefaults removeObjectForKey:configKey];
  486. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInBackgroundWithDefaultValue:200], 200);
  487. }
  488. /** Validates if the caching works for trace event count in foreground remote config. */
  489. - (void)testConfigCacheForNetworkTraceEventCountInBackground {
  490. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  491. FPRRemoteConfigFlags *configFlags =
  492. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  493. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  494. configFlags.userDefaults = userDefaults;
  495. [configFlags resetCache];
  496. NSData *valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  497. FIRRemoteConfigValue *value =
  498. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  499. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_network_request_event_count_bg"];
  500. [configFlags cacheConfigValues];
  501. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInBackgroundWithDefaultValue:200], 200);
  502. [configFlags resetCache];
  503. valueData = [@"100" dataUsingEncoding:NSUTF8StringEncoding];
  504. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  505. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_network_request_event_count_bg"];
  506. [configFlags cacheConfigValues];
  507. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInBackgroundWithDefaultValue:200], 100);
  508. [configFlags resetCache];
  509. valueData = [@"200" dataUsingEncoding:NSUTF8StringEncoding];
  510. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  511. [remoteConfig.configValues setObject:value forKey:@"fpr_rl_network_request_event_count_bg"];
  512. [configFlags cacheConfigValues];
  513. XCTAssertEqual([configFlags rateLimitNetworkRequestCountInBackgroundWithDefaultValue:200], 200);
  514. [configFlags resetCache];
  515. }
  516. #pragma mark - Sampling configs related tests.
  517. /** Validates if the fetch for the trace sampling rate config happens from cache, else return
  518. * default value. */
  519. - (void)testConfigFetchForTraceSamplingRateFromCache {
  520. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  521. FPRRemoteConfigFlags *configFlags =
  522. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  523. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  524. configFlags.userDefaults = userDefaults;
  525. NSString *configKey =
  526. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_trace_sampling_rate"];
  527. [userDefaults setObject:@(1) forKey:configKey];
  528. XCTAssertEqual([configFlags traceSamplingRateWithDefaultValue:100], 1);
  529. [userDefaults removeObjectForKey:configKey];
  530. XCTAssertEqual([configFlags traceSamplingRateWithDefaultValue:100], 100);
  531. }
  532. /** Validates if the caching works for trace sampling rate remote config. */
  533. - (void)testConfigCacheForTraceSamplingRate {
  534. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  535. FPRRemoteConfigFlags *configFlags =
  536. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  537. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  538. configFlags.userDefaults = userDefaults;
  539. [configFlags resetCache];
  540. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  541. FIRRemoteConfigValue *value =
  542. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  543. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_trace_sampling_rate"];
  544. [configFlags cacheConfigValues];
  545. XCTAssertEqual([configFlags traceSamplingRateWithDefaultValue:100], 100);
  546. [configFlags resetCache];
  547. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  548. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  549. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_trace_sampling_rate"];
  550. [configFlags cacheConfigValues];
  551. XCTAssertEqual([configFlags traceSamplingRateWithDefaultValue:100], 1);
  552. [configFlags resetCache];
  553. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  554. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  555. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_trace_sampling_rate"];
  556. [configFlags cacheConfigValues];
  557. XCTAssertEqual([configFlags traceSamplingRateWithDefaultValue:100], 100);
  558. [configFlags resetCache];
  559. }
  560. /** Validates if the fetch for the network sampling rate config happens from cache, else return
  561. * default value. */
  562. - (void)testConfigFetchForNetworkSamplingRateFromCache {
  563. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  564. FPRRemoteConfigFlags *configFlags =
  565. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  566. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  567. configFlags.userDefaults = userDefaults;
  568. NSString *configKey = [NSString
  569. stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_network_request_sampling_rate"];
  570. [userDefaults setObject:@(1) forKey:configKey];
  571. XCTAssertEqual([configFlags networkRequestSamplingRateWithDefaultValue:100], 1);
  572. [userDefaults removeObjectForKey:configKey];
  573. XCTAssertEqual([configFlags networkRequestSamplingRateWithDefaultValue:100], 100);
  574. }
  575. /** Validates if the caching works for network sampling rate remote config. */
  576. - (void)testConfigCacheForNetworkSamplingRate {
  577. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  578. FPRRemoteConfigFlags *configFlags =
  579. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  580. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  581. configFlags.userDefaults = userDefaults;
  582. [configFlags resetCache];
  583. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  584. FIRRemoteConfigValue *value =
  585. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  586. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_network_request_sampling_rate"];
  587. [configFlags cacheConfigValues];
  588. XCTAssertEqual([configFlags networkRequestSamplingRateWithDefaultValue:100], 100);
  589. [configFlags resetCache];
  590. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  591. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  592. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_network_request_sampling_rate"];
  593. [configFlags cacheConfigValues];
  594. XCTAssertEqual([configFlags networkRequestSamplingRateWithDefaultValue:100], 1);
  595. [configFlags resetCache];
  596. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  597. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  598. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_network_request_sampling_rate"];
  599. [configFlags cacheConfigValues];
  600. XCTAssertEqual([configFlags networkRequestSamplingRateWithDefaultValue:100], 100);
  601. [configFlags resetCache];
  602. }
  603. #pragma mark - Session related configs tests.
  604. /** Validates if the fetch for the session sampling rate config happens from cache, else return
  605. * default value. */
  606. - (void)testConfigFetchForSessionSamplingRateFromCache {
  607. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  608. FPRRemoteConfigFlags *configFlags =
  609. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  610. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  611. configFlags.userDefaults = userDefaults;
  612. NSString *configKey =
  613. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_session_sampling_rate"];
  614. [userDefaults setObject:@(1) forKey:configKey];
  615. XCTAssertEqual([configFlags sessionSamplingRateWithDefaultValue:100], 1);
  616. [userDefaults removeObjectForKey:configKey];
  617. XCTAssertEqual([configFlags sessionSamplingRateWithDefaultValue:100], 100);
  618. }
  619. /** Validates if the caching works for network sampling rate remote config. */
  620. - (void)testConfigCacheForSessionSamplingRate {
  621. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  622. FPRRemoteConfigFlags *configFlags =
  623. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  624. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  625. configFlags.userDefaults = userDefaults;
  626. [configFlags resetCache];
  627. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  628. FIRRemoteConfigValue *value =
  629. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  630. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_session_sampling_rate"];
  631. [configFlags cacheConfigValues];
  632. XCTAssertEqual([configFlags sessionSamplingRateWithDefaultValue:100], 100);
  633. [configFlags resetCache];
  634. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  635. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  636. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_session_sampling_rate"];
  637. [configFlags cacheConfigValues];
  638. XCTAssertEqual([configFlags sessionSamplingRateWithDefaultValue:100], 1);
  639. [configFlags resetCache];
  640. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  641. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  642. [remoteConfig.configValues setObject:value forKey:@"fpr_vc_session_sampling_rate"];
  643. [configFlags cacheConfigValues];
  644. XCTAssertEqual([configFlags sessionSamplingRateWithDefaultValue:100], 100);
  645. [configFlags resetCache];
  646. }
  647. /** Validates if the fetch for the CPU collection frequency in foreground config happens from cache,
  648. * else return default value. */
  649. - (void)testConfigFetchForCPUGaugeCollectionFrequencyInForegroundFromCache {
  650. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  651. FPRRemoteConfigFlags *configFlags =
  652. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  653. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  654. configFlags.userDefaults = userDefaults;
  655. NSString *configKey =
  656. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  657. @"fpr_session_gauge_cpu_capture_frequency_fg_ms"];
  658. [userDefaults setObject:@(1) forKey:configKey];
  659. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInForegroundWithDefaultValue:100], 1);
  660. [userDefaults removeObjectForKey:configKey];
  661. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInForegroundWithDefaultValue:100],
  662. 100);
  663. }
  664. /** Validates if the caching works for CPU collection frequency in foreground. */
  665. - (void)testConfigCacheForCPUGaugeCollectionFrequencyInForeground {
  666. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  667. FPRRemoteConfigFlags *configFlags =
  668. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  669. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  670. configFlags.userDefaults = userDefaults;
  671. [configFlags resetCache];
  672. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  673. FIRRemoteConfigValue *value =
  674. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  675. [remoteConfig.configValues setObject:value
  676. forKey:@"fpr_session_gauge_cpu_capture_frequency_fg_ms"];
  677. [configFlags cacheConfigValues];
  678. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInForegroundWithDefaultValue:100],
  679. 100);
  680. [configFlags resetCache];
  681. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  682. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  683. [remoteConfig.configValues setObject:value
  684. forKey:@"fpr_session_gauge_cpu_capture_frequency_fg_ms"];
  685. [configFlags cacheConfigValues];
  686. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInForegroundWithDefaultValue:100], 1);
  687. [configFlags resetCache];
  688. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  689. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  690. [remoteConfig.configValues setObject:value
  691. forKey:@"fpr_session_gauge_cpu_capture_frequency_fg_ms"];
  692. [configFlags cacheConfigValues];
  693. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInForegroundWithDefaultValue:100],
  694. 100);
  695. [configFlags resetCache];
  696. }
  697. /** Validates if the fetch for the CPU collection frequency in background config happens from cache,
  698. * else return default value. */
  699. - (void)testConfigFetchForCPUGaugeCollectionFrequencyInBackgroundFromCache {
  700. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  701. FPRRemoteConfigFlags *configFlags =
  702. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  703. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  704. configFlags.userDefaults = userDefaults;
  705. NSString *configKey =
  706. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  707. @"fpr_session_gauge_cpu_capture_frequency_bg_ms"];
  708. [userDefaults setObject:@(1) forKey:configKey];
  709. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInBackgroundWithDefaultValue:100], 1);
  710. [userDefaults removeObjectForKey:configKey];
  711. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInBackgroundWithDefaultValue:100],
  712. 100);
  713. }
  714. /** Validates if the caching works for CPU collection frequency in foreground. */
  715. - (void)testConfigCacheForCPUGaugeCollectionFrequencyInBackground {
  716. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  717. FPRRemoteConfigFlags *configFlags =
  718. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  719. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  720. configFlags.userDefaults = userDefaults;
  721. [configFlags resetCache];
  722. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  723. FIRRemoteConfigValue *value =
  724. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  725. [remoteConfig.configValues setObject:value
  726. forKey:@"fpr_session_gauge_cpu_capture_frequency_bg_ms"];
  727. [configFlags cacheConfigValues];
  728. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInBackgroundWithDefaultValue:100],
  729. 100);
  730. [configFlags resetCache];
  731. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  732. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  733. [remoteConfig.configValues setObject:value
  734. forKey:@"fpr_session_gauge_cpu_capture_frequency_bg_ms"];
  735. [configFlags cacheConfigValues];
  736. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInBackgroundWithDefaultValue:100], 1);
  737. [configFlags resetCache];
  738. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  739. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  740. [remoteConfig.configValues setObject:value
  741. forKey:@"fpr_session_gauge_cpu_capture_frequency_bg_ms"];
  742. [configFlags cacheConfigValues];
  743. XCTAssertEqual([configFlags sessionGaugeCPUCaptureFrequencyInBackgroundWithDefaultValue:100],
  744. 100);
  745. [configFlags resetCache];
  746. }
  747. /** Validates if the fetch for the memory collection frequency in foreground config happens from
  748. * cache, else return default value. */
  749. - (void)testConfigFetchForMemoryGaugeCollectionFrequencyInForegroundFromCache {
  750. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  751. FPRRemoteConfigFlags *configFlags =
  752. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  753. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  754. configFlags.userDefaults = userDefaults;
  755. NSString *configKey =
  756. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  757. @"fpr_session_gauge_memory_capture_frequency_fg_ms"];
  758. [userDefaults setObject:@(1) forKey:configKey];
  759. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInForegroundWithDefaultValue:100],
  760. 1);
  761. [userDefaults removeObjectForKey:configKey];
  762. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInForegroundWithDefaultValue:100],
  763. 100);
  764. }
  765. /** Validates if the caching works for memory collection frequency in foreground. */
  766. - (void)testConfigCacheForMemoryGaugeCollectionFrequencyInForeground {
  767. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  768. FPRRemoteConfigFlags *configFlags =
  769. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  770. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  771. configFlags.userDefaults = userDefaults;
  772. [configFlags resetCache];
  773. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  774. FIRRemoteConfigValue *value =
  775. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  776. [remoteConfig.configValues setObject:value
  777. forKey:@"fpr_session_gauge_memory_capture_frequency_fg_ms"];
  778. [configFlags cacheConfigValues];
  779. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInForegroundWithDefaultValue:100],
  780. 100);
  781. [configFlags resetCache];
  782. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  783. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  784. [remoteConfig.configValues setObject:value
  785. forKey:@"fpr_session_gauge_memory_capture_frequency_fg_ms"];
  786. [configFlags cacheConfigValues];
  787. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInForegroundWithDefaultValue:100],
  788. 1);
  789. [configFlags resetCache];
  790. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  791. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  792. [remoteConfig.configValues setObject:value
  793. forKey:@"fpr_session_gauge_memory_capture_frequency_fg_ms"];
  794. [configFlags cacheConfigValues];
  795. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInForegroundWithDefaultValue:100],
  796. 100);
  797. [configFlags resetCache];
  798. }
  799. /** Validates if the fetch for the memory collection frequency in background config happens from
  800. * cache, else return default value. */
  801. - (void)testConfigFetchForMemoryGaugeCollectionFrequencyInBackgroundFromCache {
  802. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  803. FPRRemoteConfigFlags *configFlags =
  804. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  805. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  806. configFlags.userDefaults = userDefaults;
  807. NSString *configKey =
  808. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  809. @"fpr_session_gauge_memory_capture_frequency_bg_ms"];
  810. [userDefaults setObject:@(1) forKey:configKey];
  811. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInBackgroundWithDefaultValue:100],
  812. 1);
  813. [userDefaults removeObjectForKey:configKey];
  814. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInBackgroundWithDefaultValue:100],
  815. 100);
  816. }
  817. /** Validates if the caching works for CPU collection frequency in foreground. */
  818. - (void)testConfigCacheForMemoryGaugeCollectionFrequencyInBackground {
  819. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  820. FPRRemoteConfigFlags *configFlags =
  821. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  822. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  823. configFlags.userDefaults = userDefaults;
  824. [configFlags resetCache];
  825. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  826. FIRRemoteConfigValue *value =
  827. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  828. [remoteConfig.configValues setObject:value
  829. forKey:@"fpr_session_gauge_memory_capture_frequency_bg_ms"];
  830. [configFlags cacheConfigValues];
  831. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInBackgroundWithDefaultValue:100],
  832. 100);
  833. [configFlags resetCache];
  834. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  835. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  836. [remoteConfig.configValues setObject:value
  837. forKey:@"fpr_session_gauge_memory_capture_frequency_bg_ms"];
  838. [configFlags cacheConfigValues];
  839. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInBackgroundWithDefaultValue:100],
  840. 1);
  841. [configFlags resetCache];
  842. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  843. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  844. [remoteConfig.configValues setObject:value
  845. forKey:@"fpr_session_gauge_memory_capture_frequency_bg_ms"];
  846. [configFlags cacheConfigValues];
  847. XCTAssertEqual([configFlags sessionGaugeMemoryCaptureFrequencyInBackgroundWithDefaultValue:100],
  848. 100);
  849. [configFlags resetCache];
  850. }
  851. /** Validates if the fetch for the session max duration config happens from cache, else return
  852. * default value. */
  853. - (void)testConfigFetchForSessionMaxDurationFromCache {
  854. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  855. FPRRemoteConfigFlags *configFlags =
  856. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  857. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  858. configFlags.userDefaults = userDefaults;
  859. NSString *configKey =
  860. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_session_max_duration_min"];
  861. [userDefaults setObject:@(1) forKey:configKey];
  862. XCTAssertEqual([configFlags sessionMaxDurationWithDefaultValue:100], 1);
  863. [userDefaults removeObjectForKey:configKey];
  864. XCTAssertEqual([configFlags sessionMaxDurationWithDefaultValue:100], 100);
  865. }
  866. /** Validates if the caching works for session max duration. */
  867. - (void)testConfigCacheForSessionMaxDuration {
  868. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  869. FPRRemoteConfigFlags *configFlags =
  870. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  871. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  872. configFlags.userDefaults = userDefaults;
  873. [configFlags resetCache];
  874. NSData *valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  875. FIRRemoteConfigValue *value =
  876. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  877. [remoteConfig.configValues setObject:value forKey:@"fpr_session_max_duration_min"];
  878. [configFlags cacheConfigValues];
  879. XCTAssertEqual([configFlags sessionMaxDurationWithDefaultValue:100], 100);
  880. [configFlags resetCache];
  881. valueData = [@"1" dataUsingEncoding:NSUTF8StringEncoding];
  882. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  883. [remoteConfig.configValues setObject:value forKey:@"fpr_session_max_duration_min"];
  884. [configFlags cacheConfigValues];
  885. XCTAssertEqual([configFlags sessionMaxDurationWithDefaultValue:100], 1);
  886. [configFlags resetCache];
  887. valueData = [@"2" dataUsingEncoding:NSUTF8StringEncoding];
  888. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  889. [remoteConfig.configValues setObject:value forKey:@"fpr_session_max_duration_min"];
  890. [configFlags cacheConfigValues];
  891. XCTAssertEqual([configFlags sessionMaxDurationWithDefaultValue:100], 100);
  892. [configFlags resetCache];
  893. }
  894. /** Validates if the fetch for the SDK disabled versions config happens from cache, else return
  895. * default value. */
  896. - (void)testConfigFetchForSDKDisabledVersionsFromCache {
  897. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  898. FPRRemoteConfigFlags *configFlags =
  899. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  900. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  901. configFlags.userDefaults = userDefaults;
  902. NSSet<NSString *> *versionSet =
  903. [[NSSet<NSString *> alloc] initWithObjects:@"1.0.2", @"1.0.3", nil];
  904. NSSet<NSString *> *emptySet = [[NSSet<NSString *> alloc] init];
  905. NSString *configKey =
  906. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_disabled_ios_versions"];
  907. [userDefaults setObject:@"1.0.2;1.0.3" forKey:configKey];
  908. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], versionSet);
  909. [userDefaults removeObjectForKey:configKey];
  910. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], emptySet);
  911. }
  912. /** Validates if the caching works for SDK disabled versions. */
  913. - (void)testConfigCacheForSDKDisabledVersions {
  914. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  915. FPRRemoteConfigFlags *configFlags =
  916. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  917. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  918. configFlags.userDefaults = userDefaults;
  919. NSString *sdkVersions = @"1.0.2;1.0.3";
  920. NSSet<NSString *> *versionSet =
  921. [[NSSet<NSString *> alloc] initWithObjects:@"1.0.2", @"1.0.3", nil];
  922. NSSet<NSString *> *emptySet = [[NSSet<NSString *> alloc] init];
  923. NSData *valueData = [sdkVersions dataUsingEncoding:NSUTF8StringEncoding];
  924. [configFlags resetCache];
  925. FIRRemoteConfigValue *value =
  926. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceStatic];
  927. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  928. [configFlags cacheConfigValues];
  929. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], emptySet);
  930. [configFlags resetCache];
  931. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  932. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  933. [configFlags cacheConfigValues];
  934. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], versionSet);
  935. [configFlags resetCache];
  936. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceDefault];
  937. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  938. [configFlags cacheConfigValues];
  939. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], emptySet);
  940. [configFlags resetCache];
  941. }
  942. /** Validates if performance disabled version are fetched from remote config with wildcards, else
  943. * return a default value. */
  944. - (void)testConfigFetchForPerformanceDisabledVersionsWithWildcard {
  945. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  946. FPRRemoteConfigFlags *configFlags =
  947. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  948. GULUserDefaults *userDefaults = [[GULUserDefaults alloc] initWithSuiteName:nil];
  949. configFlags.userDefaults = userDefaults;
  950. NSString *sdkVersions = @" 1.0.2 ; 1.0.3 ";
  951. NSSet<NSString *> *versionSet =
  952. [[NSSet<NSString *> alloc] initWithObjects:@"1.0.2", @"1.0.3", nil];
  953. NSSet<NSString *> *emptySet = [[NSSet<NSString *> alloc] init];
  954. NSData *valueData = [sdkVersions dataUsingEncoding:NSUTF8StringEncoding];
  955. [configFlags resetCache];
  956. FIRRemoteConfigValue *value =
  957. [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  958. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  959. [configFlags cacheConfigValues];
  960. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], versionSet);
  961. [configFlags resetCache];
  962. valueData = [@" " dataUsingEncoding:NSUTF8StringEncoding];
  963. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  964. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  965. [configFlags cacheConfigValues];
  966. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], emptySet);
  967. [configFlags resetCache];
  968. valueData = [@"1.0.2;1.0.3;;" dataUsingEncoding:NSUTF8StringEncoding];
  969. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  970. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  971. [configFlags cacheConfigValues];
  972. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], versionSet);
  973. [configFlags resetCache];
  974. valueData = [@";1.0.2;1.0.3;;" dataUsingEncoding:NSUTF8StringEncoding];
  975. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  976. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  977. [configFlags cacheConfigValues];
  978. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], versionSet);
  979. [configFlags resetCache];
  980. valueData = [@";;" dataUsingEncoding:NSUTF8StringEncoding];
  981. value = [[FIRRemoteConfigValue alloc] initWithData:valueData source:FIRRemoteConfigSourceRemote];
  982. [remoteConfig.configValues setObject:value forKey:@"fpr_disabled_ios_versions"];
  983. [configFlags cacheConfigValues];
  984. XCTAssertEqualObjects([configFlags sdkDisabledVersionsWithDefaultValue:emptySet], emptySet);
  985. [configFlags resetCache];
  986. }
  987. @end