// Copyright Epic Games, Inc. All Rights Reserved. #include #if ZEN_WITH_TESTS # include "zen-test.h" # include # include # include namespace zen::tests { using namespace std::literals; TEST_SUITE_BEGIN("zen.trace"); TEST_CASE("help.top_level") { ZenCommandResult Result = RunZen("trace --help"); CHECK_EQ(Result.ExitCode, 0); CHECK_MESSAGE(Result.Output.find("subcommands:") != std::string::npos, Result.Output); CHECK_MESSAGE(Result.Output.find("analyze") != std::string::npos, Result.Output); CHECK_MESSAGE(Result.Output.find("inspect") != std::string::npos, Result.Output); CHECK_MESSAGE(Result.Output.find("serve") != std::string::npos, Result.Output); } TEST_CASE("help.inspect") { ZenCommandResult Result = RunZen("trace inspect --help"); CHECK_EQ(Result.ExitCode, 0); CHECK_MESSAGE(Result.Output.find("Inspect event schemas") != std::string::npos, Result.Output); } TEST_CASE("inspect.missing_file") { ZenCommandResult Result = RunZen("trace inspect this-file-does-not-exist.utrace"); CHECK_NE(Result.ExitCode, 0); CHECK_MESSAGE(Result.Output.find("File not found") != std::string::npos, Result.Output); } TEST_CASE("inspect.generated_tracefile") { const std::filesystem::path DataDir = TestEnv.CreateNewTestDir(); const std::filesystem::path TraceFile = DataDir / "powercycle-trace.utrace"; ZenServerInstance Instance(TestEnv); Instance.SetDataDir(DataDir); ExtendableStringBuilder<512> ServerArgs; ServerArgs << "--tracefile=\""; PathToUtf8(TraceFile.c_str(), ServerArgs); ServerArgs << "\" --powercycle"; Instance.SpawnServer(TestEnv.GetNewPortNumber(), ServerArgs.ToView()); CHECK_MESSAGE(Instance.WaitUntilReady(10000), Instance.GetLogOutput()); if (Instance.IsRunning()) { std::error_code Ec; CHECK_MESSAGE(Instance.WaitUntilExited(10000, Ec), Instance.GetLogOutput()); CHECK_MESSAGE(!Ec, Ec.message()); } CHECK_EQ(Instance.Shutdown(), 0); CHECK_MESSAGE(std::filesystem::exists(TraceFile), TraceFile.string()); CHECK_MESSAGE(std::filesystem::file_size(TraceFile) > 0, TraceFile.string()); ExtendableStringBuilder<512> InspectArgs; InspectArgs << "trace inspect \""; PathToUtf8(TraceFile.c_str(), InspectArgs); InspectArgs << "\""; ZenCommandResult InspectResult = RunZen(InspectArgs.ToView()); CHECK_EQ(InspectResult.ExitCode, 0); CHECK_MESSAGE(InspectResult.Output.find("Trace:") != std::string::npos, InspectResult.Output); CHECK_MESSAGE(InspectResult.Output.find("Events:") != std::string::npos, InspectResult.Output); CHECK_MESSAGE(InspectResult.Output.find("Types:") != std::string::npos, InspectResult.Output); CHECK_MESSAGE(InspectResult.Output.find("Event Schemas:") != std::string::npos, InspectResult.Output); CHECK_MESSAGE(InspectResult.Output.find("Events: 0") == std::string::npos, InspectResult.Output); CHECK_MESSAGE(InspectResult.Output.find("Types: 0") == std::string::npos, InspectResult.Output); CHECK_MESSAGE(InspectResult.Output.find("(uid=") != std::string::npos, InspectResult.Output); CHECK_MESSAGE(InspectResult.Output.find("events=") != std::string::npos, InspectResult.Output); ExtendableStringBuilder<512> AnalyzeArgs; AnalyzeArgs << "trace analyze --no-cache --symbols=off \""; PathToUtf8(TraceFile.c_str(), AnalyzeArgs); AnalyzeArgs << "\""; ZenCommandResult AnalyzeResult = RunZen(AnalyzeArgs.ToView()); CHECK_EQ(AnalyzeResult.ExitCode, 0); CHECK_MESSAGE(AnalyzeResult.Output.find("Trace:") != std::string::npos, AnalyzeResult.Output); CHECK_MESSAGE(AnalyzeResult.Output.find("Size:") != std::string::npos, AnalyzeResult.Output); CHECK_MESSAGE(AnalyzeResult.Output.find("Events:") != std::string::npos, AnalyzeResult.Output); CHECK_MESSAGE(AnalyzeResult.Output.find("Duration:") != std::string::npos, AnalyzeResult.Output); CHECK_MESSAGE(AnalyzeResult.Output.find("Threads:") != std::string::npos, AnalyzeResult.Output); CHECK_MESSAGE(AnalyzeResult.Output.find("Modules:") != std::string::npos, AnalyzeResult.Output); CHECK_MESSAGE(AnalyzeResult.Output.find("Parsed:") != std::string::npos, AnalyzeResult.Output); } TEST_SUITE_END(); } // namespace zen::tests #endif