SessionStartEventTests.swift 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. //
  2. // Copyright 2022 Google LLC
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. import XCTest
  16. #if SWIFT_PACKAGE
  17. import FirebaseSessionsObjC
  18. #endif // SWIFT_PACKAGE
  19. #if SWIFT_PACKAGE
  20. @_implementationOnly import GoogleUtilities_Environment
  21. #else
  22. @_implementationOnly import GoogleUtilities
  23. #endif // SWIFT_PACKAGE
  24. @testable import FirebaseSessions
  25. class SessionStartEventTests: XCTestCase {
  26. var time: MockTimeProvider!
  27. var appInfo: MockApplicationInfo!
  28. override func setUp() {
  29. super.setUp()
  30. time = MockTimeProvider()
  31. appInfo = MockApplicationInfo()
  32. }
  33. var defaultSessionInfo: SessionInfo {
  34. return SessionInfo(
  35. sessionId: "test_session_id",
  36. firstSessionId: "test_first_session_id",
  37. dispatchEvents: true,
  38. sessionIndex: 0
  39. )
  40. }
  41. var thirdSessionInfo: SessionInfo {
  42. return SessionInfo(
  43. sessionId: "test_third_session_id",
  44. firstSessionId: "test_first_session_id",
  45. dispatchEvents: true,
  46. sessionIndex: 2
  47. )
  48. }
  49. /// This function runs the `testCase` twice, once for the proto object stored in
  50. /// the event, and once after encoding and decoding the proto. This is useful for
  51. /// testing cases where the proto hasn't been encoded correctly.
  52. func testProtoAndDecodedProto(sessionEvent: SessionStartEvent,
  53. testCase: (firebase_appquality_sessions_SessionEvent) -> Void) {
  54. let proto = sessionEvent.proto
  55. testCase(proto)
  56. /// If you are getting failures in this test case, and not the one above, the
  57. /// problem likely lies in encoding the proto
  58. let decodedProto = sessionEvent.encodeDecodeEvent()
  59. testCase(decodedProto)
  60. }
  61. func test_init_setsSessionData() {
  62. let event = SessionStartEvent(sessionInfo: thirdSessionInfo, appInfo: appInfo, time: time)
  63. testProtoAndDecodedProto(sessionEvent: event) { proto in
  64. assertEqualProtoString(
  65. proto.session_data.session_id,
  66. expected: "test_third_session_id",
  67. fieldName: "session_id"
  68. )
  69. assertEqualProtoString(
  70. proto.session_data.first_session_id,
  71. expected: "test_first_session_id",
  72. fieldName: "first_session_id"
  73. )
  74. XCTAssertEqual(proto.session_data.session_index, 2)
  75. XCTAssertEqual(proto.session_data.event_timestamp_us, 123)
  76. }
  77. }
  78. func test_init_setsApplicationInfo() {
  79. let event = SessionStartEvent(sessionInfo: defaultSessionInfo, appInfo: appInfo, time: time)
  80. testProtoAndDecodedProto(sessionEvent: event) { proto in
  81. assertEqualProtoString(
  82. proto.application_info.app_id,
  83. expected: MockApplicationInfo.testAppID,
  84. fieldName: "app_id"
  85. )
  86. assertEqualProtoString(
  87. proto.application_info.session_sdk_version,
  88. expected: MockApplicationInfo.testSDKVersion,
  89. fieldName: "session_sdk_version"
  90. )
  91. assertEqualProtoString(
  92. proto.application_info.os_version,
  93. expected: MockApplicationInfo.testOsDisplayVersion,
  94. fieldName: "os_version"
  95. )
  96. assertEqualProtoString(
  97. proto.application_info.apple_app_info.bundle_short_version,
  98. expected: MockApplicationInfo.testAppDisplayVersion,
  99. fieldName: "bundle_short_version"
  100. )
  101. assertEqualProtoString(
  102. proto.application_info.apple_app_info.app_build_version,
  103. expected: MockApplicationInfo.testAppBuildVersion,
  104. fieldName: "app_build_version"
  105. )
  106. assertEqualProtoString(
  107. proto.application_info.device_model,
  108. expected: MockApplicationInfo.testDeviceModel,
  109. fieldName: "device_model"
  110. )
  111. // Ensure we convert the test OS name into the enum.
  112. XCTAssertEqual(
  113. proto.application_info.apple_app_info.os_name,
  114. firebase_appquality_sessions_OsName_IOS
  115. )
  116. }
  117. }
  118. func test_setInstallationID_setsInstallationID() {
  119. let event = SessionStartEvent(sessionInfo: defaultSessionInfo, appInfo: appInfo, time: time)
  120. event.setInstallationID(installationId: "testInstallationID")
  121. testProtoAndDecodedProto(sessionEvent: event) { proto in
  122. assertEqualProtoString(
  123. proto.session_data.firebase_installation_id,
  124. expected: "testInstallationID",
  125. fieldName: "firebase_installation_id"
  126. )
  127. }
  128. }
  129. func test_convertOSName_convertsCorrectly() {
  130. let expectations: [(given: String, expected: firebase_appquality_sessions_OsName)] = [
  131. ("macos", firebase_appquality_sessions_OsName_MACOS),
  132. ("maccatalyst", firebase_appquality_sessions_OsName_MACCATALYST),
  133. ("ios_on_mac", firebase_appquality_sessions_OsName_IOS_ON_MAC),
  134. ("ios", firebase_appquality_sessions_OsName_IOS),
  135. ("tvos", firebase_appquality_sessions_OsName_TVOS),
  136. ("watchos", firebase_appquality_sessions_OsName_WATCHOS),
  137. ("ipados", firebase_appquality_sessions_OsName_IPADOS),
  138. ("something unknown", firebase_appquality_sessions_OsName_UNKNOWN_OSNAME),
  139. ]
  140. expectations.forEach { (given: String, expected: firebase_appquality_sessions_OsName) in
  141. appInfo.osName = given
  142. let event = SessionStartEvent(
  143. sessionInfo: self.defaultSessionInfo,
  144. appInfo: appInfo,
  145. time: time
  146. )
  147. testProtoAndDecodedProto(sessionEvent: event) { proto in
  148. XCTAssertEqual(event.proto.application_info.apple_app_info.os_name, expected)
  149. }
  150. }
  151. }
  152. func test_convertLogEnvironment_convertsCorrectly() {
  153. let expectations: [(given: DevEnvironment,
  154. expected: firebase_appquality_sessions_LogEnvironment)] = [
  155. (.prod, firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_PROD),
  156. (
  157. .staging,
  158. firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_STAGING
  159. ),
  160. (
  161. .autopush,
  162. firebase_appquality_sessions_LogEnvironment_LOG_ENVIRONMENT_AUTOPUSH
  163. ),
  164. ]
  165. expectations.forEach { (given: DevEnvironment,
  166. expected: firebase_appquality_sessions_LogEnvironment) in
  167. appInfo.environment = given
  168. let event = SessionStartEvent(
  169. sessionInfo: self.defaultSessionInfo,
  170. appInfo: appInfo,
  171. time: time
  172. )
  173. XCTAssertEqual(event.proto.application_info.log_environment, expected)
  174. }
  175. }
  176. func test_dataCollectionState_defaultIsUnknown() {
  177. let event = SessionStartEvent(sessionInfo: defaultSessionInfo, appInfo: appInfo, time: time)
  178. testProtoAndDecodedProto(sessionEvent: event) { proto in
  179. XCTAssertEqual(
  180. proto.session_data.data_collection_status.performance,
  181. firebase_appquality_sessions_DataCollectionState_COLLECTION_SDK_NOT_INSTALLED
  182. )
  183. XCTAssertEqual(
  184. proto.session_data.data_collection_status.crashlytics,
  185. firebase_appquality_sessions_DataCollectionState_COLLECTION_SDK_NOT_INSTALLED
  186. )
  187. }
  188. }
  189. func test_newtworkInfo_onlyPresentWhenPerformanceInstalled() {
  190. let mockNetworkInfo = MockNetworkInfo()
  191. mockNetworkInfo.networkType = .mobile
  192. // Mobile Subtypes are always empty on non-iOS platforms, and
  193. // Performance doesn't support those platforms anyways
  194. #if swift(>=5.9)
  195. #if os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  196. mockNetworkInfo.mobileSubtype = CTRadioAccessTechnologyHSUPA
  197. #else // os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  198. mockNetworkInfo.mobileSubtype = ""
  199. #endif // os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  200. #else // swift(>=5.9)
  201. #if os(iOS) && !targetEnvironment(macCatalyst)
  202. mockNetworkInfo.mobileSubtype = CTRadioAccessTechnologyHSUPA
  203. #else // os(iOS) && !targetEnvironment(macCatalyst)
  204. mockNetworkInfo.mobileSubtype = ""
  205. #endif // os(iOS) && !targetEnvironment(macCatalyst)
  206. #endif // os(iOS) && !targetEnvironment(macCatalyst)
  207. appInfo.networkInfo = mockNetworkInfo
  208. let event = SessionStartEvent(sessionInfo: defaultSessionInfo, appInfo: appInfo, time: time)
  209. // These fields will not be filled in when Crashlytics is installed
  210. event.set(subscriber: .Crashlytics, isDataCollectionEnabled: true, appInfo: appInfo)
  211. // They should also not be filled in when Performance data collection is disabled
  212. event.set(subscriber: .Performance, isDataCollectionEnabled: false, appInfo: appInfo)
  213. // Expect empty because Crashlytics is installed, but not Perf
  214. testProtoAndDecodedProto(sessionEvent: event) { proto in
  215. XCTAssertEqual(
  216. event.proto.application_info.apple_app_info.network_connection_info.network_type,
  217. firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_DUMMY
  218. )
  219. XCTAssertEqual(
  220. event.proto.application_info.apple_app_info.network_connection_info.mobile_subtype,
  221. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE
  222. )
  223. assertEqualProtoString(
  224. proto.application_info.apple_app_info.mcc_mnc,
  225. expected: "",
  226. fieldName: "mcc_mnc"
  227. )
  228. }
  229. // These fields will only be filled in when the Perf SDK is installed
  230. event.set(subscriber: .Performance, isDataCollectionEnabled: true, appInfo: appInfo)
  231. // Now the field should be set with the real thing
  232. testProtoAndDecodedProto(sessionEvent: event) { proto in
  233. XCTAssertEqual(
  234. event.proto.application_info.apple_app_info.network_connection_info.network_type,
  235. firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE
  236. )
  237. // Mobile Subtypes are always empty on non-iOS platforms, and
  238. // Performance doesn't support those platforms anyways
  239. #if swift(>=5.9)
  240. #if os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  241. XCTAssertEqual(
  242. event.proto.application_info.apple_app_info.network_connection_info.mobile_subtype,
  243. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA
  244. )
  245. #else // os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  246. XCTAssertEqual(
  247. event.proto.application_info.apple_app_info.network_connection_info.mobile_subtype,
  248. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE
  249. )
  250. #endif // os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  251. #else // swift(>=5.9)
  252. #if os(iOS) && !targetEnvironment(macCatalyst)
  253. XCTAssertEqual(
  254. event.proto.application_info.apple_app_info.network_connection_info.mobile_subtype,
  255. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA
  256. )
  257. #else // os(iOS) && !targetEnvironment(macCatalyst)
  258. XCTAssertEqual(
  259. event.proto.application_info.apple_app_info.network_connection_info.mobile_subtype,
  260. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE
  261. )
  262. #endif // os(iOS) && !targetEnvironment(macCatalyst)
  263. #endif // swift(>=5.9)
  264. assertEqualProtoString(
  265. proto.application_info.apple_app_info.mcc_mnc,
  266. expected: "",
  267. fieldName: "mcc_mnc"
  268. )
  269. }
  270. }
  271. func test_convertNetworkType_convertsCorrectly() {
  272. let expectations: [(
  273. given: GULNetworkType,
  274. expected: firebase_appquality_sessions_NetworkConnectionInfo_NetworkType
  275. )] = [
  276. (
  277. .WIFI,
  278. firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_WIFI
  279. ),
  280. (
  281. .mobile,
  282. firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_MOBILE
  283. ),
  284. (
  285. .none,
  286. firebase_appquality_sessions_NetworkConnectionInfo_NetworkType_DUMMY
  287. ),
  288. ]
  289. expectations.forEach { (given: GULNetworkType,
  290. expected: firebase_appquality_sessions_NetworkConnectionInfo_NetworkType) in
  291. let mockNetworkInfo = MockNetworkInfo()
  292. mockNetworkInfo.networkType = given
  293. appInfo.networkInfo = mockNetworkInfo
  294. let event = SessionStartEvent(
  295. sessionInfo: self.defaultSessionInfo,
  296. appInfo: appInfo,
  297. time: time
  298. )
  299. // These fields will only be filled in when the Perf SDK is installed
  300. event.set(subscriber: .Performance, isDataCollectionEnabled: true, appInfo: appInfo)
  301. testProtoAndDecodedProto(sessionEvent: event) { proto in
  302. XCTAssertEqual(
  303. event.proto.application_info.apple_app_info.network_connection_info.network_type,
  304. expected
  305. )
  306. }
  307. }
  308. }
  309. /// Following tests can be run only in iOS environment
  310. #if swift(>=5.9)
  311. #if os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  312. func test_convertMobileSubtype_convertsCorrectlyPreOS14() {
  313. let expectations: [(
  314. given: String,
  315. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype
  316. )] = [
  317. (
  318. CTRadioAccessTechnologyGPRS,
  319. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_GPRS
  320. ),
  321. (
  322. CTRadioAccessTechnologyEdge,
  323. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EDGE
  324. ),
  325. (
  326. CTRadioAccessTechnologyWCDMA,
  327. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  328. ),
  329. (
  330. CTRadioAccessTechnologyCDMA1x,
  331. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  332. ),
  333. (
  334. CTRadioAccessTechnologyHSDPA,
  335. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSDPA
  336. ),
  337. (
  338. CTRadioAccessTechnologyHSUPA,
  339. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA
  340. ),
  341. (
  342. CTRadioAccessTechnologyCDMAEVDORev0,
  343. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_0
  344. ),
  345. (
  346. CTRadioAccessTechnologyCDMAEVDORevA,
  347. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_A
  348. ),
  349. (
  350. CTRadioAccessTechnologyCDMAEVDORevB,
  351. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_B
  352. ),
  353. (
  354. CTRadioAccessTechnologyeHRPD,
  355. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EHRPD
  356. ),
  357. (
  358. CTRadioAccessTechnologyLTE,
  359. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_LTE
  360. ),
  361. (
  362. "random",
  363. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE
  364. ),
  365. ]
  366. expectations
  367. .forEach { (given: String,
  368. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype) in
  369. let mockNetworkInfo = MockNetworkInfo()
  370. mockNetworkInfo.mobileSubtype = given
  371. appInfo.networkInfo = mockNetworkInfo
  372. let event = SessionStartEvent(
  373. sessionInfo: self.defaultSessionInfo,
  374. appInfo: appInfo,
  375. time: time
  376. )
  377. // These fields will only be filled in when the Perf SDK is installed
  378. event.set(subscriber: .Performance, isDataCollectionEnabled: true, appInfo: appInfo)
  379. testProtoAndDecodedProto(sessionEvent: event) { proto in
  380. XCTAssertEqual(
  381. event.proto.application_info.apple_app_info.network_connection_info
  382. .mobile_subtype,
  383. expected
  384. )
  385. }
  386. }
  387. }
  388. #endif // os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  389. #else // swift(>=5.9)
  390. #if os(iOS) && !targetEnvironment(macCatalyst)
  391. func test_convertMobileSubtype_convertsCorrectlyPreOS14() {
  392. let expectations: [(
  393. given: String,
  394. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype
  395. )] = [
  396. (
  397. CTRadioAccessTechnologyGPRS,
  398. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_GPRS
  399. ),
  400. (
  401. CTRadioAccessTechnologyEdge,
  402. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EDGE
  403. ),
  404. (
  405. CTRadioAccessTechnologyWCDMA,
  406. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  407. ),
  408. (
  409. CTRadioAccessTechnologyCDMA1x,
  410. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  411. ),
  412. (
  413. CTRadioAccessTechnologyHSDPA,
  414. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSDPA
  415. ),
  416. (
  417. CTRadioAccessTechnologyHSUPA,
  418. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA
  419. ),
  420. (
  421. CTRadioAccessTechnologyCDMAEVDORev0,
  422. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_0
  423. ),
  424. (
  425. CTRadioAccessTechnologyCDMAEVDORevA,
  426. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_A
  427. ),
  428. (
  429. CTRadioAccessTechnologyCDMAEVDORevB,
  430. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_B
  431. ),
  432. (
  433. CTRadioAccessTechnologyeHRPD,
  434. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EHRPD
  435. ),
  436. (
  437. CTRadioAccessTechnologyLTE,
  438. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_LTE
  439. ),
  440. (
  441. "random",
  442. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE
  443. ),
  444. ]
  445. expectations
  446. .forEach { (given: String,
  447. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype) in
  448. let mockNetworkInfo = MockNetworkInfo()
  449. mockNetworkInfo.mobileSubtype = given
  450. appInfo.networkInfo = mockNetworkInfo
  451. let event = SessionStartEvent(
  452. sessionInfo: self.defaultSessionInfo,
  453. appInfo: appInfo,
  454. time: time
  455. )
  456. // These fields will only be filled in when the Perf SDK is installed
  457. event.set(subscriber: .Performance, isDataCollectionEnabled: true, appInfo: appInfo)
  458. testProtoAndDecodedProto(sessionEvent: event) { proto in
  459. XCTAssertEqual(
  460. event.proto.application_info.apple_app_info.network_connection_info
  461. .mobile_subtype,
  462. expected
  463. )
  464. }
  465. }
  466. }
  467. #endif // os(iOS) && !targetEnvironment(macCatalyst)
  468. #endif // swift(>=5.9)
  469. #if swift(>=5.9)
  470. #if os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  471. @available(iOS 14.1, *)
  472. func test_convertMobileSubtype_convertsCorrectlyPostOS14() {
  473. let expectations: [(
  474. given: String,
  475. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype
  476. )] = [
  477. (
  478. CTRadioAccessTechnologyGPRS,
  479. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_GPRS
  480. ),
  481. (
  482. CTRadioAccessTechnologyEdge,
  483. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EDGE
  484. ),
  485. (
  486. CTRadioAccessTechnologyWCDMA,
  487. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  488. ),
  489. (
  490. CTRadioAccessTechnologyCDMA1x,
  491. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  492. ),
  493. (
  494. CTRadioAccessTechnologyHSDPA,
  495. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSDPA
  496. ),
  497. (
  498. CTRadioAccessTechnologyHSUPA,
  499. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA
  500. ),
  501. (
  502. CTRadioAccessTechnologyCDMAEVDORev0,
  503. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_0
  504. ),
  505. (
  506. CTRadioAccessTechnologyCDMAEVDORevA,
  507. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_A
  508. ),
  509. (
  510. CTRadioAccessTechnologyCDMAEVDORevB,
  511. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_B
  512. ),
  513. (
  514. CTRadioAccessTechnologyeHRPD,
  515. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EHRPD
  516. ),
  517. (
  518. CTRadioAccessTechnologyLTE,
  519. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_LTE
  520. ),
  521. (
  522. CTRadioAccessTechnologyNRNSA,
  523. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_NR
  524. ),
  525. (
  526. CTRadioAccessTechnologyNR,
  527. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_NR
  528. ),
  529. (
  530. "random",
  531. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE
  532. ),
  533. ]
  534. expectations
  535. .forEach { (given: String,
  536. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype) in
  537. let mockNetworkInfo = MockNetworkInfo()
  538. mockNetworkInfo.mobileSubtype = given
  539. appInfo.networkInfo = mockNetworkInfo
  540. let event = SessionStartEvent(
  541. sessionInfo: self.defaultSessionInfo,
  542. appInfo: appInfo,
  543. time: time
  544. )
  545. // These fields will only be filled in when the Perf SDK is installed
  546. event.set(subscriber: .Performance, isDataCollectionEnabled: true, appInfo: appInfo)
  547. testProtoAndDecodedProto(sessionEvent: event) { proto in
  548. XCTAssertEqual(
  549. event.proto.application_info.apple_app_info.network_connection_info
  550. .mobile_subtype,
  551. expected
  552. )
  553. }
  554. }
  555. }
  556. #endif // os(iOS) && !targetEnvironment(macCatalyst) && !os(xrOS)
  557. #else // swift(>=5.9)
  558. #if os(iOS) && !targetEnvironment(macCatalyst)
  559. @available(iOS 14.1, *)
  560. func test_convertMobileSubtype_convertsCorrectlyPostOS14() {
  561. let expectations: [(
  562. given: String,
  563. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype
  564. )] = [
  565. (
  566. CTRadioAccessTechnologyGPRS,
  567. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_GPRS
  568. ),
  569. (
  570. CTRadioAccessTechnologyEdge,
  571. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EDGE
  572. ),
  573. (
  574. CTRadioAccessTechnologyWCDMA,
  575. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  576. ),
  577. (
  578. CTRadioAccessTechnologyCDMA1x,
  579. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_CDMA
  580. ),
  581. (
  582. CTRadioAccessTechnologyHSDPA,
  583. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSDPA
  584. ),
  585. (
  586. CTRadioAccessTechnologyHSUPA,
  587. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_HSUPA
  588. ),
  589. (
  590. CTRadioAccessTechnologyCDMAEVDORev0,
  591. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_0
  592. ),
  593. (
  594. CTRadioAccessTechnologyCDMAEVDORevA,
  595. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_A
  596. ),
  597. (
  598. CTRadioAccessTechnologyCDMAEVDORevB,
  599. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EVDO_B
  600. ),
  601. (
  602. CTRadioAccessTechnologyeHRPD,
  603. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_EHRPD
  604. ),
  605. (
  606. CTRadioAccessTechnologyLTE,
  607. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_LTE
  608. ),
  609. (
  610. CTRadioAccessTechnologyNRNSA,
  611. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_NR
  612. ),
  613. (
  614. CTRadioAccessTechnologyNR,
  615. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_NR
  616. ),
  617. (
  618. "random",
  619. firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype_UNKNOWN_MOBILE_SUBTYPE
  620. ),
  621. ]
  622. expectations
  623. .forEach { (given: String,
  624. expected: firebase_appquality_sessions_NetworkConnectionInfo_MobileSubtype) in
  625. let mockNetworkInfo = MockNetworkInfo()
  626. mockNetworkInfo.mobileSubtype = given
  627. appInfo.networkInfo = mockNetworkInfo
  628. let event = SessionStartEvent(
  629. sessionInfo: self.defaultSessionInfo,
  630. appInfo: appInfo,
  631. time: time
  632. )
  633. // These fields will only be filled in when the Perf SDK is installed
  634. event.set(subscriber: .Performance, isDataCollectionEnabled: true, appInfo: appInfo)
  635. testProtoAndDecodedProto(sessionEvent: event) { proto in
  636. XCTAssertEqual(
  637. event.proto.application_info.apple_app_info.network_connection_info
  638. .mobile_subtype,
  639. expected
  640. )
  641. }
  642. }
  643. }
  644. #endif // os(iOS) && !targetEnvironment(macCatalyst)
  645. #endif // swift(>=5.9)
  646. }