FPRConfigurationsTest.m 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  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 <GoogleUtilities/GULUserDefaults.h>
  16. #import "FirebasePerformance/Sources/Common/FPRConstants.h"
  17. #import "FirebasePerformance/Sources/Configurations/FPRConfigurations+Private.h"
  18. #import "FirebasePerformance/Sources/Configurations/FPRConfigurations.h"
  19. #import "FirebasePerformance/Sources/Configurations/FPRRemoteConfigFlags+Private.h"
  20. #import "FirebasePerformance/Sources/Configurations/FPRRemoteConfigFlags.h"
  21. #import "FirebasePerformance/Tests/Unit/Configurations/FPRFakeRemoteConfig.h"
  22. @interface FPRConfigurationsTest : XCTestCase
  23. @end
  24. @implementation FPRConfigurationsTest
  25. - (GULUserDefaults *_Nonnull)makeEmptyUserDefaults {
  26. return [[GULUserDefaults alloc] init];
  27. }
  28. /** Validates if instance creation works. */
  29. - (void)testInstanceCreation {
  30. XCTAssertNotNil([[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceNone]);
  31. XCTAssertNotNil([FPRConfigurations sharedInstance]);
  32. }
  33. /** Validates if singleton nature of the object works. */
  34. - (void)testSingletonNature {
  35. XCTAssertEqualObjects([FPRConfigurations sharedInstance], [FPRConfigurations sharedInstance]);
  36. }
  37. /** Validates for the default value for the configurations. */
  38. - (void)testDefaultValuesOfConfigs {
  39. FPRConfigurations *configurations =
  40. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceNone];
  41. #if defined(FPR_AUTOPUSH_ENDPOINT)
  42. XCTAssertEqual([configurations logSource], 461);
  43. #else
  44. XCTAssertEqual([configurations logSource], 462);
  45. #endif
  46. XCTAssertEqual([configurations diagnosticsEnabled], NO);
  47. XCTAssertEqual([configurations logTraceSamplingRate], 1.0);
  48. XCTAssertEqual([configurations logNetworkSamplingRate], 1.0);
  49. XCTAssertEqual([configurations foregroundEventCount], 300);
  50. XCTAssertEqual([configurations foregroundEventTimeLimit], 10);
  51. XCTAssertEqual([configurations backgroundEventCount], 30);
  52. XCTAssertEqual([configurations backgroundEventTimeLimit], 10);
  53. XCTAssertEqual([configurations foregroundNetworkEventCount], 700);
  54. XCTAssertEqual([configurations foregroundNetworkEventTimeLimit], 10);
  55. XCTAssertEqual([configurations backgroundNetworkEventCount], 70);
  56. XCTAssertEqual([configurations backgroundNetworkEventTimeLimit], 10);
  57. XCTAssertEqual([configurations sessionsSamplingPercentage], 1.0);
  58. XCTAssertEqual([configurations maxSessionLengthInMinutes], 240);
  59. XCTAssertEqual([configurations cpuSamplingFrequencyInForegroundInMS], 100.0);
  60. XCTAssertEqual([configurations cpuSamplingFrequencyInBackgroundInMS], 0.0);
  61. XCTAssertEqual([configurations memorySamplingFrequencyInForegroundInMS], 100.0);
  62. XCTAssertEqual([configurations memorySamplingFrequencyInBackgroundInMS], 0.0);
  63. }
  64. /** Validates if overrides work for diagnostics enabled. */
  65. - (void)testOverridesForDiagnosticsEnabled {
  66. FPRConfigurations *configurations =
  67. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  68. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  69. configurations.userDefaults = userDefaults;
  70. XCTAssertFalse(configurations.diagnosticsEnabled);
  71. [userDefaults setBool:YES forKey:@"FPRDiagnosticsLocal"];
  72. XCTAssertTrue(configurations.diagnosticsEnabled);
  73. [userDefaults setBool:NO forKey:@"FPRDiagnosticsLocal"];
  74. XCTAssertFalse(configurations.diagnosticsEnabled);
  75. }
  76. /** Validates if Firebase Remote Config overrides work for trace sampling rate. */
  77. - (void)testTraceSamplingRateRemoteConfigOverrides {
  78. FPRConfigurations *configurations =
  79. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  80. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  81. FPRRemoteConfigFlags *configFlags =
  82. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  83. configurations.remoteConfigFlags = configFlags;
  84. configFlags.lastFetchedTime = [NSDate date];
  85. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  86. configFlags.userDefaults = userDefaults;
  87. [configFlags resetCache];
  88. NSString *configKey =
  89. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_trace_sampling_rate"];
  90. [userDefaults setObject:@(0.25) forKey:configKey];
  91. XCTAssertEqual([configurations logTraceSamplingRate], 0.25);
  92. [userDefaults setObject:@(1.0) forKey:configKey];
  93. XCTAssertEqual([configurations logTraceSamplingRate], 1.0);
  94. [configFlags resetCache];
  95. }
  96. /** Validates if Firebase Remote Config overrides work for network request sampling rate. */
  97. - (void)testNetworkRequestSamplingRateRemoteConfigOverrides {
  98. FPRConfigurations *configurations =
  99. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  100. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  101. FPRRemoteConfigFlags *configFlags =
  102. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  103. configurations.remoteConfigFlags = configFlags;
  104. configFlags.lastFetchedTime = [NSDate date];
  105. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  106. configFlags.userDefaults = userDefaults;
  107. [configFlags resetCache];
  108. NSString *configKey = [NSString
  109. stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_network_request_sampling_rate"];
  110. [userDefaults setObject:@(0.25) forKey:configKey];
  111. XCTAssertEqual([configurations logNetworkSamplingRate], 0.25);
  112. [userDefaults setObject:@(1.0) forKey:configKey];
  113. XCTAssertEqual([configurations logNetworkSamplingRate], 1.0);
  114. [configFlags resetCache];
  115. }
  116. /** Validates if Firebase Remote Config overrides work for session sampling rate. */
  117. - (void)testSessionSamplingRateRemoteConfigOverrides {
  118. FPRConfigurations *configurations =
  119. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  120. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  121. FPRRemoteConfigFlags *configFlags =
  122. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  123. configurations.remoteConfigFlags = configFlags;
  124. configFlags.lastFetchedTime = [NSDate date];
  125. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  126. configFlags.userDefaults = userDefaults;
  127. [configFlags resetCache];
  128. NSString *configKey =
  129. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_session_sampling_rate"];
  130. [userDefaults setObject:@(0.25) forKey:configKey];
  131. XCTAssertEqual([configurations sessionsSamplingPercentage], 25.00);
  132. [userDefaults setObject:@(1.0) forKey:configKey];
  133. XCTAssertEqual([configurations sessionsSamplingPercentage], 100.0);
  134. [configFlags resetCache];
  135. }
  136. /** Validates if Plist overrides work for session sampling rate. */
  137. - (void)testSessionSamplingRatePlistOverrides {
  138. FPRConfigurations *configurations =
  139. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  140. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  141. FPRRemoteConfigFlags *configFlags =
  142. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  143. configurations.remoteConfigFlags = configFlags;
  144. configFlags.lastFetchedTime = [NSDate date];
  145. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  146. configFlags.userDefaults = userDefaults;
  147. [configFlags resetCache];
  148. NSString *configKey =
  149. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_vc_session_sampling_rate"];
  150. [userDefaults setObject:@(0.25) forKey:configKey];
  151. XCTAssertEqual([configurations sessionsSamplingPercentage], 25.00);
  152. NSDictionary<NSString *, id> *infoDictionary = configurations.infoDictionary;
  153. configurations.infoDictionary = @{@"sessionsSamplingPercentage" : @(1.00)};
  154. XCTAssertEqual([configurations sessionsSamplingPercentage], 1.00);
  155. configurations.infoDictionary = infoDictionary;
  156. XCTAssertEqual([configurations sessionsSamplingPercentage], 25.00);
  157. [configFlags resetCache];
  158. }
  159. /** Validates if Firebase Remote Config overrides work for log source. */
  160. - (void)testLogSourceRemoteConfigOverrides {
  161. FPRConfigurations *configurations =
  162. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  163. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  164. FPRRemoteConfigFlags *configFlags =
  165. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  166. configurations.remoteConfigFlags = configFlags;
  167. configFlags.lastFetchedTime = [NSDate date];
  168. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  169. configFlags.userDefaults = userDefaults;
  170. [configFlags resetCache];
  171. NSString *configKey = [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_log_source"];
  172. [userDefaults setObject:@(100) forKey:configKey];
  173. #if defined(FPR_AUTOPUSH_ENDPOINT)
  174. XCTAssertEqual([configurations logSource], 461);
  175. #else
  176. XCTAssertEqual([configurations logSource], 100);
  177. #endif
  178. [userDefaults setObject:@(200) forKey:configKey];
  179. #if defined(FPR_AUTOPUSH_ENDPOINT)
  180. XCTAssertEqual([configurations logSource], 461);
  181. #else
  182. XCTAssertEqual([configurations logSource], 200);
  183. #endif
  184. [configFlags resetCache];
  185. }
  186. /** Validates if a resolve of disabled SDK version works. */
  187. - (void)testDisabledSDKVersionsConfigResolveSuccessful {
  188. FPRConfigurations *configurations =
  189. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  190. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  191. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusSuccess;
  192. FPRRemoteConfigFlags *configFlags =
  193. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  194. configurations.remoteConfigFlags = configFlags;
  195. configFlags.lastFetchedTime = [NSDate date];
  196. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  197. configFlags.userDefaults = userDefaults;
  198. NSSet<NSString *> *versionSet =
  199. [[NSSet<NSString *> alloc] initWithObjects:@"1.0.2", @"1.0.3", nil];
  200. NSSet<NSString *> *emptySet = [[NSSet<NSString *> alloc] init];
  201. NSString *configKey =
  202. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_disabled_ios_versions"];
  203. [userDefaults setObject:@"1.0.2;1.0.3" forKey:configKey];
  204. XCTAssertEqualObjects([configurations sdkDisabledVersions], versionSet);
  205. [userDefaults setObject:@"" forKey:configKey];
  206. XCTAssertEqualObjects([configurations sdkDisabledVersions], emptySet);
  207. [configFlags resetCache];
  208. }
  209. /** Validates if SDK version based disabling is honored. */
  210. - (void)testDisabledSDKVersionsDisablesSDK {
  211. FPRConfigurations *configurations =
  212. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  213. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  214. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusSuccess;
  215. FPRRemoteConfigFlags *configFlags =
  216. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  217. configurations.remoteConfigFlags = configFlags;
  218. configFlags.lastFetchedTime = [NSDate date];
  219. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  220. configFlags.userDefaults = userDefaults;
  221. NSString *configKey = [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_enabled"];
  222. [userDefaults setObject:@(TRUE) forKey:configKey];
  223. XCTAssertEqual([configurations sdkEnabled], TRUE);
  224. NSString *disableVersionsConfigKey =
  225. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_disabled_ios_versions"];
  226. [userDefaults setObject:[NSString stringWithUTF8String:kFPRSDKVersion]
  227. forKey:disableVersionsConfigKey];
  228. XCTAssertEqual([configurations sdkEnabled], FALSE);
  229. [configFlags resetCache];
  230. }
  231. /** Validates if Firebase Remote Config overrides work for SDK enabled. */
  232. - (void)testSDKEnabledFlag {
  233. FPRConfigurations *configurations =
  234. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  235. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  236. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusSuccess;
  237. FPRRemoteConfigFlags *configFlags =
  238. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  239. configurations.remoteConfigFlags = configFlags;
  240. configFlags.lastFetchedTime = [NSDate date];
  241. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  242. configFlags.userDefaults = userDefaults;
  243. NSString *configKey = [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_enabled"];
  244. [userDefaults setObject:@(TRUE) forKey:configKey];
  245. XCTAssertEqual([configurations sdkEnabled], TRUE);
  246. [userDefaults setObject:@(FALSE) forKey:configKey];
  247. XCTAssertEqual([configurations sdkEnabled], FALSE);
  248. [configFlags resetCache];
  249. }
  250. /** Validates if Plist overrides work for SDK Enabled flag. */
  251. - (void)testPlistOverridesSDKEnabledFlag {
  252. FPRConfigurations *configurations =
  253. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  254. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  255. remoteConfig.lastFetchStatus = FIRRemoteConfigFetchStatusSuccess;
  256. FPRRemoteConfigFlags *configFlags =
  257. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  258. configurations.remoteConfigFlags = configFlags;
  259. configFlags.lastFetchedTime = [NSDate date];
  260. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  261. configFlags.userDefaults = userDefaults;
  262. NSString *configKey = [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_enabled"];
  263. [userDefaults setObject:@(FALSE) forKey:configKey];
  264. XCTAssertEqual([configurations sdkEnabled], FALSE);
  265. NSDictionary<NSString *, id> *infoDictionary = configurations.infoDictionary;
  266. configurations.infoDictionary = @{@"firebase_performance_sdk_enabled" : @(TRUE)};
  267. XCTAssertEqual([configurations sdkEnabled], TRUE);
  268. configurations.infoDictionary = infoDictionary;
  269. [configFlags resetCache];
  270. }
  271. /** Validates if remote config overrides work for foreground rate limiting for traces. */
  272. - (void)testForegroundRateLimitingTraceCountRemoteConfigOverrides {
  273. FPRConfigurations *configurations =
  274. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  275. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  276. FPRRemoteConfigFlags *configFlags =
  277. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  278. configurations.remoteConfigFlags = configFlags;
  279. configFlags.lastFetchedTime = [NSDate date];
  280. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  281. configFlags.userDefaults = userDefaults;
  282. NSString *configKey =
  283. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_trace_event_count_fg"];
  284. [userDefaults setObject:@(100) forKey:configKey];
  285. XCTAssertEqual([configurations foregroundEventCount], 100);
  286. [userDefaults setObject:@(200) forKey:configKey];
  287. XCTAssertEqual([configurations foregroundEventCount], 200);
  288. [configFlags resetCache];
  289. }
  290. /** Validates if remote config overrides work for background rate limiting for traces. */
  291. - (void)testBackgroundRateLimitingTraceCountRemoteConfigOverrides {
  292. FPRConfigurations *configurations =
  293. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  294. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  295. FPRRemoteConfigFlags *configFlags =
  296. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  297. configurations.remoteConfigFlags = configFlags;
  298. configFlags.lastFetchedTime = [NSDate date];
  299. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  300. configFlags.userDefaults = userDefaults;
  301. NSString *configKey =
  302. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_trace_event_count_bg"];
  303. [userDefaults setObject:@(100) forKey:configKey];
  304. XCTAssertEqual([configurations backgroundEventCount], 100);
  305. [userDefaults setObject:@(200) forKey:configKey];
  306. XCTAssertEqual([configurations backgroundEventCount], 200);
  307. [configFlags resetCache];
  308. }
  309. /** Validates if remote config overrides work for foreground rate limiting for network requests. */
  310. - (void)testForegroundRateLimitingNetworkCountRemoteConfigOverrides {
  311. FPRConfigurations *configurations =
  312. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  313. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  314. FPRRemoteConfigFlags *configFlags =
  315. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  316. configurations.remoteConfigFlags = configFlags;
  317. configFlags.lastFetchedTime = [NSDate date];
  318. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  319. configFlags.userDefaults = userDefaults;
  320. NSString *configKey = [NSString
  321. stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_network_request_event_count_fg"];
  322. [userDefaults setObject:@(100) forKey:configKey];
  323. XCTAssertEqual([configurations foregroundNetworkEventCount], 100);
  324. [userDefaults setObject:@(200) forKey:configKey];
  325. XCTAssertEqual([configurations foregroundNetworkEventCount], 200);
  326. [configFlags resetCache];
  327. }
  328. /** Validates if remote config overrides work for background rate limiting for network requests. */
  329. - (void)testBackgroundRateLimitingNetworkCountRemoteConfigOverrides {
  330. FPRConfigurations *configurations =
  331. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  332. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  333. FPRRemoteConfigFlags *configFlags =
  334. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  335. configurations.remoteConfigFlags = configFlags;
  336. configFlags.lastFetchedTime = [NSDate date];
  337. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  338. configFlags.userDefaults = userDefaults;
  339. NSString *configKey = [NSString
  340. stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_network_request_event_count_bg"];
  341. [userDefaults setObject:@(100) forKey:configKey];
  342. XCTAssertEqual([configurations backgroundNetworkEventCount], 100);
  343. [userDefaults setObject:@(200) forKey:configKey];
  344. XCTAssertEqual([configurations backgroundNetworkEventCount], 200);
  345. [configFlags resetCache];
  346. }
  347. /** Validates if remote config overrides work for rate limiting time duration. */
  348. - (void)testRateLimitingDurationRemoteConfigOverrides {
  349. FPRConfigurations *configurations =
  350. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  351. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  352. FPRRemoteConfigFlags *configFlags =
  353. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  354. configurations.remoteConfigFlags = configFlags;
  355. configFlags.lastFetchedTime = [NSDate date];
  356. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  357. configFlags.userDefaults = userDefaults;
  358. NSString *configKey =
  359. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_rl_time_limit_sec"];
  360. [userDefaults setObject:@(300) forKey:configKey];
  361. XCTAssertEqual([configurations foregroundEventTimeLimit], 5);
  362. XCTAssertEqual([configurations backgroundEventTimeLimit], 5);
  363. XCTAssertEqual([configurations foregroundNetworkEventTimeLimit], 5);
  364. XCTAssertEqual([configurations backgroundNetworkEventTimeLimit], 5);
  365. [userDefaults setObject:@(900) forKey:configKey];
  366. XCTAssertEqual([configurations foregroundEventTimeLimit], 15);
  367. XCTAssertEqual([configurations backgroundEventTimeLimit], 15);
  368. XCTAssertEqual([configurations foregroundNetworkEventTimeLimit], 15);
  369. XCTAssertEqual([configurations backgroundNetworkEventTimeLimit], 15);
  370. [configFlags resetCache];
  371. }
  372. /** Validates if remote config overrides work for gauge collecction frequency. */
  373. - (void)testGaugeCollectionFrequencyRemoteConfigOverrides {
  374. FPRConfigurations *configurations =
  375. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  376. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  377. FPRRemoteConfigFlags *configFlags =
  378. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  379. configurations.remoteConfigFlags = configFlags;
  380. configFlags.lastFetchedTime = [NSDate date];
  381. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  382. configFlags.userDefaults = userDefaults;
  383. NSString *configKeyCPUFg =
  384. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  385. @"fpr_session_gauge_cpu_capture_frequency_fg_ms"];
  386. NSString *configKeyCPUBg =
  387. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  388. @"fpr_session_gauge_cpu_capture_frequency_bg_ms"];
  389. NSString *configKeyMemoryFg =
  390. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  391. @"fpr_session_gauge_memory_capture_frequency_fg_ms"];
  392. NSString *configKeyMemoryBg =
  393. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix,
  394. @"fpr_session_gauge_memory_capture_frequency_bg_ms"];
  395. [userDefaults setObject:@(100) forKey:configKeyCPUFg];
  396. [userDefaults setObject:@(200) forKey:configKeyCPUBg];
  397. [userDefaults setObject:@(300) forKey:configKeyMemoryFg];
  398. [userDefaults setObject:@(400) forKey:configKeyMemoryBg];
  399. XCTAssertEqual([configurations cpuSamplingFrequencyInForegroundInMS], 100);
  400. XCTAssertEqual([configurations cpuSamplingFrequencyInBackgroundInMS], 200);
  401. XCTAssertEqual([configurations memorySamplingFrequencyInForegroundInMS], 300);
  402. XCTAssertEqual([configurations memorySamplingFrequencyInBackgroundInMS], 400);
  403. [userDefaults setObject:@(10) forKey:configKeyCPUFg];
  404. [userDefaults setObject:@(20) forKey:configKeyCPUBg];
  405. [userDefaults setObject:@(30) forKey:configKeyMemoryFg];
  406. [userDefaults setObject:@(40) forKey:configKeyMemoryBg];
  407. XCTAssertEqual([configurations cpuSamplingFrequencyInForegroundInMS], 10);
  408. XCTAssertEqual([configurations cpuSamplingFrequencyInBackgroundInMS], 20);
  409. XCTAssertEqual([configurations memorySamplingFrequencyInForegroundInMS], 30);
  410. XCTAssertEqual([configurations memorySamplingFrequencyInBackgroundInMS], 40);
  411. [configFlags resetCache];
  412. }
  413. /** Validates if remote config overrides work for sessions max length duration. */
  414. - (void)testSessionMaxLengthDurationRemoteConfigOverrides {
  415. FPRConfigurations *configurations =
  416. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  417. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  418. FPRRemoteConfigFlags *configFlags =
  419. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  420. configurations.remoteConfigFlags = configFlags;
  421. configFlags.lastFetchedTime = [NSDate date];
  422. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  423. configFlags.userDefaults = userDefaults;
  424. NSString *configKey =
  425. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_session_max_duration_min"];
  426. [userDefaults setObject:@(100) forKey:configKey];
  427. XCTAssertEqual([configurations maxSessionLengthInMinutes], 100);
  428. [userDefaults setObject:@(200) forKey:configKey];
  429. XCTAssertEqual([configurations maxSessionLengthInMinutes], 200);
  430. [configFlags resetCache];
  431. }
  432. - (void)testPrewarmDetectionRemoteConfigOverrides {
  433. FPRConfigurations *configurations =
  434. [[FPRConfigurations alloc] initWithSources:FPRConfigurationSourceRemoteConfig];
  435. FPRFakeRemoteConfig *remoteConfig = [[FPRFakeRemoteConfig alloc] init];
  436. FPRRemoteConfigFlags *configFlags =
  437. [[FPRRemoteConfigFlags alloc] initWithRemoteConfig:(FIRRemoteConfig *)remoteConfig];
  438. configurations.remoteConfigFlags = configFlags;
  439. configFlags.lastFetchedTime = [NSDate date];
  440. GULUserDefaults *_Nonnull userDefaults = [self makeEmptyUserDefaults];
  441. configFlags.userDefaults = userDefaults;
  442. NSString *configKey =
  443. [NSString stringWithFormat:@"%@.%@", kFPRConfigPrefix, @"fpr_prewarm_detection"];
  444. [userDefaults setObject:@(0) forKey:configKey];
  445. XCTAssertEqual([configurations prewarmDetectionMode], 0);
  446. [userDefaults setObject:@(1) forKey:configKey];
  447. XCTAssertEqual([configurations prewarmDetectionMode], 1);
  448. [userDefaults setObject:@(2) forKey:configKey];
  449. XCTAssertEqual([configurations prewarmDetectionMode], 2);
  450. [configFlags resetCache];
  451. }
  452. @end