@@ -15,9 +15,12 @@ import XCTest
15
15
import SwiftFoundation
16
16
import SwiftXCTest
17
17
#endif
18
+ import Dispatch
18
19
19
20
class TestURLSession : XCTestCase {
20
21
22
+ var serverPort : Int = - 1
23
+
21
24
static var allTests : [ ( String , ( TestURLSession ) -> ( ) throws -> Void ) ] {
22
25
return [
23
26
( " test_dataTaskWithURL " , test_dataTaskWithURL) ,
@@ -32,8 +35,35 @@ class TestURLSession : XCTestCase {
32
35
]
33
36
}
34
37
38
+ private func runServer( with condition: DispatchSemaphore ) throws {
39
+ let start = 21961
40
+ for port in start... ( start+ 100 ) { //we must find at least one port to bind
41
+ do {
42
+ serverPort = port
43
+ let test = try TestURLSessionServer ( port: UInt16 ( port) )
44
+ try test. start ( started: condition)
45
+ try test. readAndRespond ( )
46
+ test. stop ( )
47
+ } catch let e as ServerError {
48
+ if e. operation != " bind " { continue }
49
+ throw e
50
+ }
51
+ }
52
+ }
53
+
35
54
func test_dataTaskWithURL( ) {
36
- let urlString = " https://restcountries.eu/rest/v1/name/Nepal?fullText=true "
55
+ let serverReady = DispatchSemaphore ( value: 0 )
56
+ let queue = DispatchQueue . global ( )
57
+ queue. async {
58
+ do {
59
+ try self . runServer ( with: serverReady)
60
+ } catch {
61
+ XCTAssertTrue ( true )
62
+ return
63
+ }
64
+ }
65
+ serverReady. wait ( )
66
+ let urlString = " http://127.0.0.1: \( serverPort) /Nepal "
37
67
let url = URL ( string: urlString) !
38
68
let d = DataTask ( with: expectation ( description: " data task " ) )
39
69
d. run ( with: url)
@@ -44,7 +74,18 @@ class TestURLSession : XCTestCase {
44
74
}
45
75
46
76
func test_dataTaskWithURLCompletionHandler( ) {
47
- let urlString = " https://restcountries.eu/rest/v1/name/USA?fullText=true "
77
+ let serverReady = DispatchSemaphore ( value: 0 )
78
+ let queue = DispatchQueue . global ( )
79
+ queue. async {
80
+ do {
81
+ try self . runServer ( with: serverReady)
82
+ } catch {
83
+ XCTAssertTrue ( true )
84
+ return
85
+ }
86
+ }
87
+ serverReady. wait ( )
88
+ let urlString = " http://127.0.0.1: \( serverPort) /USA "
48
89
let url = URL ( string: urlString) !
49
90
let config = URLSessionConfiguration . default
50
91
config. timeoutIntervalForRequest = 8
@@ -60,13 +101,7 @@ class TestURLSession : XCTestCase {
60
101
61
102
let httpResponse = response as! HTTPURLResponse ?
62
103
XCTAssertEqual ( 200 , httpResponse!. statusCode, " HTTP response code is not 200 " )
63
- do {
64
- let json = try JSONSerialization . jsonObject ( with: data!, options: [ ] )
65
- let arr = json as? Array < Any >
66
- let first = arr![ 0 ]
67
- let result = first as? [ String : Any ]
68
- expectedResult = result![ " capital " ] as! String
69
- } catch { }
104
+ expectedResult = NSString ( data: data!, encoding: String . Encoding. utf8. rawValue) !. _bridgeToSwift ( )
70
105
XCTAssertEqual ( " Washington, D.C. " , expectedResult, " Did not receive expected value " )
71
106
expect. fulfill ( )
72
107
}
@@ -75,7 +110,18 @@ class TestURLSession : XCTestCase {
75
110
}
76
111
77
112
func test_dataTaskWithURLRequest( ) {
78
- let urlString = " https://restcountries.eu/rest/v1/name/Peru?fullText=true "
113
+ let serverReady = DispatchSemaphore ( value: 0 )
114
+ let queue = DispatchQueue . global ( )
115
+ queue. async {
116
+ do {
117
+ try self . runServer ( with: serverReady)
118
+ } catch {
119
+ XCTAssertTrue ( true )
120
+ return
121
+ }
122
+ }
123
+ serverReady. wait ( )
124
+ let urlString = " http://127.0.0.1: \( serverPort) /Peru "
79
125
let urlRequest = URLRequest ( url: URL ( string: urlString) !)
80
126
let d = DataTask ( with: expectation ( description: " data task " ) )
81
127
d. run ( with: urlRequest)
@@ -86,7 +132,18 @@ class TestURLSession : XCTestCase {
86
132
}
87
133
88
134
func test_dataTaskWithURLRequestCompletionHandler( ) {
89
- let urlString = " https://restcountries.eu/rest/v1/name/Italy?fullText=true "
135
+ let serverReady = DispatchSemaphore ( value: 0 )
136
+ let queue = DispatchQueue . global ( )
137
+ queue. async {
138
+ do {
139
+ try self . runServer ( with: serverReady)
140
+ } catch {
141
+ XCTAssertTrue ( true )
142
+ return
143
+ }
144
+ }
145
+ serverReady. wait ( )
146
+ let urlString = " http://127.0.0.1: \( serverPort) /Italy "
90
147
let urlRequest = URLRequest ( url: URL ( string: urlString) !)
91
148
let config = URLSessionConfiguration . default
92
149
config. timeoutIntervalForRequest = 8
@@ -101,13 +158,7 @@ class TestURLSession : XCTestCase {
101
158
}
102
159
let httpResponse = response as! HTTPURLResponse ?
103
160
XCTAssertEqual ( 200 , httpResponse!. statusCode, " HTTP response code is not 200 " )
104
- do {
105
- let json = try JSONSerialization . jsonObject ( with: data!, options: [ ] )
106
- let arr = json as? Array < Any >
107
- let first = arr![ 0 ]
108
- let result = first as? [ String : Any ]
109
- expectedResult = result![ " capital " ] as! String
110
- } catch { }
161
+ expectedResult = NSString ( data: data!, encoding: String . Encoding. utf8. rawValue) !. _bridgeToSwift ( )
111
162
XCTAssertEqual ( " Rome " , expectedResult, " Did not receive expected value " )
112
163
expect. fulfill ( )
113
164
}
@@ -194,14 +245,7 @@ class DataTask: NSObject {
194
245
195
246
extension DataTask : URLSessionDataDelegate {
196
247
public func urlSession( _ session: URLSession , dataTask: URLSessionDataTask , didReceive data: Data ) {
197
- do {
198
- let json = try JSONSerialization . jsonObject ( with: data, options: [ ] )
199
- let arr = json as? Array < Any >
200
- let first = arr![ 0 ]
201
- let result = first as? [ String : Any ]
202
- capital = result![ " capital " ] as! String
203
- } catch { }
204
-
248
+ capital = NSString ( data: data, encoding: String . Encoding. utf8. rawValue) !. _bridgeToSwift ( )
205
249
dataTaskExpectation. fulfill ( )
206
250
}
207
251
}
0 commit comments