1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/network_time/network_time_tracker.h"
9 #include "base/compiler_specific.h"
10 #include "base/prefs/testing_pref_service.h"
11 #include "base/time/tick_clock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
14 namespace network_time
{
18 // These are all in milliseconds.
19 const int64 kLatency1
= 50;
20 const int64 kLatency2
= 500;
22 // Can not be smaller than 15, it's the NowFromSystemTime() resolution.
23 const int64 kResolution1
= 17;
24 const int64 kResolution2
= 177;
26 const int64 kPseudoSleepTime1
= 500000001;
27 const int64 kPseudoSleepTime2
= 1888;
29 // A custom tick clock that will return an arbitrary time.
30 class TestTickClock
: public base::TickClock
{
32 explicit TestTickClock(base::TimeTicks
* ticks_now
) : ticks_now_(ticks_now
) {}
33 ~TestTickClock() override
{}
35 base::TimeTicks
NowTicks() override
{ return *ticks_now_
; }
38 base::TimeTicks
* ticks_now_
;
43 class NetworkTimeTrackerTest
: public testing::Test
{
45 ~NetworkTimeTrackerTest() override
{}
47 void SetUp() override
{
48 NetworkTimeTracker::RegisterPrefs(pref_service_
.registry());
50 now_
= base::Time::NowFromSystemTime();
51 network_time_tracker_
.reset(new NetworkTimeTracker(
52 scoped_ptr
<base::TickClock
>(new TestTickClock(&ticks_now_
)),
56 base::Time
Now() const {
57 return now_
+ (ticks_now_
- base::TimeTicks());
60 base::TimeTicks
TicksNow() const {
64 void AddToTicksNow(int64 ms
) {
65 ticks_now_
+= base::TimeDelta::FromMilliseconds(ms
);
68 // Updates the notifier's time with the specified parameters.
69 void UpdateNetworkTime(const base::Time
& network_time
,
70 const base::TimeDelta
& resolution
,
71 const base::TimeDelta
& latency
,
72 const base::TimeTicks
& post_time
) {
73 network_time_tracker_
->UpdateNetworkTime(
74 network_time
, resolution
, latency
, post_time
);
77 // Ensures the network time tracker has a network time and that the
78 // disparity between the network time version of |ticks_now_| and the actual
79 // |ticks_now_| value is within the uncertainty (should always be true
80 // because the network time notifier uses |ticks_now_| for the tick clock).
81 testing::AssertionResult
ValidateExpectedTime() const {
82 base::Time network_time
;
83 base::TimeDelta uncertainty
;
84 if (!network_time_tracker_
->GetNetworkTime(TicksNow(),
87 return testing::AssertionFailure() << "Failed to get network time.";
88 if (fabs(static_cast<double>(Now().ToInternalValue() -
89 network_time
.ToInternalValue())) >
90 static_cast<double>(uncertainty
.ToInternalValue())) {
91 return testing::AssertionFailure()
92 << "Expected network time not within uncertainty.";
94 return testing::AssertionSuccess();
97 NetworkTimeTracker
* network_time_tracker() {
98 return network_time_tracker_
.get();
102 // Used in building the current time that TestTickClock reports. See Now()
105 base::TimeTicks ticks_now_
;
107 TestingPrefServiceSimple pref_service_
;
109 // The network time tracker being tested.
110 scoped_ptr
<NetworkTimeTracker
> network_time_tracker_
;
113 // Should not return a value before UpdateNetworkTime gets called.
114 TEST_F(NetworkTimeTrackerTest
, Uninitialized
) {
115 base::Time network_time
;
116 base::TimeDelta uncertainty
;
117 EXPECT_FALSE(network_time_tracker()->GetNetworkTime(base::TimeTicks(),
122 // Verify that the the tracker receives and properly handles updates to the
124 TEST_F(NetworkTimeTrackerTest
, NetworkTimeUpdates
) {
127 base::TimeDelta::FromMilliseconds(kResolution1
),
128 base::TimeDelta::FromMilliseconds(kLatency1
),
130 EXPECT_TRUE(ValidateExpectedTime());
132 // Fake a wait for kPseudoSleepTime1 to make sure we keep tracking.
133 AddToTicksNow(kPseudoSleepTime1
);
134 EXPECT_TRUE(ValidateExpectedTime());
136 // Update the time with a new now value and kLatency2.
139 base::TimeDelta::FromMilliseconds(kResolution2
),
140 base::TimeDelta::FromMilliseconds(kLatency2
),
143 // Fake a wait for kPseudoSleepTime2 to make sure we keep tracking still.
144 AddToTicksNow(kPseudoSleepTime2
);
145 EXPECT_TRUE(ValidateExpectedTime());
147 // Fake a long delay between update task post time and the network notifier
148 // updating its network time. The uncertainty should account for the
150 base::Time old_now
= Now();
151 base::TimeTicks old_ticks
= TicksNow();
152 AddToTicksNow(kPseudoSleepTime2
);
155 base::TimeDelta::FromMilliseconds(kResolution2
),
156 base::TimeDelta::FromMilliseconds(kLatency2
),
158 EXPECT_TRUE(ValidateExpectedTime());
161 } // namespace network_time