Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Sources/Http/HttpRequestManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ extension DefaultHttpRequestManager: HttpRequestManager {
}

public func complete(taskIdentifier: Int, error: HttpError?) {
if let request = requests.get(identifier: taskIdentifier) {
if let request = requests.take(identifier: taskIdentifier) {
request.complete(error: error)
}
}
Expand Down
37 changes: 37 additions & 0 deletions SplitTests/HttpClient/CertPinning/HttpRequestManagerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,43 @@ class HttpRequestManagerTests: XCTestCase, @unchecked Sendable {
XCTAssertTrue(ok)
}

func testCompleteRemovesRequestFromManager() {
let manager = DefaultHttpRequestManager(pinChecker: nil, notificationHandler: nil)
manager.addRequest(HttpRequestMock(identifier: 1))
XCTAssertTrue(manager.set(responseCode: 200, to: 1), "Manager should hold the request before completion")

manager.complete(taskIdentifier: 1, error: nil)

XCTAssertFalse(manager.set(responseCode: 200, to: 1), "Completed request must be removed from the manager")
}

func testCompletedRequestIsReleased() {
let manager = DefaultHttpRequestManager(pinChecker: nil, notificationHandler: nil)
weak var weakRequest: HttpRequestMock?

autoreleasepool {
let request = HttpRequestMock(identifier: 42)
weakRequest = request
manager.addRequest(request)
// Flush the async `set` barrier so the manager is definitely holding the request.
XCTAssertTrue(manager.set(responseCode: 200, to: 42))
manager.complete(taskIdentifier: 42, error: nil)
}

_ = manager.set(responseCode: 200, to: 42)

XCTAssertNil(weakRequest, "Manager must release the request after completion (memory leak guard)")
}

func testCompleteUnknownIdentifierIsNoOp() {
let manager = DefaultHttpRequestManager(pinChecker: nil, notificationHandler: nil)
manager.addRequest(HttpRequestMock(identifier: 1))

manager.complete(taskIdentifier: 999, error: nil)

XCTAssertTrue(manager.set(responseCode: 200, to: 1), "An unrelated request must remain tracked")
}

func createRequestManager() -> URLSessionTaskDelegate {
pinChecker = PinCheckerMock()
pinChecker.pinResults = CredentialValidationResult.allCases
Expand Down
3 changes: 3 additions & 0 deletions SplitTests/Streaming/SyncManagerTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,9 @@ class SyncManagerTest: XCTestCase {
default:
print("nones")
}

nHelper.removeAllObservers()
syncManager.stop()
}
}

Expand Down
Loading
Loading