Skip to content

Commit 71a6356

Browse files
authored
Fix non-task custom delegate (#586)
1 parent d08a284 commit 71a6356

File tree

3 files changed

+51
-15
lines changed

3 files changed

+51
-15
lines changed

platform/swift/source/integrations/url_session/ProxyURLSessionDelegate.swift

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ class ProxyURLSessionDelegate: NSObject {
1717
/// `URLSession`'s `delegate` property is a `strong` reference. It's uncommon for delegates on iOS to be
1818
/// `strong` references but to make our delegate mimic the behavior of `URLSession`'s delegate we hold
1919
/// a strong reference to the underlying delegate.
20-
fileprivate let target: URLSessionTaskDelegate?
20+
fileprivate let target: URLSessionDelegate?
2121

22-
init(target: URLSessionTaskDelegate?) {
22+
init(target: URLSessionDelegate?) {
2323
self.target = target
2424
}
2525

@@ -40,7 +40,9 @@ extension ProxyURLSessionDelegate: URLSessionTaskDelegate {
4040
)
4141
{
4242
URLSessionTaskTracker.shared.task(task, didFinishCollecting: metrics)
43-
self.target?.urlSession?(session, task: task, didFinishCollecting: metrics)
43+
if let delegate = self.target as? URLSessionTaskDelegate {
44+
delegate.urlSession?(session, task: task, didFinishCollecting: metrics)
45+
}
4446
}
4547
}
4648

@@ -54,7 +56,7 @@ final class ProxyURLSessionTaskDelegate: ProxyURLSessionDelegate {
5456
{
5557
URLSessionTaskTracker.shared.task(task, didFinishCollecting: metrics)
5658

57-
if let delegate = self.target, delegate.responds(to: kFinishedCollectingMetrics) {
59+
if let delegate = self.target as? URLSessionTaskDelegate, delegate.responds(to: kFinishedCollectingMetrics) {
5860
delegate.urlSession?(session, task: task, didFinishCollecting: metrics)
5961
return
6062
}

platform/swift/source/integrations/url_session/extensions/URLSession+Extensions.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ extension URLSession {
3434
if delegate?.isKind(of: ProxyURLSessionDelegate.self) == true {
3535
newDelegate = delegate
3636
} else {
37-
newDelegate = ProxyURLSessionDelegate(target: delegate as? URLSessionTaskDelegate)
37+
newDelegate = ProxyURLSessionDelegate(target: delegate)
3838
}
3939

4040
if var protocolClasses = configuration.protocolClasses {

test/platform/swift/unit_integration/integrations/URLSessionIntegrationTests.swift

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,16 @@ private final class URLSessionIncompleteDelegate: NSObject, URLSessionTaskDelega
2020
}
2121
}
2222

23-
private final class URLSessionDelegate: NSObject, URLSessionTaskDelegate {
23+
private final class URLSessionCustomDelegate: NSObject, URLSessionDelegate {
24+
var didReceiveChallenge: XCTestExpectation?
25+
26+
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge) async -> (URLSession.AuthChallengeDisposition, URLCredential?) {
27+
self.didReceiveChallenge?.fulfill()
28+
return (.performDefaultHandling, nil)
29+
}
30+
}
31+
32+
private final class URLSessionCustomTaskDelegate: NSObject, URLSessionTaskDelegate {
2433
var didCreateTaskExpectation: XCTestExpectation?
2534
var didFinishCollectingMetricsExpectation: XCTestExpectation?
2635
var didCompleteExpectation: XCTestExpectation?
@@ -122,7 +131,7 @@ final class URLSessionIntegrationTests: XCTestCase {
122131

123132
let taskCompletionExpectation = self.expectation(description: "task completed")
124133

125-
let delegate = URLSessionDelegate()
134+
let delegate = URLSessionCustomTaskDelegate()
126135
delegate.didCreateTaskExpectation = expectation
127136
delegate.didFinishCollectingMetricsExpectation = expectation
128137
delegate.didCompleteExpectation = taskCompletionExpectation
@@ -205,7 +214,7 @@ final class URLSessionIntegrationTests: XCTestCase {
205214

206215
let taskCompletionExpectation = self.expectation(description: "task completed")
207216

208-
let delegate = URLSessionDelegate()
217+
let delegate = URLSessionCustomTaskDelegate()
209218
delegate.didCreateTaskExpectation = expectation
210219
delegate.didFinishCollectingMetricsExpectation = expectation
211220
delegate.didCompleteExpectation = taskCompletionExpectation
@@ -225,6 +234,31 @@ final class URLSessionIntegrationTests: XCTestCase {
225234
}
226235
}
227236

237+
func testCustomCaptureSessionTasksWithNonTaskDelegate() throws {
238+
for taskTestCase in self.makeTaskWithoutCompletionClosureTestCases() {
239+
self.customSetUp(swizzle: false)
240+
241+
let expectation = self.expectation(description: "delegate callbacks are called")
242+
expectation.expectedFulfillmentCount = 1
243+
244+
let delegate = URLSessionCustomDelegate()
245+
delegate.didReceiveChallenge = expectation
246+
247+
let session = URLSession(
248+
instrumentedSessionWithConfiguration: .default,
249+
delegate: delegate
250+
)
251+
let task = try taskTestCase(session)
252+
253+
try self.runCompletedRequestTest(with: task, completionExpectation: nil)
254+
255+
XCTAssertEqual(.completed, XCTWaiter().wait(for: [expectation], timeout: 0.1))
256+
257+
session.invalidateAndCancel()
258+
self.customTearDown()
259+
}
260+
}
261+
228262
func testCustomDelegateWithoutAllMethods() throws {
229263
for taskTestCase in self.makeTaskWithoutCompletionClosureTestCases() {
230264
self.customSetUp(swizzle: false)
@@ -268,7 +302,7 @@ final class URLSessionIntegrationTests: XCTestCase {
268302
let expectation = self.expectation(description: "delegate callback is called")
269303
let taskCompletionExpectation = self.expectation(description: "task completed")
270304

271-
let delegate = URLSessionDelegate()
305+
let delegate = URLSessionCustomTaskDelegate()
272306
delegate.didFinishCollectingMetricsExpectation = expectation
273307
delegate.didCompleteExpectation = taskCompletionExpectation
274308

@@ -293,7 +327,7 @@ final class URLSessionIntegrationTests: XCTestCase {
293327
let expectation = self.expectation(description: "delegate callback is called")
294328
let taskCompletionExpectation = self.expectation(description: "task completed")
295329

296-
let delegate = URLSessionDelegate()
330+
let delegate = URLSessionCustomTaskDelegate()
297331
delegate.didFinishCollectingMetricsExpectation = expectation
298332
delegate.didCompleteExpectation = taskCompletionExpectation
299333

@@ -332,7 +366,7 @@ final class URLSessionIntegrationTests: XCTestCase {
332366
let expectation = self.expectation(description: "delegate callbacks are called")
333367
expectation.expectedFulfillmentCount = 2
334368

335-
let delegate = URLSessionDelegate()
369+
let delegate = URLSessionCustomTaskDelegate()
336370
delegate.didCreateTaskExpectation = expectation
337371
delegate.didFinishCollectingMetricsExpectation = expectation
338372

@@ -384,7 +418,7 @@ final class URLSessionIntegrationTests: XCTestCase {
384418
self.customSetUp(swizzle: true)
385419

386420
let expectation = self.expectation(description: "task completes")
387-
let delegate = URLSessionDelegate()
421+
let delegate = URLSessionCustomTaskDelegate()
388422
delegate.didCompleteExpectation = expectation
389423

390424
let task = try taskTestCase(.shared)
@@ -403,7 +437,7 @@ final class URLSessionIntegrationTests: XCTestCase {
403437
let session = URLSession(configuration: .default)
404438

405439
let expectation = self.expectation(description: "task completes")
406-
let delegate = URLSessionDelegate()
440+
let delegate = URLSessionCustomTaskDelegate()
407441
delegate.didCompleteExpectation = expectation
408442

409443
let task = try taskTestCase(session)
@@ -457,7 +491,7 @@ final class URLSessionIntegrationTests: XCTestCase {
457491
self.customSetUp(swizzle: true)
458492

459493
let expectation = self.expectation(description: "task did collect metrics")
460-
let delegate = URLSessionDelegate()
494+
let delegate = URLSessionCustomTaskDelegate()
461495
delegate.didFinishCollectingMetricsExpectation = expectation
462496

463497
let testCaseInput = try taskTestCase(.shared)
@@ -481,7 +515,7 @@ final class URLSessionIntegrationTests: XCTestCase {
481515
let session = URLSession(configuration: .default)
482516

483517
let expectation = self.expectation(description: "task did collect metrics")
484-
let delegate = URLSessionDelegate()
518+
let delegate = URLSessionCustomTaskDelegate()
485519
delegate.didFinishCollectingMetricsExpectation = expectation
486520

487521
let testCaseInput = try taskTestCase(session)

0 commit comments

Comments
 (0)