blob: d9aaed9d1bdc66d88d0433f435c0fe891218f74d [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 "lib/escher/profiling/timestamp_profiler.h"
#include "gtest/gtest.h"
namespace escher {
TEST(Trace, EmptyInput) {
std::vector<TimestampProfiler::Result> ts;
std::vector<TimestampProfiler::TraceEvent> trace_events =
TimestampProfiler::ProcessTraceEvents(ts);
EXPECT_EQ(trace_events.size(), 0u);
}
TEST(Trace, TooSmallInput) {
std::vector<TimestampProfiler::Result> ts;
ts.push_back({});
std::vector<TimestampProfiler::TraceEvent> trace_events =
TimestampProfiler::ProcessTraceEvents(ts);
EXPECT_EQ(trace_events.size(), 0u);
}
TEST(Trace, OneSingularEvent) {
std::vector<TimestampProfiler::Result> ts;
const char* name = "event";
ts.push_back({1000, 0, 0, "start"});
ts.push_back({2000, 0, 0, name});
ts.push_back({3000, 0, 0, "end"});
std::vector<TimestampProfiler::TraceEvent> trace_events =
TimestampProfiler::ProcessTraceEvents(ts);
// Check the number of non-overlapping events.
EXPECT_EQ(trace_events.size(), 1u);
// Check the number of each event's concurrent events.
EXPECT_EQ(trace_events[0].names.size(), 1u);
// Check pointer equality for each event's name.
EXPECT_EQ(trace_events[0].names[0], name);
}
TEST(Trace, MultipleSingularEvents) {
std::vector<TimestampProfiler::Result> ts;
const char* name1 = "event1";
const char* name2 = "event2";
ts.push_back({1000, 0, 0, "start"});
ts.push_back({2000, 0, 0, name1});
ts.push_back({3000, 0, 0, name2});
ts.push_back({4000, 0, 0, "end"});
std::vector<TimestampProfiler::TraceEvent> trace_events =
TimestampProfiler::ProcessTraceEvents(ts);
// Check the number of non-overlapping events.
EXPECT_EQ(trace_events.size(), 2u);
// Check the number of each event's concurrent events.
EXPECT_EQ(trace_events[0].names.size(), 1u);
EXPECT_EQ(trace_events[1].names.size(), 1u);
// Check pointer equality for each event's name.
EXPECT_EQ(trace_events[0].names[0], name1);
EXPECT_EQ(trace_events[1].names[0], name2);
}
TEST(Trace, OneConcurrentEvent) {
std::vector<TimestampProfiler::Result> ts;
const char* name1a = "event1a";
const char* name1b = "event1b";
ts.push_back({1000, 0, 0, "start"});
ts.push_back({2000, 0, 0, name1a});
ts.push_back({2000, 0, 0, name1b});
ts.push_back({3000, 0, 0, "end"});
std::vector<TimestampProfiler::TraceEvent> trace_events =
TimestampProfiler::ProcessTraceEvents(ts);
// Check the number of non-overlapping events.
EXPECT_EQ(trace_events.size(), 1u);
// Check the number of each event's concurrent events.
EXPECT_EQ(trace_events[0].names.size(), 2u);
// Check pointer equality for each event's name.
EXPECT_EQ(trace_events[0].names[0], name1a);
EXPECT_EQ(trace_events[0].names[1], name1b);
}
TEST(Trace, MultipleConcurrentEvents) {
std::vector<TimestampProfiler::Result> ts;
const char* name1a = "event1a";
const char* name1b = "event1b";
const char* name2a = "event2a";
const char* name2b = "event2b";
const char* name2c = "event2c";
const char* name3a = "event3a";
ts.push_back({1000, 0, 0, "start"});
ts.push_back({2000, 0, 0, name1a});
ts.push_back({2000, 0, 0, name1b});
ts.push_back({3000, 0, 0, name2a});
ts.push_back({3000, 0, 0, name2b});
ts.push_back({3000, 0, 0, name2c});
ts.push_back({4000, 0, 0, name3a});
ts.push_back({5000, 0, 0, "end"});
std::vector<TimestampProfiler::TraceEvent> trace_events =
TimestampProfiler::ProcessTraceEvents(ts);
// Check the number of non-overlapping events.
EXPECT_EQ(trace_events.size(), 3u);
// Check the number of each event's concurrent events.
EXPECT_EQ(trace_events[0].names.size(), 2u);
EXPECT_EQ(trace_events[1].names.size(), 3u);
EXPECT_EQ(trace_events[2].names.size(), 1u);
// Check pointer equality for each event's name.
EXPECT_EQ(trace_events[0].names[0], name1a);
EXPECT_EQ(trace_events[0].names[1], name1b);
EXPECT_EQ(trace_events[1].names[0], name2a);
EXPECT_EQ(trace_events[1].names[1], name2b);
EXPECT_EQ(trace_events[1].names[2], name2c);
EXPECT_EQ(trace_events[2].names[0], name3a);
}
} // namespace escher