FPRRemoteConfigFlagsTest.m 57 KB

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