aboutsummaryrefslogtreecommitdiff
path: root/src/zen-test/trace-tests.cpp
blob: e57d30e6cb7f5f19b9ba6d9d10d1f3e8947a5c93 (plain) (blame)
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