|
|
@@ -153,6 +153,78 @@ class RequestResponseTestCase: BaseTestCase {
|
|
|
XCTFail("last item in bytesValues and progressValues should not be nil")
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ func testRequestResponseWithStream() {
|
|
|
+ // Given
|
|
|
+ let randomBytes = 4 * 1024 * 1024
|
|
|
+ let URLString = "http://httpbin.org/bytes/\(randomBytes)"
|
|
|
+
|
|
|
+ let expectation = expectationWithDescription("Bytes download progress should be reported: \(URLString)")
|
|
|
+
|
|
|
+ var byteValues: [(bytes: Int64, totalBytes: Int64, totalBytesExpected: Int64)] = []
|
|
|
+ var progressValues: [(completedUnitCount: Int64, totalUnitCount: Int64)] = []
|
|
|
+ var responseRequest: NSURLRequest?
|
|
|
+ var responseResponse: NSHTTPURLResponse?
|
|
|
+ var responseData: AnyObject?
|
|
|
+ var responseError: NSError?
|
|
|
+
|
|
|
+ var accumulatedData = [NSData]()
|
|
|
+
|
|
|
+ // When
|
|
|
+ let request = Alamofire.request(.GET, URLString)
|
|
|
+ request.progress { bytesRead, totalBytesRead, totalBytesExpectedToRead in
|
|
|
+ let bytes = (bytes: bytesRead, totalBytes: totalBytesRead, totalBytesExpected: totalBytesExpectedToRead)
|
|
|
+ byteValues.append(bytes)
|
|
|
+
|
|
|
+ let progress = (completedUnitCount: request.progress.completedUnitCount, totalUnitCount: request.progress.totalUnitCount)
|
|
|
+ progressValues.append(progress)
|
|
|
+ }
|
|
|
+ request.stream { data in accumulatedData.append(data) }
|
|
|
+ request.response { request, response, data, error in
|
|
|
+ responseRequest = request
|
|
|
+ responseResponse = response
|
|
|
+ responseData = data
|
|
|
+ responseError = error
|
|
|
+
|
|
|
+ expectation.fulfill()
|
|
|
+ }
|
|
|
+
|
|
|
+ waitForExpectationsWithTimeout(self.defaultTimeout, handler: nil)
|
|
|
+
|
|
|
+ // Then
|
|
|
+ XCTAssertNotNil(responseRequest, "response request should not be nil")
|
|
|
+ XCTAssertNotNil(responseResponse, "response response should not be nil")
|
|
|
+ XCTAssertNil(responseData, "response data should be nil")
|
|
|
+ XCTAssertNil(responseError, "response error should be nil")
|
|
|
+ XCTAssertGreaterThanOrEqual(accumulatedData.count, 1, "accumulated data should have one or more parts")
|
|
|
+
|
|
|
+ XCTAssertEqual(byteValues.count, progressValues.count, "byteValues count should equal progressValues count")
|
|
|
+
|
|
|
+ if byteValues.count == progressValues.count {
|
|
|
+ for index in 0..<byteValues.count {
|
|
|
+ let byteValue = byteValues[index]
|
|
|
+ let progressValue = progressValues[index]
|
|
|
+
|
|
|
+ XCTAssertGreaterThan(byteValue.bytes, 0, "reported bytes should always be greater than 0")
|
|
|
+ XCTAssertEqual(byteValue.totalBytes, progressValue.completedUnitCount, "total bytes should be equal to completed unit count")
|
|
|
+ XCTAssertEqual(byteValue.totalBytesExpected, progressValue.totalUnitCount, "total bytes expected should be equal to total unit count")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if let lastByteValue = byteValues.last,
|
|
|
+ lastProgressValue = progressValues.last
|
|
|
+ {
|
|
|
+ let byteValueFractionalCompletion = Double(lastByteValue.totalBytes) / Double(lastByteValue.totalBytesExpected)
|
|
|
+ let progressValueFractionalCompletion = Double(lastProgressValue.0) / Double(lastProgressValue.1)
|
|
|
+
|
|
|
+ XCTAssertEqual(byteValueFractionalCompletion, 1.0, "byte value fractional completion should equal 1.0")
|
|
|
+ XCTAssertEqual(progressValueFractionalCompletion, 1.0, "progress value fractional completion should equal 1.0")
|
|
|
+
|
|
|
+ XCTAssertEqual(reduce(accumulatedData, 0) { $0 + $1.length }, lastByteValue.totalBytes, "accumulated data length should match byte count")
|
|
|
+ } else {
|
|
|
+ XCTFail("last item in bytesValues and progressValues should not be nil")
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// MARK: -
|