FPRConfigurationsTest.m 24 KB

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