xref: /aosp_15_r20/external/cronet/base/timer/elapsed_timer_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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