diff --git a/Split/Api/DefaultSplitClient.swift b/Split/Api/DefaultSplitClient.swift index bbf3aa8a7..fe328c932 100644 --- a/Split/Api/DefaultSplitClient.swift +++ b/Split/Api/DefaultSplitClient.swift @@ -89,14 +89,23 @@ extension DefaultSplitClient { on(event: event, executeTask: task) } - private func on(event: SplitEvent, executeTask task: SplitEventTask) { - if event != .sdkReadyFromCache, - eventsManager.eventAlreadyTriggered(event: event) { - Logger.w("A handler was added for \(event.toString()) on the SDK, " + - "which has already fired and won’t be emitted again. The callback won’t be executed.") + private func onWithMetadata(event: SplitEventWithMetadata, runInBackground: Bool, queue: DispatchQueue?, execute actionWithMetadata: @escaping SplitActionWithMetadata) { + guard let factory = clientManager?.splitFactory else { return } + let task = SplitEventActionTask(action: actionWithMetadata, event: event.type, runInBackground: runInBackground, factory: factory, queue: queue) + on(event: event.type, executeTask: task) + } + + public func on(event: SplitEvent, executeWithMetadata action: SplitActionWithMetadata?) { + guard let action = action else { return } + onWithMetadata(event: SplitEventWithMetadata(type: event, metadata: nil), runInBackground: true, queue: nil, execute: action) + } + + private func on(event: SplitEvent, executeTask task: SplitEventActionTask) { + if event != .sdkReadyFromCache, eventsManager.eventAlreadyTriggered(event: event) { + Logger.w("A handler was added for \(event.toString()) on the SDK, which has already fired and won’t be emitted again. The callback won’t be executed.") return } - eventsManager.register(event: event, task: task) + eventsManager.register(event: SplitEventWithMetadata(type: event, metadata: nil), task: task) } } diff --git a/Split/Api/FailHelpers.swift b/Split/Api/FailHelpers.swift index 6f90ba7b7..fc6eae22c 100644 --- a/Split/Api/FailHelpers.swift +++ b/Split/Api/FailHelpers.swift @@ -64,6 +64,8 @@ class FailedClient: SplitClient { func on(event: SplitEvent, queue: DispatchQueue, execute action: @escaping SplitAction) { } + + func on(event: SplitEvent, executeWithMetadata: @escaping SplitActionWithMetadata) {} func track(trafficType: String, eventType: String) -> Bool { return false diff --git a/Split/Api/LocalhostSplitClient.swift b/Split/Api/LocalhostSplitClient.swift index 2aaacca6b..a2a3f6f6c 100644 --- a/Split/Api/LocalhostSplitClient.swift +++ b/Split/Api/LocalhostSplitClient.swift @@ -121,25 +121,43 @@ public final class LocalhostSplitClient: NSObject, SplitClient { return results } - public func on(event: SplitEvent, runInBackground: Bool, - execute action: @escaping SplitAction) { + public func on(event: SplitEvent, execute action: @escaping SplitAction) { + on(event: event, runInBackground: false, queue: nil, execute: action) + } + + public func on(event: SplitEvent, executeWithMetadata: @escaping SplitActionWithMetadata) { + on(eventWithMetadata: SplitEventWithMetadata(type: event, metadata: nil), runInBackground: false, queue: nil, execute: executeWithMetadata) + } + + public func on(event: SplitEvent, runInBackground: Bool, execute action: @escaping SplitAction) { on(event: event, runInBackground: runInBackground, queue: nil, execute: action) } + + private func on(event: SplitEvent, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitAction) { + on(eventWithMetadata: SplitEventWithMetadata(type: event, metadata: nil), runInBackground: runInBackground, queue: queue, execute: action) + } public func on(event: SplitEvent, queue: DispatchQueue, execute action: @escaping SplitAction) { on(event: event, runInBackground: true, queue: queue, execute: action) } - public func on(event: SplitEvent, execute action: @escaping SplitAction) { - on(event: event, runInBackground: false, queue: nil, execute: action) + private func on(eventWithMetadata event: SplitEventWithMetadata, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitAction) { + + guard let factory = clientManger?.splitFactory else { return } + if let eventsManager = self.eventsManager { + let task = SplitEventActionTask(action: action, event: event.type, + runInBackground: runInBackground, + factory: factory, + queue: queue) + eventsManager.register(event: event, task: task) + } } - private func on(event: SplitEvent, runInBackground: Bool, - queue: DispatchQueue?, execute action: @escaping SplitAction) { + private func on(eventWithMetadata event: SplitEventWithMetadata, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitActionWithMetadata) { guard let factory = clientManger?.splitFactory else { return } if let eventsManager = self.eventsManager { - let task = SplitEventActionTask(action: action, event: event, + let task = SplitEventActionTask(action: action, event: event.type, runInBackground: runInBackground, factory: factory, queue: queue) diff --git a/Split/Api/SplitClient.swift b/Split/Api/SplitClient.swift index ff4df2005..3aff37add 100644 --- a/Split/Api/SplitClient.swift +++ b/Split/Api/SplitClient.swift @@ -8,8 +8,6 @@ import Foundation -public typealias SplitAction = () -> Void - @objc public protocol SplitClient { // MARK: Evaluation feature @@ -34,6 +32,7 @@ public typealias SplitAction = () -> Void func getTreatmentsWithConfig(splits: [String], attributes: [String: Any]?, evaluationOptions: EvaluationOptions?) -> [String: SplitResult] func on(event: SplitEvent, execute action: @escaping SplitAction) + func on(event: SplitEvent, executeWithMetadata: @escaping SplitActionWithMetadata) -> Void func on(event: SplitEvent, runInBackground: Bool, execute action: @escaping SplitAction) func on(event: SplitEvent, queue: DispatchQueue, execute action: @escaping SplitAction) diff --git a/Split/Common/Structs/BlockingQueue.swift b/Split/Common/Structs/BlockingQueue.swift index 8fd45f67f..c02bf5b71 100644 --- a/Split/Common/Structs/BlockingQueue.swift +++ b/Split/Common/Structs/BlockingQueue.swift @@ -73,19 +73,23 @@ class GenericBlockingQueue { // Protocol to allow mocking protocol InternalEventBlockingQueue { - func add(_ item: SplitInternalEvent) - func take() throws -> SplitInternalEvent + func add(_ item: SplitInternalEventWithMetadata) + func take() throws -> SplitInternalEventWithMetadata func stop() } class DefaultInternalEventBlockingQueue: InternalEventBlockingQueue { - let blockingQueue = GenericBlockingQueue() + let blockingQueue = GenericBlockingQueue() func add(_ item: SplitInternalEvent) { + blockingQueue.add(SplitInternalEventWithMetadata(item)) + } + + func add(_ item: SplitInternalEventWithMetadata) { blockingQueue.add(item) } - func take() throws -> SplitInternalEvent { - let value = try blockingQueue.take() + func take() throws -> SplitInternalEventWithMetadata { + let value = try blockingQueue.take() return value } diff --git a/Split/Events/EventsManagerCoordinator.swift b/Split/Events/EventsManagerCoordinator.swift index 3ddf4fe93..44f910596 100644 --- a/Split/Events/EventsManagerCoordinator.swift +++ b/Split/Events/EventsManagerCoordinator.swift @@ -25,6 +25,10 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator { ) func notifyInternalEvent(_ event: SplitInternalEvent) { + notifyInternalEvent(event, metadata: nil) + } + + func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata? = nil) { if !eventsToHandle.contains(event) { return } @@ -33,7 +37,7 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator { self.triggered.insert(event) self.managers.forEach { _, manager in - manager.notifyInternalEvent(event) + manager.notifyInternalEvent(event, metadata: metadata) } } } @@ -76,5 +80,6 @@ class MainSplitEventsManager: SplitEventsManagerCoordinator { } } - func register(event: SplitEvent, task: SplitEventTask) {} + func register(event: SplitEvent, task: SplitEventActionTask) {} + func register(event: SplitEventWithMetadata, task: SplitEventActionTask) {} } diff --git a/Split/Events/SplitEventActionTask.swift b/Split/Events/SplitEventActionTask.swift index be1368d04..906f027bb 100644 --- a/Split/Events/SplitEventActionTask.swift +++ b/Split/Events/SplitEventActionTask.swift @@ -1,16 +1,17 @@ -// -// SplitEventActionTask.swift -// Split -// // Created by Javier L. Avrudsky on 7/6/18. -// import Foundation +public typealias SplitAction = () -> Void +public typealias SplitActionWithMetadata = (_ metadata: EventMetadata?) -> Void + class SplitEventActionTask: SplitEventTask { + // Private private var eventHandler: SplitAction? + private var eventHandlerWithMetadata: SplitActionWithMetadata? private var queue: DispatchQueue? + var event: SplitEvent var runInBackground: Bool = false var factory: SplitFactory @@ -27,13 +28,25 @@ class SplitEventActionTask: SplitEventTask { self.queue = queue self.factory = factory } + + init(action: @escaping SplitActionWithMetadata, event: SplitEvent, runInBackground: Bool = false, factory: SplitFactory, queue: DispatchQueue? = nil) { + self.eventHandlerWithMetadata = action + self.event = event + self.runInBackground = runInBackground + self.queue = queue + self.factory = factory + } func takeQueue() -> DispatchQueue? { defer { queue = nil } return queue } - - func run() { + + func run(_ metadata: EventMetadata?) { eventHandler?() + + if let metadata = metadata { + eventHandlerWithMetadata?(metadata) + } } } diff --git a/Split/Events/SplitEventTask.swift b/Split/Events/SplitEventTask.swift index 1655e2b25..147bc8441 100644 --- a/Split/Events/SplitEventTask.swift +++ b/Split/Events/SplitEventTask.swift @@ -11,5 +11,5 @@ protocol SplitEventTask { var event: SplitEvent { get } var runInBackground: Bool { get } func takeQueue() -> DispatchQueue? - func run() + func run(_ metadata: EventMetadata?) } diff --git a/Split/Events/SplitEventsManager.swift b/Split/Events/SplitEventsManager.swift index ea64d0279..d55a9df0d 100644 --- a/Split/Events/SplitEventsManager.swift +++ b/Split/Events/SplitEventsManager.swift @@ -9,8 +9,10 @@ import Foundation protocol SplitEventsManager: AnyObject { - func register(event: SplitEvent, task: SplitEventTask) + func register(event: SplitEvent, task: SplitEventActionTask) + func register(event: SplitEventWithMetadata, task: SplitEventActionTask) func notifyInternalEvent(_ event: SplitInternalEvent) + func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata?) func start() func stop() func eventAlreadyTriggered(event: SplitEvent) -> Bool @@ -23,7 +25,7 @@ class DefaultSplitEventsManager: SplitEventsManager { private var subscriptions = [SplitEvent: [SplitEventTask]]() private var executionTimes: [String: Int] - private var triggered: [SplitInternalEvent] + private var triggered: [SplitInternalEventWithMetadata] private let processQueue: DispatchQueue private let dataAccessQueue: DispatchQueue private var isStarted: Bool @@ -35,7 +37,7 @@ class DefaultSplitEventsManager: SplitEventsManager { self.isStarted = false self.sdkReadyTimeStart = Date().unixTimestampInMiliseconds() self.readingRefreshTime = 300 - self.triggered = [SplitInternalEvent]() + self.triggered = [SplitInternalEventWithMetadata]() self.eventsQueue = DefaultInternalEventBlockingQueue() self.executionTimes = [String: Int]() registerMaxAllowedExecutionTimesPerEvent() @@ -48,18 +50,24 @@ class DefaultSplitEventsManager: SplitEventsManager { } } } + + func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata? = nil) { + let event = SplitInternalEventWithMetadata(event, metadata: metadata) - func notifyInternalEvent(_ event: SplitInternalEvent) { processQueue.async { [weak self] in if let self = self { - Logger.v("Event \(event) notified") self.eventsQueue.add(event) } } } - func register(event: SplitEvent, task: SplitEventTask) { - let eventName = event.toString() + // Method kept for backwards compatibility. Allows notifying an event without metadata. + func notifyInternalEvent(_ event: SplitInternalEvent) { + notifyInternalEvent(event, metadata: nil) + } + + func register(event: SplitEventWithMetadata, task: SplitEventActionTask) { + let eventName = event.type.toString() processQueue.async { [weak self] in guard let self = self else { return } // If event is already triggered, execute the task @@ -67,9 +75,14 @@ class DefaultSplitEventsManager: SplitEventsManager { self.executeTask(event: event, task: task) return } - self.subscribe(task: task, to: event) + self.subscribe(task: task, to: event.type) } } + + // Method kept for backwards compatibility. Allows registering an event without metadata. + func register(event: SplitEvent, task: SplitEventActionTask) { + register(event: SplitEventWithMetadata(type: event, metadata: nil), task: task) + } func start() { dataAccessQueue.sync { @@ -128,7 +141,7 @@ class DefaultSplitEventsManager: SplitEventsManager { return isRunning } - private func takeEvent() -> SplitInternalEvent? { + private func takeEvent() -> SplitInternalEventWithMetadata? { do { return try eventsQueue.take() } catch BlockingQueueError.hasBeenStopped { @@ -145,7 +158,7 @@ class DefaultSplitEventsManager: SplitEventsManager { return } self.triggered.append(event) - switch event { + switch event.type { case .splitsUpdated, .mySegmentsUpdated, .myLargeSegmentsUpdated: if isTriggered(external: .sdkReady) { trigger(event: .sdkUpdated) @@ -201,7 +214,11 @@ class DefaultSplitEventsManager: SplitEventsManager { } private func trigger(event: SplitEvent) { - let eventName = event.toString() + trigger(event: SplitEventWithMetadata(type: event, metadata: nil)) + } + + private func trigger(event: SplitEventWithMetadata) { + let eventName = event.type.toString() // If executionTimes is zero, maximum executions has been reached if executionTimes(for: eventName) == 0 { @@ -215,14 +232,14 @@ class DefaultSplitEventsManager: SplitEventsManager { Logger.d("Triggering SDK event \(eventName)") // If executionTimes is lower than zero, execute it without limitation - if let subscriptions = getSubscriptions(for: event) { + if let subscriptions = getSubscriptions(for: event.type) { for task in subscriptions { executeTask(event: event, task: task) } } } - private func executeTask(event: SplitEvent, task: SplitEventTask) { + private func executeTask(event: SplitEventWithMetadata, task: SplitEventTask) { let eventName = task.event.toString() @@ -232,7 +249,7 @@ class DefaultSplitEventsManager: SplitEventsManager { let queue = task.takeQueue() ?? DispatchQueue.general queue.async { TimeChecker.logInterval("Running \(eventName) in Background queue \(queue)") - task.run() + task.run(event.metadata) } return } @@ -240,13 +257,17 @@ class DefaultSplitEventsManager: SplitEventsManager { DispatchQueue.main.async { TimeChecker.logInterval("Running event on main: \(eventName)") // UI Updates - task.run() + task.run(event.metadata) } } - private func isTriggered(internal event: SplitInternalEvent) -> Bool { + private func isTriggered(internal event: SplitInternalEventWithMetadata) -> Bool { return triggered.filter { $0 == event }.count > 0 } + + private func isTriggered(internal event: SplitInternalEvent) -> Bool { + return isTriggered(internal: SplitInternalEventWithMetadata(event, metadata: nil)) + } // MARK: Safe Data Access func executionTimes(for eventName: String) -> Int? { diff --git a/SplitTests/Collections/BlockingQueueTest.swift b/SplitTests/Collections/BlockingQueueTest.swift index 04c4b5df3..a38051a20 100644 --- a/SplitTests/Collections/BlockingQueueTest.swift +++ b/SplitTests/Collections/BlockingQueueTest.swift @@ -25,7 +25,7 @@ class BlockingQueueTest: XCTestCase { while true { do { let event = try queue.take() - local.append(event) + local.append(event.type) if local.count == 4 { endExp.fulfill() } @@ -60,7 +60,7 @@ class BlockingQueueTest: XCTestCase { while true { do { let event = try queue.take() - local.append(event) + local.append(event.type) } catch { endExp.fulfill() interrupted = true @@ -105,8 +105,8 @@ class BlockingQueueTest: XCTestCase { for _ in 0..<50000 { do { let event = try queue.take() - local.append(event) - print("Took: \(event)") + local.append(event.type) + print("Took: \(event.type)") } catch { } } @@ -117,8 +117,8 @@ class BlockingQueueTest: XCTestCase { for _ in 0..<50000 { do { let event = try queue.take() - local.append(event) - print("Took QA1: \(event)") + local.append(event.type) + print("Took QA1: \(event.type)") } catch { print("\n\n\nERROR!!!!: \(error) \n\n\n") } @@ -129,9 +129,9 @@ class BlockingQueueTest: XCTestCase { for _ in 0..<50000 { do { let event = try queue.take() - local.append(event) + local.append(event.type) Thread.sleep(forTimeInterval: 0.3) - print("Took QA2: \(event)") + print("Took QA2: \(event.type)") } catch { } } @@ -142,8 +142,8 @@ class BlockingQueueTest: XCTestCase { do { Thread.sleep(forTimeInterval: 0.5) let event = try queue.take() - local.append(event) - print("Took QA3: \(event)") + local.append(event.type) + print("Took QA3: \(event.type)") } catch { } } diff --git a/SplitTests/Fake/InternalSplitClientStub.swift b/SplitTests/Fake/InternalSplitClientStub.swift index 5b792fb3e..2d54d6e3a 100644 --- a/SplitTests/Fake/InternalSplitClientStub.swift +++ b/SplitTests/Fake/InternalSplitClientStub.swift @@ -103,6 +103,9 @@ class InternalSplitClientStub: InternalSplitClient { func on(event: SplitEvent, execute action: @escaping SplitAction) { } + + func on(event: SplitEvent, executeWithMetadata: @escaping SplitActionWithMetadata) { + } func track(trafficType: String, eventType: String) -> Bool { return true diff --git a/SplitTests/Fake/Service/SplitEventsManagerCoordinatorStub.swift b/SplitTests/Fake/Service/SplitEventsManagerCoordinatorStub.swift index 94cbb8991..26e0d03f7 100644 --- a/SplitTests/Fake/Service/SplitEventsManagerCoordinatorStub.swift +++ b/SplitTests/Fake/Service/SplitEventsManagerCoordinatorStub.swift @@ -22,9 +22,13 @@ class SplitEventsManagerCoordinatorStub: SplitEventsManagerCoordinator { managers[key] = nil } - func register(event: SplitEvent, task: SplitEventTask) { + func register(event: SplitEvent, task: SplitEventActionTask) { } + + func register(event: SplitEventWithMetadata, task: SplitEventActionTask) {} + + func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata?) {} var notifiedEvents = Set() func notifyInternalEvent(_ event: SplitInternalEvent) { diff --git a/SplitTests/Fake/SplitClientStub.swift b/SplitTests/Fake/SplitClientStub.swift index a19acdcb7..5927d9a06 100644 --- a/SplitTests/Fake/SplitClientStub.swift +++ b/SplitTests/Fake/SplitClientStub.swift @@ -95,6 +95,9 @@ class SplitClientStub: SplitClient { func on(event: SplitEvent, runInBackground: Bool, queue: DispatchQueue?, execute action: @escaping SplitAction) { } + func on(event: SplitEvent, executeWithMetadata: @escaping SplitActionWithMetadata) { + } + func track(trafficType: String, eventType: String) -> Bool { return true } diff --git a/SplitTests/Fake/SplitEventsManagerMock.swift b/SplitTests/Fake/SplitEventsManagerMock.swift index 1132148df..256258dac 100644 --- a/SplitTests/Fake/SplitEventsManagerMock.swift +++ b/SplitTests/Fake/SplitEventsManagerMock.swift @@ -31,6 +31,8 @@ class SplitEventsManagerMock: SplitEventsManager { var isSdkUpdatedFired = false var isSdkReadyChecked = false + + var metadata: EventMetadata? func notifyInternalEvent(_ event:SplitInternalEvent) { switch event { @@ -52,9 +54,13 @@ class SplitEventsManagerMock: SplitEventsManager { } } - var registeredEvents = [SplitEvent: SplitEventTask]() - func register(event: SplitEvent, task: SplitEventTask) { - registeredEvents[event] = task + var registeredEvents = [SplitEvent: SplitEventActionTask]() + func register(event: SplitEvent, task: SplitEventActionTask) { + register(event: SplitEventWithMetadata(type: event), task: task) + } + + func register(event: SplitEventWithMetadata, task: SplitEventActionTask) { + registeredEvents[event.type] = task } func start() { @@ -79,4 +85,9 @@ class SplitEventsManagerMock: SplitEventsManager { return true } } + + func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata?) { + self.metadata = metadata + notifyInternalEvent(event) + } } diff --git a/SplitTests/Fake/SplitEventsManagerStub.swift b/SplitTests/Fake/SplitEventsManagerStub.swift index 1d7685dc3..df390d772 100644 --- a/SplitTests/Fake/SplitEventsManagerStub.swift +++ b/SplitTests/Fake/SplitEventsManagerStub.swift @@ -15,11 +15,19 @@ class SplitEventsManagerStub: SplitEventsManager { var splitsKilledEventFiredCount = 0 var splitsUpdatedEventFiredCount = 0 var mySegmentsLoadedEventFiredCount = 0 + var metadata: EventMetadata? var mySegmentsLoadedEventExp: XCTestExpectation? var startCalled = false var stopCalled = false func notifyInternalEvent(_ event: SplitInternalEvent) { + notifyInternalEvent(event, metadata: nil) + } + + func notifyInternalEvent(_ event: SplitInternalEvent, metadata: EventMetadata? = nil) { + + self.metadata = metadata + switch event { case .mySegmentsLoadedFromCache: mySegmentsLoadedEventFiredCount+=1 @@ -39,8 +47,12 @@ class SplitEventsManagerStub: SplitEventsManager { } } - var registeredEvents = [SplitEvent: SplitEventTask]() - func register(event: SplitEvent, task: SplitEventTask) { + var registeredEvents = [SplitEventWithMetadata: SplitEventActionTask]() + func register(event: SplitEvent, task: SplitEventActionTask) { + register(event: SplitEventWithMetadata(type: event), task: task) + } + + func register(event: SplitEventWithMetadata, task: SplitEventActionTask) { registeredEvents[event] = task } diff --git a/SplitTests/SplitEventsManagerTest.swift b/SplitTests/SplitEventsManagerTest.swift index 11d8603ae..2e5b99d23 100644 --- a/SplitTests/SplitEventsManagerTest.swift +++ b/SplitTests/SplitEventsManagerTest.swift @@ -262,6 +262,25 @@ class SplitEventsManagerTest: XCTestCase { eventManager.stop() } + + func testEventWithMetadata() { + + let taskExp = XCTestExpectation() + + // Build Task + let metadata = EventMetadata(type: .FLAGS_KILLED, data: "TEST_FLAG") + + let handler: SplitActionWithMetadata = { handlerMetadata in + XCTAssertEqual(metadata.type, handlerMetadata?.type) + XCTAssertEqual(metadata.data, "TEST_FLAG") + taskExp.fulfill() + } + let task = SplitEventActionTask(action: handler, event: .sdkReady, runInBackground: false, factory: SplitFactoryStub(apiKey: IntegrationHelper.dummyApiKey), queue: nil) + + // Run & test + task.run(metadata) + wait(for: [taskExp], timeout: 3.0) + } func testSdkReadyFromCacheWithoutFlagCachedValues() { @@ -296,6 +315,26 @@ class SplitEventsManagerTest: XCTestCase { eventManager.stop() } + func testSplitEventActionTaskMetadata() { + + // Dummy event with metadata + let metadataTypeToCheck: EventMetadataType = .FLAGS_KILLED + let metadataDataToCheck: String = "Test-flag-42" + let dummyMetadata = EventMetadata(type: metadataTypeToCheck, data: metadataDataToCheck) + + // This will be the task's "run()" + let action: SplitActionWithMetadata = { metadata in + XCTAssertEqual(metadataTypeToCheck, metadata!.type) + XCTAssertEqual(metadataDataToCheck,metadata!.data) + } + + // SUT + let SUT = TestTask(exp: nil, action: action, metadata: dummyMetadata) + + SUT.run(dummyMetadata) + XCTAssertTrue(SUT.taskTriggered) + } + // MARK: Helpers func currentTimestamp() -> Int { return Int(Date().unixTimestamp()) @@ -306,29 +345,21 @@ class SplitEventsManagerTest: XCTestCase { } } -class TestTask: SplitEventTask { - - var event: SplitEvent = .sdkReady - - var runInBackground: Bool = false - - var queue: DispatchQueue? +class TestTask: SplitEventActionTask { var taskTriggered = false let label: String var exp: XCTestExpectation? - init(exp: XCTestExpectation?, label: String = "") { + init(exp: XCTestExpectation?, label: String = "", action: SplitActionWithMetadata? = nil, metadata: EventMetadata? = nil) { self.exp = exp self.label = label + super.init(action: action ?? { _ in }, event: .sdkReady, factory: SplitFactoryStub(apiKey: IntegrationHelper.dummyApiKey)) } - - func takeQueue() -> DispatchQueue? { - return nil - } - - func run() { + + override func run(_ metadata: EventMetadata?) { print("run: \(self.label)") taskTriggered = true + super.run(metadata) if let exp = self.exp { exp.fulfill() }