ManagerTests.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. //
  2. // ManagerTests.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 ManagerTestCase: BaseTestCase {
  28. // MARK: Initialization Tests
  29. func testInitializerWithDefaultArguments() {
  30. // Given, When
  31. let manager = Manager()
  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 testDefaultUserAgentHeader() {
  38. // Given, When
  39. let userAgent = Manager.defaultHTTPHeaders["User-Agent"]
  40. // Then
  41. let osNameVersion: String = {
  42. let versionString: String
  43. if #available(OSX 10.10, *) {
  44. let version = NSProcessInfo.processInfo().operatingSystemVersion
  45. versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)"
  46. } else {
  47. versionString = "10.9"
  48. }
  49. let osName: String = {
  50. #if os(iOS)
  51. return "iOS"
  52. #elseif os(watchOS)
  53. return "watchOS"
  54. #elseif os(tvOS)
  55. return "tvOS"
  56. #elseif os(OSX)
  57. return "OS X"
  58. #elseif os(Linux)
  59. return "Linux"
  60. #else
  61. return "Unknown"
  62. #endif
  63. }()
  64. return "\(osName) \(versionString)"
  65. }()
  66. let alamofireVersion: String = {
  67. guard
  68. let afInfo = NSBundle(forClass: Manager.self).infoDictionary,
  69. build = afInfo["CFBundleShortVersionString"]
  70. else { return "Unknown" }
  71. return "Alamofire/\(build)"
  72. }()
  73. let expectedUserAgent = "Unknown/Unknown (Unknown; build:Unknown; \(osNameVersion)) \(alamofireVersion)"
  74. XCTAssertEqual(userAgent, expectedUserAgent)
  75. }
  76. func testInitializerWithSpecifiedArguments() {
  77. // Given
  78. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  79. let delegate = Manager.SessionDelegate()
  80. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  81. // When
  82. let manager = Manager(
  83. configuration: configuration,
  84. delegate: delegate,
  85. serverTrustPolicyManager: serverTrustPolicyManager
  86. )
  87. // Then
  88. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  89. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  90. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  91. }
  92. func testThatFailableInitializerSucceedsWithDefaultArguments() {
  93. // Given
  94. let delegate = Manager.SessionDelegate()
  95. let session: NSURLSession = {
  96. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  97. return NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  98. }()
  99. // When
  100. let manager = Manager(session: session, delegate: delegate)
  101. // Then
  102. if let manager = manager {
  103. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  104. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  105. } else {
  106. XCTFail("manager should not be nil")
  107. }
  108. }
  109. func testThatFailableInitializerSucceedsWithSpecifiedArguments() {
  110. // Given
  111. let delegate = Manager.SessionDelegate()
  112. let session: NSURLSession = {
  113. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  114. return NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  115. }()
  116. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  117. // When
  118. let manager = Manager(session: session, delegate: delegate, serverTrustPolicyManager: serverTrustPolicyManager)
  119. // Then
  120. if let manager = manager {
  121. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  122. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  123. } else {
  124. XCTFail("manager should not be nil")
  125. }
  126. }
  127. func testThatFailableInitializerFailsWithWhenDelegateDoesNotEqualSessionDelegate() {
  128. // Given
  129. let delegate = Manager.SessionDelegate()
  130. let session: NSURLSession = {
  131. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  132. return NSURLSession(configuration: configuration, delegate: Manager.SessionDelegate(), delegateQueue: nil)
  133. }()
  134. // When
  135. let manager = Manager(session: session, delegate: delegate)
  136. // Then
  137. XCTAssertNil(manager, "manager should be nil")
  138. }
  139. func testThatFailableInitializerFailsWhenSessionDelegateIsNil() {
  140. // Given
  141. let delegate = Manager.SessionDelegate()
  142. let session: NSURLSession = {
  143. let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  144. return NSURLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
  145. }()
  146. // When
  147. let manager = Manager(session: session, delegate: delegate)
  148. // Then
  149. XCTAssertNil(manager, "manager should be nil")
  150. }
  151. // MARK: Start Requests Immediately Tests
  152. func testSetStartRequestsImmediatelyToFalseAndResumeRequest() {
  153. // Given
  154. let manager = Alamofire.Manager()
  155. manager.startRequestsImmediately = false
  156. let URL = NSURL(string: "https://httpbin.org/get")!
  157. let URLRequest = NSURLRequest(URL: URL)
  158. let expectation = expectationWithDescription("\(URL)")
  159. var response: NSHTTPURLResponse?
  160. // When
  161. manager.request(URLRequest)
  162. .response { _, responseResponse, _, _ in
  163. response = responseResponse
  164. expectation.fulfill()
  165. }
  166. .resume()
  167. waitForExpectationsWithTimeout(timeout, handler: nil)
  168. // Then
  169. XCTAssertNotNil(response, "response should not be nil")
  170. XCTAssertTrue(response?.statusCode == 200, "response status code should be 200")
  171. }
  172. // MARK: Deinitialization Tests
  173. func testReleasingManagerWithPendingRequestDeinitializesSuccessfully() {
  174. // Given
  175. var manager: Manager? = Alamofire.Manager()
  176. manager?.startRequestsImmediately = false
  177. let URL = NSURL(string: "https://httpbin.org/get")!
  178. let URLRequest = NSURLRequest(URL: URL)
  179. // When
  180. let request = manager?.request(URLRequest)
  181. manager = nil
  182. // Then
  183. XCTAssertTrue(request?.task.state == .Suspended, "request task state should be '.Suspended'")
  184. XCTAssertNil(manager, "manager should be nil")
  185. }
  186. func testReleasingManagerWithPendingCanceledRequestDeinitializesSuccessfully() {
  187. // Given
  188. var manager: Manager? = Alamofire.Manager()
  189. manager!.startRequestsImmediately = false
  190. let URL = NSURL(string: "https://httpbin.org/get")!
  191. let URLRequest = NSURLRequest(URL: URL)
  192. // When
  193. let request = manager!.request(URLRequest)
  194. request.cancel()
  195. manager = nil
  196. // Then
  197. let state = request.task.state
  198. XCTAssertTrue(state == .Canceling || state == .Completed, "state should be .Canceling or .Completed")
  199. XCTAssertNil(manager, "manager should be nil")
  200. }
  201. }
  202. // MARK: -
  203. class ManagerConfigurationHeadersTestCase: BaseTestCase {
  204. enum ConfigurationType {
  205. case Default, Ephemeral, Background
  206. }
  207. func testThatDefaultConfigurationHeadersAreSentWithRequest() {
  208. // Given, When, Then
  209. executeAuthorizationHeaderTestForConfigurationType(.Default)
  210. }
  211. func testThatEphemeralConfigurationHeadersAreSentWithRequest() {
  212. // Given, When, Then
  213. executeAuthorizationHeaderTestForConfigurationType(.Ephemeral)
  214. }
  215. func testThatBackgroundConfigurationHeadersAreSentWithRequest() {
  216. // Given, When, Then
  217. #if swift(>=2.3)
  218. // ⚠️⚠️ rdar://26870455
  219. // Will be enabled once rdar is resolved
  220. print("⚠️⚠️ Skipping \(#function) due to rdar://26870455 ⚠️⚠️")
  221. #else
  222. executeAuthorizationHeaderTestForConfigurationType(.Background)
  223. #endif
  224. }
  225. private func executeAuthorizationHeaderTestForConfigurationType(type: ConfigurationType) {
  226. // Given
  227. let manager: Manager = {
  228. let configuration: NSURLSessionConfiguration = {
  229. let configuration: NSURLSessionConfiguration
  230. switch type {
  231. case .Default:
  232. configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
  233. case .Ephemeral:
  234. configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
  235. case .Background:
  236. let identifier = "com.alamofire.test.manager-configuration-tests"
  237. configuration = NSURLSessionConfiguration.backgroundSessionConfigurationForAllPlatformsWithIdentifier(identifier)
  238. }
  239. var headers = Alamofire.Manager.defaultHTTPHeaders
  240. headers["Authorization"] = "Bearer 123456"
  241. configuration.HTTPAdditionalHeaders = headers
  242. return configuration
  243. }()
  244. return Manager(configuration: configuration)
  245. }()
  246. let expectation = expectationWithDescription("request should complete successfully")
  247. var response: Response<AnyObject, NSError>?
  248. // When
  249. manager.request(.GET, "https://httpbin.org/headers")
  250. .responseJSON { closureResponse in
  251. response = closureResponse
  252. expectation.fulfill()
  253. }
  254. waitForExpectationsWithTimeout(timeout, handler: nil)
  255. // Then
  256. if let response = response {
  257. XCTAssertNotNil(response.request, "request should not be nil")
  258. XCTAssertNotNil(response.response, "response should not be nil")
  259. XCTAssertNotNil(response.data, "data should not be nil")
  260. XCTAssertTrue(response.result.isSuccess, "result should be a success")
  261. if let
  262. headers = response.result.value?["headers" as NSString] as? [String: String],
  263. authorization = headers["Authorization"]
  264. {
  265. XCTAssertEqual(authorization, "Bearer 123456", "authorization header value does not match")
  266. } else {
  267. XCTFail("failed to extract authorization header value")
  268. }
  269. } else {
  270. XCTFail("response should not be nil")
  271. }
  272. }
  273. }