148 lines
6.9 KiB
Swift
148 lines
6.9 KiB
Swift
//
|
|
// Copyright Amazon.com Inc. or its affiliates.
|
|
// All Rights Reserved.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
import XCTest
|
|
@testable import Amplify
|
|
@testable import AmplifyTestCommon
|
|
|
|
struct DefaultHubPluginPerformanceTestHelpers {
|
|
|
|
static func makeTestObjectsForSingleChannel<T: Dispatcher>(listenerCount: Int,
|
|
dispatcherType: T.Type,
|
|
testCase: XCTestCase) -> PerformanceTestObjects {
|
|
let dispatcherChannels = [HubChannel.storage]
|
|
|
|
let listenerChannels = [HubChannel.storage]
|
|
|
|
let expectedChannels = [HubChannel.storage]
|
|
|
|
return makeTestObjectsForDispatcherTypes(listenerCount: listenerCount,
|
|
listenerChannels: listenerChannels,
|
|
dispatcherType: dispatcherType,
|
|
dispatcherChannels: dispatcherChannels,
|
|
expectedChannels: expectedChannels,
|
|
testCase: testCase)
|
|
}
|
|
|
|
static func makeTestObjectsForSingleDispatcher<T: Dispatcher>(listenerCount: Int,
|
|
dispatcherType: T.Type,
|
|
testCase: XCTestCase) -> PerformanceTestObjects {
|
|
let dispatcherChannels = [HubChannel.storage]
|
|
|
|
let listenerChannels = [HubChannel.storage,
|
|
.custom("CustomChannel1"),
|
|
.custom("CustomChannel2"),
|
|
.custom("CustomChannel3"),
|
|
.custom("CustomChannel4")]
|
|
|
|
let expectedChannels = [HubChannel.storage]
|
|
|
|
return makeTestObjectsForDispatcherTypes(listenerCount: listenerCount,
|
|
listenerChannels: listenerChannels,
|
|
dispatcherType: dispatcherType,
|
|
dispatcherChannels: dispatcherChannels,
|
|
expectedChannels: expectedChannels,
|
|
testCase: testCase)
|
|
}
|
|
|
|
static func makeTestObjectsForMultipleDispatchers<T: Dispatcher>(listenerCount: Int,
|
|
dispatcherType: T.Type,
|
|
testCase: XCTestCase) -> PerformanceTestObjects {
|
|
let dispatcherChannels = [HubChannel.storage, .custom("CustomChannel1")]
|
|
|
|
let listenerChannels = [HubChannel.storage,
|
|
.custom("CustomChannel1"),
|
|
.custom("CustomChannel2"),
|
|
.custom("CustomChannel3"),
|
|
.custom("CustomChannel4")]
|
|
|
|
let expectedChannels = [HubChannel.storage, .custom("CustomChannel1")]
|
|
|
|
return makeTestObjectsForDispatcherTypes(listenerCount: listenerCount,
|
|
listenerChannels: listenerChannels,
|
|
dispatcherType: dispatcherType,
|
|
dispatcherChannels: dispatcherChannels,
|
|
expectedChannels: expectedChannels,
|
|
testCase: testCase)
|
|
}
|
|
|
|
// swiftlint:disable:next function_parameter_count
|
|
static func makeTestObjectsForDispatcherTypes<T: Dispatcher>(listenerCount: Int,
|
|
listenerChannels: [HubChannel],
|
|
dispatcherType: T.Type,
|
|
dispatcherChannels: [HubChannel],
|
|
expectedChannels: [HubChannel],
|
|
testCase: XCTestCase) -> PerformanceTestObjects {
|
|
|
|
var dispatchers = [Dispatcher]()
|
|
for channel in dispatcherChannels {
|
|
let dispatcher: Dispatcher
|
|
switch dispatcherType {
|
|
case is ConcurrentDispatcher.Type:
|
|
dispatcher = ConcurrentDispatcher(channel: channel,
|
|
payload: HubPayload(eventName: "TEST_EVENT"))
|
|
case is SerialDispatcher.Type:
|
|
dispatcher = SerialDispatcher(channel: channel,
|
|
payload: HubPayload(eventName: "TEST_EVENT"))
|
|
default:
|
|
fatalError("Unknown dispatcher type: \(dispatcherType)")
|
|
}
|
|
dispatchers.append(dispatcher)
|
|
}
|
|
|
|
let (listeners, expectations) = makeListeners(count: listenerCount,
|
|
for: listenerChannels,
|
|
expectedChannels: expectedChannels,
|
|
testCase: testCase)
|
|
|
|
let objects = PerformanceTestObjects(dispatchers: dispatchers,
|
|
listeners: listeners,
|
|
expectations: expectations)
|
|
|
|
return objects
|
|
}
|
|
|
|
/// Makes `count` listeners for each channel in `channels`
|
|
///
|
|
/// - Parameter count: The number of listeners to make for each channel
|
|
/// - Parameter channels: The channels for which to make listeners
|
|
/// - Parameter expectedChannels: The channels for which to create expectations
|
|
/// - Parameter testcase: The XCTestCase for which to create expectations
|
|
static func makeListeners(count: Int,
|
|
for channels: [HubChannel],
|
|
expectedChannels: [HubChannel],
|
|
testCase: XCTestCase) -> ([FilteredListener], [XCTestExpectation]) {
|
|
var listeners = [FilteredListener]()
|
|
var expectations = [XCTestExpectation]()
|
|
|
|
for idx in 0 ..< count {
|
|
for channel in channels {
|
|
var expectation: XCTestExpectation?
|
|
if expectedChannels.contains(channel) {
|
|
expectation = testCase.expectation(description: "Listener \(idx) invoked for channel \(channel)")
|
|
expectations.append(expectation!)
|
|
}
|
|
let listener = FilteredListener(for: channel, filter: nil) { _ in expectation?.fulfill() }
|
|
listeners.append(listener)
|
|
}
|
|
}
|
|
|
|
return (listeners, expectations)
|
|
}
|
|
|
|
}
|
|
|
|
enum DispatcherType {
|
|
case concurrent, serial
|
|
}
|
|
|
|
struct PerformanceTestObjects {
|
|
let dispatchers: [Dispatcher]
|
|
let listeners: [FilteredListener]
|
|
let expectations: [XCTestExpectation]
|
|
}
|