Files
UnrealEngine/Engine/Plugins/Runtime/ReplicationSystemTestPlugin/Source/Private/NetworkAutomationTest.cpp
2025-05-18 13:04:45 +08:00

176 lines
4.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "NetworkAutomationTest.h"
#include "NetworkAutomationTestMacros.h"
#include "ReplicationSystemTestPlugin/NetworkAutomationTest.h"
namespace UE::Net
{
//
bool FNetworkAutomationTestConfig::bVerboseLogging = false;
class FNetworkAutomationTestStatsSummary
{
public:
FNetworkAutomationTestStatsSummary();
void AddTestResult(const TCHAR* TestName, const FNetworkAutomationTestStats& Stats);
private:
friend void PrintNetworkAutomationTestSummary();
TMap<const TCHAR*, FNetworkAutomationTestStats, FDefaultSetAllocator, TStringPointerMapKeyFuncs_DEPRECATED<const TCHAR*, FNetworkAutomationTestStats>> TestsWithFailures;
TMap<const TCHAR*, FNetworkAutomationTestStats, FDefaultSetAllocator, TStringPointerMapKeyFuncs_DEPRECATED<const TCHAR*, FNetworkAutomationTestStats>> TestsWithWarnings;
SIZE_T TestCount;
SIZE_T SuccessCount;
};
static FNetworkAutomationTestStatsSummary NetworkAutomationTestStatsSummary;
//
FNetworkAutomationTestSuiteFixture::FNetworkAutomationTestSuiteFixture()
: bSuppressWarningsFromSummary(false)
{
}
FNetworkAutomationTestSuiteFixture::~FNetworkAutomationTestSuiteFixture()
{
}
void FNetworkAutomationTestSuiteFixture::SetUp()
{
}
void FNetworkAutomationTestSuiteFixture::TearDown()
{
}
void FNetworkAutomationTestSuiteFixture::PreSetUp()
{
if (FNetworkAutomationTestConfig::GetVerboseLogging())
{
UE_LOG(LogNetworkAutomationTest, Display, TEXT("Running TestCase %ls"), GetName());
}
Stats = FNetworkAutomationTestStats();
}
void FNetworkAutomationTestSuiteFixture::RunTest()
{
PreSetUp();
SetUp();
RunTestImpl();
TearDown();
PostTearDown();
}
void FNetworkAutomationTestSuiteFixture::PostTearDown()
{
NetworkAutomationTestStatsSummary.AddTestResult(GetName(), Stats);
Stats = FNetworkAutomationTestStats();
}
void FNetworkAutomationTestSuiteFixture::SetSuppressWarningsFromSummary(bool bSuppress)
{
bSuppressWarningsFromSummary = bSuppress;
}
void FNetworkAutomationTestSuiteFixture::AddTestFailure()
{
++Stats.FailureCount;
}
void FNetworkAutomationTestSuiteFixture::AddTestWarning()
{
Stats.WarningCount += !bSuppressWarningsFromSummary;
}
#if WITH_AUTOMATION_WORKER
FNetworkAutomationTestWrapper::FNetworkAutomationTestWrapper(FNetworkAutomationTestSuiteFixture& InTestSuite, const TCHAR* Name)
: FAutomationTestBase(Name, false /* bIsComplex */)
, TestSuite(InTestSuite)
{
}
EAutomationTestFlags FNetworkAutomationTestWrapper::GetTestFlags() const
{
return EAutomationTestFlags::EngineFilter | EAutomationTestFlags::ClientContext | EAutomationTestFlags::ServerContext | EAutomationTestFlags::CommandletContext;
}
uint32 FNetworkAutomationTestWrapper::GetRequiredDeviceNum() const
{
return 1;
}
FString FNetworkAutomationTestWrapper::GetBeautifiedTestName() const
{
return TestName;
}
void FNetworkAutomationTestWrapper::GetTests(TArray<FString>& OutBeautifiedNames, TArray <FString>& OutTestCommands) const
{
OutBeautifiedNames.Add(TestName);
OutTestCommands.Add(TestName);
}
bool FNetworkAutomationTestWrapper::RunTest(const FString&)
{
TestSuite.RunTest();
return true;
}
#else
#endif
//
FNetworkAutomationTestStatsSummary::FNetworkAutomationTestStatsSummary()
: TestCount(0)
, SuccessCount(0)
{
}
void FNetworkAutomationTestStatsSummary::AddTestResult(const TCHAR* TestName, const FNetworkAutomationTestStats& Stats)
{
++TestCount;
SuccessCount += (Stats.FailureCount == 0 ? 1U : 0U);
if (Stats.FailureCount)
{
TestsWithFailures.Add(TestName, Stats);
}
else if (Stats.WarningCount)
{
TestsWithWarnings.Add(TestName, Stats);
}
}
void PrintNetworkAutomationTestSummary()
{
UE_LOG(LogNetworkAutomationTest, Display, TEXT("\n-----------------------------\nNetworkAutomationTest Summary\n-----------------------------\nTests executed: %zu\nTests succeeded: %zu\nTests failed: %zu\nTests with warnings: %zu\n-----------------------------"), NetworkAutomationTestStatsSummary.TestCount, NetworkAutomationTestStatsSummary.SuccessCount, SIZE_T(NetworkAutomationTestStatsSummary.TestsWithFailures.Num()), SIZE_T(NetworkAutomationTestStatsSummary.TestsWithWarnings.Num()));
if (NetworkAutomationTestStatsSummary.TestsWithFailures.Num())
{
for (auto It = NetworkAutomationTestStatsSummary.TestsWithFailures.CreateConstIterator(); It; ++It)
{
const TCHAR* Name = It.Key();
const FNetworkAutomationTestStats& Stats = It.Value();
UE_LOG(LogNetworkAutomationTest, Display, TEXT("Test %ls failed with %zu errors and %zu warnings"), Name, Stats.FailureCount, Stats.WarningCount);
}
}
if (NetworkAutomationTestStatsSummary.TestsWithWarnings.Num())
{
for (auto It = NetworkAutomationTestStatsSummary.TestsWithWarnings.CreateConstIterator(); It; ++It)
{
const TCHAR* Name = It.Key();
const FNetworkAutomationTestStats& Stats = It.Value();
UE_LOG(LogNetworkAutomationTest, Display, TEXT("Test %ls had %zu warnings"), Name, Stats.WarningCount);
}
}
}
}