NetworkReachabilityManagerTests.swift 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. //
  2. // NetworkReachabilityManagerTests.swift
  3. //
  4. // Copyright (c) 2014 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. func testThatZeroManagerIsNotifiedWhenStoppedAndStarted() {
  121. // Given
  122. let manager = NetworkReachabilityManager()
  123. let first = expectation(description: "first listener notified")
  124. let second = expectation(description: "second listener notified")
  125. // When
  126. manager?.listener = { _ in
  127. first.fulfill()
  128. }
  129. manager?.startListening()
  130. wait(for: [first], timeout: timeout)
  131. manager?.stopListening()
  132. manager?.listener = { _ in
  133. second.fulfill()
  134. }
  135. manager?.startListening()
  136. wait(for: [second], timeout: timeout)
  137. // Then
  138. XCTAssertEqual(manager?.networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  139. }
  140. // MARK: - Tests - Network Reachability Status
  141. func testThatManagerReturnsNotReachableStatusWhenReachableFlagIsAbsent() {
  142. // Given
  143. let manager = NetworkReachabilityManager()
  144. let flags: SCNetworkReachabilityFlags = [.connectionOnDemand]
  145. // When
  146. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  147. // Then
  148. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  149. }
  150. func testThatManagerReturnsNotReachableStatusWhenConnectionIsRequired() {
  151. // Given
  152. let manager = NetworkReachabilityManager()
  153. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired]
  154. // When
  155. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  156. // Then
  157. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  158. }
  159. func testThatManagerReturnsNotReachableStatusWhenInterventionIsRequired() {
  160. // Given
  161. let manager = NetworkReachabilityManager()
  162. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .interventionRequired]
  163. // When
  164. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  165. // Then
  166. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  167. }
  168. func testThatManagerReturnsReachableOnWiFiStatusWhenConnectionIsNotRequired() {
  169. // Given
  170. let manager = NetworkReachabilityManager()
  171. let flags: SCNetworkReachabilityFlags = [.reachable]
  172. // When
  173. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  174. // Then
  175. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  176. }
  177. func testThatManagerReturnsReachableOnWiFiStatusWhenConnectionIsOnDemand() {
  178. // Given
  179. let manager = NetworkReachabilityManager()
  180. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .connectionOnDemand]
  181. // When
  182. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  183. // Then
  184. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  185. }
  186. func testThatManagerReturnsReachableOnWiFiStatusWhenConnectionIsOnTraffic() {
  187. // Given
  188. let manager = NetworkReachabilityManager()
  189. let flags: SCNetworkReachabilityFlags = [.reachable, .connectionRequired, .connectionOnTraffic]
  190. // When
  191. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  192. // Then
  193. XCTAssertEqual(networkReachabilityStatus, .reachable(.ethernetOrWiFi))
  194. }
  195. #if os(iOS)
  196. func testThatManagerReturnsReachableOnWWANStatusWhenIsWWAN() {
  197. // Given
  198. let manager = NetworkReachabilityManager()
  199. let flags: SCNetworkReachabilityFlags = [.reachable, .isWWAN]
  200. // When
  201. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  202. // Then
  203. XCTAssertEqual(networkReachabilityStatus, .reachable(.wwan))
  204. }
  205. func testThatManagerReturnsNotReachableOnWWANStatusWhenIsWWANAndConnectionIsRequired() {
  206. // Given
  207. let manager = NetworkReachabilityManager()
  208. let flags: SCNetworkReachabilityFlags = [.reachable, .isWWAN, .connectionRequired]
  209. // When
  210. let networkReachabilityStatus = manager?.networkReachabilityStatusForFlags(flags)
  211. // Then
  212. XCTAssertEqual(networkReachabilityStatus, .notReachable)
  213. }
  214. #endif
  215. }