1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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
|