DownloadTests.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // DownloadTests.swift
  2. //
  3. // Copyright (c) 2014–2015 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. import Alamofire
  23. import Foundation
  24. import XCTest
  25. class DownloadResponseTestCase: BaseTestCase {
  26. // MARK: - Properties
  27. let searchPathDirectory: NSSearchPathDirectory = .CachesDirectory
  28. let searchPathDomain: NSSearchPathDomainMask = .UserDomainMask
  29. // MARK: - Tests
  30. func testDownloadRequest() {
  31. // Given
  32. let numberOfLines = 100
  33. let URL = "http://httpbin.org/stream/\(numberOfLines)"
  34. let destination = Alamofire.Request.suggestedDownloadDestination(directory: searchPathDirectory, domain: searchPathDomain)
  35. let expectation = expectationWithDescription(URL)
  36. var request: NSURLRequest?
  37. var response: NSHTTPURLResponse?
  38. var error: NSError?
  39. // When
  40. Alamofire.download(.GET, URL, destination)
  41. .response { responseRequest, responseResponse, _, responseError in
  42. request = responseRequest
  43. response = responseResponse
  44. error = responseError
  45. expectation.fulfill()
  46. }
  47. waitForExpectationsWithTimeout(self.defaultTimeout, handler: nil)
  48. // Then
  49. XCTAssertNotNil(request, "request should not be nil")
  50. XCTAssertNotNil(response, "response should not be nil")
  51. XCTAssertNil(error, "error should be nil")
  52. let fileManager = NSFileManager.defaultManager()
  53. let directory = fileManager.URLsForDirectory(self.searchPathDirectory, inDomains: self.searchPathDomain)[0] as! NSURL
  54. var fileManagerError: NSError?
  55. if let contents = fileManager.contentsOfDirectoryAtURL(directory, includingPropertiesForKeys: nil, options: .SkipsHiddenFiles, error: &fileManagerError) {
  56. XCTAssertNil(fileManagerError, "fileManagerError should be nil")
  57. #if os(iOS)
  58. let suggestedFilename = "\(numberOfLines)"
  59. #elseif os(OSX)
  60. let suggestedFilename = "\(numberOfLines).json"
  61. #endif
  62. let predicate = NSPredicate(format: "lastPathComponent = '\(suggestedFilename)'")
  63. let filteredContents = (contents as NSArray).filteredArrayUsingPredicate(predicate)
  64. XCTAssertEqual(filteredContents.count, 1, "should have one file in Documents")
  65. if let file = filteredContents.first as? NSURL {
  66. XCTAssertEqual(file.lastPathComponent ?? "", "\(suggestedFilename)", "filename should be \(suggestedFilename)")
  67. if let data = NSData(contentsOfURL: file) {
  68. XCTAssertGreaterThan(data.length, 0, "data length should be non-zero")
  69. } else {
  70. XCTFail("data should exist for contents of URL")
  71. }
  72. fileManager.removeItemAtURL(file, error: nil)
  73. } else {
  74. XCTFail("file should not be nil")
  75. }
  76. } else {
  77. XCTFail("contents should not be nil")
  78. }
  79. }
  80. func testDownloadRequestWithProgress() {
  81. // Given
  82. let numberOfLines = 100
  83. let URL = "http://httpbin.org/stream/\(numberOfLines)"
  84. let destination = Alamofire.Request.suggestedDownloadDestination(directory: searchPathDirectory, domain: searchPathDomain)
  85. let expectation = expectationWithDescription(URL)
  86. var bytesRead: Int64?
  87. var totalBytesRead: Int64?
  88. var totalBytesExpectedToRead: Int64?
  89. // When
  90. let download = Alamofire.download(.GET, URL, destination)
  91. download.progress { progressBytesRead, progressTotalBytesRead, progressTotalBytesExpectedToRead in
  92. bytesRead = progressBytesRead
  93. totalBytesRead = progressTotalBytesRead
  94. totalBytesExpectedToRead = progressTotalBytesExpectedToRead
  95. download.cancel()
  96. expectation.fulfill()
  97. }
  98. waitForExpectationsWithTimeout(self.defaultTimeout, handler: nil)
  99. // Then
  100. XCTAssertGreaterThan(bytesRead ?? 0, 0, "bytesRead should be > 0")
  101. XCTAssertGreaterThan(totalBytesRead ?? 0, 0, "totalBytesRead should be > 0")
  102. XCTAssertEqual(totalBytesExpectedToRead ?? 0, -1, "totalBytesExpectedToRead should be -1")
  103. }
  104. }