FPRNanoPbUtilsTest.m 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. // Copyright 2021 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/FIRPerformance+Internal.h"
  16. #import "FirebasePerformance/Sources/FPRDataUtils.h"
  17. #import "FirebasePerformance/Sources/FPRNanoPbUtils.h"
  18. #import "FirebasePerformance/Sources/Public/FirebasePerformance/FIRPerformance.h"
  19. #import "FirebasePerformance/Sources/Common/FPRConstants.h"
  20. #import "FirebasePerformance/Sources/Instrumentation/FPRNetworkTrace+Private.h"
  21. #import "FirebasePerformance/Sources/Instrumentation/FPRNetworkTrace.h"
  22. #import "FirebasePerformance/Sources/Timer/FIRTrace+Internal.h"
  23. #import "FirebasePerformance/Sources/Timer/FIRTrace+Private.h"
  24. #import "FirebasePerformance/Sources/Gauges/CPU/FPRCPUGaugeData.h"
  25. #import "FirebasePerformance/Sources/Gauges/Memory/FPRMemoryGaugeData.h"
  26. #import "FirebasePerformance/Tests/Unit/FPRTestCase.h"
  27. #import "FirebasePerformance/Tests/Unit/FPRTestUtils.h"
  28. #import <OCMock/OCMock.h>
  29. @interface FPRNanoPbUtilsTest : FPRTestCase
  30. @end
  31. @implementation FPRNanoPbUtilsTest
  32. - (void)setUp {
  33. [super setUp];
  34. FIRPerformance *performance = [FIRPerformance sharedInstance];
  35. [performance setDataCollectionEnabled:YES];
  36. }
  37. - (void)tearDown {
  38. [super tearDown];
  39. FIRPerformance *performance = [FIRPerformance sharedInstance];
  40. [performance setDataCollectionEnabled:NO];
  41. }
  42. /** Validates that a firebase_perf_v1_PerfMetric creation is successful. */
  43. - (void)testPerfMetricMessageCreation {
  44. NSString *appID = @"RandomAppID";
  45. firebase_perf_v1_PerfMetric perfMetric = FPRGetPerfMetricMessage(appID);
  46. XCTAssertEqualObjects(FPRDecodeString(perfMetric.application_info.google_app_id), appID);
  47. }
  48. /** Tests if the application information is populated when creating a firebase_perf_v1_PerfMetric.
  49. */
  50. - (void)testApplicationInfoMessage {
  51. firebase_perf_v1_PerfMetric event = FPRGetPerfMetricMessage(@"appid");
  52. firebase_perf_v1_ApplicationInfo appInfo = event.application_info;
  53. XCTAssertEqualObjects(FPRDecodeString(appInfo.google_app_id), @"appid");
  54. XCTAssertTrue(appInfo.ios_app_info.sdk_version != NULL);
  55. XCTAssertTrue(appInfo.has_ios_app_info);
  56. XCTAssertTrue(appInfo.ios_app_info.bundle_short_version != NULL);
  57. XCTAssertTrue(appInfo.ios_app_info.mcc_mnc == NULL || appInfo.ios_app_info.mcc_mnc->size == 6);
  58. XCTAssertTrue(appInfo.ios_app_info.has_network_connection_info);
  59. XCTAssertTrue(appInfo.ios_app_info.network_connection_info.has_network_type);
  60. XCTAssertTrue(appInfo.ios_app_info.network_connection_info.network_type !=
  61. firebase_perf_v1_NetworkConnectionInfo_NetworkType_NONE);
  62. if (appInfo.ios_app_info.network_connection_info.network_type ==
  63. firebase_perf_v1_NetworkConnectionInfo_NetworkType_MOBILE) {
  64. XCTAssertTrue(appInfo.ios_app_info.network_connection_info.mobile_subtype !=
  65. firebase_perf_v1_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE);
  66. }
  67. }
  68. /** Validates that ApplicationInfoMessage carries global attributes. */
  69. - (void)testApplicationInfoMessageWithAttributes {
  70. FIRPerformance *performance = [FIRPerformance sharedInstance];
  71. [performance setValue:@"bar1" forAttribute:@"foo1"];
  72. [performance setValue:@"bar2" forAttribute:@"foo2"];
  73. firebase_perf_v1_PerfMetric event = FPRGetPerfMetricMessage(@"appid");
  74. firebase_perf_v1_ApplicationInfo appInfo = event.application_info;
  75. XCTAssertEqual(appInfo.custom_attributes_count, 2);
  76. NSDictionary *attributes = FPRDecodeStringToStringMap(
  77. (StringToStringMap *)appInfo.custom_attributes, appInfo.custom_attributes_count);
  78. XCTAssertEqualObjects(attributes[@"foo1"], @"bar1");
  79. XCTAssertEqualObjects(attributes[@"foo2"], @"bar2");
  80. [performance removeAttribute:@"foo1"];
  81. [performance removeAttribute:@"foo2"];
  82. }
  83. /** Validates that a valid FIRTrace object to firebase_perf_v1_TraceMetric conversion is successful.
  84. */
  85. - (void)testTraceMetricMessageCreation {
  86. FIRTrace *trace = [[FIRTrace alloc] initWithName:@"Random"];
  87. [trace start];
  88. [trace startStageNamed:@"1"];
  89. [trace startStageNamed:@"2"];
  90. [trace incrementMetric:@"c1" byInt:2];
  91. [trace setValue:@"bar" forAttribute:@"foo"];
  92. [trace stop];
  93. firebase_perf_v1_TraceMetric traceMetric = FPRGetTraceMetric(trace);
  94. XCTAssertEqualObjects(FPRDecodeString(traceMetric.name), @"Random");
  95. XCTAssertEqual(traceMetric.subtraces_count, 2);
  96. XCTAssertEqual(traceMetric.counters_count, 1);
  97. NSDictionary *counters = FPRDecodeStringToNumberMap((StringToNumberMap *)traceMetric.counters,
  98. traceMetric.counters_count);
  99. XCTAssertEqual([counters[@"c1"] intValue], 2);
  100. XCTAssertEqualObjects(FPRDecodeString(traceMetric.subtraces[0].name), @"1");
  101. XCTAssertEqualObjects(FPRDecodeString(traceMetric.subtraces[1].name), @"2");
  102. XCTAssertTrue(traceMetric.custom_attributes != NULL);
  103. XCTAssertEqual(traceMetric.custom_attributes_count, 1);
  104. NSDictionary *attributes = FPRDecodeStringToStringMap(
  105. (StringToStringMap *)traceMetric.custom_attributes, traceMetric.custom_attributes_count);
  106. XCTAssertEqualObjects(attributes[@"foo"], @"bar");
  107. }
  108. /** Validates that a valid FIRTrace object to firebase_perf_v1_TraceMetric conversion has required
  109. * fields. */
  110. - (void)testTraceMetricMessageCreationHasRequiredFields {
  111. FIRTrace *trace = [[FIRTrace alloc] initWithName:@"Random"];
  112. [trace start];
  113. [trace incrementMetric:@"c1" byInt:2];
  114. [trace stop];
  115. firebase_perf_v1_TraceMetric traceMetric = FPRGetTraceMetric(trace);
  116. XCTAssertTrue(traceMetric.name != NULL);
  117. XCTAssertTrue(traceMetric.has_client_start_time_us);
  118. XCTAssertTrue(traceMetric.has_duration_us);
  119. XCTAssertTrue(traceMetric.has_is_auto);
  120. }
  121. /** Validates the session details inside trace metric. */
  122. - (void)testTraceMetricMessageHasSessionDetails {
  123. FIRTrace *trace = [[FIRTrace alloc] initWithName:@"Random"];
  124. [trace start];
  125. [trace incrementMetric:@"c1" byInt:2];
  126. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  127. options:FPRSessionOptionsNone];
  128. FPRSessionDetails *session2 =
  129. [[FPRSessionDetails alloc] initWithSessionId:@"b" options:FPRSessionOptionsGauges];
  130. trace.activeSessions = [@[ session1, session2 ] mutableCopy];
  131. [trace stop];
  132. firebase_perf_v1_TraceMetric traceMetric = FPRGetTraceMetric(trace);
  133. XCTAssertTrue(traceMetric.perf_sessions != NULL);
  134. XCTAssertTrue(traceMetric.perf_sessions_count >= 2);
  135. }
  136. /** Validates that the FPRNetworkTrace object to firebase_perf_v1_NetworkRequestMetric conversion is
  137. * successful. */
  138. - (void)testNetworkTraceMetricMessage {
  139. NSURL *URL = [NSURL URLWithString:@"https://abc.com"];
  140. NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];
  141. FPRNetworkTrace *trace = [[FPRNetworkTrace alloc] initWithURLRequest:URLRequest];
  142. [trace start];
  143. [trace checkpointState:FPRNetworkTraceCheckpointStateInitiated];
  144. [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
  145. NSDictionary<NSString *, NSString *> *headerFields = @{@"Content-Type" : @"text/json"};
  146. NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URLRequest.URL
  147. statusCode:404
  148. HTTPVersion:@"HTTP/1.1"
  149. headerFields:headerFields];
  150. NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-200 userInfo:nil];
  151. [trace didReceiveData:[NSData data]];
  152. [trace didCompleteRequestWithResponse:response error:error];
  153. firebase_perf_v1_NetworkRequestMetric networkMetric = FPRGetNetworkRequestMetric(trace);
  154. XCTAssertEqualObjects(FPRDecodeString(networkMetric.url), URL.absoluteString);
  155. XCTAssertEqual(networkMetric.http_method, firebase_perf_v1_NetworkRequestMetric_HttpMethod_GET);
  156. XCTAssertEqual(
  157. networkMetric.network_client_error_reason,
  158. firebase_perf_v1_NetworkRequestMetric_NetworkClientErrorReason_GENERIC_CLIENT_ERROR);
  159. XCTAssertEqual(networkMetric.http_response_code, 404);
  160. XCTAssertEqualObjects(FPRDecodeString(networkMetric.response_content_type), @"text/json");
  161. }
  162. /** Validates that the FPRNetworkTrace object to Proto conversion has required fields for a valid
  163. * response.
  164. */
  165. - (void)testNetworkTraceMetricMessageHasAllRequiredFields {
  166. NSURL *URL = [NSURL URLWithString:@"https://abc.com"];
  167. NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];
  168. FPRNetworkTrace *trace = [[FPRNetworkTrace alloc] initWithURLRequest:URLRequest];
  169. [trace start];
  170. [trace checkpointState:FPRNetworkTraceCheckpointStateInitiated];
  171. [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
  172. NSDictionary<NSString *, NSString *> *headerFields = @{@"Content-Type" : @"text/json"};
  173. NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URLRequest.URL
  174. statusCode:404
  175. HTTPVersion:@"HTTP/1.1"
  176. headerFields:headerFields];
  177. NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-200 userInfo:nil];
  178. [trace didReceiveData:[NSData data]];
  179. [trace didCompleteRequestWithResponse:response error:error];
  180. firebase_perf_v1_NetworkRequestMetric networkMetric = FPRGetNetworkRequestMetric(trace);
  181. XCTAssertTrue(networkMetric.url != NULL);
  182. XCTAssertTrue(networkMetric.has_client_start_time_us);
  183. XCTAssertTrue(networkMetric.has_http_method);
  184. XCTAssertTrue(networkMetric.has_response_payload_bytes);
  185. XCTAssertTrue(networkMetric.has_network_client_error_reason);
  186. XCTAssertTrue(networkMetric.has_http_response_code);
  187. XCTAssertTrue(networkMetric.response_content_type != NULL);
  188. XCTAssertTrue(networkMetric.has_time_to_response_completed_us);
  189. }
  190. /** Validates that application process state conversion to firebase_perf_v1_ApplicationProcessState
  191. * enum type is successful. */
  192. - (void)testApplicationProcessStateConversion {
  193. XCTAssertEqual(firebase_perf_v1_ApplicationProcessState_BACKGROUND,
  194. FPRApplicationProcessState(FPRTraceStateBackgroundOnly));
  195. XCTAssertEqual(firebase_perf_v1_ApplicationProcessState_FOREGROUND,
  196. FPRApplicationProcessState(FPRTraceStateForegroundOnly));
  197. XCTAssertEqual(firebase_perf_v1_ApplicationProcessState_FOREGROUND_BACKGROUND,
  198. FPRApplicationProcessState(FPRTraceStateBackgroundAndForeground));
  199. XCTAssertEqual(firebase_perf_v1_ApplicationProcessState_APPLICATION_PROCESS_STATE_UNKNOWN,
  200. FPRApplicationProcessState(FPRTraceStateUnknown));
  201. // Try with some random value should say the application state is unknown.
  202. XCTAssertEqual(firebase_perf_v1_ApplicationProcessState_APPLICATION_PROCESS_STATE_UNKNOWN,
  203. FPRApplicationProcessState(100));
  204. }
  205. #ifdef TARGET_HAS_MOBILE_CONNECTIVITY
  206. /** Validates if network object creation works. */
  207. - (void)testNetworkInfoObjectCreation {
  208. XCTAssertNotNil(FPRNetworkInfo());
  209. }
  210. #endif
  211. /** Validates the session details inside trace metric. */
  212. - (void)testNetworkRequestMetricMessageHasSessionDetails {
  213. NSURL *URL = [NSURL URLWithString:@"https://abc.com"];
  214. NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];
  215. FPRNetworkTrace *trace = [[FPRNetworkTrace alloc] initWithURLRequest:URLRequest];
  216. [trace start];
  217. [trace checkpointState:FPRNetworkTraceCheckpointStateInitiated];
  218. [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
  219. NSDictionary<NSString *, NSString *> *headerFields = @{@"Content-Type" : @"text/json"};
  220. NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URLRequest.URL
  221. statusCode:404
  222. HTTPVersion:@"HTTP/1.1"
  223. headerFields:headerFields];
  224. NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-200 userInfo:nil];
  225. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  226. options:FPRSessionOptionsNone];
  227. FPRSessionDetails *session2 =
  228. [[FPRSessionDetails alloc] initWithSessionId:@"b" options:FPRSessionOptionsGauges];
  229. trace.activeSessions = [@[ session1, session2 ] mutableCopy];
  230. [trace didReceiveData:[NSData data]];
  231. [trace didCompleteRequestWithResponse:response error:error];
  232. firebase_perf_v1_NetworkRequestMetric networkMetric = FPRGetNetworkRequestMetric(trace);
  233. XCTAssertTrue(networkMetric.perf_sessions != NULL);
  234. XCTAssertTrue(networkMetric.perf_sessions_count >= 2);
  235. }
  236. /** Validates the gauge metric proto packaging works with proper conversions. */
  237. - (void)testMemoryMetricProtoConversion {
  238. NSMutableArray *gauges = [[NSMutableArray alloc] init];
  239. NSDate *date = [NSDate date];
  240. FPRMemoryGaugeData *memoryData = [[FPRMemoryGaugeData alloc] initWithCollectionTime:date
  241. heapUsed:5 * 1024
  242. heapAvailable:10 * 1024];
  243. [gauges addObject:memoryData];
  244. firebase_perf_v1_GaugeMetric gaugeMetric = FPRGetGaugeMetric(gauges, @"abc");
  245. XCTAssertEqual(gaugeMetric.cpu_metric_readings_count, 0);
  246. XCTAssertEqual(gaugeMetric.ios_memory_readings_count, 1);
  247. XCTAssertEqual(gaugeMetric.ios_memory_readings[0].used_app_heap_memory_kb, 5);
  248. XCTAssertEqual(gaugeMetric.ios_memory_readings[0].free_app_heap_memory_kb, 10);
  249. }
  250. /** Validates the gauge metric proto packaging works. */
  251. - (void)testGaugeMetricProtoPacking {
  252. NSMutableArray *gauges = [[NSMutableArray alloc] init];
  253. for (int i = 0; i < 5; i++) {
  254. NSDate *date = [NSDate date];
  255. FPRCPUGaugeData *cpuData = [[FPRCPUGaugeData alloc] initWithCollectionTime:date
  256. systemTime:100
  257. userTime:200];
  258. FPRMemoryGaugeData *memoryData = [[FPRMemoryGaugeData alloc] initWithCollectionTime:date
  259. heapUsed:100
  260. heapAvailable:200];
  261. [gauges addObject:cpuData];
  262. [gauges addObject:memoryData];
  263. }
  264. firebase_perf_v1_GaugeMetric gaugeMetric = FPRGetGaugeMetric(gauges, @"abc");
  265. XCTAssertEqual(gaugeMetric.cpu_metric_readings_count, 5);
  266. XCTAssertEqual(gaugeMetric.ios_memory_readings_count, 5);
  267. }
  268. /** Validates if the first session is a verbose session for a trace. */
  269. - (void)testOrderingOfSessionsForTrace {
  270. FIRTrace *trace = [[FIRTrace alloc] initWithName:@"Random"];
  271. [trace start];
  272. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  273. options:FPRSessionOptionsNone];
  274. FPRSessionDetails *session2 =
  275. [[FPRSessionDetails alloc] initWithSessionId:@"b" options:FPRSessionOptionsGauges];
  276. trace.activeSessions = [@[ session1, session2 ] mutableCopy];
  277. [trace stop];
  278. firebase_perf_v1_TraceMetric traceMetric = FPRGetTraceMetric(trace);
  279. XCTAssertTrue(traceMetric.perf_sessions != NULL);
  280. XCTAssertTrue(traceMetric.perf_sessions_count >= 2);
  281. firebase_perf_v1_PerfSession perfSession = traceMetric.perf_sessions[0];
  282. XCTAssertEqual(perfSession.session_verbosity[0],
  283. firebase_perf_v1_SessionVerbosity_GAUGES_AND_SYSTEM_EVENTS);
  284. XCTAssertEqualObjects(FPRDecodeString(perfSession.session_id), @"b");
  285. }
  286. /** Validates the verbosity ordering when no sessions are verbose. */
  287. - (void)testOrderingOfNonVerboseSessionsForTrace {
  288. FIRTrace *trace = [[FIRTrace alloc] initWithName:@"Random"];
  289. [trace start];
  290. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  291. options:FPRSessionOptionsNone];
  292. FPRSessionDetails *session2 = [[FPRSessionDetails alloc] initWithSessionId:@"b"
  293. options:FPRSessionOptionsNone];
  294. trace.activeSessions = [@[ session1, session2 ] mutableCopy];
  295. [trace stop];
  296. firebase_perf_v1_TraceMetric traceMetric = FPRGetTraceMetric(trace);
  297. XCTAssertTrue(traceMetric.perf_sessions != NULL);
  298. XCTAssertTrue(traceMetric.perf_sessions_count >= 2);
  299. firebase_perf_v1_PerfSession perfSession = traceMetric.perf_sessions[0];
  300. XCTAssertEqualObjects(FPRDecodeString(perfSession.session_id), @"a");
  301. XCTAssertEqual(perfSession.session_verbosity_count, 0);
  302. }
  303. /** Validates if a session is not verbose, do not populate the session verbosity array. */
  304. - (void)testVerbosityArrayEmptyWhenTheSessionIsNotVerbose {
  305. FIRTrace *trace = [[FIRTrace alloc] initWithName:@"Random"];
  306. [trace start];
  307. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  308. options:FPRSessionOptionsNone];
  309. trace.activeSessions = [@[ session1 ] mutableCopy];
  310. [trace stop];
  311. firebase_perf_v1_TraceMetric traceMetric = FPRGetTraceMetric(trace);
  312. XCTAssertTrue(traceMetric.perf_sessions != NULL);
  313. XCTAssertTrue(traceMetric.perf_sessions_count >= 1);
  314. firebase_perf_v1_PerfSession perfSession = traceMetric.perf_sessions[0];
  315. XCTAssertEqualObjects(FPRDecodeString(perfSession.session_id), @"a");
  316. XCTAssertEqual(perfSession.session_verbosity_count, 0);
  317. }
  318. /** Validates if the first session is a verbose session for a network trace. */
  319. - (void)testOrderingOfSessionsForNetworkTrace {
  320. NSURL *URL = [NSURL URLWithString:@"https://abc.com"];
  321. NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];
  322. FPRNetworkTrace *trace = [[FPRNetworkTrace alloc] initWithURLRequest:URLRequest];
  323. [trace start];
  324. [trace checkpointState:FPRNetworkTraceCheckpointStateInitiated];
  325. [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
  326. NSDictionary<NSString *, NSString *> *headerFields = @{@"Content-Type" : @"text/json"};
  327. NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URLRequest.URL
  328. statusCode:404
  329. HTTPVersion:@"HTTP/1.1"
  330. headerFields:headerFields];
  331. NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-200 userInfo:nil];
  332. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  333. options:FPRSessionOptionsNone];
  334. FPRSessionDetails *session2 =
  335. [[FPRSessionDetails alloc] initWithSessionId:@"b" options:FPRSessionOptionsGauges];
  336. trace.activeSessions = [@[ session1, session2 ] mutableCopy];
  337. [trace didReceiveData:[NSData data]];
  338. [trace didCompleteRequestWithResponse:response error:error];
  339. firebase_perf_v1_NetworkRequestMetric networkMetric = FPRGetNetworkRequestMetric(trace);
  340. XCTAssertTrue(networkMetric.perf_sessions != NULL);
  341. XCTAssertTrue(networkMetric.perf_sessions_count >= 2);
  342. firebase_perf_v1_PerfSession perfSession = networkMetric.perf_sessions[0];
  343. XCTAssertEqual(perfSession.session_verbosity[0],
  344. firebase_perf_v1_SessionVerbosity_GAUGES_AND_SYSTEM_EVENTS);
  345. XCTAssertEqualObjects(FPRDecodeString(perfSession.session_id), @"b");
  346. }
  347. /** Validates the verbosity ordering when no sessions are verbose for a network trace. */
  348. - (void)testOrderingOfNonVerboseSessionsForNetworkTrace {
  349. NSURL *URL = [NSURL URLWithString:@"https://abc.com"];
  350. NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];
  351. FPRNetworkTrace *trace = [[FPRNetworkTrace alloc] initWithURLRequest:URLRequest];
  352. [trace start];
  353. [trace checkpointState:FPRNetworkTraceCheckpointStateInitiated];
  354. [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
  355. NSDictionary<NSString *, NSString *> *headerFields = @{@"Content-Type" : @"text/json"};
  356. NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URLRequest.URL
  357. statusCode:404
  358. HTTPVersion:@"HTTP/1.1"
  359. headerFields:headerFields];
  360. NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-200 userInfo:nil];
  361. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  362. options:FPRSessionOptionsNone];
  363. FPRSessionDetails *session2 = [[FPRSessionDetails alloc] initWithSessionId:@"b"
  364. options:FPRSessionOptionsNone];
  365. trace.activeSessions = [@[ session1, session2 ] mutableCopy];
  366. [trace didReceiveData:[NSData data]];
  367. [trace didCompleteRequestWithResponse:response error:error];
  368. firebase_perf_v1_NetworkRequestMetric networkMetric = FPRGetNetworkRequestMetric(trace);
  369. XCTAssertTrue(networkMetric.perf_sessions != NULL);
  370. XCTAssertTrue(networkMetric.perf_sessions_count >= 2);
  371. firebase_perf_v1_PerfSession perfSession = networkMetric.perf_sessions[0];
  372. XCTAssertEqualObjects(FPRDecodeString(perfSession.session_id), @"a");
  373. XCTAssertEqual(perfSession.session_verbosity_count, 0);
  374. }
  375. /** Validates if a session is not verbose, do not populate the session verbosity array for network
  376. * trace.
  377. */
  378. - (void)testVerbosityArrayEmptyWhenTheSessionIsNotVerboseForNetworkTrace {
  379. NSURL *URL = [NSURL URLWithString:@"https://abc.com"];
  380. NSURLRequest *URLRequest = [NSURLRequest requestWithURL:URL];
  381. FPRNetworkTrace *trace = [[FPRNetworkTrace alloc] initWithURLRequest:URLRequest];
  382. [trace start];
  383. [trace checkpointState:FPRNetworkTraceCheckpointStateInitiated];
  384. [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
  385. NSDictionary<NSString *, NSString *> *headerFields = @{@"Content-Type" : @"text/json"};
  386. NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:URLRequest.URL
  387. statusCode:404
  388. HTTPVersion:@"HTTP/1.1"
  389. headerFields:headerFields];
  390. NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:-200 userInfo:nil];
  391. FPRSessionDetails *session1 = [[FPRSessionDetails alloc] initWithSessionId:@"a"
  392. options:FPRSessionOptionsNone];
  393. trace.activeSessions = [@[ session1 ] mutableCopy];
  394. [trace didReceiveData:[NSData data]];
  395. [trace didCompleteRequestWithResponse:response error:error];
  396. firebase_perf_v1_NetworkRequestMetric networkMetric = FPRGetNetworkRequestMetric(trace);
  397. XCTAssertTrue(networkMetric.perf_sessions != NULL);
  398. XCTAssertTrue(networkMetric.perf_sessions_count >= 1);
  399. firebase_perf_v1_PerfSession perfSession = networkMetric.perf_sessions[0];
  400. XCTAssertEqualObjects(FPRDecodeString(perfSession.session_id), @"a");
  401. XCTAssertEqual(perfSession.session_verbosity_count, 0);
  402. }
  403. @end