Files
UnrealEngine/Engine/Source/Developer/Zen/Tests/ZenTest.cpp
2025-05-18 13:04:45 +08:00

213 lines
8.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#if WITH_LOW_LEVEL_TESTS
#include "TestHarness.h"
#if WITH_EDITORONLY_DATA
#include "Experimental/ZenServerInterface.h"
#include "HAL/FileManager.h"
#include "Misc/Paths.h"
namespace UE
{
TEST_CASE("Zen::ZenServerInterface", "[Zen][Basic]")
{
using namespace UE::Zen;
uint16 DefaultTestPort = 8559;
uint16 CurrentTestPort = DefaultTestPort + 1;
FString DefaultArgs = TEXT("--http asio");
FString DataPathRoot = FPaths::ConvertRelativePathToFull(FPaths::Combine(FPaths::EngineSavedDir(), "ZenServerInterfaceUnitTest"));
FString DefaultDataPath = FPaths::ConvertRelativePathToFull(FPaths::Combine(DataPathRoot, "Default"));
IFileManager::Get().DeleteDirectory(*DataPathRoot, false, true);
SECTION("Basic AutoLaunch and Shutdown (copy)")
{
for (int Iteration = 0; Iteration < 4; ++Iteration)
{
FServiceSettings ZenTestServiceSettings;
FServiceAutoLaunchSettings& ZenTestAutoLaunchSettings = ZenTestServiceSettings.SettingsVariant.Get<FServiceAutoLaunchSettings>();
ZenTestAutoLaunchSettings.DataPath = DefaultDataPath;
ZenTestAutoLaunchSettings.ExtraArgs = DefaultArgs;
ZenTestAutoLaunchSettings.DesiredPort = DefaultTestPort;
ZenTestAutoLaunchSettings.InstallMode = FServiceAutoLaunchSettings::EInstallMode::Copy;
{
FScopeZenService ScopeZenService(MoveTemp(ZenTestServiceSettings));
FZenServiceInstance& ZenInstance = ScopeZenService.GetInstance();
uint16 AutoLaunchedPort = ZenInstance.GetAutoLaunchedPort();
uint16 DetectedPort = 0;
CHECK(ZenInstance.IsServiceReady());
CHECK(IsLocalServiceRunning(*DefaultDataPath, &DetectedPort));
CHECK(DetectedPort == AutoLaunchedPort);
CHECK(StopLocalService(*DefaultDataPath));
CHECK(!IsLocalServiceRunning(*DefaultDataPath));
}
}
}
SECTION("Basic AutoLaunch and Shutdown (link)")
{
for (int Iteration = 0; Iteration < 4; ++Iteration)
{
FServiceSettings ZenTestServiceSettings;
FServiceAutoLaunchSettings& ZenTestAutoLaunchSettings = ZenTestServiceSettings.SettingsVariant.Get<FServiceAutoLaunchSettings>();
ZenTestAutoLaunchSettings.DataPath = DefaultDataPath;
ZenTestAutoLaunchSettings.ExtraArgs = DefaultArgs;
ZenTestAutoLaunchSettings.DesiredPort = DefaultTestPort;
ZenTestAutoLaunchSettings.InstallMode = FServiceAutoLaunchSettings::EInstallMode::Link;
{
FScopeZenService ScopeZenService(MoveTemp(ZenTestServiceSettings));
FZenServiceInstance& ZenInstance = ScopeZenService.GetInstance();
uint16 AutoLaunchedPort = ZenInstance.GetAutoLaunchedPort();
uint16 DetectedPort = 0;
CHECK(ZenInstance.IsServiceReady());
CHECK(IsLocalServiceRunning(*DefaultDataPath, &DetectedPort));
CHECK(DetectedPort == AutoLaunchedPort);
CHECK(StopLocalService(*DefaultDataPath));
CHECK(!IsLocalServiceRunning(*DefaultDataPath));
}
}
}
SECTION("Overlapping AutoLaunch and Shutdown (copy)")
{
for (int Iteration = 0; Iteration < 11; ++Iteration)
{
FServiceSettings ZenTestServiceSettings;
FServiceAutoLaunchSettings& ZenTestAutoLaunchSettings = ZenTestServiceSettings.SettingsVariant.Get<FServiceAutoLaunchSettings>();
ZenTestAutoLaunchSettings.DataPath = DefaultDataPath;
ZenTestAutoLaunchSettings.ExtraArgs = DefaultArgs;
ZenTestAutoLaunchSettings.DesiredPort = DefaultTestPort;
ZenTestAutoLaunchSettings.InstallMode = FServiceAutoLaunchSettings::EInstallMode::Copy;
{
FScopeZenService ScopeZenService(MoveTemp(ZenTestServiceSettings));
FZenServiceInstance& ZenInstance = ScopeZenService.GetInstance();
uint16 AutoLaunchedPort = ZenInstance.GetAutoLaunchedPort();
uint16 DetectedPort = 0;
CHECK(ZenInstance.IsServiceReady());
CHECK(IsLocalServiceRunning(*DefaultDataPath, &DetectedPort));
CHECK(DetectedPort == AutoLaunchedPort);
}
}
CHECK(StopLocalService(*DefaultDataPath));
CHECK(!IsLocalServiceRunning(*DefaultDataPath));
}
SECTION("Overlapping AutoLaunch and Shutdown (link)")
{
for (int Iteration = 0; Iteration < 11; ++Iteration)
{
FServiceSettings ZenTestServiceSettings;
FServiceAutoLaunchSettings& ZenTestAutoLaunchSettings = ZenTestServiceSettings.SettingsVariant.Get<FServiceAutoLaunchSettings>();
ZenTestAutoLaunchSettings.DataPath = DefaultDataPath;
ZenTestAutoLaunchSettings.ExtraArgs = DefaultArgs;
ZenTestAutoLaunchSettings.DesiredPort = DefaultTestPort;
ZenTestAutoLaunchSettings.InstallMode = FServiceAutoLaunchSettings::EInstallMode::Link;
{
FScopeZenService ScopeZenService(MoveTemp(ZenTestServiceSettings));
FZenServiceInstance& ZenInstance = ScopeZenService.GetInstance();
uint16 AutoLaunchedPort = ZenInstance.GetAutoLaunchedPort();
uint16 DetectedPort = 0;
CHECK(ZenInstance.IsServiceReady());
CHECK(IsLocalServiceRunning(*DefaultDataPath, &DetectedPort));
CHECK(DetectedPort == AutoLaunchedPort);
}
}
CHECK(StopLocalService(*DefaultDataPath));
CHECK(!IsLocalServiceRunning(*DefaultDataPath));
}
SECTION("Overlapping AutoLaunch and Shutdown With DataPath Shared And Differing Args (copy)")
{
for (int Iteration = 0; Iteration < 11; ++Iteration)
{
FServiceSettings ZenTestServiceSettings;
FServiceAutoLaunchSettings& ZenTestAutoLaunchSettings = ZenTestServiceSettings.SettingsVariant.Get<FServiceAutoLaunchSettings>();
ZenTestAutoLaunchSettings.DataPath = DefaultDataPath;
ZenTestAutoLaunchSettings.ExtraArgs = *WriteToString<128>(DefaultArgs, TEXT(" --gc-interval-seconds "), (Iteration+1)*1000);
ZenTestAutoLaunchSettings.DesiredPort = DefaultTestPort;
ZenTestAutoLaunchSettings.InstallMode = FServiceAutoLaunchSettings::EInstallMode::Copy;
{
FScopeZenService ScopeZenService(MoveTemp(ZenTestServiceSettings));
FZenServiceInstance& ZenInstance = ScopeZenService.GetInstance();
uint16 AutoLaunchedPort = ZenInstance.GetAutoLaunchedPort();
uint16 DetectedPort = 0;
CHECK(ZenInstance.IsServiceReady());
CHECK(IsLocalServiceRunning(*DefaultDataPath, &DetectedPort));
CHECK(DetectedPort == AutoLaunchedPort);
}
}
CHECK(StopLocalService(*DefaultDataPath));
CHECK(!IsLocalServiceRunning(*DefaultDataPath));
}
SECTION("Overlapping AutoLaunch and Shutdown With DataPath Shared And Differing Args (link)")
{
for (int Iteration = 0; Iteration < 11; ++Iteration)
{
FServiceSettings ZenTestServiceSettings;
FServiceAutoLaunchSettings& ZenTestAutoLaunchSettings = ZenTestServiceSettings.SettingsVariant.Get<FServiceAutoLaunchSettings>();
ZenTestAutoLaunchSettings.DataPath = DefaultDataPath;
ZenTestAutoLaunchSettings.ExtraArgs = *WriteToString<128>(DefaultArgs, TEXT(" --gc-interval-seconds "), (Iteration + 1) * 1000);
ZenTestAutoLaunchSettings.DesiredPort = DefaultTestPort;
ZenTestAutoLaunchSettings.InstallMode = FServiceAutoLaunchSettings::EInstallMode::Link;
{
FScopeZenService ScopeZenService(MoveTemp(ZenTestServiceSettings));
FZenServiceInstance& ZenInstance = ScopeZenService.GetInstance();
uint16 AutoLaunchedPort = ZenInstance.GetAutoLaunchedPort();
uint16 DetectedPort = 0;
CHECK(ZenInstance.IsServiceReady());
CHECK(IsLocalServiceRunning(*DefaultDataPath, &DetectedPort));
CHECK(DetectedPort == AutoLaunchedPort);
}
}
CHECK(StopLocalService(*DefaultDataPath));
CHECK(!IsLocalServiceRunning(*DefaultDataPath));
}
SECTION("Overlapping AutoLaunch and Shutdown With DataPath Shared And Differing Args (alternating)")
{
for (int Iteration = 0; Iteration < 11; ++Iteration)
{
FServiceSettings ZenTestServiceSettings;
FServiceAutoLaunchSettings& ZenTestAutoLaunchSettings = ZenTestServiceSettings.SettingsVariant.Get<FServiceAutoLaunchSettings>();
ZenTestAutoLaunchSettings.DataPath = DefaultDataPath;
ZenTestAutoLaunchSettings.ExtraArgs = *WriteToString<128>(DefaultArgs, TEXT(" --gc-interval-seconds "), (Iteration + 1) * 1000);
ZenTestAutoLaunchSettings.DesiredPort = DefaultTestPort;
ZenTestAutoLaunchSettings.InstallMode = ((Iteration & 1) == 0) ? FServiceAutoLaunchSettings::EInstallMode::Copy : FServiceAutoLaunchSettings::EInstallMode::Link;
{
FScopeZenService ScopeZenService(MoveTemp(ZenTestServiceSettings));
FZenServiceInstance& ZenInstance = ScopeZenService.GetInstance();
uint16 AutoLaunchedPort = ZenInstance.GetAutoLaunchedPort();
uint16 DetectedPort = 0;
CHECK(ZenInstance.IsServiceReady());
CHECK(IsLocalServiceRunning(*DefaultDataPath, &DetectedPort));
CHECK(DetectedPort == AutoLaunchedPort);
}
}
CHECK(StopLocalService(*DefaultDataPath));
CHECK(!IsLocalServiceRunning(*DefaultDataPath));
}
}
} // UE
#endif // WITH_EDITORONLY_DATA
#endif // WITH_LOW_LEVEL_TESTS