Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: components/network_time/network_time_tracker_unittest.cc

Issue 2254433003: When network time is unavailable, record the reason in UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: mab comments Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <map> 7 #include <map>
8 #include <memory> 8 #include <memory>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 15 matching lines...) Expand all
26 #include "net/http/http_response_headers.h" 26 #include "net/http/http_response_headers.h"
27 #include "net/test/embedded_test_server/embedded_test_server.h" 27 #include "net/test/embedded_test_server/embedded_test_server.h"
28 #include "net/test/embedded_test_server/http_response.h" 28 #include "net/test/embedded_test_server/http_response.h"
29 #include "net/url_request/url_fetcher.h" 29 #include "net/url_request/url_fetcher.h"
30 #include "net/url_request/url_request_test_util.h" 30 #include "net/url_request/url_request_test_util.h"
31 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
32 32
33 namespace network_time { 33 namespace network_time {
34 34
35 namespace { 35 namespace {
36 const uint32_t kOneDayInSeconds = 86400;
36 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed"; 37 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed";
37 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid"; 38 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid";
39 const char kClockDivergenceHistogram[] = "NetworkTimeTracker.ClockDivergence";
40 const char kWallClockBackwardsHistogram[] =
41 "NetworkTimeTracker.WallClockRanBackwards";
38 } // namespace 42 } // namespace
39 43
40 class NetworkTimeTrackerTest : public testing::Test { 44 class NetworkTimeTrackerTest : public testing::Test {
41 public: 45 public:
42 ~NetworkTimeTrackerTest() override {} 46 ~NetworkTimeTrackerTest() override {}
43 47
44 NetworkTimeTrackerTest() 48 NetworkTimeTrackerTest()
45 : io_thread_("IO thread"), 49 : io_thread_("IO thread"),
46 clock_(new base::SimpleTestClock), 50 clock_(new base::SimpleTestClock),
47 tick_clock_(new base::SimpleTestTickClock), 51 tick_clock_(new base::SimpleTestTickClock),
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 TestingPrefServiceSimple pref_service_; 229 TestingPrefServiceSimple pref_service_;
226 std::unique_ptr<base::FieldTrialList> field_trial_list_; 230 std::unique_ptr<base::FieldTrialList> field_trial_list_;
227 std::unique_ptr<NetworkTimeTracker> tracker_; 231 std::unique_ptr<NetworkTimeTracker> tracker_;
228 std::unique_ptr<net::EmbeddedTestServer> test_server_; 232 std::unique_ptr<net::EmbeddedTestServer> test_server_;
229 std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; 233 std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_;
230 }; 234 };
231 235
232 TEST_F(NetworkTimeTrackerTest, Uninitialized) { 236 TEST_F(NetworkTimeTrackerTest, Uninitialized) {
233 base::Time network_time; 237 base::Time network_time;
234 base::TimeDelta uncertainty; 238 base::TimeDelta uncertainty;
235 EXPECT_FALSE(tracker_->GetNetworkTime(&network_time, &uncertainty)); 239 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
240 tracker_->GetNetworkTime(&network_time, &uncertainty));
236 } 241 }
237 242
238 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) { 243 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) {
239 // The request arrives at the server, which records the time. Advance the 244 // The request arrives at the server, which records the time. Advance the
240 // clock to simulate the latency of sending the reply, which we'll say for 245 // clock to simulate the latency of sending the reply, which we'll say for
241 // convenience is half the total latency. 246 // convenience is half the total latency.
242 base::Time in_network_time = clock_->Now(); 247 base::Time in_network_time = clock_->Now();
243 AdvanceBoth(latency_ / 2); 248 AdvanceBoth(latency_ / 2);
244 249
245 // Record the tick counter at the time the reply is received. At this point, 250 // Record the tick counter at the time the reply is received. At this point,
246 // we would post UpdateNetworkTime to be run on the browser thread. 251 // we would post UpdateNetworkTime to be run on the browser thread.
247 base::TimeTicks posting_time = tick_clock_->NowTicks(); 252 base::TimeTicks posting_time = tick_clock_->NowTicks();
248 253
249 // Simulate that it look a long time (1888us) for the browser thread to get 254 // Simulate that it look a long time (1888us) for the browser thread to get
250 // around to executing the update. 255 // around to executing the update.
251 AdvanceBoth(base::TimeDelta::FromMicroseconds(1888)); 256 AdvanceBoth(base::TimeDelta::FromMicroseconds(1888));
252 UpdateNetworkTime(in_network_time, resolution_, latency_, posting_time); 257 UpdateNetworkTime(in_network_time, resolution_, latency_, posting_time);
253 258
254 base::Time out_network_time; 259 base::Time out_network_time;
255 base::TimeDelta uncertainty; 260 base::TimeDelta uncertainty;
256 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 261 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
262 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
257 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 263 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
258 EXPECT_EQ(clock_->Now(), out_network_time); 264 EXPECT_EQ(clock_->Now(), out_network_time);
259 } 265 }
260 266
261 TEST_F(NetworkTimeTrackerTest, LopsidedLatency) { 267 TEST_F(NetworkTimeTrackerTest, LopsidedLatency) {
262 // Simulate that the server received the request instantaneously, and that all 268 // Simulate that the server received the request instantaneously, and that all
263 // of the latency was in sending the reply. (This contradicts the assumption 269 // of the latency was in sending the reply. (This contradicts the assumption
264 // in the code.) 270 // in the code.)
265 base::Time in_network_time = clock_->Now(); 271 base::Time in_network_time = clock_->Now();
266 AdvanceBoth(latency_); 272 AdvanceBoth(latency_);
267 UpdateNetworkTime(in_network_time, resolution_, latency_, 273 UpdateNetworkTime(in_network_time, resolution_, latency_,
268 tick_clock_->NowTicks()); 274 tick_clock_->NowTicks());
269 275
270 // But, the answer is still within the uncertainty bounds! 276 // But, the answer is still within the uncertainty bounds!
271 base::Time out_network_time; 277 base::Time out_network_time;
272 base::TimeDelta uncertainty; 278 base::TimeDelta uncertainty;
273 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 279 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
280 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
274 EXPECT_LT(out_network_time - uncertainty / 2, clock_->Now()); 281 EXPECT_LT(out_network_time - uncertainty / 2, clock_->Now());
275 EXPECT_GT(out_network_time + uncertainty / 2, clock_->Now()); 282 EXPECT_GT(out_network_time + uncertainty / 2, clock_->Now());
276 } 283 }
277 284
278 TEST_F(NetworkTimeTrackerTest, ClockIsWack) { 285 TEST_F(NetworkTimeTrackerTest, ClockIsWack) {
279 // Now let's assume the system clock is completely wrong. 286 // Now let's assume the system clock is completely wrong.
280 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 287 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
281 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 288 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
282 tick_clock_->NowTicks()); 289 tick_clock_->NowTicks());
283 290
284 base::Time out_network_time; 291 base::Time out_network_time;
285 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 292 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
293 tracker_->GetNetworkTime(&out_network_time, nullptr));
286 EXPECT_EQ(in_network_time, out_network_time); 294 EXPECT_EQ(in_network_time, out_network_time);
287 } 295 }
288 296
289 TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) { 297 TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) {
290 // The two clocks are allowed to diverge a little bit. 298 // The two clocks are allowed to diverge a little bit.
299 base::HistogramTester histograms;
300 histograms.ExpectTotalCount(kClockDivergenceHistogram, 0);
301 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
291 base::Time in_network_time = clock_->Now(); 302 base::Time in_network_time = clock_->Now();
292 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 303 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
293 tick_clock_->NowTicks()); 304 tick_clock_->NowTicks());
294 305
295 base::TimeDelta small = base::TimeDelta::FromSeconds(30); 306 base::TimeDelta small = base::TimeDelta::FromSeconds(30);
296 tick_clock_->Advance(small); 307 tick_clock_->Advance(small);
297 base::Time out_network_time; 308 base::Time out_network_time;
298 base::TimeDelta out_uncertainty; 309 base::TimeDelta out_uncertainty;
299 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty)); 310 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
311 tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
300 EXPECT_EQ(in_network_time + small, out_network_time); 312 EXPECT_EQ(in_network_time + small, out_network_time);
301 // The clock divergence should show up in the uncertainty. 313 // The clock divergence should show up in the uncertainty.
302 EXPECT_EQ(resolution_ + latency_ + adjustment_ + small, out_uncertainty); 314 EXPECT_EQ(resolution_ + latency_ + adjustment_ + small, out_uncertainty);
315 histograms.ExpectTotalCount(kClockDivergenceHistogram, 0);
316 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
303 } 317 }
304 318
305 TEST_F(NetworkTimeTrackerTest, NetworkTimeUpdates) { 319 TEST_F(NetworkTimeTrackerTest, NetworkTimeUpdates) {
306 // Verify that the the tracker receives and properly handles updates to the 320 // Verify that the the tracker receives and properly handles updates to the
307 // network time. 321 // network time.
308 base::Time out_network_time; 322 base::Time out_network_time;
309 base::TimeDelta uncertainty; 323 base::TimeDelta uncertainty;
310 324
311 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_, 325 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_,
312 tick_clock_->NowTicks()); 326 tick_clock_->NowTicks());
313 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 327 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
328 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
314 EXPECT_EQ(clock_->Now(), out_network_time); 329 EXPECT_EQ(clock_->Now(), out_network_time);
315 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 330 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
316 331
317 // Fake a wait to make sure we keep tracking. 332 // Fake a wait to make sure we keep tracking.
318 AdvanceBoth(base::TimeDelta::FromSeconds(1)); 333 AdvanceBoth(base::TimeDelta::FromSeconds(1));
319 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 334 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
335 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
320 EXPECT_EQ(clock_->Now(), out_network_time); 336 EXPECT_EQ(clock_->Now(), out_network_time);
321 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 337 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
322 338
323 // And one more time. 339 // And one more time.
324 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_, 340 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_,
325 tick_clock_->NowTicks()); 341 tick_clock_->NowTicks());
326 AdvanceBoth(base::TimeDelta::FromSeconds(1)); 342 AdvanceBoth(base::TimeDelta::FromSeconds(1));
327 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 343 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
344 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
328 EXPECT_EQ(clock_->Now(), out_network_time); 345 EXPECT_EQ(clock_->Now(), out_network_time);
329 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 346 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
330 } 347 }
331 348
332 TEST_F(NetworkTimeTrackerTest, SpringForward) { 349 TEST_F(NetworkTimeTrackerTest, SpringForward) {
350 base::HistogramTester histograms;
351 histograms.ExpectTotalCount(kClockDivergenceHistogram, 0);
352 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
333 // Simulate the wall clock advancing faster than the tick clock. 353 // Simulate the wall clock advancing faster than the tick clock.
334 UpdateNetworkTime(clock_->Now(), resolution_, latency_, 354 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
335 tick_clock_->NowTicks()); 355 tick_clock_->NowTicks());
336 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); 356 tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
337 clock_->Advance(base::TimeDelta::FromDays(1)); 357 clock_->Advance(base::TimeDelta::FromDays(1));
338 base::Time out_network_time; 358 base::Time out_network_time;
339 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 359 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
360 tracker_->GetNetworkTime(&out_network_time, nullptr));
361 histograms.ExpectTotalCount(kClockDivergenceHistogram, 1);
362 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
363 // The recorded clock divergence should be 1 second - 1 day in seconds.
364 histograms.ExpectBucketCount(kClockDivergenceHistogram, 1 - kOneDayInSeconds,
365 1);
366 }
367
368 TEST_F(NetworkTimeTrackerTest, TickClockSpringsForward) {
369 base::HistogramTester histograms;
370 histograms.ExpectTotalCount(kClockDivergenceHistogram, 0);
371 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
372 // Simulate the tick clock advancing faster than the wall clock.
373 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
374 tick_clock_->NowTicks());
375 tick_clock_->Advance(base::TimeDelta::FromDays(1));
376 clock_->Advance(base::TimeDelta::FromSeconds(1));
377 base::Time out_network_time;
378 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
379 tracker_->GetNetworkTime(&out_network_time, nullptr));
380 histograms.ExpectTotalCount(kClockDivergenceHistogram, 1);
381 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
382 // The recorded clock divergence should be 1 day - 1 second.
383 histograms.ExpectBucketCount(kClockDivergenceHistogram, kOneDayInSeconds - 1,
384 1);
340 } 385 }
341 386
342 TEST_F(NetworkTimeTrackerTest, FallBack) { 387 TEST_F(NetworkTimeTrackerTest, FallBack) {
388 base::HistogramTester histograms;
389 histograms.ExpectTotalCount(kClockDivergenceHistogram, 0);
390 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
343 // Simulate the wall clock running backward. 391 // Simulate the wall clock running backward.
344 UpdateNetworkTime(clock_->Now(), resolution_, latency_, 392 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
345 tick_clock_->NowTicks()); 393 tick_clock_->NowTicks());
346 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); 394 tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
347 clock_->Advance(base::TimeDelta::FromDays(-1)); 395 clock_->Advance(base::TimeDelta::FromDays(-1));
348 base::Time out_network_time; 396 base::Time out_network_time;
349 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 397 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
398 tracker_->GetNetworkTime(&out_network_time, nullptr));
399 histograms.ExpectTotalCount(kClockDivergenceHistogram, 0);
400 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 1);
401 histograms.ExpectBucketCount(kWallClockBackwardsHistogram,
402 1 - kOneDayInSeconds, 1);
350 } 403 }
351 404
352 TEST_F(NetworkTimeTrackerTest, SuspendAndResume) { 405 TEST_F(NetworkTimeTrackerTest, SuspendAndResume) {
353 // Simulate the wall clock advancing while the tick clock stands still, as 406 // Simulate the wall clock advancing while the tick clock stands still, as
354 // would happen in a suspend+resume cycle. 407 // would happen in a suspend+resume cycle.
355 UpdateNetworkTime(clock_->Now(), resolution_, latency_, 408 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
356 tick_clock_->NowTicks()); 409 tick_clock_->NowTicks());
357 clock_->Advance(base::TimeDelta::FromHours(1)); 410 clock_->Advance(base::TimeDelta::FromHours(1));
358 base::Time out_network_time; 411 base::Time out_network_time;
359 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 412 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
413 tracker_->GetNetworkTime(&out_network_time, nullptr));
360 } 414 }
361 415
362 TEST_F(NetworkTimeTrackerTest, Serialize) { 416 TEST_F(NetworkTimeTrackerTest, Serialize) {
363 // Test that we can serialize and deserialize state and get consistent 417 // Test that we can serialize and deserialize state and get consistent
364 // results. 418 // results.
365 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 419 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
366 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 420 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
367 tick_clock_->NowTicks()); 421 tick_clock_->NowTicks());
368 base::Time out_network_time; 422 base::Time out_network_time;
369 base::TimeDelta out_uncertainty; 423 base::TimeDelta out_uncertainty;
370 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty)); 424 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
425 tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
371 EXPECT_EQ(in_network_time, out_network_time); 426 EXPECT_EQ(in_network_time, out_network_time);
372 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty); 427 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty);
373 428
374 // 6 days is just under the threshold for discarding data. 429 // 6 days is just under the threshold for discarding data.
375 base::TimeDelta delta = base::TimeDelta::FromDays(6); 430 base::TimeDelta delta = base::TimeDelta::FromDays(6);
376 AdvanceBoth(delta); 431 AdvanceBoth(delta);
377 Reset(); 432 Reset();
378 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty)); 433 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
434 tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
379 EXPECT_EQ(in_network_time + delta, out_network_time); 435 EXPECT_EQ(in_network_time + delta, out_network_time);
380 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty); 436 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty);
381 } 437 }
382 438
383 TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) { 439 TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) {
384 // Test that deserializing old data (which do not record the uncertainty and 440 // Test that deserializing old data (which do not record the uncertainty and
385 // tick clock) causes the serialized data to be ignored. 441 // tick clock) causes the serialized data to be ignored.
386 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 442 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
387 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 443 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
388 tick_clock_->NowTicks()); 444 tick_clock_->NowTicks());
389 445
390 base::Time out_network_time; 446 base::Time out_network_time;
391 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 447 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
448 tracker_->GetNetworkTime(&out_network_time, nullptr));
392 double local, network; 449 double local, network;
393 const base::DictionaryValue* saved_prefs = 450 const base::DictionaryValue* saved_prefs =
394 pref_service_.GetDictionary(prefs::kNetworkTimeMapping); 451 pref_service_.GetDictionary(prefs::kNetworkTimeMapping);
395 saved_prefs->GetDouble("local", &local); 452 saved_prefs->GetDouble("local", &local);
396 saved_prefs->GetDouble("network", &network); 453 saved_prefs->GetDouble("network", &network);
397 base::DictionaryValue prefs; 454 base::DictionaryValue prefs;
398 prefs.SetDouble("local", local); 455 prefs.SetDouble("local", local);
399 prefs.SetDouble("network", network); 456 prefs.SetDouble("network", network);
400 pref_service_.Set(prefs::kNetworkTimeMapping, prefs); 457 pref_service_.Set(prefs::kNetworkTimeMapping, prefs);
401 Reset(); 458 Reset();
402 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 459 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
460 tracker_->GetNetworkTime(&out_network_time, nullptr));
403 } 461 }
404 462
405 TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) { 463 TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) {
406 // Test that if the serialized data are more than a week old, they are 464 // Test that if the serialized data are more than a week old, they are
407 // discarded. 465 // discarded.
408 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 466 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
409 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 467 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
410 tick_clock_->NowTicks()); 468 tick_clock_->NowTicks());
411 base::Time out_network_time; 469 base::Time out_network_time;
412 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 470 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
471 tracker_->GetNetworkTime(&out_network_time, nullptr));
413 AdvanceBoth(base::TimeDelta::FromDays(8)); 472 AdvanceBoth(base::TimeDelta::FromDays(8));
414 Reset(); 473 Reset();
415 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 474 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
475 tracker_->GetNetworkTime(&out_network_time, nullptr));
416 } 476 }
417 477
418 TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) { 478 TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) {
419 // Test that serialized data are discarded if the wall clock and tick clock 479 // Test that serialized data are discarded if the wall clock and tick clock
420 // have not advanced consistently since data were serialized. 480 // have not advanced consistently since data were serialized.
421 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 481 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
422 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 482 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
423 tick_clock_->NowTicks()); 483 tick_clock_->NowTicks());
424 base::Time out_network_time; 484 base::Time out_network_time;
425 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 485 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
486 tracker_->GetNetworkTime(&out_network_time, nullptr));
426 tick_clock_->Advance(base::TimeDelta::FromDays(1)); 487 tick_clock_->Advance(base::TimeDelta::FromDays(1));
427 Reset(); 488 Reset();
428 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 489 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
490 tracker_->GetNetworkTime(&out_network_time, nullptr));
429 } 491 }
430 492
431 TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) { 493 TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) {
432 // Test that serialized data are discarded if the wall clock and tick clock 494 // Test that serialized data are discarded if the wall clock and tick clock
433 // have not advanced consistently since data were serialized. 495 // have not advanced consistently since data were serialized.
434 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 496 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
435 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 497 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
436 tick_clock_->NowTicks()); 498 tick_clock_->NowTicks());
437 499
438 base::Time out_network_time; 500 base::Time out_network_time;
439 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 501 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
502 tracker_->GetNetworkTime(&out_network_time, nullptr));
440 clock_->Advance(base::TimeDelta::FromDays(1)); 503 clock_->Advance(base::TimeDelta::FromDays(1));
441 Reset(); 504 Reset();
442 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 505 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
506 tracker_->GetNetworkTime(&out_network_time, nullptr));
443 } 507 }
444 508
445 TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) { 509 TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) {
446 base::HistogramTester histograms; 510 base::HistogramTester histograms;
447 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 511 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
448 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 512 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
449 513
450 base::Time out_network_time; 514 base::Time out_network_time;
451 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 515 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
516 tracker_->GetNetworkTime(&out_network_time, nullptr));
452 // First query should happen soon. 517 // First query should happen soon.
453 EXPECT_EQ(base::TimeDelta::FromMinutes(0), 518 EXPECT_EQ(base::TimeDelta::FromMinutes(0),
454 tracker_->GetTimerDelayForTesting()); 519 tracker_->GetTimerDelayForTesting());
455 520
456 test_server_->RegisterRequestHandler( 521 test_server_->RegisterRequestHandler(
457 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); 522 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler));
458 EXPECT_TRUE(test_server_->Start()); 523 EXPECT_TRUE(test_server_->Start());
459 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 524 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
460 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 525 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
461 tracker_->WaitForFetchForTesting(123123123); 526 tracker_->WaitForFetchForTesting(123123123);
462 527
463 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 528 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
529 tracker_->GetNetworkTime(&out_network_time, nullptr));
464 EXPECT_EQ(base::Time::UnixEpoch() + 530 EXPECT_EQ(base::Time::UnixEpoch() +
465 base::TimeDelta::FromMilliseconds(1461621971825), 531 base::TimeDelta::FromMilliseconds(1461621971825),
466 out_network_time); 532 out_network_time);
467 // Should see no backoff in the success case. 533 // Should see no backoff in the success case.
468 EXPECT_EQ(base::TimeDelta::FromMinutes(60), 534 EXPECT_EQ(base::TimeDelta::FromMinutes(60),
469 tracker_->GetTimerDelayForTesting()); 535 tracker_->GetTimerDelayForTesting());
470 536
471 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 537 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
472 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 538 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
473 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1); 539 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 582 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
517 583
518 test_server_->RegisterRequestHandler( 584 test_server_->RegisterRequestHandler(
519 base::Bind(&NetworkTimeTrackerTest::BadSignatureResponseHandler)); 585 base::Bind(&NetworkTimeTrackerTest::BadSignatureResponseHandler));
520 EXPECT_TRUE(test_server_->Start()); 586 EXPECT_TRUE(test_server_->Start());
521 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 587 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
522 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 588 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
523 tracker_->WaitForFetchForTesting(123123123); 589 tracker_->WaitForFetchForTesting(123123123);
524 590
525 base::Time out_network_time; 591 base::Time out_network_time;
526 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 592 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
593 tracker_->GetNetworkTime(&out_network_time, nullptr));
527 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 594 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
528 tracker_->GetTimerDelayForTesting()); 595 tracker_->GetTimerDelayForTesting());
529 596
530 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 597 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
531 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 598 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
532 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); 599 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1);
533 } 600 }
534 601
535 static const uint8_t kDevKeyPubBytes[] = { 602 static const uint8_t kDevKeyPubBytes[] = {
536 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 603 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
(...skipping 13 matching lines...) Expand all
550 test_server_->RegisterRequestHandler( 617 test_server_->RegisterRequestHandler(
551 base::Bind(&NetworkTimeTrackerTest::BadDataResponseHandler)); 618 base::Bind(&NetworkTimeTrackerTest::BadDataResponseHandler));
552 EXPECT_TRUE(test_server_->Start()); 619 EXPECT_TRUE(test_server_->Start());
553 base::StringPiece key = {reinterpret_cast<const char*>(kDevKeyPubBytes), 620 base::StringPiece key = {reinterpret_cast<const char*>(kDevKeyPubBytes),
554 sizeof(kDevKeyPubBytes)}; 621 sizeof(kDevKeyPubBytes)};
555 tracker_->SetPublicKeyForTesting(key); 622 tracker_->SetPublicKeyForTesting(key);
556 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 623 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
557 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 624 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
558 tracker_->WaitForFetchForTesting(123123123); 625 tracker_->WaitForFetchForTesting(123123123);
559 base::Time out_network_time; 626 base::Time out_network_time;
560 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 627 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
628 tracker_->GetNetworkTime(&out_network_time, nullptr));
561 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 629 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
562 tracker_->GetTimerDelayForTesting()); 630 tracker_->GetTimerDelayForTesting());
563 631
564 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 632 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
565 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 633 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
566 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); 634 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1);
567 } 635 }
568 636
569 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkServerError) { 637 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkServerError) {
570 base::HistogramTester histograms; 638 base::HistogramTester histograms;
571 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 639 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
572 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 640 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
573 641
574 test_server_->RegisterRequestHandler( 642 test_server_->RegisterRequestHandler(
575 base::Bind(&NetworkTimeTrackerTest::ServerErrorResponseHandler)); 643 base::Bind(&NetworkTimeTrackerTest::ServerErrorResponseHandler));
576 EXPECT_TRUE(test_server_->Start()); 644 EXPECT_TRUE(test_server_->Start());
577 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 645 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
578 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 646 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
579 tracker_->WaitForFetchForTesting(123123123); 647 tracker_->WaitForFetchForTesting(123123123);
580 648
581 base::Time out_network_time; 649 base::Time out_network_time;
582 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 650 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
651 tracker_->GetNetworkTime(&out_network_time, nullptr));
583 // Should see backoff in the error case. 652 // Should see backoff in the error case.
584 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 653 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
585 tracker_->GetTimerDelayForTesting()); 654 tracker_->GetTimerDelayForTesting());
586 655
587 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 656 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
588 // There was no network error, so the histogram is recorded as 657 // There was no network error, so the histogram is recorded as
589 // net::OK, indicating that the connection succeeded but there was a 658 // net::OK, indicating that the connection succeeded but there was a
590 // non-200 HTTP status code. 659 // non-200 HTTP status code.
591 histograms.ExpectBucketCount(kFetchFailedHistogram, net::OK, 1); 660 histograms.ExpectBucketCount(kFetchFailedHistogram, net::OK, 1);
592 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 661 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
593 } 662 }
594 663
595 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkNetworkError) { 664 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkNetworkError) {
596 base::HistogramTester histograms; 665 base::HistogramTester histograms;
597 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 666 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
598 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 667 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
599 668
600 test_server_->RegisterRequestHandler( 669 test_server_->RegisterRequestHandler(
601 base::Bind(&NetworkTimeTrackerTest::NetworkErrorResponseHandler)); 670 base::Bind(&NetworkTimeTrackerTest::NetworkErrorResponseHandler));
602 EXPECT_TRUE(test_server_->Start()); 671 EXPECT_TRUE(test_server_->Start());
603 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 672 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
604 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 673 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
605 tracker_->WaitForFetchForTesting(123123123); 674 tracker_->WaitForFetchForTesting(123123123);
606 675
607 base::Time out_network_time; 676 base::Time out_network_time;
608 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 677 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
678 tracker_->GetNetworkTime(&out_network_time, nullptr));
609 // Should see backoff in the error case. 679 // Should see backoff in the error case.
610 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 680 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
611 tracker_->GetTimerDelayForTesting()); 681 tracker_->GetTimerDelayForTesting());
612 682
613 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 683 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
614 histograms.ExpectBucketCount(kFetchFailedHistogram, -net::ERR_EMPTY_RESPONSE, 684 histograms.ExpectBucketCount(kFetchFailedHistogram, -net::ERR_EMPTY_RESPONSE,
615 1); 685 1);
616 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 686 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
617 } 687 }
618 688
619 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) { 689 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) {
620 base::HistogramTester histograms; 690 base::HistogramTester histograms;
621 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 691 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
622 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 692 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
623 693
624 test_server_->RegisterRequestHandler( 694 test_server_->RegisterRequestHandler(
625 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); 695 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler));
626 EXPECT_TRUE(test_server_->Start()); 696 EXPECT_TRUE(test_server_->Start());
627 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 697 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
628 698
629 base::Time out_network_time; 699 base::Time out_network_time;
630 700
631 tracker_->SetMaxResponseSizeForTesting(3); 701 tracker_->SetMaxResponseSizeForTesting(3);
632 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 702 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
633 tracker_->WaitForFetchForTesting(123123123); 703 tracker_->WaitForFetchForTesting(123123123);
634 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 704 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
705 tracker_->GetNetworkTime(&out_network_time, nullptr));
635 706
636 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 707 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
637 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 708 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
638 709
639 tracker_->SetMaxResponseSizeForTesting(1024); 710 tracker_->SetMaxResponseSizeForTesting(1024);
640 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 711 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
641 tracker_->WaitForFetchForTesting(123123123); 712 tracker_->WaitForFetchForTesting(123123123);
642 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 713 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
714 tracker_->GetNetworkTime(&out_network_time, nullptr));
643 715
644 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 716 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
645 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 717 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
646 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1); 718 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1);
647 } 719 }
648 720
649 } // namespace network_time 721 } // namespace network_time
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698