SessionManagerTests.swift 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. //
  2. // SessionManagerTests.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 XCTest
  27. class SessionManagerTestCase: BaseTestCase {
  28. // MARK: Initialization Tests
  29. func testInitializerWithDefaultArguments() {
  30. // Given, When
  31. let manager = SessionManager()
  32. // Then
  33. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  34. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  35. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  36. }
  37. func testInitializerWithSpecifiedArguments() {
  38. // Given
  39. let configuration = URLSessionConfiguration.default
  40. let delegate = SessionDelegate()
  41. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  42. // When
  43. let manager = SessionManager(
  44. configuration: configuration,
  45. delegate: delegate,
  46. serverTrustPolicyManager: serverTrustPolicyManager
  47. )
  48. // Then
  49. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  50. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  51. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  52. }
  53. func testThatFailableInitializerSucceedsWithDefaultArguments() {
  54. // Given
  55. let delegate = SessionDelegate()
  56. let session: URLSession = {
  57. let configuration = URLSessionConfiguration.default
  58. return URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  59. }()
  60. // When
  61. let manager = SessionManager(session: session, delegate: delegate)
  62. // Then
  63. if let manager = manager {
  64. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  65. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  66. } else {
  67. XCTFail("manager should not be nil")
  68. }
  69. }
  70. func testThatFailableInitializerSucceedsWithSpecifiedArguments() {
  71. // Given
  72. let delegate = SessionDelegate()
  73. let session: URLSession = {
  74. let configuration = URLSessionConfiguration.default
  75. return URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  76. }()
  77. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  78. // When
  79. let manager = SessionManager(session: session, delegate: delegate, serverTrustPolicyManager: serverTrustPolicyManager)
  80. // Then
  81. if let manager = manager {
  82. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  83. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  84. } else {
  85. XCTFail("manager should not be nil")
  86. }
  87. }
  88. func testThatFailableInitializerFailsWithWhenDelegateDoesNotEqualSessionDelegate() {
  89. // Given
  90. let delegate = SessionDelegate()
  91. let session: URLSession = {
  92. let configuration = URLSessionConfiguration.default
  93. return URLSession(configuration: configuration, delegate: SessionDelegate(), delegateQueue: nil)
  94. }()
  95. // When
  96. let manager = SessionManager(session: session, delegate: delegate)
  97. // Then
  98. XCTAssertNil(manager, "manager should be nil")
  99. }
  100. func testThatFailableInitializerFailsWhenSessionDelegateIsNil() {
  101. // Given
  102. let delegate = SessionDelegate()
  103. let session: URLSession = {
  104. let configuration = URLSessionConfiguration.default
  105. return URLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
  106. }()
  107. // When
  108. let manager = SessionManager(session: session, delegate: delegate)
  109. // Then
  110. XCTAssertNil(manager, "manager should be nil")
  111. }
  112. // MARK: Start Requests Immediately Tests
  113. func testSetStartRequestsImmediatelyToFalseAndResumeRequest() {
  114. // Given
  115. let manager = SessionManager()
  116. manager.startRequestsImmediately = false
  117. let url = URL(string: "https://httpbin.org/get")!
  118. let urlRequest = URLRequest(url: url)
  119. let expectation = self.expectation(description: "\(url)")
  120. var response: HTTPURLResponse?
  121. // When
  122. manager.request(urlRequest)
  123. .response { _, responseResponse, _, _ in
  124. response = responseResponse
  125. expectation.fulfill()
  126. }
  127. .resume()
  128. waitForExpectations(timeout: timeout, handler: nil)
  129. // Then
  130. XCTAssertNotNil(response, "response should not be nil")
  131. XCTAssertTrue(response?.statusCode == 200, "response status code should be 200")
  132. }
  133. // MARK: Deinitialization Tests
  134. func testReleasingManagerWithPendingRequestDeinitializesSuccessfully() {
  135. // Given
  136. var manager: SessionManager? = SessionManager()
  137. manager?.startRequestsImmediately = false
  138. let url = URL(string: "https://httpbin.org/get")!
  139. let urlRequest = URLRequest(url: url)
  140. // When
  141. let request = manager?.request(urlRequest)
  142. manager = nil
  143. // Then
  144. XCTAssertTrue(request?.task.state == .suspended, "request task state should be '.Suspended'")
  145. XCTAssertNil(manager, "manager should be nil")
  146. }
  147. func testReleasingManagerWithPendingCanceledRequestDeinitializesSuccessfully() {
  148. // Given
  149. var manager: SessionManager? = SessionManager()
  150. manager!.startRequestsImmediately = false
  151. let url = URL(string: "https://httpbin.org/get")!
  152. let urlRequest = URLRequest(url: url)
  153. // When
  154. let request = manager!.request(urlRequest)
  155. request.cancel()
  156. manager = nil
  157. // Then
  158. let state = request.task.state
  159. XCTAssertTrue(state == .canceling || state == .completed, "state should be .Canceling or .Completed")
  160. XCTAssertNil(manager, "manager should be nil")
  161. }
  162. }
  163. // MARK: -
  164. class ManagerConfigurationHeadersTestCase: BaseTestCase {
  165. enum ConfigurationType {
  166. case `default`, ephemeral, background
  167. }
  168. func testThatDefaultConfigurationHeadersAreSentWithRequest() {
  169. // Given, When, Then
  170. executeAuthorizationHeaderTest(for: .default)
  171. }
  172. func testThatEphemeralConfigurationHeadersAreSentWithRequest() {
  173. // Given, When, Then
  174. executeAuthorizationHeaderTest(for: .ephemeral)
  175. }
  176. // ⚠️ This test has been removed as a result of rdar://26870455 in Xcode 8 Seed 1
  177. // func testThatBackgroundConfigurationHeadersAreSentWithRequest() {
  178. // // Given, When, Then
  179. // executeAuthorizationHeaderTestForConfigurationType(.background)
  180. // }
  181. private func executeAuthorizationHeaderTest(for type: ConfigurationType) {
  182. // Given
  183. let manager: SessionManager = {
  184. let configuration: URLSessionConfiguration = {
  185. let configuration: URLSessionConfiguration
  186. switch type {
  187. case .default:
  188. configuration = .default
  189. case .ephemeral:
  190. configuration = .ephemeral
  191. case .background:
  192. let identifier = "org.alamofire.test.manager-configuration-tests"
  193. configuration = .background(withIdentifier: identifier)
  194. }
  195. var headers = SessionManager.defaultHTTPHeaders
  196. headers["Authorization"] = "Bearer 123456"
  197. configuration.httpAdditionalHeaders = headers
  198. return configuration
  199. }()
  200. return SessionManager(configuration: configuration)
  201. }()
  202. let expectation = self.expectation(description: "request should complete successfully")
  203. var response: Response<AnyObject, NSError>?
  204. // When
  205. manager.request("https://httpbin.org/headers", withMethod: .get)
  206. .responseJSON { closureResponse in
  207. response = closureResponse
  208. expectation.fulfill()
  209. }
  210. waitForExpectations(timeout: timeout, handler: nil)
  211. // Then
  212. if let response = response {
  213. XCTAssertNotNil(response.request, "request should not be nil")
  214. XCTAssertNotNil(response.response, "response should not be nil")
  215. XCTAssertNotNil(response.data, "data should not be nil")
  216. XCTAssertTrue(response.result.isSuccess, "result should be a success")
  217. if
  218. let headers = response.result.value?["headers" as NSString] as? [String: String],
  219. let authorization = headers["Authorization"]
  220. {
  221. XCTAssertEqual(authorization, "Bearer 123456", "authorization header value does not match")
  222. } else {
  223. XCTFail("failed to extract authorization header value")
  224. }
  225. } else {
  226. XCTFail("response should not be nil")
  227. }
  228. }
  229. }