forked from sparkle-project/Sparkle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSPUDownloaderTest.swift
143 lines (115 loc) · 5.4 KB
/
SPUDownloaderTest.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
//
// SPUDownloaderTest.swift
// Sparkle
//
// Created by Deadpikle on 12/28/17.
// Copyright © 2017 Sparkle Project. All rights reserved.
//
import XCTest
import Sparkle
class SPUDownloaderTestDelegate: NSObject, SPUDownloaderDelegate {
var asyncExpectation: XCTestExpectation?
var tempResult: SPUDownloadData?
var downloadPath: URL?
func downloaderDidReceiveData(ofLength length: UInt64)
{
}
func downloaderDidReceiveExpectedContentLength(_ expectedContentLength: Int64)
{
}
func downloaderDidSetDestinationName(_ destinationName: String, temporaryDirectory: String)
{
self.downloadPath = NSURL(fileURLWithPath: temporaryDirectory).appendingPathComponent(destinationName)
}
func downloaderDidFailWithError(_ error: Error)
{
XCTFail(error.localizedDescription);
self.asyncExpectation?.fulfill()
}
func downloaderDidFinish(withTemporaryDownloadData downloadData: SPUDownloadData?)
{
self.tempResult = downloadData
self.asyncExpectation?.fulfill()
}
}
class SPUDownloaderTest: XCTestCase
{
func performTemporaryDownloadTest(withDownloader downloader: SPUDownloader, delegate: SPUDownloaderTestDelegate)
{
let delegateExpectation = expectation(description: "SPUDownloader temporary download")
delegate.asyncExpectation = delegateExpectation
let url = URL.init(string: "https://sparkle-project.org/unit_test/test.xml")
var request = URLRequest(url: url!, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 30.0)
request.setValue("application/rss+xml,*/*;q=0.1", forHTTPHeaderField: "Accept")
let downloaderRequest = SPUURLRequest(request: request as URLRequest)
downloader.startTemporaryDownload(with: downloaderRequest)
super.waitForExpectations(timeout: 30.0) { error in
if let error = error {
XCTFail("waitForExpectations had error: \(error)")
}
guard let result = delegate.tempResult else {
XCTFail("Expected result to be non-nil")
return
}
let str = String.init(data: result.data,
encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
XCTAssert(str == "<test>appcast</test>\n")
}
}
// SHA256 code from: https://stackoverflow.com/a/42934185/3938401
func sha256(data: Data) -> Data
{
var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes {digestBytes in
data.withUnsafeBytes {messageBytes in
CC_SHA256(messageBytes, CC_LONG(data.count), digestBytes)
}
}
return digestData
}
func performPersistentDownloadTest(withDownloader downloader: SPUDownloader, delegate: SPUDownloaderTestDelegate)
{
let delegateExpectation = expectation(description: "SPUDownloader persistent download")
delegate.asyncExpectation = delegateExpectation
let url = URL.init(string: "https://sparkle-project.org/unit_test/icon.png")
var request = URLRequest(url: url!, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 30.0)
request.setValue("image/png", forHTTPHeaderField: "Accept")
let downloaderRequest = SPUURLRequest(request: request as URLRequest)
let bundleIdentifier = Bundle.init(for: self.superclass!).bundleIdentifier
downloader.startPersistentDownload(with: downloaderRequest, bundleIdentifier: bundleIdentifier!, desiredFilename: "icon")
super.waitForExpectations(timeout: 30.0) { error in
if let error = error {
XCTFail("waitForExpectations had error: \(error)")
}
guard let filePath = delegate.downloadPath else {
XCTFail("Expected download path to be non-nil")
return
}
let fileManager = FileManager.default
XCTAssert(fileManager.fileExists(atPath: filePath.path))
do {
let iconData = try Data.init(contentsOf: filePath)
let sha256HashData = self.sha256(data: iconData)
let hashString = sha256HashData.map { String(format: "%02hhx", $0) }.joined().uppercased()
XCTAssert(hashString == "F262E65663C505B9C6449B61660FA3F223912465AE637014288294A8CB286B85")
} catch {
XCTFail("Something went wrong reading the file data")
}
}
}
func testDeprecatedDownloader()
{
let delegate = SPUDownloaderTestDelegate()
let downloader = SPUDownloaderDeprecated(delegate: delegate)
self.performTemporaryDownloadTest(withDownloader: downloader!, delegate: delegate)
self.performPersistentDownloadTest(withDownloader: downloader!, delegate: delegate)
}
func testSessionDownloader()
{
let delegate = SPUDownloaderTestDelegate()
var downloader = SPUDownloaderSession(delegate: delegate)
self.performTemporaryDownloadTest(withDownloader: downloader!, delegate: delegate)
downloader = SPUDownloaderSession(delegate: delegate)
self.performPersistentDownloadTest(withDownloader: downloader!, delegate: delegate)
}
}