浏览代码

Fix tests and temporarily mark main actor

onevcat 1 年之前
父节点
当前提交
50b54c7623

+ 1 - 1
Sources/Extensions/CPListItem+Kingfisher.swift

@@ -178,7 +178,7 @@ extension KingfisherWrapper where Base: CPListItem {
             },
             },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier },
             completionHandler: { result in
             completionHandler: { result in
-                CallbackQueue.mainCurrentOrAsync.execute {
+                CallbackQueue.mainCurrentOrAsync.execute { @MainActor in
                     guard issuedIdentifier == self.taskIdentifier else {
                     guard issuedIdentifier == self.taskIdentifier else {
                         let reason: KingfisherError.ImageSettingErrorReason
                         let reason: KingfisherError.ImageSettingErrorReason
                         do {
                         do {

+ 1 - 1
Sources/Extensions/ImageView+Kingfisher.swift

@@ -324,7 +324,7 @@ extension KingfisherWrapper where Base: KFCrossPlatformImageView {
             progressiveImageSetter: { self.base.image = $0 },
             progressiveImageSetter: { self.base.image = $0 },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier },
             completionHandler: { result in
             completionHandler: { result in
-                CallbackQueue.mainCurrentOrAsync.execute {
+                CallbackQueue.mainCurrentOrAsync.execute { @MainActor in
                     maybeIndicator?.stopAnimatingView()
                     maybeIndicator?.stopAnimatingView()
                     guard issuedIdentifier == self.taskIdentifier else {
                     guard issuedIdentifier == self.taskIdentifier else {
                         let reason: KingfisherError.ImageSettingErrorReason
                         let reason: KingfisherError.ImageSettingErrorReason

+ 1 - 1
Sources/Extensions/NSTextAttachment+Kingfisher.swift

@@ -195,7 +195,7 @@ extension KingfisherWrapper where Base: NSTextAttachment {
             progressiveImageSetter: { self.base.image = $0 },
             progressiveImageSetter: { self.base.image = $0 },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier },
             completionHandler: { result in
             completionHandler: { result in
-                CallbackQueue.mainCurrentOrAsync.execute {
+                CallbackQueue.mainCurrentOrAsync.execute { @MainActor in
                     guard issuedIdentifier == self.taskIdentifier else {
                     guard issuedIdentifier == self.taskIdentifier else {
                         let reason: KingfisherError.ImageSettingErrorReason
                         let reason: KingfisherError.ImageSettingErrorReason
                         do {
                         do {

+ 2 - 2
Sources/Extensions/UIButton+Kingfisher.swift

@@ -141,7 +141,7 @@ extension KingfisherWrapper where Base: UIButton {
             progressiveImageSetter: { self.base.setImage($0, for: state) },
             progressiveImageSetter: { self.base.setImage($0, for: state) },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier(for: state) },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.taskIdentifier(for: state) },
             completionHandler: { result in
             completionHandler: { result in
-                CallbackQueue.mainCurrentOrAsync.execute {
+                CallbackQueue.mainCurrentOrAsync.execute { @MainActor in
                     guard issuedIdentifier == self.taskIdentifier(for: state) else {
                     guard issuedIdentifier == self.taskIdentifier(for: state) else {
                         let reason: KingfisherError.ImageSettingErrorReason
                         let reason: KingfisherError.ImageSettingErrorReason
                         do {
                         do {
@@ -294,7 +294,7 @@ extension KingfisherWrapper where Base: UIButton {
             progressiveImageSetter: { self.base.setBackgroundImage($0, for: state) },
             progressiveImageSetter: { self.base.setBackgroundImage($0, for: state) },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.backgroundTaskIdentifier(for: state) },
             referenceTaskIdentifierChecker: { issuedIdentifier == self.backgroundTaskIdentifier(for: state) },
             completionHandler: { result in
             completionHandler: { result in
-                CallbackQueue.mainCurrentOrAsync.execute {
+                CallbackQueue.mainCurrentOrAsync.execute { @MainActor in
                     guard issuedIdentifier == self.backgroundTaskIdentifier(for: state) else {
                     guard issuedIdentifier == self.backgroundTaskIdentifier(for: state) else {
                         let reason: KingfisherError.ImageSettingErrorReason
                         let reason: KingfisherError.ImageSettingErrorReason
                         do {
                         do {

+ 23 - 18
Sources/General/KingfisherManager.swift

@@ -235,7 +235,7 @@ public class KingfisherManager: @unchecked Sendable {
         options: KingfisherOptionsInfo? = nil,
         options: KingfisherOptionsInfo? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         downloadTaskUpdated: DownloadTaskUpdatedBlock? = nil,
         downloadTaskUpdated: DownloadTaskUpdatedBlock? = nil,
-        completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
+        completionHandler: (@Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
     {
     {
         let options = currentDefaultOptions + (options ?? .empty)
         let options = currentDefaultOptions + (options ?? .empty)
         let info = KingfisherParsedOptionsInfo(options)
         let info = KingfisherParsedOptionsInfo(options)
@@ -252,7 +252,7 @@ public class KingfisherManager: @unchecked Sendable {
         options: KingfisherParsedOptionsInfo,
         options: KingfisherParsedOptionsInfo,
         progressBlock: DownloadProgressBlock? = nil,
         progressBlock: DownloadProgressBlock? = nil,
         downloadTaskUpdated: DownloadTaskUpdatedBlock? = nil,
         downloadTaskUpdated: DownloadTaskUpdatedBlock? = nil,
-        completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
+        completionHandler: (@Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
     {
     {
         var info = options
         var info = options
         if let block = progressBlock {
         if let block = progressBlock {
@@ -272,9 +272,11 @@ public class KingfisherManager: @unchecked Sendable {
         downloadTaskUpdated: DownloadTaskUpdatedBlock? = nil,
         downloadTaskUpdated: DownloadTaskUpdatedBlock? = nil,
         progressiveImageSetter: ((KFCrossPlatformImage?) -> Void)? = nil,
         progressiveImageSetter: ((KFCrossPlatformImage?) -> Void)? = nil,
         referenceTaskIdentifierChecker: (() -> Bool)? = nil,
         referenceTaskIdentifierChecker: (() -> Bool)? = nil,
-        completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
+        completionHandler: (@Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
     {
     {
         var options = options
         var options = options
+        let retryStrategy = options.retryStrategy
+        
         if let provider = ImageProgressiveProvider(options: options, refresh: { image in
         if let provider = ImageProgressiveProvider(options: options, refresh: { image in
             guard let setter = progressiveImageSetter else {
             guard let setter = progressiveImageSetter else {
                 return
                 return
@@ -300,17 +302,18 @@ public class KingfisherManager: @unchecked Sendable {
         let retrievingContext = RetrievingContext(options: options, originalSource: source)
         let retrievingContext = RetrievingContext(options: options, originalSource: source)
         var retryContext: RetryContext?
         var retryContext: RetryContext?
 
 
-        func startNewRetrieveTask(
+        @Sendable func startNewRetrieveTask(
             with source: Source,
             with source: Source,
+            retryContext: RetryContext?,
             downloadTaskUpdated: DownloadTaskUpdatedBlock?
             downloadTaskUpdated: DownloadTaskUpdatedBlock?
         ) {
         ) {
             let newTask = self.retrieveImage(with: source, context: retrievingContext) { result in
             let newTask = self.retrieveImage(with: source, context: retrievingContext) { result in
-                handler(currentSource: source, result: result)
+                handler(currentSource: source, retryContext: retryContext, result: result)
             }
             }
             downloadTaskUpdated?(newTask)
             downloadTaskUpdated?(newTask)
         }
         }
 
 
-        func failCurrentSource(_ source: Source, with error: KingfisherError) {
+        @Sendable func failCurrentSource(_ source: Source, retryContext: RetryContext?, with error: KingfisherError) {
             // Skip alternative sources if the user cancelled it.
             // Skip alternative sources if the user cancelled it.
             guard !error.isTaskCancelled else {
             guard !error.isTaskCancelled else {
                 completionHandler?(.failure(error))
                 completionHandler?(.failure(error))
@@ -320,7 +323,7 @@ public class KingfisherManager: @unchecked Sendable {
             guard !error.isLowDataModeConstrained else {
             guard !error.isLowDataModeConstrained else {
                 if let source = retrievingContext.options.lowDataModeSource {
                 if let source = retrievingContext.options.lowDataModeSource {
                     retrievingContext.options.lowDataModeSource = nil
                     retrievingContext.options.lowDataModeSource = nil
-                    startNewRetrieveTask(with: source, downloadTaskUpdated: downloadTaskUpdated)
+                    startNewRetrieveTask(with: source, retryContext: retryContext, downloadTaskUpdated: downloadTaskUpdated)
                 } else {
                 } else {
                     // This should not happen.
                     // This should not happen.
                     completionHandler?(.failure(error))
                     completionHandler?(.failure(error))
@@ -329,7 +332,7 @@ public class KingfisherManager: @unchecked Sendable {
             }
             }
             if let nextSource = retrievingContext.popAlternativeSource() {
             if let nextSource = retrievingContext.popAlternativeSource() {
                 retrievingContext.appendError(error, to: source)
                 retrievingContext.appendError(error, to: source)
-                startNewRetrieveTask(with: nextSource, downloadTaskUpdated: downloadTaskUpdated)
+                startNewRetrieveTask(with: nextSource, retryContext: retryContext, downloadTaskUpdated: downloadTaskUpdated)
             } else {
             } else {
                 // No other alternative source. Finish with error.
                 // No other alternative source. Finish with error.
                 if retrievingContext.propagationErrors.isEmpty {
                 if retrievingContext.propagationErrors.isEmpty {
@@ -344,26 +347,28 @@ public class KingfisherManager: @unchecked Sendable {
             }
             }
         }
         }
 
 
-        func handler(currentSource: Source, result: (Result<RetrieveImageResult, KingfisherError>)) -> Void {
+        @Sendable func handler(
+            currentSource: Source,
+            retryContext: RetryContext?,
+            result: (Result<RetrieveImageResult, KingfisherError>)
+        ) -> Void {
             switch result {
             switch result {
             case .success:
             case .success:
                 completionHandler?(result)
                 completionHandler?(result)
             case .failure(let error):
             case .failure(let error):
-                if let retryStrategy = options.retryStrategy {
+                if let retryStrategy = retryStrategy {
                     let context = retryContext?.increaseRetryCount() ?? RetryContext(source: source, error: error)
                     let context = retryContext?.increaseRetryCount() ?? RetryContext(source: source, error: error)
-                    retryContext = context
-
                     retryStrategy.retry(context: context) { decision in
                     retryStrategy.retry(context: context) { decision in
                         switch decision {
                         switch decision {
                         case .retry(let userInfo):
                         case .retry(let userInfo):
                             context.userInfo = userInfo
                             context.userInfo = userInfo
-                            startNewRetrieveTask(with: source, downloadTaskUpdated: downloadTaskUpdated)
+                            startNewRetrieveTask(with: source, retryContext: context, downloadTaskUpdated: downloadTaskUpdated)
                         case .stop:
                         case .stop:
-                            failCurrentSource(currentSource, with: error)
+                            failCurrentSource(currentSource, retryContext: context, with: error)
                         }
                         }
                     }
                     }
                 } else {
                 } else {
-                    failCurrentSource(currentSource, with: error)
+                    failCurrentSource(currentSource, retryContext: retryContext, with: error)
                 }
                 }
             }
             }
         }
         }
@@ -373,7 +378,7 @@ public class KingfisherManager: @unchecked Sendable {
             context: retrievingContext)
             context: retrievingContext)
         {
         {
             result in
             result in
-            handler(currentSource: source, result: result)
+            handler(currentSource: source, retryContext: nil, result: result)
         }
         }
 
 
     }
     }
@@ -381,7 +386,7 @@ public class KingfisherManager: @unchecked Sendable {
     private func retrieveImage(
     private func retrieveImage(
         with source: Source,
         with source: Source,
         context: RetrievingContext,
         context: RetrievingContext,
-        completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
+        completionHandler: (@Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> DownloadTask?
     {
     {
         let options = context.options
         let options = context.options
         if options.forceRefresh {
         if options.forceRefresh {
@@ -579,7 +584,7 @@ public class KingfisherManager: @unchecked Sendable {
     func retrieveImageFromCache(
     func retrieveImageFromCache(
         source: Source,
         source: Source,
         context: RetrievingContext,
         context: RetrievingContext,
-        completionHandler: ((Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> Bool
+        completionHandler: (@Sendable (Result<RetrieveImageResult, KingfisherError>) -> Void)?) -> Bool
     {
     {
         let options = context.options
         let options = context.options
         // 1. Check whether the image was already in target cache. If so, just get it.
         // 1. Check whether the image was already in target cache. If so, just get it.

+ 98 - 67
Tests/KingfisherTests/KingfisherManagerTests.swift

@@ -463,11 +463,13 @@ class KingfisherManagerTests: XCTestCase {
     
     
     func testFailingProcessOnDataProviderImage() {
     func testFailingProcessOnDataProviderImage() {
         let provider = SimpleImageDataProvider(cacheKey: "key") { .success(testImageData) }
         let provider = SimpleImageDataProvider(cacheKey: "key") { .success(testImageData) }
-        var called = false
+        let called = ActorBox(false)
         let p = FailingProcessor()
         let p = FailingProcessor()
         let options = [KingfisherOptionsInfoItem.processor(p), .processingQueue(.mainCurrentOrAsync)]
         let options = [KingfisherOptionsInfoItem.processor(p), .processingQueue(.mainCurrentOrAsync)]
         _ = manager.retrieveImage(with: .provider(provider), options: options) { result in
         _ = manager.retrieveImage(with: .provider(provider), options: options) { result in
-            called = true
+            Task {
+                await called.setValue(true)
+            }
             XCTAssertNotNil(result.error)
             XCTAssertNotNil(result.error)
             if case .processorError(reason: .processingFailed(let processor, _)) = result.error! {
             if case .processorError(reason: .processingFailed(let processor, _)) = result.error! {
                 XCTAssertEqual(processor.identifier, p.identifier)
                 XCTAssertEqual(processor.identifier, p.identifier)
@@ -475,7 +477,10 @@ class KingfisherManagerTests: XCTestCase {
                 XCTFail()
                 XCTFail()
             }
             }
         }
         }
-        XCTAssertTrue(called)
+        Task {
+            let result = await called.value
+            XCTAssertTrue(result)
+        }
     }
     }
     
     
     func testCacheOriginalImageWithOriginalCache() {
     func testCacheOriginalImageWithOriginalCache() {
@@ -587,7 +592,7 @@ class KingfisherManagerTests: XCTestCase {
         let options1: KingfisherOptionsInfo = [.processor(p1), .cacheSerializer(s), .waitForCache]
         let options1: KingfisherOptionsInfo = [.processor(p1), .cacheSerializer(s), .waitForCache]
         let source = Source.network(url)
         let source = Source.network(url)
         
         
-        manager.retrieveImage(with: source, options: options1) { result in
+        manager.retrieveImage(with: source, options: options1) { [s] result in
             XCTAssertTrue(p1.processed)
             XCTAssertTrue(p1.processed)
             
             
             let p2 = SimpleProcessor()
             let p2 = SimpleProcessor()
@@ -787,86 +792,106 @@ class KingfisherManagerTests: XCTestCase {
         waitForExpectations(timeout: 3, handler: nil)
         waitForExpectations(timeout: 3, handler: nil)
     }
     }
 
 
-//    func testShouldApplyImageModifierWhenLoadFromDiskCache() {
-//        let exp = expectation(description: #function)
-//        let url = testURLs[0]
-//        stub(url, data: testImageData)
-//
-//        var modifierCalled = false
-//        let modifier = AnyImageModifier { image in
-//            modifierCalled = true
-//            return image.withRenderingMode(.alwaysTemplate)
-//        }
-//
-//        manager.cache.store(testImage, forKey: url.cacheKey) { _ in
-//            self.manager.cache.clearMemoryCache()
-//            self.manager.retrieveImage(with: url, options: [.imageModifier(modifier)]) { result in
-//                XCTAssertTrue(modifierCalled)
-//                XCTAssertEqual(result.value!.cacheType, .disk)
-//                XCTAssertEqual(result.value!.image.renderingMode, .alwaysTemplate)
-//                exp.fulfill()
-//            }
-//        }
-//        waitForExpectations(timeout: 3, handler: nil)
-//    }
-
-//    func testImageModifierResultShouldNotBeCached() {
-//        let exp = expectation(description: #function)
-//        let url = testURLs[0]
-//        stub(url, data: testImageData)
-//
-//        var modifierCalled = false
-//        let modifier = AnyImageModifier { image in
-//            modifierCalled = true
-//            return image.withRenderingMode(.alwaysTemplate)
-//        }
-//        manager.retrieveImage(with: url, options: [.imageModifier(modifier)]) { result in
-//            XCTAssertTrue(modifierCalled)
-//            XCTAssertEqual(result.value?.image.renderingMode, .alwaysTemplate)
-//
-//            let memoryCached = self.manager.cache.retrieveImageInMemoryCache(forKey: url.absoluteString)
-//            XCTAssertNotNil(memoryCached)
-//            XCTAssertEqual(memoryCached?.renderingMode, .automatic)
-//
-//            self.manager.cache.retrieveImageInDiskCache(forKey: url.absoluteString) { result in
-//                XCTAssertNotNil(result.value!)
-//                XCTAssertEqual(result.value??.renderingMode, .automatic)
-//
-//                exp.fulfill()
-//            }
-//        }
-//        
-//        waitForExpectations(timeout: 3, handler: nil)
-//    }
+    func testShouldApplyImageModifierWhenLoadFromDiskCache() {
+        let exp = expectation(description: #function)
+        let url = testURLs[0]
+        stub(url, data: testImageData)
+
+        let modifierCalled = ActorBox(false)
+        let modifier = AnyImageModifier { image in
+            Task {
+                await modifierCalled.setValue(true)
+            }
+            return image.withRenderingMode(.alwaysTemplate)
+        }
+
+        manager.cache.store(testImage, forKey: url.cacheKey) { _ in
+            self.manager.cache.clearMemoryCache()
+            self.manager.retrieveImage(with: url, options: [.imageModifier(modifier)]) { result in
+                XCTAssertEqual(result.value!.cacheType, .disk)
+                XCTAssertEqual(result.value!.image.renderingMode, .alwaysTemplate)
+                Task {
+                    let result = await modifierCalled.value
+                    XCTAssertTrue(result)
+                }
+                exp.fulfill()
+            }
+        }
+        waitForExpectations(timeout: 3, handler: nil)
+    }
+
+    func testImageModifierResultShouldNotBeCached() {
+        let exp = expectation(description: #function)
+        let url = testURLs[0]
+        stub(url, data: testImageData)
+
+        let modifierCalled = ActorBox(false)
+        let modifier = AnyImageModifier { image in
+            Task {
+                await modifierCalled.setValue(true)
+            }
+            return image.withRenderingMode(.alwaysTemplate)
+        }
+        manager.retrieveImage(with: url, options: [.imageModifier(modifier)]) { result in
+            XCTAssertEqual(result.value?.image.renderingMode, .alwaysTemplate)
+
+            let memoryCached = self.manager.cache.retrieveImageInMemoryCache(forKey: url.absoluteString)
+            XCTAssertNotNil(memoryCached)
+            XCTAssertEqual(memoryCached?.renderingMode, .automatic)
+
+            self.manager.cache.retrieveImageInDiskCache(forKey: url.absoluteString) { result in
+                XCTAssertNotNil(result.value!)
+                XCTAssertEqual(result.value??.renderingMode, .automatic)
+
+                Task {
+                    let result = await modifierCalled.value
+                    XCTAssertTrue(result)
+                    exp.fulfill()
+                }
+            }
+        }
+        
+        waitForExpectations(timeout: 3, handler: nil)
+    }
 
 
 #endif
 #endif
     
     
     func testRetrieveWithImageProvider() {
     func testRetrieveWithImageProvider() {
         let provider = SimpleImageDataProvider(cacheKey: "key") { .success(testImageData) }
         let provider = SimpleImageDataProvider(cacheKey: "key") { .success(testImageData) }
-        var called = false
+        let called = ActorBox(false)
         manager.defaultOptions = .empty
         manager.defaultOptions = .empty
         _ = manager.retrieveImage(with: .provider(provider), options: [.processingQueue(.mainCurrentOrAsync)]) {
         _ = manager.retrieveImage(with: .provider(provider), options: [.processingQueue(.mainCurrentOrAsync)]) {
             result in
             result in
-            called = true
             XCTAssertNotNil(result.value)
             XCTAssertNotNil(result.value)
             XCTAssertTrue(result.value!.image.renderEqual(to: testImage))
             XCTAssertTrue(result.value!.image.renderEqual(to: testImage))
+            Task {
+                await called.setValue(true)
+            }
+        }
+        Task {
+            let result = await called.value
+            XCTAssertTrue(result)
         }
         }
-        XCTAssertTrue(called)
     }
     }
     
     
     func testRetrieveWithImageProviderFail() {
     func testRetrieveWithImageProviderFail() {
         let provider = SimpleImageDataProvider(cacheKey: "key") { .failure(SimpleImageDataProvider.E()) }
         let provider = SimpleImageDataProvider(cacheKey: "key") { .failure(SimpleImageDataProvider.E()) }
-        var called = false
+        let called = ActorBox(false)
         _ = manager.retrieveImage(with: .provider(provider)) { result in
         _ = manager.retrieveImage(with: .provider(provider)) { result in
-            called = true
             XCTAssertNotNil(result.error)
             XCTAssertNotNil(result.error)
             if case .imageSettingError(reason: .dataProviderError(_, let error)) = result.error! {
             if case .imageSettingError(reason: .dataProviderError(_, let error)) = result.error! {
                 XCTAssertTrue(error is SimpleImageDataProvider.E)
                 XCTAssertTrue(error is SimpleImageDataProvider.E)
             } else {
             } else {
                 XCTFail()
                 XCTFail()
             }
             }
+            Task {
+                await called.setValue(true)
+            }
+        }
+        Task {
+            let result = await called.value
+            XCTAssertTrue(result)
         }
         }
-        XCTAssertTrue(called)
     }
     }
 
 
     func testContextRemovingAlternativeSource() {
     func testContextRemovingAlternativeSource() {
@@ -970,18 +995,24 @@ class KingfisherManagerTests: XCTestCase {
         let brokenURL = URL(string: "brokenurl")!
         let brokenURL = URL(string: "brokenurl")!
         stub(brokenURL, data: Data())
         stub(brokenURL, data: Data())
 
 
-        var downloadTaskUpdatedCount = 0
+        let downloadTaskUpdatedCount = ActorBox(0)
         let task = manager.retrieveImage(
         let task = manager.retrieveImage(
           with: .network(brokenURL),
           with: .network(brokenURL),
           options: [.alternativeSources([.network(url)])],
           options: [.alternativeSources([.network(url)])],
           downloadTaskUpdated: { newTask in
           downloadTaskUpdated: { newTask in
-            downloadTaskUpdatedCount += 1
-            XCTAssertEqual(newTask?.sessionTask?.task.currentRequest?.url, url)
+              Task {
+                  let value = await downloadTaskUpdatedCount.value + 1
+                  await downloadTaskUpdatedCount.setValue(value)
+              }
+              XCTAssertEqual(newTask?.sessionTask?.task.currentRequest?.url, url)
           })
           })
-          {
+        {
             result in
             result in
-            XCTAssertEqual(downloadTaskUpdatedCount, 1)
-            exp.fulfill()
+            Task {
+                let result = await downloadTaskUpdatedCount.value
+                XCTAssertEqual(result, 1)
+                exp.fulfill()
+            }
         }
         }
 
 
         XCTAssertEqual(task?.sessionTask?.task.currentRequest?.url, brokenURL)
         XCTAssertEqual(task?.sessionTask?.task.currentRequest?.url, brokenURL)