AmazonChimeSDK/AmazonChimeSDKTests/internal/metric/ClientMetricsCollectorTests.swift (58 lines of code) (raw):
//
// ClientMetricsCollectorTests.swift
// AmazonChimeSDK
//
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
//
import Foundation
@testable import AmazonChimeSDK
import XCTest
class ClientMetricsCollectorTests: XCTestCase, MetricsObserver {
// Replicated here as to confirm values don't change and to avoid exposing in actual code
private let clientMicDeviceFramesLostPercent = 0
private let clientPostJbSpk1sPacketsLostPercent = 7
private let serverPostJbMic1sPacketsLostPercent = 3
private var receivedMetrics: [AnyHashable: Any] = [:]
private let metricsReceivedExpectation = XCTestExpectation(
description: "Is fulfilled after metrics were received")
private let metricsReceivedTimeoutMs = 10.0
private var clientMetricsCollector: DefaultClientMetricsCollector?
override func setUp() {
super.setUp()
clientMetricsCollector = DefaultClientMetricsCollector()
clientMetricsCollector?.subscribeToMetrics(observer: self)
}
func testOnMetricsReceiveShouldNotBeCalledBeforeInterval() {
let audioClientMetrics = [
serverPostJbMic1sPacketsLostPercent: 1,
clientPostJbSpk1sPacketsLostPercent: 2
]
clientMetricsCollector?.processAudioClientMetrics(metrics: audioClientMetrics)
// No callback should have occurred
XCTAssertEqual(receivedMetrics.count, 0)
}
func testOnMetricsReceiveShouldBeCalledAfterInterval() {
let audioClientMetrics = [
serverPostJbMic1sPacketsLostPercent: 1,
clientPostJbSpk1sPacketsLostPercent: 2
]
// Wait at least a second and next time we process metrics we should receive the callback
Thread.sleep(forTimeInterval: 1)
clientMetricsCollector?.processAudioClientMetrics(metrics: audioClientMetrics)
wait(for: [metricsReceivedExpectation], timeout: metricsReceivedTimeoutMs)
XCTAssertEqual(receivedMetrics.count, 2)
XCTAssertEqual(receivedMetrics[ObservableMetric.audioSendPacketLossPercent] as? Int, 1)
XCTAssertEqual(receivedMetrics[ObservableMetric.audioReceivePacketLossPercent] as? Int, 2)
}
func testNonObservableMetricShouldNotBeEmitted() {
let audioClientMetrics = [
clientMicDeviceFramesLostPercent: 1
]
// Wait at least a second and next time we process metrics we should receive the callback
Thread.sleep(forTimeInterval: 1)
clientMetricsCollector?.processAudioClientMetrics(metrics: audioClientMetrics)
XCTAssertEqual(receivedMetrics.count, 0)
}
func testInvalidMetricShouldNotBeEmitted() {
let audioClientMetrics = [
999: 1
]
// Wait at least a second and next time we process metrics we should receive the callback
Thread.sleep(forTimeInterval: 1)
clientMetricsCollector?.processAudioClientMetrics(metrics: audioClientMetrics)
XCTAssertEqual(receivedMetrics.count, 0)
}
func metricsDidReceive(metrics: [AnyHashable: Any]) {
metricsReceivedExpectation.fulfill()
receivedMetrics = metrics
}
}