SessionManagerTests.swift 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  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: Helper Types
  29. private class HTTPMethodAdapter: RequestAdapter {
  30. let method: HTTPMethod
  31. let throwsError: Bool
  32. init(method: HTTPMethod, throwsError: Bool = false) {
  33. self.method = method
  34. self.throwsError = throwsError
  35. }
  36. func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
  37. guard !throwsError else { throw AFError.invalidURL(url: "") }
  38. var urlRequest = urlRequest
  39. urlRequest.httpMethod = method.rawValue
  40. return urlRequest
  41. }
  42. }
  43. private class RequestHandler: RequestAdapter, RequestRetrier {
  44. var adaptedCount = 0
  45. var retryCount = 0
  46. var shouldApplyAuthorizationHeader = false
  47. var throwsErrorOnSecondAdapt = false
  48. func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
  49. if throwsErrorOnSecondAdapt && adaptedCount == 1 { throw AFError.invalidURL(url: "") }
  50. var urlRequest = urlRequest
  51. adaptedCount += 1
  52. if shouldApplyAuthorizationHeader && adaptedCount > 1 {
  53. if let header = Request.authorizationHeader(user: "user", password: "password") {
  54. urlRequest.setValue(header.value, forHTTPHeaderField: header.key)
  55. }
  56. }
  57. return urlRequest
  58. }
  59. func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
  60. retryCount += 1
  61. if retryCount < 2 {
  62. completion(true, 0.0)
  63. } else {
  64. completion(false, 0.0)
  65. }
  66. }
  67. }
  68. // MARK: Tests - Initialization
  69. func testInitializerWithDefaultArguments() {
  70. // Given, When
  71. let manager = SessionManager()
  72. // Then
  73. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  74. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  75. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  76. }
  77. func testInitializerWithSpecifiedArguments() {
  78. // Given
  79. let configuration = URLSessionConfiguration.default
  80. let delegate = SessionDelegate()
  81. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  82. // When
  83. let manager = SessionManager(
  84. configuration: configuration,
  85. delegate: delegate,
  86. serverTrustPolicyManager: serverTrustPolicyManager
  87. )
  88. // Then
  89. XCTAssertNotNil(manager.session.delegate, "session delegate should not be nil")
  90. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  91. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  92. }
  93. func testThatFailableInitializerSucceedsWithDefaultArguments() {
  94. // Given
  95. let delegate = SessionDelegate()
  96. let session: URLSession = {
  97. let configuration = URLSessionConfiguration.default
  98. return URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  99. }()
  100. // When
  101. let manager = SessionManager(session: session, delegate: delegate)
  102. // Then
  103. if let manager = manager {
  104. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  105. XCTAssertNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should be nil")
  106. } else {
  107. XCTFail("manager should not be nil")
  108. }
  109. }
  110. func testThatFailableInitializerSucceedsWithSpecifiedArguments() {
  111. // Given
  112. let delegate = SessionDelegate()
  113. let session: URLSession = {
  114. let configuration = URLSessionConfiguration.default
  115. return URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
  116. }()
  117. let serverTrustPolicyManager = ServerTrustPolicyManager(policies: [:])
  118. // When
  119. let manager = SessionManager(session: session, delegate: delegate, serverTrustPolicyManager: serverTrustPolicyManager)
  120. // Then
  121. if let manager = manager {
  122. XCTAssertTrue(manager.delegate === manager.session.delegate, "manager delegate should equal session delegate")
  123. XCTAssertNotNil(manager.session.serverTrustPolicyManager, "session server trust policy manager should not be nil")
  124. } else {
  125. XCTFail("manager should not be nil")
  126. }
  127. }
  128. func testThatFailableInitializerFailsWithWhenDelegateDoesNotEqualSessionDelegate() {
  129. // Given
  130. let delegate = SessionDelegate()
  131. let session: URLSession = {
  132. let configuration = URLSessionConfiguration.default
  133. return URLSession(configuration: configuration, delegate: SessionDelegate(), delegateQueue: nil)
  134. }()
  135. // When
  136. let manager = SessionManager(session: session, delegate: delegate)
  137. // Then
  138. XCTAssertNil(manager, "manager should be nil")
  139. }
  140. func testThatFailableInitializerFailsWhenSessionDelegateIsNil() {
  141. // Given
  142. let delegate = SessionDelegate()
  143. let session: URLSession = {
  144. let configuration = URLSessionConfiguration.default
  145. return URLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
  146. }()
  147. // When
  148. let manager = SessionManager(session: session, delegate: delegate)
  149. // Then
  150. XCTAssertNil(manager, "manager should be nil")
  151. }
  152. // MARK: Tests - Default HTTP Headers
  153. func testDefaultUserAgentHeader() {
  154. // Given, When
  155. let userAgent = SessionManager.defaultHTTPHeaders["User-Agent"]
  156. // Then
  157. let osNameVersion: String = {
  158. let version = ProcessInfo.processInfo.operatingSystemVersion
  159. let versionString = "\(version.majorVersion).\(version.minorVersion).\(version.patchVersion)"
  160. let osName: String = {
  161. #if os(iOS)
  162. return "iOS"
  163. #elseif os(watchOS)
  164. return "watchOS"
  165. #elseif os(tvOS)
  166. return "tvOS"
  167. #elseif os(OSX)
  168. return "OS X"
  169. #elseif os(Linux)
  170. return "Linux"
  171. #else
  172. return "Unknown"
  173. #endif
  174. }()
  175. return "\(osName) \(versionString)"
  176. }()
  177. let alamofireVersion: String = {
  178. guard
  179. let afInfo = Bundle(for: SessionManager.self).infoDictionary,
  180. let build = afInfo["CFBundleShortVersionString"]
  181. else { return "Unknown" }
  182. return "Alamofire/\(build)"
  183. }()
  184. let expectedUserAgent = "Unknown/Unknown (Unknown; build:Unknown; \(osNameVersion)) \(alamofireVersion)"
  185. XCTAssertEqual(userAgent, expectedUserAgent)
  186. }
  187. // MARK: Tests - Start Requests Immediately
  188. func testSetStartRequestsImmediatelyToFalseAndResumeRequest() {
  189. // Given
  190. let manager = SessionManager()
  191. manager.startRequestsImmediately = false
  192. let url = URL(string: "https://httpbin.org/get")!
  193. let urlRequest = URLRequest(url: url)
  194. let expectation = self.expectation(description: "\(url)")
  195. var response: HTTPURLResponse?
  196. // When
  197. manager.request(urlRequest)
  198. .response { resp in
  199. response = resp.response
  200. expectation.fulfill()
  201. }
  202. .resume()
  203. waitForExpectations(timeout: timeout, handler: nil)
  204. // Then
  205. XCTAssertNotNil(response, "response should not be nil")
  206. XCTAssertTrue(response?.statusCode == 200, "response status code should be 200")
  207. }
  208. // MARK: Tests - Deinitialization
  209. func testReleasingManagerWithPendingRequestDeinitializesSuccessfully() {
  210. // Given
  211. var manager: SessionManager? = SessionManager()
  212. manager?.startRequestsImmediately = false
  213. let url = URL(string: "https://httpbin.org/get")!
  214. let urlRequest = URLRequest(url: url)
  215. // When
  216. let request = manager?.request(urlRequest)
  217. manager = nil
  218. // Then
  219. XCTAssertTrue(request?.task?.state == .suspended, "request task state should be '.Suspended'")
  220. XCTAssertNil(manager, "manager should be nil")
  221. }
  222. func testReleasingManagerWithPendingCanceledRequestDeinitializesSuccessfully() {
  223. // Given
  224. var manager: SessionManager? = SessionManager()
  225. manager!.startRequestsImmediately = false
  226. let url = URL(string: "https://httpbin.org/get")!
  227. let urlRequest = URLRequest(url: url)
  228. // When
  229. let request = manager!.request(urlRequest)
  230. request.cancel()
  231. manager = nil
  232. // Then
  233. let state = request.task?.state
  234. XCTAssertTrue(state == .canceling || state == .completed, "state should be .Canceling or .Completed")
  235. XCTAssertNil(manager, "manager should be nil")
  236. }
  237. // MARK: Tests - Bad Requests
  238. func testThatDataRequestWithInvalidURLStringThrowsResponseHandlerError() {
  239. // Given
  240. let sessionManager = SessionManager()
  241. let expectation = self.expectation(description: "Request should fail with error")
  242. var response: DefaultDataResponse?
  243. // When
  244. sessionManager.request("https://httpbin.org/get/äëïöü").response { resp in
  245. response = resp
  246. expectation.fulfill()
  247. }
  248. waitForExpectations(timeout: timeout, handler: nil)
  249. // Then
  250. XCTAssertNil(response?.request)
  251. XCTAssertNil(response?.response)
  252. XCTAssertNotNil(response?.data)
  253. XCTAssertEqual(response?.data?.count, 0)
  254. XCTAssertNotNil(response?.error)
  255. if let error = response?.error as? AFError {
  256. XCTAssertTrue(error.isInvalidURLError)
  257. XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü")
  258. } else {
  259. XCTFail("error should not be nil")
  260. }
  261. }
  262. func testThatDownloadRequestWithInvalidURLStringThrowsResponseHandlerError() {
  263. // Given
  264. let sessionManager = SessionManager()
  265. let expectation = self.expectation(description: "Download should fail with error")
  266. var response: DefaultDownloadResponse?
  267. // When
  268. sessionManager.download("https://httpbin.org/get/äëïöü").response { resp in
  269. response = resp
  270. expectation.fulfill()
  271. }
  272. waitForExpectations(timeout: timeout, handler: nil)
  273. // Then
  274. XCTAssertNil(response?.request)
  275. XCTAssertNil(response?.response)
  276. XCTAssertNil(response?.temporaryURL)
  277. XCTAssertNil(response?.destinationURL)
  278. XCTAssertNil(response?.resumeData)
  279. XCTAssertNotNil(response?.error)
  280. if let error = response?.error as? AFError {
  281. XCTAssertTrue(error.isInvalidURLError)
  282. XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü")
  283. } else {
  284. XCTFail("error should not be nil")
  285. }
  286. }
  287. func testThatUploadDataRequestWithInvalidURLStringThrowsResponseHandlerError() {
  288. // Given
  289. let sessionManager = SessionManager()
  290. let expectation = self.expectation(description: "Upload should fail with error")
  291. var response: DefaultDataResponse?
  292. // When
  293. sessionManager.upload(Data(), to: "https://httpbin.org/get/äëïöü").response { resp in
  294. response = resp
  295. expectation.fulfill()
  296. }
  297. waitForExpectations(timeout: timeout, handler: nil)
  298. // Then
  299. XCTAssertNil(response?.request)
  300. XCTAssertNil(response?.response)
  301. XCTAssertNotNil(response?.data)
  302. XCTAssertEqual(response?.data?.count, 0)
  303. XCTAssertNotNil(response?.error)
  304. if let error = response?.error as? AFError {
  305. XCTAssertTrue(error.isInvalidURLError)
  306. XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü")
  307. } else {
  308. XCTFail("error should not be nil")
  309. }
  310. }
  311. func testThatUploadFileRequestWithInvalidURLStringThrowsResponseHandlerError() {
  312. // Given
  313. let sessionManager = SessionManager()
  314. let expectation = self.expectation(description: "Upload should fail with error")
  315. var response: DefaultDataResponse?
  316. // When
  317. sessionManager.upload(URL(fileURLWithPath: "/invalid"), to: "https://httpbin.org/get/äëïöü").response { resp in
  318. response = resp
  319. expectation.fulfill()
  320. }
  321. waitForExpectations(timeout: timeout, handler: nil)
  322. // Then
  323. XCTAssertNil(response?.request)
  324. XCTAssertNil(response?.response)
  325. XCTAssertNotNil(response?.data)
  326. XCTAssertEqual(response?.data?.count, 0)
  327. XCTAssertNotNil(response?.error)
  328. if let error = response?.error as? AFError {
  329. XCTAssertTrue(error.isInvalidURLError)
  330. XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü")
  331. } else {
  332. XCTFail("error should not be nil")
  333. }
  334. }
  335. func testThatUploadStreamRequestWithInvalidURLStringThrowsResponseHandlerError() {
  336. // Given
  337. let sessionManager = SessionManager()
  338. let expectation = self.expectation(description: "Upload should fail with error")
  339. var response: DefaultDataResponse?
  340. // When
  341. sessionManager.upload(InputStream(data: Data()), to: "https://httpbin.org/get/äëïöü").response { resp in
  342. response = resp
  343. expectation.fulfill()
  344. }
  345. waitForExpectations(timeout: timeout, handler: nil)
  346. // Then
  347. XCTAssertNil(response?.request)
  348. XCTAssertNil(response?.response)
  349. XCTAssertNotNil(response?.data)
  350. XCTAssertEqual(response?.data?.count, 0)
  351. XCTAssertNotNil(response?.error)
  352. if let error = response?.error as? AFError {
  353. XCTAssertTrue(error.isInvalidURLError)
  354. XCTAssertEqual(error.urlConvertible as? String, "https://httpbin.org/get/äëïöü")
  355. } else {
  356. XCTFail("error should not be nil")
  357. }
  358. }
  359. // MARK: Tests - Request Adapter
  360. func testThatSessionManagerCallsRequestAdapterWhenCreatingDataRequest() {
  361. // Given
  362. let adapter = HTTPMethodAdapter(method: .post)
  363. let sessionManager = SessionManager()
  364. sessionManager.adapter = adapter
  365. sessionManager.startRequestsImmediately = false
  366. // When
  367. let request = sessionManager.request("https://httpbin.org/get")
  368. // Then
  369. XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue)
  370. }
  371. func testThatSessionManagerCallsRequestAdapterWhenCreatingDownloadRequest() {
  372. // Given
  373. let adapter = HTTPMethodAdapter(method: .post)
  374. let sessionManager = SessionManager()
  375. sessionManager.adapter = adapter
  376. sessionManager.startRequestsImmediately = false
  377. // When
  378. let destination = DownloadRequest.suggestedDownloadDestination()
  379. let request = sessionManager.download("https://httpbin.org/get", to: destination)
  380. // Then
  381. XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue)
  382. }
  383. func testThatSessionManagerCallsRequestAdapterWhenCreatingUploadRequestWithData() {
  384. // Given
  385. let adapter = HTTPMethodAdapter(method: .get)
  386. let sessionManager = SessionManager()
  387. sessionManager.adapter = adapter
  388. sessionManager.startRequestsImmediately = false
  389. // When
  390. let request = sessionManager.upload("data".data(using: .utf8)!, to: "https://httpbin.org/post")
  391. // Then
  392. XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue)
  393. }
  394. func testThatSessionManagerCallsRequestAdapterWhenCreatingUploadRequestWithFile() {
  395. // Given
  396. let adapter = HTTPMethodAdapter(method: .get)
  397. let sessionManager = SessionManager()
  398. sessionManager.adapter = adapter
  399. sessionManager.startRequestsImmediately = false
  400. // When
  401. let fileURL = URL(fileURLWithPath: "/path/to/some/file.txt")
  402. let request = sessionManager.upload(fileURL, to: "https://httpbin.org/post")
  403. // Then
  404. XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue)
  405. }
  406. func testThatSessionManagerCallsRequestAdapterWhenCreatingUploadRequestWithInputStream() {
  407. // Given
  408. let adapter = HTTPMethodAdapter(method: .get)
  409. let sessionManager = SessionManager()
  410. sessionManager.adapter = adapter
  411. sessionManager.startRequestsImmediately = false
  412. // When
  413. let inputStream = InputStream(data: "data".data(using: .utf8)!)
  414. let request = sessionManager.upload(inputStream, to: "https://httpbin.org/post")
  415. // Then
  416. XCTAssertEqual(request.task?.originalRequest?.httpMethod, adapter.method.rawValue)
  417. }
  418. func testThatRequestAdapterErrorThrowsResponseHandlerError() {
  419. // Given
  420. let adapter = HTTPMethodAdapter(method: .post, throwsError: true)
  421. let sessionManager = SessionManager()
  422. sessionManager.adapter = adapter
  423. sessionManager.startRequestsImmediately = false
  424. // When
  425. let request = sessionManager.request("https://httpbin.org/get")
  426. // Then
  427. if let error = request.delegate.error as? AFError {
  428. XCTAssertTrue(error.isInvalidURLError)
  429. XCTAssertEqual(error.urlConvertible as? String, "")
  430. } else {
  431. XCTFail("error should not be nil")
  432. }
  433. }
  434. // MARK: Tests - Request Retrier
  435. func testThatSessionManagerCallsRequestRetrierWhenRequestEncountersError() {
  436. // Given
  437. let handler = RequestHandler()
  438. let sessionManager = SessionManager()
  439. sessionManager.adapter = handler
  440. sessionManager.retrier = handler
  441. let expectation = self.expectation(description: "request should eventually fail")
  442. var response: DataResponse<Any>?
  443. // When
  444. sessionManager.request("https://httpbin.org/basic-auth/user/password")
  445. .validate()
  446. .responseJSON { jsonResponse in
  447. response = jsonResponse
  448. expectation.fulfill()
  449. }
  450. waitForExpectations(timeout: timeout, handler: nil)
  451. // Then
  452. XCTAssertEqual(handler.adaptedCount, 2)
  453. XCTAssertEqual(handler.retryCount, 2)
  454. XCTAssertEqual(response?.result.isSuccess, false)
  455. }
  456. func testThatSessionManagerCallsAdapterWhenRequestIsRetried() {
  457. // Given
  458. let handler = RequestHandler()
  459. handler.shouldApplyAuthorizationHeader = true
  460. let sessionManager = SessionManager()
  461. sessionManager.adapter = handler
  462. sessionManager.retrier = handler
  463. let expectation = self.expectation(description: "request should eventually fail")
  464. var response: DataResponse<Any>?
  465. // When
  466. sessionManager.request("https://httpbin.org/basic-auth/user/password")
  467. .validate()
  468. .responseJSON { jsonResponse in
  469. response = jsonResponse
  470. expectation.fulfill()
  471. }
  472. waitForExpectations(timeout: timeout, handler: nil)
  473. // Then
  474. XCTAssertEqual(handler.adaptedCount, 2)
  475. XCTAssertEqual(handler.retryCount, 1)
  476. XCTAssertEqual(response?.result.isSuccess, true)
  477. }
  478. func testThatRequestAdapterErrorThrowsResponseHandlerErrorWhenRequestIsRetried() {
  479. // Given
  480. let handler = RequestHandler()
  481. handler.throwsErrorOnSecondAdapt = true
  482. let sessionManager = SessionManager()
  483. sessionManager.adapter = handler
  484. sessionManager.retrier = handler
  485. let expectation = self.expectation(description: "request should eventually fail")
  486. var response: DataResponse<Any>?
  487. // When
  488. sessionManager.request("https://httpbin.org/basic-auth/user/password")
  489. .validate()
  490. .responseJSON { jsonResponse in
  491. response = jsonResponse
  492. expectation.fulfill()
  493. }
  494. waitForExpectations(timeout: timeout, handler: nil)
  495. // Then
  496. XCTAssertEqual(handler.adaptedCount, 1)
  497. XCTAssertEqual(handler.retryCount, 1)
  498. XCTAssertEqual(response?.result.isSuccess, false)
  499. if let error = response?.result.error as? AFError {
  500. XCTAssertTrue(error.isInvalidURLError)
  501. XCTAssertEqual(error.urlConvertible as? String, "")
  502. } else {
  503. XCTFail("error should not be nil")
  504. }
  505. }
  506. }
  507. // MARK: -
  508. class SessionManagerConfigurationHeadersTestCase: BaseTestCase {
  509. enum ConfigurationType {
  510. case `default`, ephemeral, background
  511. }
  512. func testThatDefaultConfigurationHeadersAreSentWithRequest() {
  513. // Given, When, Then
  514. executeAuthorizationHeaderTest(for: .default)
  515. }
  516. func testThatEphemeralConfigurationHeadersAreSentWithRequest() {
  517. // Given, When, Then
  518. executeAuthorizationHeaderTest(for: .ephemeral)
  519. }
  520. // ⚠️ This test has been removed as a result of rdar://26870455 in Xcode 8 Seed 1
  521. // func testThatBackgroundConfigurationHeadersAreSentWithRequest() {
  522. // // Given, When, Then
  523. // executeAuthorizationHeaderTest(for: .background)
  524. // }
  525. private func executeAuthorizationHeaderTest(for type: ConfigurationType) {
  526. // Given
  527. let manager: SessionManager = {
  528. let configuration: URLSessionConfiguration = {
  529. let configuration: URLSessionConfiguration
  530. switch type {
  531. case .default:
  532. configuration = .default
  533. case .ephemeral:
  534. configuration = .ephemeral
  535. case .background:
  536. let identifier = "org.alamofire.test.manager-configuration-tests"
  537. configuration = .background(withIdentifier: identifier)
  538. }
  539. var headers = SessionManager.defaultHTTPHeaders
  540. headers["Authorization"] = "Bearer 123456"
  541. configuration.httpAdditionalHeaders = headers
  542. return configuration
  543. }()
  544. return SessionManager(configuration: configuration)
  545. }()
  546. let expectation = self.expectation(description: "request should complete successfully")
  547. var response: DataResponse<Any>?
  548. // When
  549. manager.request("https://httpbin.org/headers")
  550. .responseJSON { closureResponse in
  551. response = closureResponse
  552. expectation.fulfill()
  553. }
  554. waitForExpectations(timeout: timeout, handler: nil)
  555. // Then
  556. if let response = response {
  557. XCTAssertNotNil(response.request, "request should not be nil")
  558. XCTAssertNotNil(response.response, "response should not be nil")
  559. XCTAssertNotNil(response.data, "data should not be nil")
  560. XCTAssertTrue(response.result.isSuccess, "result should be a success")
  561. // The `as NSString` cast is necessary due to a compiler bug. See the following rdar for more info.
  562. // - https://openradar.appspot.com/radar?id=5517037090635776
  563. if
  564. let headers = (response.result.value as AnyObject?)?["headers" as NSString] as? [String: String],
  565. let authorization = headers["Authorization"]
  566. {
  567. XCTAssertEqual(authorization, "Bearer 123456", "authorization header value does not match")
  568. } else {
  569. XCTFail("failed to extract authorization header value")
  570. }
  571. } else {
  572. XCTFail("response should not be nil")
  573. }
  574. }
  575. }