FPRRemoteConfigFlagsTest.m 55 KB

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