ManagerTests.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. // ManagerTests.swift
  2. //
  3. // Copyright (c) 2014–2016 Alamofire Software Foundation (http://alamofire.org/)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. @testable import Alamofire
  23. import Foundation
  24. import XCTest
  25. class ManagerTestCase: BaseTestCase {
  26. // MARK: Initialization Tests
  27. func testInitializerWithDefaultArguments() {
  28. // Given, When
  29. let manager = Manager()
  30. // Then
  31. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  32. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  33. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  34. }
  35. func testInitializerWithSpecifiedArguments() {
  36. // Given
  37. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  38. let delegate = Manager.SessionDelegate()
  39. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  40. // When
  41. let manager = Manager(
  42. configuration: configuration,
  43. delegate: delegate,
  44. serverTrustPolicyManager: serverTrustPolicyManager
  45. )
  46. // Then
  47. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  48. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  49. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  50. }
  51. func testThatFailableInitializerSucceedsWithDefaultArguments() {
  52. // Given
  53. let delegate = Manager.SessionDelegate()
  54. let session: NSURLSession = {
  55. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  56. return NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  57. }()
  58. // When
  59. let manager = Manager(session: session, delegate: delegate)
  60. // Then
  61. if let manager = manager {
  62. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  63. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  64. } else {
  65. XCTFail("manager should not be nil")
  66. }
  67. }
  68. func testThatFailableInitializerSucceedsWithSpecifiedArguments() {
  69. // Given
  70. let delegate = Manager.SessionDelegate()
  71. let session: NSURLSession = {
  72. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  73. return NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  74. }()
  75. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  76. // When
  77. let manager = Manager(session: session, delegate: delegate, serverTrustPolicyManager: serverTrustPolicyManager)
  78. // Then
  79. if let manager = manager {
  80. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  81. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  82. } else {
  83. XCTFail("manager should not be nil")
  84. }
  85. }
  86. func testThatFailableInitializerFailsWithWhenDelegateDoesNotEqualSessionDelegate() {
  87. // Given
  88. let delegate = Manager.SessionDelegate()
  89. let session: NSURLSession = {
  90. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  91. return NSURLSession(configuration: configuration, delegate: Manager.SessionDelegate(), delegateQueue: nil)
  92. }()
  93. // When
  94. let manager = Manager(session: session, delegate: delegate)
  95. // Then
  96. XCTAssertNil(manager, "manager should be nil")
  97. }
  98. func testThatFailableInitializerFailsWhenSessionDelegateIsNil() {
  99. // Given
  100. let delegate = Manager.SessionDelegate()
  101. let session: NSURLSession = {
  102. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  103. return NSURLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
  104. }()
  105. // When
  106. let manager = Manager(session: session, delegate: delegate)
  107. // Then
  108. XCTAssertNil(manager, "manager should be nil")
  109. }
  110. // MARK: Start Requests Immediately Tests
  111. func testSetStartRequestsImmediatelyToFalseAndResumeRequest() {
  112. // Given
  113. let manager = Alamofire.Manager()
  114. manager.startRequestsImmediately = false
  115. let URL = NSURL(string: "https://httpbin.org/get")!
  116. let URLRequest = NSURLRequest(URL: URL)
  117. let expectation = expectationWithDescription("\(URL)")
  118. var response: NSHTTPURLResponse?
  119. // When
  120. manager.request(URLRequest)
  121. .response { _, responseResponse, _, _ in
  122. response = responseResponse
  123. expectation.fulfill()
  124. }
  125. .resume()
  126. waitForExpectationsWithTimeout(timeout, handler: nil)
  127. // Then
  128. XCTAssertNotNil(response, "response should not be nil")
  129. XCTAssertTrue(response?.statusCode == 200, "response status code should be 200")
  130. }
  131. // MARK: Deinitialization Tests
  132. func testReleasingManagerWithPendingRequestDeinitializesSuccessfully() {
  133. // Given
  134. var manager: Manager? = Alamofire.Manager()
  135. manager?.startRequestsImmediately = false
  136. let URL = NSURL(string: "https://httpbin.org/get")!
  137. let URLRequest = NSURLRequest(URL: URL)
  138. // When
  139. let request = manager?.request(URLRequest)
  140. manager = nil
  141. // Then
  142. XCTAssertTrue(request?.task.state == .Suspended, "request task state should be '.Suspended'")
  143. XCTAssertNil(manager, "manager should be nil")
  144. }
  145. func testReleasingManagerWithPendingCanceledRequestDeinitializesSuccessfully() {
  146. // Given
  147. var manager: Manager? = Alamofire.Manager()
  148. manager!.startRequestsImmediately = false
  149. let URL = NSURL(string: "https://httpbin.org/get")!
  150. let URLRequest = NSURLRequest(URL: URL)
  151. // When
  152. let request = manager!.request(URLRequest)
  153. request.cancel()
  154. manager = nil
  155. // Then
  156. let state = request.task.state
  157. XCTAssertTrue(state == .Canceling || state == .Completed, "state should be .Canceling or .Completed")
  158. XCTAssertNil(manager, "manager should be nil")
  159. }
  160. }
  161. // MARK: -
  162. class ManagerConfigurationHeadersTestCase: BaseTestCase {
  163. enum ConfigurationType {
  164. case Default, Ephemeral, Background
  165. }
  166. func testThatDefaultConfigurationHeadersAreSentWithRequest() {
  167. // Given, When, Then
  168. executeAuthorizationHeaderTestForConfigurationType(.Default)
  169. }
  170. func testThatEphemeralConfigurationHeadersAreSentWithRequest() {
  171. // Given, When, Then
  172. executeAuthorizationHeaderTestForConfigurationType(.Ephemeral)
  173. }
  174. func testThatBackgroundConfigurationHeadersAreSentWithRequest() {
  175. // Given, When, Then
  176. executeAuthorizationHeaderTestForConfigurationType(.Background)
  177. }
  178. private func executeAuthorizationHeaderTestForConfigurationType(type: ConfigurationType) {
  179. // Given
  180. let manager: Manager = {
  181. let configuration: NSURLSessionConfiguration = {
  182. let configuration: NSURLSessionConfiguration
  183. switch type {
  184. case .Default:
  185. configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  186. case .Ephemeral:
  187. configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
  188. case .Background:
  189. let identifier = "com.alamofire.test.manager-configuration-tests"
  190. configuration = NSURLSessionConfiguration.backgroundSessionConfigurationForAllPlatformsWithIdentifier(identifier)
  191. }
  192. var headers = Alamofire.Manager.defaultHTTPHeaders
  193. headers["Authorization"] = "Bearer 123456"
  194. configuration.HTTPAdditionalHeaders = headers
  195. return configuration
  196. }()
  197. return Manager(configuration: configuration)
  198. }()
  199. let expectation = expectationWithDescription("request should complete successfully")
  200. var response: Response<AnyObject, NSError>?
  201. // When
  202. manager.request(.GET, "https://httpbin.org/headers")
  203. .responseJSON { closureResponse in
  204. response = closureResponse
  205. expectation.fulfill()
  206. }
  207. waitForExpectationsWithTimeout(timeout, handler: nil)
  208. // Then
  209. if let response = response {
  210. XCTAssertNotNil(response.request, "request should not be nil")
  211. XCTAssertNotNil(response.response, "response should not be nil")
  212. XCTAssertNotNil(response.data, "data should not be nil")
  213. XCTAssertTrue(response.result.isSuccess, "result should be a success")
  214. if let
  215. headers = response.result.value?["headers" as NSString] as? [String: String],
  216. authorization = headers["Authorization"]
  217. {
  218. XCTAssertEqual(authorization, "Bearer 123456", "authorization header value does not match")
  219. } else {
  220. XCTFail("failed to extract authorization header value")
  221. }
  222. } else {
  223. XCTFail("response should not be nil")
  224. }
  225. }
  226. }