From 44c8cd3ccf2bcd2e7cbaff1e3b6b697dddb6cdef Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Tue, 7 May 2024 14:24:54 -0400 Subject: [PATCH] * No longer pollPendingRequests when request fails prepareForExecution * Update MockOSDispatchQueue to use dispatch queue under the covers --- .../MockOSDispatchQueue.swift | 21 +++++++- .../Executors/OSLiveActivitiesExecutor.swift | 1 - .../Requests/OSRequestRemoveUpdateToken.swift | 2 +- .../OSLiveActivitiesExecutorTests.swift | 52 ++++++++++++++----- 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOSDispatchQueue.swift b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOSDispatchQueue.swift index a9dd899ef..b02525282 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOSDispatchQueue.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalCoreMocks/MockOSDispatchQueue.swift @@ -28,13 +28,30 @@ import OneSignalOSCore public class MockDispatchQueue: OSDispatchQueue { + let requestDispatch = DispatchQueue(label: "MockDispatchQueue") + var numDispatches = 0 + public init() {} public func async(execute work: @escaping @convention(block) () -> Void) { - work() + requestDispatch.async { + work() + self.numDispatches += 1 + } } public func asyncAfterTime(deadline: DispatchTime, execute work: @escaping @Sendable @convention(block) () -> Void) { - work() + requestDispatch.asyncAfterTime(deadline: deadline) { + work() + self.numDispatches += 1 + } + } + + public func waitForDispatches(_ numDispatches: Int) -> Void { + while self.numDispatches < numDispatches { + requestDispatch.sync { + Thread.sleep(forTimeInterval: TimeInterval(1)) + } + } } } diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift index c5c9011a9..ab4ece358 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Executors/OSLiveActivitiesExecutor.swift @@ -199,7 +199,6 @@ class OSLiveActivitiesExecutor: OSPushSubscriptionObserver { } if !request.prepareForExecution() { - self.pollPendingRequests() return } diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift index 8dbcdeae1..0f904dd59 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivities/Source/Requests/OSRequestRemoveUpdateToken.swift @@ -37,7 +37,7 @@ class OSRequestRemoveUpdateToken: OneSignalRequest, OSLiveActivityRequest, OSLiv func prepareForExecution() -> Bool { guard let appId = OneSignalConfigManager.getAppId() else { - OneSignalLog.onesignalLog(.LL_DEBUG, message: "Cannot generate the reemove update token request due to null app ID.") + OneSignalLog.onesignalLog(.LL_DEBUG, message: "Cannot generate the remove update token request due to null app ID.") return false } diff --git a/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/OSLiveActivitiesExecutorTests.swift b/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/OSLiveActivitiesExecutorTests.swift index be1a5c82d..795301a39 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/OSLiveActivitiesExecutorTests.swift +++ b/iOS_SDK/OneSignalSDK/OneSignalLiveActivitiesTests/OSLiveActivitiesExecutorTests.swift @@ -51,6 +51,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testAppendSetStartTokenWithSuccessfulRequest() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -61,8 +62,9 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request) + mockDispatchQueue.waitForDispatches(2) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 1) @@ -74,6 +76,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testRemoveStartTokenWithSuccessfulRequest() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -84,8 +87,9 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request) + mockDispatchQueue.waitForDispatches(2) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 0) @@ -95,6 +99,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testSetUpdateTokenWithSuccessfulRequest() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -105,8 +110,9 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request) + mockDispatchQueue.waitForDispatches(2) /* Then */ XCTAssertEqual(executor.updateTokens.items.count, 1) @@ -118,6 +124,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testRemoveUpdateTokenWithSuccessfulRequest() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -128,8 +135,9 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request) + mockDispatchQueue.waitForDispatches(2) /* Then */ XCTAssertEqual(executor.updateTokens.items.count, 0) @@ -139,12 +147,14 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testRequestWillNotExecuteWhenNoSubscription() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() let request = OSRequestSetStartToken(key: "my-activity-type", token: "my-token") /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request) + mockDispatchQueue.waitForDispatches(1) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 1) @@ -155,6 +165,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testRequestStaysInCacheForRetryableError() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -165,8 +176,9 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockFailureResponseForRequest(request: String(describing: request), error: NSError(domain: "not-important", code: 500)) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request) + mockDispatchQueue.waitForDispatches(1) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 1) @@ -178,6 +190,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testRequestRemovedFromCacheForNonRetryableError() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -188,8 +201,9 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockFailureResponseForRequest(request: String(describing: request), error: NSError(domain: "not-important", code: 401)) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request) + mockDispatchQueue.waitForDispatches(2) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 0) @@ -199,6 +213,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testSetStartRequestNotExecutedWithSameActivityTypeAndToken() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -211,9 +226,10 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request2), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request1) executor.append(request2) + mockDispatchQueue.waitForDispatches(3) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 1) @@ -224,6 +240,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testSetStartRequestNotExecutedWithSameActivityTypeAndDiffToken() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -236,9 +253,10 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request2), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request1) executor.append(request2) + mockDispatchQueue.waitForDispatches(3) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 1) @@ -250,6 +268,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testSetStartRequestFollowedByRemoveStartIsSuccessful() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -262,9 +281,10 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request2), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request1) executor.append(request2) + mockDispatchQueue.waitForDispatches(4) /* Then */ XCTAssertEqual(executor.startTokens.items.count, 0) @@ -275,6 +295,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testSetUpdateRequestNotExecutedWithSameActivityIdAndToken() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -287,9 +308,10 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request2), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request1) executor.append(request2) + mockDispatchQueue.waitForDispatches(3) /* Then */ XCTAssertEqual(executor.updateTokens.items.count, 1) @@ -300,6 +322,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testSetUpdateRequestNotExecutedWithSameActivityIdAndDiffToken() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -312,9 +335,10 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request2), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request1) executor.append(request2) + mockDispatchQueue.waitForDispatches(3) /* Then */ XCTAssertEqual(executor.updateTokens.items.count, 1) @@ -326,6 +350,7 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { func testSetUpdateRequestFollowedByRemoveUpdateIsSuccessful() throws { /* Setup */ + let mockDispatchQueue = MockDispatchQueue() let mockClient = MockOneSignalClient() OneSignalCoreImpl.setSharedClient(mockClient) OneSignalUserDefaults.initShared().saveString(forKey: OSUD_LEGACY_PLAYER_ID, withValue: "my-subscription-id") @@ -338,9 +363,10 @@ final class OSLiveActivitiesExecutorTests: XCTestCase { mockClient.setMockResponseForRequest(request: String(describing: request2), response: [String: Any]()) /* When */ - let executor = OSLiveActivitiesExecutor(requestDispatch: MockDispatchQueue()) + let executor = OSLiveActivitiesExecutor(requestDispatch: mockDispatchQueue) executor.append(request1) executor.append(request2) + mockDispatchQueue.waitForDispatches(4) /* Then */ XCTAssertEqual(executor.updateTokens.items.count, 0)