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

#include "base/timer/elapsed_timer.h"

#include "base/threading/platform_thread.h"
#include "base/time/time.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace base {

namespace {

constexpr TimeDelta kSleepDuration = Milliseconds(20);
}

TEST(ElapsedTimerTest, Simple) {
  ElapsedTimer timer;

  PlatformThread::Sleep(kSleepDuration);
  EXPECT_GE(timer.Elapsed(), kSleepDuration);

  // Can call |Elapsed()| multiple times.
  PlatformThread::Sleep(kSleepDuration);
  EXPECT_GE(timer.Elapsed(), 2 * kSleepDuration);
}

TEST(ElapsedTimerTest, Mocked) {
  ScopedMockElapsedTimersForTest mock_elapsed_timer;

  ElapsedTimer timer;
  EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);

  // Real-time doesn't matter.
  PlatformThread::Sleep(kSleepDuration);
  EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);
}

class ElapsedThreadTimerTest : public ::testing::Test {
 protected:
  void SetUp() override {
    if (ThreadTicks::IsSupported())
      ThreadTicks::WaitUntilInitialized();
  }
};

TEST_F(ElapsedThreadTimerTest, IsSupported) {
  ElapsedThreadTimer timer;
  if (!ThreadTicks::IsSupported()) {
    EXPECT_FALSE(timer.is_supported());
    EXPECT_EQ(TimeDelta(), timer.Elapsed());
  } else {
    EXPECT_TRUE(timer.is_supported());
  }
}

TEST_F(ElapsedThreadTimerTest, Simple) {
  if (!ThreadTicks::IsSupported())
    return;

  ElapsedThreadTimer timer;
  EXPECT_TRUE(timer.is_supported());

  // 1ms of work.
  constexpr TimeDelta kLoopingTime = Milliseconds(1);
  const ThreadTicks start_ticks = ThreadTicks::Now();
  while (ThreadTicks::Now() - start_ticks < kLoopingTime) {
  }

  EXPECT_GE(timer.Elapsed(), kLoopingTime);
}

TEST_F(ElapsedThreadTimerTest, DoesNotCountSleep) {
  if (!ThreadTicks::IsSupported())
    return;

  ElapsedThreadTimer timer;
  EXPECT_TRUE(timer.is_supported());

  PlatformThread::Sleep(kSleepDuration);
  // Sleep time is not accounted for.
  EXPECT_LT(timer.Elapsed(), kSleepDuration);
}

TEST_F(ElapsedThreadTimerTest, Mocked) {
  if (!ThreadTicks::IsSupported())
    return;

  ScopedMockElapsedTimersForTest mock_elapsed_timer;

  ElapsedThreadTimer timer;
  EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);

  // Real-time doesn't matter.
  PlatformThread::Sleep(kSleepDuration);
  EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);
}

}  // namespace base
