blob: 91bce3717f9f0a486fb14f7a3ab75c420dede9e6 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "garnet/bin/trace2json/trace_parser.h"
#include <gtest/gtest.h>
#include <rapidjson/document.h>
#include <rapidjson/istreamwrapper.h>
#include <src/lib/files/file.h>
#if defined(__APPLE__)
#include <mach-o/dyld.h>
#endif
#include <fstream>
namespace {
using ::testing::Test;
std::string GetSelfPath() {
std::string result;
#if defined(__APPLE__)
// Executable path can have relative references ("..") depending on how the
// app was launched.
uint32_t length = 0;
_NSGetExecutablePath(nullptr, &length);
result.resize(length);
_NSGetExecutablePath(&result[0], &length);
result.resize(length - 1); // Length included terminator.
#elif defined(__linux__)
// The realpath() call below will resolve the symbolic link.
result.assign("/proc/self/exe");
#else
#error Write this for your platform.
#endif
char fullpath[PATH_MAX];
return std::string(realpath(result.c_str(), fullpath));
}
std::string GetTestDataPath() {
std::string path = GetSelfPath();
size_t last_slash = path.rfind('/');
if (last_slash == std::string::npos) {
path = "./";
} else {
path.resize(last_slash + 1);
}
return path + "test_data/trace2json/";
}
void ConvertAndCompare(std::string input_file,
std::string expected_output_file) {
std::string test_data_path = GetTestDataPath();
std::ifstream fxt_in(test_data_path + input_file,
std::ios_base::in | std::ios_base::binary);
std::ostringstream json_out;
// The inner scope here is necessary since ChromiumExporter uses its
// destructor as the signal to write systemTraceEvents.
{
tracing::FuchsiaTraceParser parser(&json_out);
EXPECT_TRUE(parser.Parse(&fxt_in));
}
std::string actual_out = json_out.str();
std::string expected_out;
EXPECT_TRUE(files::ReadFileToString(test_data_path + expected_output_file,
&expected_out));
EXPECT_EQ(actual_out, expected_out);
}
TEST(TraceParserTest, SimpleTrace) {
// simple_trace.fxt is a small hand-written trace file that exercises a few
// basic event types (currently slice begin, slice end, slice complete, async
// begin, and async end), and includes both inline and table referenced
// strings. It only contains one provider.
ConvertAndCompare("simple_trace.fxt", "simple_trace.json");
}
TEST(TraceParserTest, ExampleBenchmark) {
// example_benchmark.fxt is the trace written by the program in
// garnet/examples/benchmark, in this case run on qemu. To collect the trace,
// include //garnet/packages/examples:benchmark in your build and then run
// `fx traceutil record -binary -spawn /bin/run
// fuchsia-pkg://fuchsia.com/benchmark#meta/benchmark.cmx`
ConvertAndCompare("example_benchmark.fxt", "example_benchmark.json");
}
} // namespace