1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/timer/elapsed_timer.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
9*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker namespace base {
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker constexpr TimeDelta kSleepDuration = Milliseconds(20);
16*6777b538SAndroid Build Coastguard Worker }
17*6777b538SAndroid Build Coastguard Worker
TEST(ElapsedTimerTest,Simple)18*6777b538SAndroid Build Coastguard Worker TEST(ElapsedTimerTest, Simple) {
19*6777b538SAndroid Build Coastguard Worker ElapsedTimer timer;
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker PlatformThread::Sleep(kSleepDuration);
22*6777b538SAndroid Build Coastguard Worker EXPECT_GE(timer.Elapsed(), kSleepDuration);
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker // Can call |Elapsed()| multiple times.
25*6777b538SAndroid Build Coastguard Worker PlatformThread::Sleep(kSleepDuration);
26*6777b538SAndroid Build Coastguard Worker EXPECT_GE(timer.Elapsed(), 2 * kSleepDuration);
27*6777b538SAndroid Build Coastguard Worker }
28*6777b538SAndroid Build Coastguard Worker
TEST(ElapsedTimerTest,Mocked)29*6777b538SAndroid Build Coastguard Worker TEST(ElapsedTimerTest, Mocked) {
30*6777b538SAndroid Build Coastguard Worker ScopedMockElapsedTimersForTest mock_elapsed_timer;
31*6777b538SAndroid Build Coastguard Worker
32*6777b538SAndroid Build Coastguard Worker ElapsedTimer timer;
33*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker // Real-time doesn't matter.
36*6777b538SAndroid Build Coastguard Worker PlatformThread::Sleep(kSleepDuration);
37*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker
40*6777b538SAndroid Build Coastguard Worker class ElapsedThreadTimerTest : public ::testing::Test {
41*6777b538SAndroid Build Coastguard Worker protected:
SetUp()42*6777b538SAndroid Build Coastguard Worker void SetUp() override {
43*6777b538SAndroid Build Coastguard Worker if (ThreadTicks::IsSupported())
44*6777b538SAndroid Build Coastguard Worker ThreadTicks::WaitUntilInitialized();
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker };
47*6777b538SAndroid Build Coastguard Worker
TEST_F(ElapsedThreadTimerTest,IsSupported)48*6777b538SAndroid Build Coastguard Worker TEST_F(ElapsedThreadTimerTest, IsSupported) {
49*6777b538SAndroid Build Coastguard Worker ElapsedThreadTimer timer;
50*6777b538SAndroid Build Coastguard Worker if (!ThreadTicks::IsSupported()) {
51*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(timer.is_supported());
52*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(TimeDelta(), timer.Elapsed());
53*6777b538SAndroid Build Coastguard Worker } else {
54*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.is_supported());
55*6777b538SAndroid Build Coastguard Worker }
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker
TEST_F(ElapsedThreadTimerTest,Simple)58*6777b538SAndroid Build Coastguard Worker TEST_F(ElapsedThreadTimerTest, Simple) {
59*6777b538SAndroid Build Coastguard Worker if (!ThreadTicks::IsSupported())
60*6777b538SAndroid Build Coastguard Worker return;
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker ElapsedThreadTimer timer;
63*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.is_supported());
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker // 1ms of work.
66*6777b538SAndroid Build Coastguard Worker constexpr TimeDelta kLoopingTime = Milliseconds(1);
67*6777b538SAndroid Build Coastguard Worker const ThreadTicks start_ticks = ThreadTicks::Now();
68*6777b538SAndroid Build Coastguard Worker while (ThreadTicks::Now() - start_ticks < kLoopingTime) {
69*6777b538SAndroid Build Coastguard Worker }
70*6777b538SAndroid Build Coastguard Worker
71*6777b538SAndroid Build Coastguard Worker EXPECT_GE(timer.Elapsed(), kLoopingTime);
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker
TEST_F(ElapsedThreadTimerTest,DoesNotCountSleep)74*6777b538SAndroid Build Coastguard Worker TEST_F(ElapsedThreadTimerTest, DoesNotCountSleep) {
75*6777b538SAndroid Build Coastguard Worker if (!ThreadTicks::IsSupported())
76*6777b538SAndroid Build Coastguard Worker return;
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker ElapsedThreadTimer timer;
79*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(timer.is_supported());
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker PlatformThread::Sleep(kSleepDuration);
82*6777b538SAndroid Build Coastguard Worker // Sleep time is not accounted for.
83*6777b538SAndroid Build Coastguard Worker EXPECT_LT(timer.Elapsed(), kSleepDuration);
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker
TEST_F(ElapsedThreadTimerTest,Mocked)86*6777b538SAndroid Build Coastguard Worker TEST_F(ElapsedThreadTimerTest, Mocked) {
87*6777b538SAndroid Build Coastguard Worker if (!ThreadTicks::IsSupported())
88*6777b538SAndroid Build Coastguard Worker return;
89*6777b538SAndroid Build Coastguard Worker
90*6777b538SAndroid Build Coastguard Worker ScopedMockElapsedTimersForTest mock_elapsed_timer;
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker ElapsedThreadTimer timer;
93*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker // Real-time doesn't matter.
96*6777b538SAndroid Build Coastguard Worker PlatformThread::Sleep(kSleepDuration);
97*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(timer.Elapsed(), ScopedMockElapsedTimersForTest::kMockElapsedTime);
98*6777b538SAndroid Build Coastguard Worker }
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker } // namespace base
101