blob: a9347a27e658464f1f6fc66c39aac2a23b001f6e [file] [log] [blame]
// Copyright 2017 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/lib/measure/time_between.h"
#include <vector>
#include "garnet/lib/measure/test_events.h"
#include "gtest/gtest.h"
namespace tracing {
namespace measure {
namespace {
TEST(MeasureTimeBetweenTest, Instant) {
std::vector<TimeBetweenSpec> specs = {
TimeBetweenSpec({42u,
{"first_event", "category_foo"},
Anchor::Begin,
{"second_event", "category_foo"},
Anchor::Begin})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::Instant("first_event", "category_foo", 1u));
measure.Process(test::Instant("first_event", "category_foo", 2u));
measure.Process(test::Instant("second_event", "category_foo", 4u));
measure.Process(test::Instant("second_event", "category_foo", 10u));
measure.Process(test::Instant("first_event", "category_foo", 12u));
measure.Process(test::Instant("second_event", "category_foo", 13u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({2u, 1u}), results[42u]);
}
// Verifies that we can measure the time between consecutive occurences of the
// same event.
TEST(MeasureTimeBetweenTest, SameEvent) {
std::vector<TimeBetweenSpec> specs = {
TimeBetweenSpec({42u,
{"bar", "category_foo"},
Anchor::Begin,
{"bar", "category_foo"},
Anchor::Begin})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::Instant("bar", "category_foo", 1u));
measure.Process(test::Instant("bar", "category_foo", 1u));
measure.Process(test::Instant("bar", "category_foo", 4u));
measure.Process(test::Instant("bar", "category_foo", 20u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({0u, 3u, 16u}), results[42u]);
}
TEST(MeasureTimeBetweenTest, AnchorsEndBegin) {
std::vector<TimeBetweenSpec> specs = {
TimeBetweenSpec({42u,
{"first_event", "category_foo"},
Anchor::End,
{"second_event", "category_foo"},
Anchor::Begin})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::DurationBegin("first_event", "category_foo", 1u));
measure.Process(test::DurationEnd("first_event", "category_foo", 3u));
measure.Process(test::DurationBegin("second_event", "category_foo", 4u));
measure.Process(test::DurationEnd("second_event", "category_foo", 8u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({1u}), results[42u]);
}
TEST(MeasureTimeBetweenTest, AnchorsBeginEnd) {
std::vector<TimeBetweenSpec> specs = {
TimeBetweenSpec({42u,
{"first_event", "category_foo"},
Anchor::End,
{"second_event", "category_foo"},
Anchor::Begin})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::DurationBegin("first_event", "category_foo", 1u));
measure.Process(test::DurationEnd("first_event", "category_foo", 3u));
measure.Process(test::DurationBegin("second_event", "category_foo", 4u));
measure.Process(test::DurationEnd("second_event", "category_foo", 8u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({1u}), results[42u]);
}
TEST(MeasureTimeBetweenTest, AnchorsSameEvent) {
std::vector<TimeBetweenSpec> specs = {
TimeBetweenSpec({42u,
{"bar", "category_foo"},
Anchor::End,
{"bar", "category_foo"},
Anchor::Begin})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::DurationBegin("bar", "category_foo", 1u));
measure.Process(test::DurationEnd("bar", "category_foo", 3u));
measure.Process(test::DurationBegin("bar", "category_foo", 4u));
measure.Process(test::DurationEnd("bar", "category_foo", 8u));
measure.Process(test::DurationBegin("bar", "category_foo", 16u));
measure.Process(test::DurationEnd("bar", "category_foo", 20u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({1u, 8u}), results[42u]);
}
TEST(MeasureTimeBetweenTest, AnchorsSameEventCompleteEndToBegin) {
std::vector<TimeBetweenSpec> specs = {
TimeBetweenSpec({42u,
{"bar", "category_foo"},
Anchor::End,
{"bar", "category_foo"},
Anchor::Begin})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::DurationComplete("bar", "category_foo", 1u, 3u));
measure.Process(test::DurationComplete("bar", "category_foo", 4u, 8u));
measure.Process(test::DurationComplete("bar", "category_foo", 16u, 20u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({1u, 8u}), results[42u]);
}
TEST(MeasureTimeBetweenTest, AnchorsSameEventCompleteBeginToEnd) {
std::vector<TimeBetweenSpec> specs = {
TimeBetweenSpec({42u,
{"bar", "category_foo"},
Anchor::Begin,
{"bar", "category_foo"},
Anchor::End})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::DurationComplete("bar", "category_foo", 1u, 3u));
measure.Process(test::DurationComplete("bar", "category_foo", 4u, 8u));
measure.Process(test::DurationComplete("bar", "category_foo", 16u, 20u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({7u, 16u}), results[42u]);
}
TEST(MeasureTimeBetweenTest, AsyncAndFlow) {
std::vector<TimeBetweenSpec> specs = {TimeBetweenSpec({42u,
{"bar", "async_event"},
Anchor::End,
{"bar", "flow_event"},
Anchor::Begin})};
MeasureTimeBetween measure(std::move(specs));
measure.Process(test::AsyncBegin(1000u, "bar", "async_event", 1u));
measure.Process(test::AsyncEnd(1000u, "bar", "async_event", 5u));
measure.Process(test::FlowBegin(1001u, "bar", "flow_event", 7u));
measure.Process(test::FlowEnd(1001u, "bar", "flow_event", 10u));
auto results = measure.results();
EXPECT_EQ(1u, results.size());
EXPECT_EQ(std::vector<uint64_t>({2u}), results[42u]);
}
} // namespace
} // namespace measure
} // namespace tracing