FPRConfigurationsTest.m 28 KB

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