FPRRemoteConfigFlagsTest.m 54 KB

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