@@ -29,7 +29,8 @@ class TestURLSession : XCTestCase {
29
29
( " test_downloadTaskWithURLRequest " , test_downloadTaskWithURLRequest) ,
30
30
( " test_downloadTaskWithRequestAndHandler " , test_downloadTaskWithRequestAndHandler) ,
31
31
( " test_downloadTaskWithURLAndHandler " , test_downloadTaskWithURLAndHandler) ,
32
- ( " test_finishTaskAndInvalidate " , test_finishTasksAndInvalidate)
32
+ ( " test_finishTaskAndInvalidate " , test_finishTasksAndInvalidate) ,
33
+ ( " test_cancelTask " , test_cancelTask) ,
33
34
]
34
35
}
35
36
@@ -262,6 +263,27 @@ class TestURLSession : XCTestCase {
262
263
session. finishTasksAndInvalidate ( )
263
264
waitForExpectations ( timeout: 12 )
264
265
}
266
+
267
+ func test_cancelTask( ) {
268
+ let serverReady = ServerSemaphore ( )
269
+ globalDispatchQueue. async {
270
+ do {
271
+ try self . runServer ( with: serverReady)
272
+ } catch {
273
+ XCTAssertTrue ( true )
274
+ return
275
+ }
276
+ }
277
+ serverReady. wait ( )
278
+ let url = URL ( string: " http://127.0.0.1: \( serverPort) /Peru " ) !
279
+ let d = DataTask ( with: expectation ( description: " Task to be canceled " ) )
280
+ d. dataTaskExpectation. fulfill ( ) //we aren't interested in this expectation
281
+ d. cancelExpectation = expectation ( description: " URLSessionTask wasn't canceled " )
282
+ d. run ( with: url)
283
+ d. cancel ( )
284
+ waitForExpectations ( timeout: 12 )
285
+ }
286
+
265
287
}
266
288
267
289
class SessionDelegate : NSObject , URLSessionDelegate {
@@ -279,6 +301,8 @@ class DataTask : NSObject {
279
301
var capital = " unknown "
280
302
var session : URLSession ! = nil
281
303
var task : URLSessionDataTask ! = nil
304
+ var cancelExpectation : XCTestExpectation ?
305
+
282
306
public var error = false
283
307
284
308
init ( with expectation: XCTestExpectation ) {
@@ -300,20 +324,24 @@ class DataTask : NSObject {
300
324
task = session. dataTask ( with: url)
301
325
task. resume ( )
302
326
}
327
+
328
+ func cancel( ) {
329
+ task. cancel ( )
330
+ }
303
331
}
304
332
305
333
extension DataTask : URLSessionDataDelegate {
306
- public func urlSession( _ session: URLSession , dataTask: URLSessionDataTask , didReceive data: Data ) {
307
- capital = String ( data: data, encoding: String . Encoding. utf8) !
308
- dataTaskExpectation. fulfill ( )
309
- }
334
+ public func urlSession( _ session: URLSession , dataTask: URLSessionDataTask , didReceive data: Data ) {
335
+ capital = String ( data: data, encoding: String . Encoding. utf8) !
336
+ dataTaskExpectation. fulfill ( )
337
+ }
310
338
}
311
339
312
340
extension DataTask : URLSessionTaskDelegate {
313
- public func urlSession( _ session: URLSession , task: URLSessionTask , didCompleteWithError error: NSError ? ) {
314
- guard let e = error else { return }
315
- XCTAssertEqual ( e . code , NSURLErrorTimedOut , " Unexpected error code " )
316
- dataTaskExpectation . fulfill ( )
341
+ public func urlSession( _ session: URLSession , task: URLSessionTask , didCompleteWithError error: Error ? ) {
342
+ if let cancellation = cancelExpectation {
343
+ cancellation . fulfill ( )
344
+ }
317
345
self . error = true
318
346
}
319
347
}
0 commit comments