// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "IPixelStreaming2Streamer.h" #include "Misc/AutomationTest.h" #include "MockPlayer.h" #include "PixelStreaming2Servers.h" #include "VideoProducer.h" #include "Video/VideoConfig.h" #if WITH_DEV_AUTOMATION_TESTS namespace UE::PixelStreaming2 { enum class EMediaType : uint8 { Audio, Video }; namespace TestUtils { int32 NextStreamerPort(); int32 NextPlayerPort(); } // namespace TestUtils // Equivalent to DEFINE_LATENT_AUTOMATION_COMMAND_FOUR_PARAMETER, but instead we define a custom constructor class FWaitForDataChannelMessageOrTimeout : public IAutomationLatentCommand { public: FWaitForDataChannelMessageOrTimeout(double InTimeoutSeconds, TSharedPtr InPlayer, TFunction&)>& InCallback, TSharedPtr InbComplete) : TimeoutSeconds(InTimeoutSeconds) , Player(InPlayer) , Callback(InCallback) , bComplete(InbComplete) { MessageReceivedHandle = Player->OnMessageReceived.AddLambda([MessageCallback = this->Callback](const TArray& RawBuffer) { MessageCallback(RawBuffer); }); } virtual ~FWaitForDataChannelMessageOrTimeout() { Player->OnMessageReceived.Remove(MessageReceivedHandle); } virtual bool Update() override; private: double TimeoutSeconds; TSharedPtr Player; TFunction&)> Callback; TSharedPtr bComplete; FDelegateHandle MessageReceivedHandle; }; class FWaitForStreamerDataChannelMessageOrTimeout : public IAutomationLatentCommand { public: FWaitForStreamerDataChannelMessageOrTimeout(double InTimeoutSeconds, TSharedPtr InStreamer, TSharedPtr InbComplete) : TimeoutSeconds(InTimeoutSeconds) , Streamer(InStreamer) , bComplete(InbComplete) { } virtual ~FWaitForStreamerDataChannelMessageOrTimeout() { } virtual bool Update() override; private: double TimeoutSeconds; TSharedPtr Streamer; TSharedPtr bComplete; }; DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FWaitSeconds, double, WaitSeconds); DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FSendSolidColorFrame, TSharedPtr, VideoProducer, FMockVideoFrameConfig, FrameConfig); DEFINE_LATENT_AUTOMATION_COMMAND_THREE_PARAMETER(FWaitForFrameReceived, double, TimeoutSeconds, TSharedPtr, VideoSink, FMockVideoFrameConfig, FrameConfig); DEFINE_LATENT_AUTOMATION_COMMAND_FOUR_PARAMETER(FSubscribePlayerAfterStreamerConnectedOrTimeout, double, TimeoutSeconds, TSharedPtr, OutStreamer, TSharedPtr, OutPlayer, FString, StreamerName); DEFINE_LATENT_AUTOMATION_COMMAND_THREE_PARAMETER(FCleanupAll, TSharedPtr, OutSignallingServer, TSharedPtr, OutStreamer, TSharedPtr, OutPlayer); DEFINE_LATENT_AUTOMATION_COMMAND_THREE_PARAMETER(FCleanupAllPlayers, TSharedPtr, OutSignallingServer, TSharedPtr, OutStreamer, TArray>, OutPlayers); DEFINE_LATENT_AUTOMATION_COMMAND_TWO_PARAMETER(FWaitForDataChannelOrTimeout, double, TimeoutSeconds, TSharedPtr, OutPlayer); DEFINE_LATENT_AUTOMATION_COMMAND_THREE_PARAMETER(FSendDataChannelMessageToStreamer, TSharedPtr, Player, FString, MessageType, const FString, Body); DEFINE_LATENT_AUTOMATION_COMMAND_THREE_PARAMETER(FSendDataChannelMessageFromStreamer, TSharedPtr, Streamer, FString, MessageType, const FString, Body); DEFINE_LATENT_AUTOMATION_COMMAND_THREE_PARAMETER(FSendCustomMessageToStreamer, TSharedPtr, Player, FString, MessageType, uint16, Body); DEFINE_LATENT_AUTOMATION_COMMAND_THREE_PARAMETER(FWaitForPlayerTrackOrTimeout, double, TimeoutSeconds, TSharedPtr, Player, TSharedPtr, bComplete); DEFINE_LATENT_AUTOMATION_COMMAND_FOUR_PARAMETER(FWaitAndCheckBool, double, WaitSeconds, TSharedPtr, Player, TSharedPtr, bCheck, bool, bExpectedValue); DEFINE_LATENT_AUTOMATION_COMMAND_FIVE_PARAMETER(FWaitAndCheckStreamerBool, const FString, CheckName, double, WaitSeconds, TSharedPtr, Streamer, TSharedPtr, bCheck, bool, bExpectedValue); DEFINE_LATENT_AUTOMATION_COMMAND_FIVE_PARAMETER(FWAitForBoolOrTimeout, const FString, CheckName, double, WaitSeconds, TSharedPtr, Streamer, TSharedPtr, bCheck, bool, bExpectedValue); DEFINE_LATENT_AUTOMATION_COMMAND_ONE_PARAMETER(FExecuteLambda, const TFunction, Func); TSharedPtr CreateStreamer(const FString& StreamerName, int StreamerPort); TSharedPtr CreatePlayer(FMockPlayerConfig Config = { .AudioDirection = EMediaDirection::RecvOnly, .VideoDirection = EMediaDirection::RecvOnly }); TSharedPtr CreateSignallingServer(int StreamerPort, int PlayerPort); void SetCodec(EVideoCodec Codec); void SetMediaDirection(EMediaType Media, EMediaDirection Direction); } // namespace UE::PixelStreaming2 #endif // WITH_DEV_AUTOMATION_TESTS