FPRRemoteConfigFlagsTest.m 58 KB

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