@@ -32,6 +32,7 @@ class TestURLSession : XCTestCase {
32
32
( " test_finishTaskAndInvalidate " , test_finishTasksAndInvalidate) ,
33
33
( " test_taskError " , test_taskError) ,
34
34
( " test_taskCopy " , test_taskCopy) ,
35
+ ( " test_cancelTask " , test_cancelTask) ,
35
36
]
36
37
}
37
38
@@ -297,6 +298,26 @@ class TestURLSession : XCTestCase {
297
298
298
299
XCTAssert ( task. isEqual ( task. copy ( ) ) )
299
300
}
301
+
302
+ func test_cancelTask( ) {
303
+ let serverReady = ServerSemaphore ( )
304
+ globalDispatchQueue. async {
305
+ do {
306
+ try self . runServer ( with: serverReady)
307
+ } catch {
308
+ XCTAssertTrue ( true )
309
+ return
310
+ }
311
+ }
312
+ serverReady. wait ( )
313
+ let url = URL ( string: " http://127.0.0.1: \( serverPort) /Peru " ) !
314
+ let d = DataTask ( with: expectation ( description: " Task to be canceled " ) )
315
+ d. cancelExpectation = expectation ( description: " URLSessionTask wasn't canceled " )
316
+ d. run ( with: url)
317
+ d. cancel ( )
318
+ waitForExpectations ( timeout: 12 )
319
+ }
320
+
300
321
}
301
322
302
323
class SessionDelegate : NSObject , URLSessionDelegate {
@@ -314,6 +335,8 @@ class DataTask : NSObject {
314
335
var capital = " unknown "
315
336
var session : URLSession ! = nil
316
337
var task : URLSessionDataTask ! = nil
338
+ var cancelExpectation : XCTestExpectation ?
339
+
317
340
public var error = false
318
341
319
342
init ( with expectation: XCTestExpectation ) {
@@ -335,20 +358,26 @@ class DataTask : NSObject {
335
358
task = session. dataTask ( with: url)
336
359
task. resume ( )
337
360
}
361
+
362
+ func cancel( ) {
363
+ task. cancel ( )
364
+ }
338
365
}
339
366
340
367
extension DataTask : URLSessionDataDelegate {
341
- public func urlSession( _ session: URLSession , dataTask: URLSessionDataTask , didReceive data: Data ) {
342
- capital = String ( data: data, encoding: String . Encoding. utf8) !
343
- dataTaskExpectation. fulfill ( )
344
- }
368
+ public func urlSession( _ session: URLSession , dataTask: URLSessionDataTask , didReceive data: Data ) {
369
+ capital = String ( data: data, encoding: String . Encoding. utf8) !
370
+ dataTaskExpectation. fulfill ( )
371
+ }
345
372
}
346
373
347
374
extension DataTask : URLSessionTaskDelegate {
348
375
public func urlSession( _ session: URLSession , task: URLSessionTask , didCompleteWithError error: Error ? ) {
349
376
guard let e = error as? URLError else { return }
350
- XCTAssertEqual ( e. code, . timedOut, " Unexpected error code " )
351
377
dataTaskExpectation. fulfill ( )
378
+ if let cancellation = cancelExpectation {
379
+ cancellation. fulfill ( )
380
+ }
352
381
self . error = true
353
382
}
354
383
}
0 commit comments