// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "perf_test_helpers.h"

#include <algorithm>

#include "base/check.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/perf/perf_result_reporter.h"

namespace tracing {

namespace {

perf_test::PerfResultReporter SetUpReporter(const std::string& metric) {
  CHECK(::testing::UnitTest::GetInstance() != nullptr) << "Must be GTest.";
  const ::testing::TestInfo* test_info =
      ::testing::UnitTest::GetInstance()->current_test_info();
  CHECK(test_info != nullptr) << "Must be GTest.";

  perf_test::PerfResultReporter reporter(
      std::string(test_info->test_suite_name()) + ".", test_info->name());
  reporter.RegisterImportantMetric(metric, "ms");
  return reporter;
}

}  // namespace

ScopedStopwatch::ScopedStopwatch(const std::string& metric) : metric_(metric) {
  begin_= base::TimeTicks::Now();
}

ScopedStopwatch::~ScopedStopwatch() {
  base::TimeDelta value = base::TimeTicks::Now() - begin_;
  SetUpReporter(metric_).AddResult(metric_, value);
}

IterableStopwatch::IterableStopwatch(const std::string& metric)
    : metric_(metric) {
  begin_ = base::TimeTicks::Now();
}

void IterableStopwatch::NextLap() {
  base::TimeTicks now = base::TimeTicks::Now();
  double elapsed = (now - begin_).InMillisecondsF();
  begin_ = now;
  laps_.push_back(elapsed);
}

IterableStopwatch::~IterableStopwatch() {
  CHECK(!laps_.empty());
  std::sort(laps_.begin(), laps_.end());
  double median = laps_.at(laps_.size() / 2);
  SetUpReporter(metric_).AddResult(metric_, median);
}

}  // namespace tracing
