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