Browse Source

Added URL protocol test case for checking header passthrough behaviors.

Christian Noon 10 years ago
parent
commit
b92f4e054c
2 changed files with 175 additions and 0 deletions
  1. 6 0
      Alamofire.xcodeproj/project.pbxproj
  2. 169 0
      Tests/URLProtocolTests.swift

+ 6 - 0
Alamofire.xcodeproj/project.pbxproj

@@ -11,6 +11,8 @@
 		4C256A541B096C770065714F /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C256A501B096C2C0065714F /* BaseTestCase.swift */; };
 		4C341BBA1B1A865A00C1B34D /* CacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C341BB91B1A865A00C1B34D /* CacheTests.swift */; };
 		4C341BBB1B1A865A00C1B34D /* CacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C341BB91B1A865A00C1B34D /* CacheTests.swift */; };
+		4CCFA79A1B2BE71600B6F460 /* URLProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */; };
+		4CCFA79B1B2BE71600B6F460 /* URLProtocolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */; };
 		4CDE2C371AF8932A00BABAE5 /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C361AF8932A00BABAE5 /* Manager.swift */; };
 		4CDE2C381AF8932A00BABAE5 /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C361AF8932A00BABAE5 /* Manager.swift */; };
 		4CDE2C3A1AF899EC00BABAE5 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDE2C391AF899EC00BABAE5 /* Request.swift */; };
@@ -70,6 +72,7 @@
 /* Begin PBXFileReference section */
 		4C256A501B096C2C0065714F /* BaseTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseTestCase.swift; sourceTree = "<group>"; };
 		4C341BB91B1A865A00C1B34D /* CacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheTests.swift; sourceTree = "<group>"; };
+		4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLProtocolTests.swift; sourceTree = "<group>"; };
 		4CDE2C361AF8932A00BABAE5 /* Manager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Manager.swift; sourceTree = "<group>"; };
 		4CDE2C391AF899EC00BABAE5 /* Request.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request.swift; sourceTree = "<group>"; };
 		4CDE2C3C1AF89D4900BABAE5 /* Download.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Download.swift; sourceTree = "<group>"; };
@@ -148,6 +151,7 @@
 				F8111E5B19A9674D0040E7D1 /* DownloadTests.swift */,
 				F86AEFE51AE6A282007D9C76 /* TLSEvaluationTests.swift */,
 				F8111E5F19A9674D0040E7D1 /* UploadTests.swift */,
+				4CCFA7991B2BE71600B6F460 /* URLProtocolTests.swift */,
 				F8AE910119D28DCC0078C7B2 /* ValidationTests.swift */,
 			);
 			name = Features;
@@ -437,6 +441,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				4C341BBA1B1A865A00C1B34D /* CacheTests.swift in Sources */,
+				4CCFA79A1B2BE71600B6F460 /* URLProtocolTests.swift in Sources */,
 				F86AEFE71AE6A312007D9C76 /* TLSEvaluationTests.swift in Sources */,
 				F8858DDD19A96B4300F55F93 /* RequestTests.swift in Sources */,
 				4C256A531B096C770065714F /* BaseTestCase.swift in Sources */,
@@ -455,6 +460,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				4C341BBB1B1A865A00C1B34D /* CacheTests.swift in Sources */,
+				4CCFA79B1B2BE71600B6F460 /* URLProtocolTests.swift in Sources */,
 				F829C6BE1A7A950600A2CD59 /* ParameterEncodingTests.swift in Sources */,
 				F829C6BF1A7A950600A2CD59 /* RequestTests.swift in Sources */,
 				4C256A541B096C770065714F /* BaseTestCase.swift in Sources */,

+ 169 - 0
Tests/URLProtocolTests.swift

@@ -0,0 +1,169 @@
+// URLProtocolTests.swift
+//
+// Copyright (c) 2014–2015 Alamofire Software Foundation (http://alamofire.org/)
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+import Alamofire
+import Foundation
+import XCTest
+
+class ProxyURLProtocol: NSURLProtocol {
+
+    // MARK: Properties
+
+    struct PropertyKeys {
+        static let HandledByForwarderURLProtocol = "HandledByProxyURLProtocol"
+    }
+
+    lazy var session: NSURLSession = {
+        let configuration: NSURLSessionConfiguration = {
+            let configuration = NSURLSessionConfiguration.ephemeralSessionConfiguration()
+            configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
+
+            return configuration
+        }()
+
+        let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
+
+        return session
+    }()
+
+    var activeTask: NSURLSessionTask?
+
+    // MARK: Class Request Methods
+
+    override class func canInitWithRequest(request: NSURLRequest) -> Bool {
+        if NSURLProtocol.propertyForKey(PropertyKeys.HandledByForwarderURLProtocol, inRequest: request) != nil {
+            return false
+        }
+
+        return true
+    }
+
+    override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest {
+        return request
+    }
+
+    override class func requestIsCacheEquivalent(a: NSURLRequest, toRequest b: NSURLRequest) -> Bool {
+        return false
+    }
+
+    // MARK: Loading Methods
+
+    override func startLoading() {
+        var mutableRequest = self.request.mutableCopy() as! NSMutableURLRequest
+        NSURLProtocol.setProperty(true, forKey: PropertyKeys.HandledByForwarderURLProtocol, inRequest: mutableRequest)
+
+        self.activeTask = self.session.dataTaskWithRequest(mutableRequest)
+        self.activeTask?.resume()
+    }
+
+    override func stopLoading() {
+        self.activeTask?.cancel()
+    }
+}
+
+// MARK: -
+
+extension ProxyURLProtocol: NSURLSessionDelegate {
+
+    // MARK: NSURLSessionDelegate
+
+    func URLSession(session: NSURLSession, dataTask: NSURLSessionDataTask, didReceiveData data: NSData) {
+        self.client?.URLProtocol(self, didLoadData: data)
+    }
+
+    func URLSession(session: NSURLSession, task: NSURLSessionTask, didCompleteWithError error: NSError?) {
+        if let response = task.response {
+            let cachePolicy = task.originalRequest.cachePolicy
+            self.client?.URLProtocol(self, didReceiveResponse: response, cacheStoragePolicy: .NotAllowed)
+        }
+
+        self.client?.URLProtocolDidFinishLoading(self)
+    }
+}
+
+// MARK: -
+
+class URLProtocolTestCase: BaseTestCase {
+
+    // MARK: Setup and Teardown Methods
+
+    override func setUp() {
+        super.setUp()
+
+        let protocolClasses: [AnyObject] = [ProxyURLProtocol.self]
+        Alamofire.Manager.sharedInstance.session.configuration.protocolClasses = protocolClasses
+        Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = ["Session-Configuration-Header": "foo"]
+    }
+
+    override func tearDown() {
+        super.tearDown()
+
+        Alamofire.Manager.sharedInstance.session.configuration.protocolClasses = []
+    }
+
+    // MARK: Tests
+
+    func testThatURLProtocolReceivesRequestHeadersAndNotSessionConfigurationHeaders() {
+        // Given
+        let URLString = "http://httpbin.org/response-headers"
+        let URL = NSURL(string: URLString)!
+        let parameters = ["URLRequest-Header": "foobar"]
+
+        let mutableURLRequest = NSMutableURLRequest(URL: URL)
+        mutableURLRequest.HTTPMethod = Method.GET.rawValue
+
+        let URLRequest = ParameterEncoding.URL.encode(mutableURLRequest, parameters: parameters).0
+
+        let expectation = expectationWithDescription("GET request should succeed")
+
+        var request: NSURLRequest?
+        var response: NSHTTPURLResponse?
+        var string: AnyObject?
+        var error: NSError?
+
+        // When
+        Alamofire.request(URLRequest)
+            .response { responseRequest, responseResponse, responseString, responseError in
+                request = responseRequest
+                response = responseResponse
+                string = responseString
+                error = responseError
+
+                expectation.fulfill()
+        }
+
+        waitForExpectationsWithTimeout(self.defaultTimeout, handler: nil)
+
+        // Then
+        XCTAssertNotNil(request, "request should not be nil")
+        XCTAssertNotNil(response, "response should not be nil")
+        XCTAssertNotNil(string, "string should not be nil")
+        XCTAssertNil(error, "error should be nil")
+
+        if let headers = response?.allHeaderFields as? [String: String] {
+            XCTAssertEqual(headers["URLRequest-Header"] ?? "", "foobar", "URLRequest-Header should be foobar")
+            XCTAssertNil(headers["Session-Configuration-Header"], "Session-Configuration-Header should be nil")
+        } else {
+            XCTFail("headers should not be nil")
+        }
+    }
+}