AmazonChimeSDK/AmazonChimeSDKTests/internal/video/VideoFrameResenderTests.swift (72 lines of code) (raw):

// // VideoFrameResenderTests.swift // AmazonChimeSDK // // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 // @testable import AmazonChimeSDK import AmazonChimeSDKMedia import Mockingbird import XCTest class VideoFrameResenderTests: CommonTestCase { let minFrameRate:UInt = 5 let logger = ConsoleLogger(name:"test", level: .DEBUG) let videoFrameGenerator = VideoFrameGenerator() var testImage: UIImage! var invocationCount = 0 override func setUp() { super.setUp() guard let testImage = UIImage(named: "background-ml-test-image.jpeg", in: Bundle(for: type(of: self)), compatibleWith: nil) else { XCTFail("Failed to load test image.") return } self.testImage = testImage self.invocationCount = 0 } func testFrameDidSend_ResendTimerShoulrRunPeriodicallyWhenThereisFrame() { let timeout = 2 let expectedCount = timeout * Int(minFrameRate) let _ = createAndRunResender(numberOfThreads: 1) DispatchQueue.global().asyncAfter(deadline: .now() + .seconds(timeout)) { XCTAssertTrue( ((expectedCount - 1)...(expectedCount + 1)).contains(self.invocationCount), "`handlerInvocationCount` should be close to expected count") } } func testFrameDidSend_NoCrashDuringWithMultipleFrameDidSend() { let _ = createAndRunResender(numberOfThreads: 10) DispatchQueue.global().asyncAfter(deadline: .now() + 5) { XCTAssertTrue(true) } } func testFrameDidSend_NoCrashIfDestroyResenderDuringScheduledResendTasks() { var resender:VideoFrameResender? = createAndRunResender(numberOfThreads: 10) // Destroy resender in 2 seconds DispatchQueue.global().asyncAfter(deadline: .now() + 2) { resender = nil } // Should be no crash in 5 seconds DispatchQueue.global().asyncAfter(deadline: .now() + 5) { XCTAssertTrue(true) } } func testFrameDidSend_NoCrashIfStopResenderDuringScheduledResendTasks() { let resender = createAndRunResender(numberOfThreads: 10) // Stop resender in 2 seconds DispatchQueue.global().asyncAfter(deadline: .now() + 2) { resender.stop() } // Should be no crash in 5 seconds DispatchQueue.global().asyncAfter(deadline: .now() + 5) { XCTAssertTrue(true) } } private func createAndRunResender(numberOfThreads: Int) -> VideoFrameResender { let dispatchGroup = DispatchGroup() let resender:VideoFrameResender = VideoFrameResender(minFrameRate: self.minFrameRate, logger: self.logger, resendFrameHandler: { _ in self.invocationCount += 1 }) for _ in 1...numberOfThreads { let frame = self.videoFrameGenerator.generateVideoFrame(image: self.testImage)! DispatchQueue.global(qos: .background).async(group: dispatchGroup) { resender.frameDidSend(videoFrame: frame) } } dispatchGroup.wait() return resender } }