1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/test/scoped_mock_clock_override.h"
6
7 #include "base/build_time.h"
8 #include "base/time/time.h"
9 #include "build/build_config.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace base {
13
14 namespace {
15
16 // Disabled on Android due to flakes; see https://crbug.com/1474884.
17 #if BUILDFLAG(IS_ANDROID)
18 #define MAYBE_Time DISABLED_Time
19 #else
20 #define MAYBE_Time Time
21 #endif
TEST(ScopedMockClockOverrideTest,MAYBE_Time)22 TEST(ScopedMockClockOverrideTest, MAYBE_Time) {
23 // Choose a reference time that we know to be in the past but close to now.
24 Time build_time = GetBuildTime();
25
26 // Override is not active. All Now() methods should return a time greater than
27 // the build time.
28 EXPECT_LT(build_time, Time::Now());
29 EXPECT_GT(Time::Max(), Time::Now());
30 EXPECT_LT(build_time, Time::NowFromSystemTime());
31 EXPECT_GT(Time::Max(), Time::NowFromSystemTime());
32
33 {
34 // Set override.
35 ScopedMockClockOverride mock_clock;
36
37 EXPECT_NE(Time(), Time::Now());
38 Time start = Time::Now();
39 mock_clock.Advance(Seconds(1));
40 EXPECT_EQ(start + Seconds(1), Time::Now());
41 }
42
43 // All methods return real time again.
44 EXPECT_LT(build_time, Time::Now());
45 EXPECT_GT(Time::Max(), Time::Now());
46 EXPECT_LT(build_time, Time::NowFromSystemTime());
47 EXPECT_GT(Time::Max(), Time::NowFromSystemTime());
48 }
49
TEST(ScopedMockClockOverrideTest,TimeTicks)50 TEST(ScopedMockClockOverrideTest, TimeTicks) {
51 // Override is not active. All Now() methods should return a sensible value.
52 EXPECT_LT(TimeTicks::UnixEpoch(), TimeTicks::Now());
53 EXPECT_GT(TimeTicks::Max(), TimeTicks::Now());
54 EXPECT_LT(TimeTicks::UnixEpoch() + Days(365), TimeTicks::Now());
55
56 {
57 // Set override.
58 ScopedMockClockOverride mock_clock;
59
60 EXPECT_NE(TimeTicks(), TimeTicks::Now());
61 TimeTicks start = TimeTicks::Now();
62 mock_clock.Advance(Seconds(1));
63 EXPECT_EQ(start + Seconds(1), TimeTicks::Now());
64 }
65
66 // All methods return real ticks again.
67 EXPECT_LT(TimeTicks::UnixEpoch(), TimeTicks::Now());
68 EXPECT_GT(TimeTicks::Max(), TimeTicks::Now());
69 EXPECT_LT(TimeTicks::UnixEpoch() + Days(365), TimeTicks::Now());
70 }
71
TEST(ScopedMockClockOverrideTest,ThreadTicks)72 TEST(ScopedMockClockOverrideTest, ThreadTicks) {
73 if (ThreadTicks::IsSupported()) {
74 ThreadTicks::WaitUntilInitialized();
75
76 // Override is not active. All Now() methods should return a sensible value.
77 ThreadTicks initial_thread_ticks = ThreadTicks::Now();
78 EXPECT_LE(initial_thread_ticks, ThreadTicks::Now());
79 EXPECT_GT(ThreadTicks::Max(), ThreadTicks::Now());
80 EXPECT_LT(ThreadTicks(), ThreadTicks::Now());
81
82 {
83 // Set override.
84 ScopedMockClockOverride mock_clock;
85
86 EXPECT_NE(ThreadTicks(), ThreadTicks::Now());
87 ThreadTicks start = ThreadTicks::Now();
88 mock_clock.Advance(Seconds(1));
89 EXPECT_EQ(start + Seconds(1), ThreadTicks::Now());
90 }
91
92 // All methods return real ticks again.
93 EXPECT_LE(initial_thread_ticks, ThreadTicks::Now());
94 EXPECT_GT(ThreadTicks::Max(), ThreadTicks::Now());
95 EXPECT_LT(ThreadTicks(), ThreadTicks::Now());
96 }
97 }
98
99 } // namespace
100
101 } // namespace base
102