diff options
Diffstat (limited to 'src/zen-test/trace-tests.cpp')
| -rw-r--r-- | src/zen-test/trace-tests.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/zen-test/trace-tests.cpp b/src/zen-test/trace-tests.cpp new file mode 100644 index 000000000..e57d30e6c --- /dev/null +++ b/src/zen-test/trace-tests.cpp @@ -0,0 +1,107 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include <zencore/zencore.h> + +#if ZEN_WITH_TESTS + +# include "zen-test.h" + +# include <zencore/filesystem.h> +# include <zencore/testing.h> + +# include <system_error> + +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 |