OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/network_time/network_time_tracker.h" | 5 #include "components/network_time/network_time_tracker.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | |
8 | 9 |
9 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
11 #include "base/message_loop/message_loop.h" | |
12 #include "base/strings/stringprintf.h" | |
10 #include "base/test/simple_test_clock.h" | 13 #include "base/test/simple_test_clock.h" |
11 #include "base/test/simple_test_tick_clock.h" | 14 #include "base/test/simple_test_tick_clock.h" |
15 #include "components/client_update_protocol/ecdsa.h" | |
12 #include "components/network_time/network_time_pref_names.h" | 16 #include "components/network_time/network_time_pref_names.h" |
13 #include "components/prefs/testing_pref_service.h" | 17 #include "components/prefs/testing_pref_service.h" |
18 #include "net/http/http_response_headers.h" | |
19 #include "net/test/embedded_test_server/embedded_test_server.h" | |
20 #include "net/test/embedded_test_server/http_response.h" | |
21 #include "net/url_request/url_fetcher.h" | |
22 #include "net/url_request/url_request_test_util.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | 23 #include "testing/gtest/include/gtest/gtest.h" |
15 | 24 |
16 namespace network_time { | 25 namespace network_time { |
17 | 26 |
18 class NetworkTimeTrackerTest : public testing::Test { | 27 class NetworkTimeTrackerTest : public testing::Test { |
19 public: | 28 public: |
20 ~NetworkTimeTrackerTest() override {} | 29 ~NetworkTimeTrackerTest() override {} |
21 | 30 |
22 void SetUp() override { | 31 NetworkTimeTrackerTest() |
32 : io_thread_("IO thread"), | |
33 clock_(new base::SimpleTestClock), | |
34 tick_clock_(new base::SimpleTestTickClock), | |
35 test_server_(new net::EmbeddedTestServer) { | |
36 base::Thread::Options thread_options; | |
37 thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | |
38 EXPECT_TRUE(io_thread_.StartWithOptions(thread_options)); | |
23 NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); | 39 NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); |
24 | 40 |
25 clock_ = new base::SimpleTestClock(); | 41 tracker_.reset(new NetworkTimeTracker( |
26 tick_clock_ = new base::SimpleTestTickClock(); | 42 std::unique_ptr<base::Clock>(clock_), |
43 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, | |
44 new net::TestURLRequestContextGetter(io_thread_.task_runner()))); | |
45 | |
27 // Do this to be sure that |is_null| returns false. | 46 // Do this to be sure that |is_null| returns false. |
28 clock_->Advance(base::TimeDelta::FromDays(111)); | 47 clock_->Advance(base::TimeDelta::FromDays(111)); |
29 tick_clock_->Advance(base::TimeDelta::FromDays(222)); | 48 tick_clock_->Advance(base::TimeDelta::FromDays(222)); |
30 | 49 |
31 tracker_.reset(new NetworkTimeTracker( | |
32 std::unique_ptr<base::Clock>(clock_), | |
33 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_)); | |
34 | |
35 // Can not be smaller than 15, it's the NowFromSystemTime() resolution. | 50 // Can not be smaller than 15, it's the NowFromSystemTime() resolution. |
36 resolution_ = base::TimeDelta::FromMilliseconds(17); | 51 resolution_ = base::TimeDelta::FromMilliseconds(17); |
37 latency_ = base::TimeDelta::FromMilliseconds(50); | 52 latency_ = base::TimeDelta::FromMilliseconds(50); |
38 adjustment_ = 7 * base::TimeDelta::FromMilliseconds(kTicksResolutionMs); | 53 adjustment_ = 7 * base::TimeDelta::FromMilliseconds(kTicksResolutionMs); |
39 } | 54 } |
40 | 55 |
56 void TearDown() override { | |
57 if (test_server_->Started()) { | |
58 ASSERT_TRUE(test_server_->ShutdownAndWaitUntilComplete()); | |
59 } | |
mmenke
2016/05/02 17:47:28
This isn't needed - the test server will shut itse
mab
2016/05/05 19:57:42
Done.
| |
60 io_thread_.Stop(); | |
61 } | |
62 | |
63 void WaitForFetch(uint32_t nonce) { | |
64 tracker_->query_signer_->OverrideNonceForTesting(1 /* key version */, | |
65 nonce); | |
66 while (tracker_->time_fetcher_) { | |
67 base::MessageLoop::current()->RunUntilIdle(); | |
mmenke
2016/05/02 17:47:28
This works, but repeatedly spinning up a runloop w
mab
2016/05/05 19:57:42
Modification of prefs is an incidental effect of a
mmenke
2016/05/06 15:00:37
SGTM
mab
2016/05/06 18:12:37
I ended up doing this by simply passing in the Mes
| |
68 } | |
69 } | |
70 | |
41 // Replaces |tracker_| with a new object, while preserving the | 71 // Replaces |tracker_| with a new object, while preserving the |
42 // testing clocks. | 72 // testing clocks. |
43 void Reset() { | 73 void Reset() { |
44 base::SimpleTestClock* new_clock = new base::SimpleTestClock(); | 74 base::SimpleTestClock* new_clock = new base::SimpleTestClock(); |
45 new_clock->SetNow(clock_->Now()); | 75 new_clock->SetNow(clock_->Now()); |
46 base::SimpleTestTickClock* new_tick_clock = new base::SimpleTestTickClock(); | 76 base::SimpleTestTickClock* new_tick_clock = new base::SimpleTestTickClock(); |
47 new_tick_clock->SetNowTicks(tick_clock_->NowTicks()); | 77 new_tick_clock->SetNowTicks(tick_clock_->NowTicks()); |
48 clock_ = new_clock; | 78 clock_ = new_clock; |
49 tick_clock_= new_tick_clock; | 79 tick_clock_= new_tick_clock; |
50 tracker_.reset(new NetworkTimeTracker( | 80 tracker_.reset(new NetworkTimeTracker( |
51 std::unique_ptr<base::Clock>(clock_), | 81 std::unique_ptr<base::Clock>(clock_), |
52 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_)); | 82 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, |
83 new net::TestURLRequestContextGetter(io_thread_.task_runner()))); | |
84 } | |
85 | |
86 // Returns a valid time response. Update as follows: | |
87 // | |
88 // curl http://clients2.google.com/time/1/current?cup2key=1:123123123 | |
89 // | |
90 // where 1 is the key version and 123123123 is the nonce. Copy the nonce, the | |
91 // response, and the x-cup-server-proof header into the test. | |
92 static std::unique_ptr<net::test_server::HttpResponse> | |
93 GoodTimeResponseHandler(const net::test_server::HttpRequest& request) { | |
94 net::test_server::BasicHttpResponse* response = | |
95 new net::test_server::BasicHttpResponse(); | |
96 response->set_code(net::HTTP_OK); | |
97 response->set_content( | |
98 ")]}'\n" | |
99 "{\"current_time_millis\":1461621971825,\"server_nonce\":-6." | |
100 "006853099049523E85}"); | |
101 response->AddCustomHeader( | |
102 "x-cup-server-proof", | |
103 "304402202e0f24db1ea69f1bbe81da4108f381fcf7a2781c53cf7663cb47083cb5fe8e" | |
104 "fd" | |
105 "022009d2b67c0deceaaf849f7c529be96701ed5f15d5efcaf401a94e0801accc9832:" | |
106 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); | |
107 return std::unique_ptr<net::test_server::HttpResponse>(response); | |
108 } | |
109 | |
110 static std::unique_ptr<net::test_server::HttpResponse> | |
111 BadSignatureResponseHandler(const net::test_server::HttpRequest& request) { | |
112 net::test_server::BasicHttpResponse* response = | |
113 new net::test_server::BasicHttpResponse(); | |
114 response->set_code(net::HTTP_OK); | |
115 response->set_content("foo"); | |
116 response->AddCustomHeader("x-cup-server-proof", "dead:beef"); | |
117 return std::unique_ptr<net::test_server::HttpResponse>(response); | |
118 } | |
119 | |
120 static std::unique_ptr<net::test_server::HttpResponse> ErrorResponseHandler( | |
121 const net::test_server::HttpRequest& request) { | |
122 net::test_server::BasicHttpResponse* response = | |
123 new net::test_server::BasicHttpResponse(); | |
124 response->set_code(net::HTTP_INTERNAL_SERVER_ERROR); | |
125 return std::unique_ptr<net::test_server::HttpResponse>(response); | |
53 } | 126 } |
mmenke
2016/05/02 17:47:28
You should also test a network error (Response has
mab
2016/05/05 19:57:42
Done.
| |
54 | 127 |
55 // Updates the notifier's time with the specified parameters. | 128 // Updates the notifier's time with the specified parameters. |
56 void UpdateNetworkTime(const base::Time& network_time, | 129 void UpdateNetworkTime(const base::Time& network_time, |
57 const base::TimeDelta& resolution, | 130 const base::TimeDelta& resolution, |
58 const base::TimeDelta& latency, | 131 const base::TimeDelta& latency, |
59 const base::TimeTicks& post_time) { | 132 const base::TimeTicks& post_time) { |
60 tracker_->UpdateNetworkTime( | 133 tracker_->UpdateNetworkTime( |
61 network_time, resolution, latency, post_time); | 134 network_time, resolution, latency, post_time); |
62 } | 135 } |
63 | 136 |
64 // Advances both the system clock and the tick clock. This should be used for | 137 // Advances both the system clock and the tick clock. This should be used for |
65 // the normal passage of time, i.e. when neither clock is doing anything odd. | 138 // the normal passage of time, i.e. when neither clock is doing anything odd. |
66 void AdvanceBoth(const base::TimeDelta& delta) { | 139 void AdvanceBoth(const base::TimeDelta& delta) { |
67 tick_clock_->Advance(delta); | 140 tick_clock_->Advance(delta); |
68 clock_->Advance(delta); | 141 clock_->Advance(delta); |
69 } | 142 } |
70 | 143 |
71 protected: | 144 protected: |
145 base::Thread io_thread_; | |
146 base::MessageLoop message_loop_; | |
72 base::TimeDelta resolution_; | 147 base::TimeDelta resolution_; |
73 base::TimeDelta latency_; | 148 base::TimeDelta latency_; |
74 base::TimeDelta adjustment_; | 149 base::TimeDelta adjustment_; |
75 base::SimpleTestClock* clock_; | 150 base::SimpleTestClock* clock_; |
76 base::SimpleTestTickClock* tick_clock_; | 151 base::SimpleTestTickClock* tick_clock_; |
77 TestingPrefServiceSimple pref_service_; | 152 TestingPrefServiceSimple pref_service_; |
78 std::unique_ptr<NetworkTimeTracker> tracker_; | 153 std::unique_ptr<NetworkTimeTracker> tracker_; |
154 std::unique_ptr<net::EmbeddedTestServer> test_server_; | |
79 }; | 155 }; |
80 | 156 |
81 TEST_F(NetworkTimeTrackerTest, Uninitialized) { | 157 TEST_F(NetworkTimeTrackerTest, Uninitialized) { |
82 base::Time network_time; | 158 base::Time network_time; |
83 base::TimeDelta uncertainty; | 159 base::TimeDelta uncertainty; |
84 EXPECT_FALSE(tracker_->GetNetworkTime(&network_time, &uncertainty)); | 160 EXPECT_FALSE(tracker_->GetNetworkTime(&network_time, &uncertainty)); |
85 } | 161 } |
86 | 162 |
87 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) { | 163 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) { |
88 // The request arrives at the server, which records the time. Advance the | 164 // The request arrives at the server, which records the time. Advance the |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
124 EXPECT_GT(out_network_time + uncertainty / 2, clock_->Now()); | 200 EXPECT_GT(out_network_time + uncertainty / 2, clock_->Now()); |
125 } | 201 } |
126 | 202 |
127 TEST_F(NetworkTimeTrackerTest, ClockIsWack) { | 203 TEST_F(NetworkTimeTrackerTest, ClockIsWack) { |
128 // Now let's assume the system clock is completely wrong. | 204 // Now let's assume the system clock is completely wrong. |
129 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); | 205 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); |
130 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, | 206 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, |
131 tick_clock_->NowTicks()); | 207 tick_clock_->NowTicks()); |
132 | 208 |
133 base::Time out_network_time; | 209 base::Time out_network_time; |
134 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 210 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
135 EXPECT_EQ(in_network_time, out_network_time); | 211 EXPECT_EQ(in_network_time, out_network_time); |
136 } | 212 } |
137 | 213 |
138 TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) { | 214 TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) { |
139 // The two clocks are allowed to diverge a little bit. | 215 // The two clocks are allowed to diverge a little bit. |
140 base::Time in_network_time = clock_->Now(); | 216 base::Time in_network_time = clock_->Now(); |
141 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, | 217 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, |
142 tick_clock_->NowTicks()); | 218 tick_clock_->NowTicks()); |
143 | 219 |
144 base::TimeDelta small = base::TimeDelta::FromSeconds(30); | 220 base::TimeDelta small = base::TimeDelta::FromSeconds(30); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
178 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); | 254 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); |
179 } | 255 } |
180 | 256 |
181 TEST_F(NetworkTimeTrackerTest, SpringForward) { | 257 TEST_F(NetworkTimeTrackerTest, SpringForward) { |
182 // Simulate the wall clock advancing faster than the tick clock. | 258 // Simulate the wall clock advancing faster than the tick clock. |
183 UpdateNetworkTime(clock_->Now(), resolution_, latency_, | 259 UpdateNetworkTime(clock_->Now(), resolution_, latency_, |
184 tick_clock_->NowTicks()); | 260 tick_clock_->NowTicks()); |
185 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); | 261 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
186 clock_->Advance(base::TimeDelta::FromDays(1)); | 262 clock_->Advance(base::TimeDelta::FromDays(1)); |
187 base::Time out_network_time; | 263 base::Time out_network_time; |
188 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 264 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
189 } | 265 } |
190 | 266 |
191 TEST_F(NetworkTimeTrackerTest, FallBack) { | 267 TEST_F(NetworkTimeTrackerTest, FallBack) { |
192 // Simulate the wall clock running backward. | 268 // Simulate the wall clock running backward. |
193 UpdateNetworkTime(clock_->Now(), resolution_, latency_, | 269 UpdateNetworkTime(clock_->Now(), resolution_, latency_, |
194 tick_clock_->NowTicks()); | 270 tick_clock_->NowTicks()); |
195 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); | 271 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); |
196 clock_->Advance(base::TimeDelta::FromDays(-1)); | 272 clock_->Advance(base::TimeDelta::FromDays(-1)); |
197 base::Time out_network_time; | 273 base::Time out_network_time; |
198 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 274 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
199 } | 275 } |
200 | 276 |
201 TEST_F(NetworkTimeTrackerTest, SuspendAndResume) { | 277 TEST_F(NetworkTimeTrackerTest, SuspendAndResume) { |
202 // Simulate the wall clock advancing while the tick clock stands still, as | 278 // Simulate the wall clock advancing while the tick clock stands still, as |
203 // would happen in a suspend+resume cycle. | 279 // would happen in a suspend+resume cycle. |
204 UpdateNetworkTime(clock_->Now(), resolution_, latency_, | 280 UpdateNetworkTime(clock_->Now(), resolution_, latency_, |
205 tick_clock_->NowTicks()); | 281 tick_clock_->NowTicks()); |
206 clock_->Advance(base::TimeDelta::FromHours(1)); | 282 clock_->Advance(base::TimeDelta::FromHours(1)); |
207 base::Time out_network_time; | 283 base::Time out_network_time; |
208 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 284 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
209 } | 285 } |
210 | 286 |
211 TEST_F(NetworkTimeTrackerTest, Serialize) { | 287 TEST_F(NetworkTimeTrackerTest, Serialize) { |
212 // Test that we can serialize and deserialize state and get consistent | 288 // Test that we can serialize and deserialize state and get consistent |
213 // results. | 289 // results. |
214 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); | 290 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); |
215 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, | 291 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, |
216 tick_clock_->NowTicks()); | 292 tick_clock_->NowTicks()); |
217 base::Time out_network_time; | 293 base::Time out_network_time; |
218 base::TimeDelta out_uncertainty; | 294 base::TimeDelta out_uncertainty; |
(...skipping 11 matching lines...) Expand all Loading... | |
230 } | 306 } |
231 | 307 |
232 TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) { | 308 TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) { |
233 // Test that deserializing old data (which do not record the uncertainty and | 309 // Test that deserializing old data (which do not record the uncertainty and |
234 // tick clock) causes the serialized data to be ignored. | 310 // tick clock) causes the serialized data to be ignored. |
235 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); | 311 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); |
236 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, | 312 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, |
237 tick_clock_->NowTicks()); | 313 tick_clock_->NowTicks()); |
238 | 314 |
239 base::Time out_network_time; | 315 base::Time out_network_time; |
240 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 316 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
241 double local, network; | 317 double local, network; |
242 const base::DictionaryValue* saved_prefs = | 318 const base::DictionaryValue* saved_prefs = |
243 pref_service_.GetDictionary(prefs::kNetworkTimeMapping); | 319 pref_service_.GetDictionary(prefs::kNetworkTimeMapping); |
244 saved_prefs->GetDouble("local", &local); | 320 saved_prefs->GetDouble("local", &local); |
245 saved_prefs->GetDouble("network", &network); | 321 saved_prefs->GetDouble("network", &network); |
246 base::DictionaryValue prefs; | 322 base::DictionaryValue prefs; |
247 prefs.SetDouble("local", local); | 323 prefs.SetDouble("local", local); |
248 prefs.SetDouble("network", network); | 324 prefs.SetDouble("network", network); |
249 pref_service_.Set(prefs::kNetworkTimeMapping, prefs); | 325 pref_service_.Set(prefs::kNetworkTimeMapping, prefs); |
250 Reset(); | 326 Reset(); |
251 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 327 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
252 } | 328 } |
253 | 329 |
254 TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) { | 330 TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) { |
255 // Test that if the serialized data are more than a week old, they are | 331 // Test that if the serialized data are more than a week old, they are |
256 // discarded. | 332 // discarded. |
257 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); | 333 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); |
258 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, | 334 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, |
259 tick_clock_->NowTicks()); | 335 tick_clock_->NowTicks()); |
260 base::Time out_network_time; | 336 base::Time out_network_time; |
261 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 337 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
262 AdvanceBoth(base::TimeDelta::FromDays(8)); | 338 AdvanceBoth(base::TimeDelta::FromDays(8)); |
263 Reset(); | 339 Reset(); |
264 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 340 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
265 } | 341 } |
266 | 342 |
267 TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) { | 343 TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) { |
268 // Test that serialized data are discarded if the wall clock and tick clock | 344 // Test that serialized data are discarded if the wall clock and tick clock |
269 // have not advanced consistently since data were serialized. | 345 // have not advanced consistently since data were serialized. |
270 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); | 346 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); |
271 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, | 347 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, |
272 tick_clock_->NowTicks()); | 348 tick_clock_->NowTicks()); |
273 base::Time out_network_time; | 349 base::Time out_network_time; |
274 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 350 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
275 tick_clock_->Advance(base::TimeDelta::FromDays(1)); | 351 tick_clock_->Advance(base::TimeDelta::FromDays(1)); |
276 Reset(); | 352 Reset(); |
277 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 353 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
278 } | 354 } |
279 | 355 |
280 TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) { | 356 TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) { |
281 // Test that serialized data are discarded if the wall clock and tick clock | 357 // Test that serialized data are discarded if the wall clock and tick clock |
282 // have not advanced consistently since data were serialized. | 358 // have not advanced consistently since data were serialized. |
283 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); | 359 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); |
284 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, | 360 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, |
285 tick_clock_->NowTicks()); | 361 tick_clock_->NowTicks()); |
286 | 362 |
287 base::Time out_network_time; | 363 base::Time out_network_time; |
288 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 364 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
289 clock_->Advance(base::TimeDelta::FromDays(1)); | 365 clock_->Advance(base::TimeDelta::FromDays(1)); |
290 Reset(); | 366 Reset(); |
291 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); | 367 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); |
368 } | |
369 | |
370 TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) { | |
371 base::Time out_network_time; | |
372 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
373 | |
374 test_server_->RegisterRequestHandler( | |
375 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); | |
376 EXPECT_TRUE(test_server_->Start()); | |
377 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | |
378 tracker_->QueryTimeService(); | |
379 WaitForFetch(123123123); | |
380 | |
381 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
382 EXPECT_EQ(base::Time::UnixEpoch() + | |
383 base::TimeDelta::FromMilliseconds(1461621971825), | |
384 out_network_time); | |
385 // Should see no backoff in the success case. | |
386 EXPECT_TRUE(tracker_->query_timer_.IsRunning()); | |
387 EXPECT_EQ(base::TimeDelta::FromMinutes(60), | |
388 tracker_->query_timer_.GetCurrentDelay()); | |
389 } | |
390 | |
391 TEST_F(NetworkTimeTrackerTest, NoNetworkQueryWhileSynced) { | |
392 base::Time in_network_time = clock_->Now(); | |
393 UpdateNetworkTime(in_network_time, resolution_, latency_, | |
394 tick_clock_->NowTicks()); | |
395 tracker_->QueryTimeService(); | |
396 EXPECT_EQ(nullptr, tracker_->time_fetcher_); // No query should be started. | |
397 } | |
398 | |
399 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkBadSignature) { | |
mmenke
2016/05/02 17:47:28
Seems like there are two cases we should care abou
mab
2016/05/05 19:57:42
It's a fair point that we should test good data +
mmenke
2016/05/05 20:23:54
I didn't suggest bad data + bad signature, I said
mab
2016/05/05 22:24:36
Ah, I see what you're saying. Done.
| |
400 test_server_->RegisterRequestHandler( | |
401 base::Bind(&NetworkTimeTrackerTest::BadSignatureResponseHandler)); | |
402 EXPECT_TRUE(test_server_->Start()); | |
403 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | |
404 tracker_->QueryTimeService(); | |
405 WaitForFetch(123123123); | |
406 | |
407 base::Time out_network_time; | |
408 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
409 EXPECT_TRUE(tracker_->query_timer_.IsRunning()); | |
410 } | |
411 | |
412 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkServerError) { | |
413 test_server_->RegisterRequestHandler( | |
414 base::Bind(&NetworkTimeTrackerTest::ErrorResponseHandler)); | |
415 EXPECT_TRUE(test_server_->Start()); | |
416 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | |
417 tracker_->QueryTimeService(); | |
418 WaitForFetch(123123123); | |
419 | |
420 base::Time out_network_time; | |
421 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
422 // Should see backoff in the error case. | |
423 EXPECT_TRUE(tracker_->query_timer_.IsRunning()); | |
424 EXPECT_EQ(base::TimeDelta::FromMinutes(120), | |
425 tracker_->query_timer_.GetCurrentDelay()); | |
426 } | |
427 | |
428 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) { | |
429 test_server_->RegisterRequestHandler( | |
430 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); | |
431 EXPECT_TRUE(test_server_->Start()); | |
432 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | |
433 | |
434 base::Time out_network_time; | |
435 | |
436 tracker_->SetMaxResponseSizeForTesting(3); | |
437 tracker_->QueryTimeService(); | |
438 WaitForFetch(123123123); | |
439 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
440 | |
441 tracker_->SetMaxResponseSizeForTesting(1024); | |
442 tracker_->QueryTimeService(); | |
443 WaitForFetch(123123123); | |
444 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
292 } | 445 } |
293 | 446 |
294 } // namespace network_time | 447 } // namespace network_time |
OLD | NEW |