NetworkReachabilityManagerTests.swift 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. //
  2. // NetworkReachabilityManagerTests.swift
  3. //
  4. // Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/)
  5. //
  6. // Permission is hereby granted, free of charge, to any person obtaining a copy
  7. // of this software and associated documentation files (the "Software"), to deal
  8. // in the Software without restriction, including without limitation the rights
  9. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. // copies of the Software, and to permit persons to whom the Software is
  11. // furnished to do so, subject to the following conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be included in
  14. // all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  19. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. // THE SOFTWARE.
  23. //
  24. @testable import Alamofire
  25. import Foundation
  26. import SystemConfiguration
  27. import XCTest
  28. class NetworkReachabilityManagerTestCase: BaseTestCase {
  29. // MARK: - Tests - Initialization
  30. func testThatManagerCanBeInitializedFromHost() {
  31. // Given, When
  32. let manager = NetworkReachabilityManager(host: "localhost")
  33. // Then
  34. XCTAssertNotNil(manager)
  35. }
  36. func testThatManagerCanBeInitializedFromAddress() {
  37. // Given, When
  38. let manager = NetworkReachabilityManager()
  39. // Then
  40. XCTAssertNotNil(manager)
  41. }
  42. func testThatHostManagerIsReachableOnWiFi() {
  43. // Given, When
  44. let manager = NetworkReachabilityManager(host: "localhost")
  45. // Then
  46. XCTAssertEqual(manager?.networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  47. XCTAssertEqual(manager?.isReachable, true)
  48. XCTAssertEqual(manager?.isReachableOnWWAN, false)
  49. XCTAssertEqual(manager?.isReachableOnEthernetOrWiFi, true)
  50. }
  51. func testThatHostManagerStartsWithReachableStatus() {
  52. // Given, When
  53. let manager = NetworkReachabilityManager(host: "localhost")
  54. // Then
  55. XCTAssertEqual(manager?.networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  56. XCTAssertEqual(manager?.isReachable, true)
  57. XCTAssertEqual(manager?.isReachableOnWWAN, false)
  58. XCTAssertEqual(manager?.isReachableOnEthernetOrWiFi, true)
  59. }
  60. func testThatAddressManagerStartsWithReachableStatus() {
  61. // Given, When
  62. let manager = NetworkReachabilityManager()
  63. // Then
  64. XCTAssertEqual(manager?.networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  65. XCTAssertEqual(manager?.isReachable, true)
  66. XCTAssertEqual(manager?.isReachableOnWWAN, false)
  67. XCTAssertEqual(manager?.isReachableOnEthernetOrWiFi, true)
  68. }
  69. func testThatHostManagerCanBeDeinitialized() {
  70. // Given
  71. var manager: NetworkReachabilityManager? = NetworkReachabilityManager(host: "localhost")
  72. // When
  73. manager = nil
  74. // Then
  75. XCTAssertNil(manager)
  76. }
  77. func testThatAddressManagerCanBeDeinitialized() {
  78. // Given
  79. var manager: NetworkReachabilityManager? = NetworkReachabilityManager()
  80. // When
  81. manager = nil
  82. // Then
  83. XCTAssertNil(manager)
  84. }
  85. // MARK: - Tests - Listener
  86. func testThatHostManagerIsNotifiedWhenStartListeningIsCalled() {
  87. // Given
  88. guard let manager = NetworkReachabilityManager(host: "store.apple.com") else {
  89. XCTFail("manager should NOT be nil")
  90. return
  91. }
  92. let expectation = self.expectation(description: "listener closure should be executed")
  93. var networkReachabilityStatus: NetworkReachabilityManager.NetworkReachabilityStatus?
  94. manager.listener = { status in
  95. guard networkReachabilityStatus == nil else { return }
  96. networkReachabilityStatus = status
  97. expectation.fulfill()
  98. }
  99. // When
  100. manager.startListening()
  101. waitForExpectations(timeout: timeout, handler: nil)
  102. // Then
  103. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  104. }
  105. func testThatAddressManagerIsNotifiedWhenStartListeningIsCalled() {
  106. // Given
  107. let manager = NetworkReachabilityManager()
  108. let expectation = self.expectation(description: "listener closure should be executed")
  109. var networkReachabilityStatus: NetworkReachabilityManager.NetworkReachabilityStatus?
  110. manager?.listener = { status in
  111. networkReachabilityStatus = status
  112. expectation.fulfill()
  113. }
  114. // When
  115. manager?.startListening()
  116. waitForExpectations(timeout: timeout, handler: nil)
  117. // Then
  118. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  119. }
  120. // MARK: - Tests - Network Reachability Status
  121. func testThatManagerReturnsNotReachableStatusWhenReachableFlagIsAbsent() {
  122. // Given
  123. let manager = NetworkReachabilityManager()
  124. let flags: SCNetworkReachabilityFlags = [.connectionOnDemand]
  125. // When
  126. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  127. // Then
  128. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  129. }
  130. func testThatManagerReturnsNotReachableStatusWhenConnectionIsRequired() {
  131. // Given
  132. let manager = NetworkReachabilityManager()
  133. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired]
  134. // When
  135. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  136. // Then
  137. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  138. }
  139. func testThatManagerReturnsNotReachableStatusWhenInterventionIsRequired() {
  140. // Given
  141. let manager = NetworkReachabilityManager()
  142. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .interventionRequired]
  143. // When
  144. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  145. // Then
  146. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  147. }
  148. func testThatManagerReturnsReachableOnWiFiStatusWhenConnectionIsNotRequired() {
  149. // Given
  150. let manager = NetworkReachabilityManager()
  151. let flags: SCNetworkReachabilityFlags = [.reachable]
  152. // When
  153. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  154. // Then
  155. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  156. }
  157. func testThatManagerReturnsReachableOnWiFiStatusWhenConnectionIsOnDemand() {
  158. // Given
  159. let manager = NetworkReachabilityManager()
  160. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .connectionOnDemand]
  161. // When
  162. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  163. // Then
  164. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  165. }
  166. func testThatManagerReturnsReachableOnWiFiStatusWhenConnectionIsOnTraffic() {
  167. // Given
  168. let manager = NetworkReachabilityManager()
  169. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .connectionOnTraffic]
  170. // When
  171. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  172. // Then
  173. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  174. }
  175. #if os(iOS)
  176. func testThatManagerReturnsReachableOnWWANStatusWhenIsWWAN() {
  177. // Given
  178. let manager = NetworkReachabilityManager()
  179. let flags: SCNetworkReachabilityFlags = [.reachable, .isWWAN]
  180. // When
  181. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  182. // Then
  183. XCTAssertEqual(networkReachabilityStatus, .reachable(.wwan))
  184. }
  185. func testThatManagerReturnsNotReachableOnWWANStatusWhenIsWWANAndConnectionIsRequired() {
  186. // Given
  187. let manager = NetworkReachabilityManager()
  188. let flags: SCNetworkReachabilityFlags = [.reachable, .isWWAN, .connectionRequired]
  189. // When
  190. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  191. // Then
  192. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  193. }
  194. #endif
  195. }