// 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
