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 <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed"; | 32 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed"; |
33 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid"; | 33 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid"; |
34 const char kClockDivergencePositiveHistogram[] = | 34 const char kClockDivergencePositiveHistogram[] = |
35 "NetworkTimeTracker.ClockDivergence.Positive"; | 35 "NetworkTimeTracker.ClockDivergence.Positive"; |
36 const char kClockDivergenceNegativeHistogram[] = | 36 const char kClockDivergenceNegativeHistogram[] = |
37 "NetworkTimeTracker.ClockDivergence.Negative"; | 37 "NetworkTimeTracker.ClockDivergence.Negative"; |
38 const char kWallClockBackwardsHistogram[] = | 38 const char kWallClockBackwardsHistogram[] = |
39 "NetworkTimeTracker.WallClockRanBackwards"; | 39 "NetworkTimeTracker.WallClockRanBackwards"; |
40 } // namespace | 40 } // namespace |
41 | 41 |
42 class NetworkTimeTrackerTest : public FieldTrialTest { | 42 class NetworkTimeTrackerTest : public ::testing::Test { |
43 public: | 43 public: |
44 ~NetworkTimeTrackerTest() override {} | 44 ~NetworkTimeTrackerTest() override {} |
45 | 45 |
46 NetworkTimeTrackerTest() | 46 NetworkTimeTrackerTest() |
47 : io_thread_("IO thread"), | 47 : io_thread_("IO thread"), |
| 48 field_trial_test_(new FieldTrialTest()), |
48 clock_(new base::SimpleTestClock), | 49 clock_(new base::SimpleTestClock), |
49 tick_clock_(new base::SimpleTestTickClock), | 50 tick_clock_(new base::SimpleTestTickClock), |
50 test_server_(new net::EmbeddedTestServer) { | 51 test_server_(new net::EmbeddedTestServer) { |
51 base::Thread::Options thread_options; | 52 base::Thread::Options thread_options; |
52 thread_options.message_loop_type = base::MessageLoop::TYPE_IO; | 53 thread_options.message_loop_type = base::MessageLoop::TYPE_IO; |
53 EXPECT_TRUE(io_thread_.StartWithOptions(thread_options)); | 54 EXPECT_TRUE(io_thread_.StartWithOptions(thread_options)); |
54 NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); | 55 NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); |
55 | 56 |
56 SetNetworkQueriesWithVariationsService(true, 0.0 /* query probability */); | 57 field_trial_test_->SetNetworkQueriesWithVariationsService( |
| 58 true, 0.0 /* query probability */, |
| 59 FieldTrialTest::ENABLE_FETCHES_ON_DEMAND); |
57 | 60 |
58 tracker_.reset(new NetworkTimeTracker( | 61 tracker_.reset(new NetworkTimeTracker( |
59 std::unique_ptr<base::Clock>(clock_), | 62 std::unique_ptr<base::Clock>(clock_), |
60 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, | 63 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, |
61 new net::TestURLRequestContextGetter(io_thread_.task_runner()))); | 64 new net::TestURLRequestContextGetter(io_thread_.task_runner()))); |
62 | 65 |
63 // Do this to be sure that |is_null| returns false. | 66 // Do this to be sure that |is_null| returns false. |
64 clock_->Advance(base::TimeDelta::FromDays(111)); | 67 clock_->Advance(base::TimeDelta::FromDays(111)); |
65 tick_clock_->Advance(base::TimeDelta::FromDays(222)); | 68 tick_clock_->Advance(base::TimeDelta::FromDays(222)); |
66 | 69 |
(...skipping 13 matching lines...) Expand all Loading... |
80 base::SimpleTestTickClock* new_tick_clock = new base::SimpleTestTickClock(); | 83 base::SimpleTestTickClock* new_tick_clock = new base::SimpleTestTickClock(); |
81 new_tick_clock->SetNowTicks(tick_clock_->NowTicks()); | 84 new_tick_clock->SetNowTicks(tick_clock_->NowTicks()); |
82 clock_ = new_clock; | 85 clock_ = new_clock; |
83 tick_clock_ = new_tick_clock; | 86 tick_clock_ = new_tick_clock; |
84 tracker_.reset(new NetworkTimeTracker( | 87 tracker_.reset(new NetworkTimeTracker( |
85 std::unique_ptr<base::Clock>(clock_), | 88 std::unique_ptr<base::Clock>(clock_), |
86 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, | 89 std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, |
87 new net::TestURLRequestContextGetter(io_thread_.task_runner()))); | 90 new net::TestURLRequestContextGetter(io_thread_.task_runner()))); |
88 } | 91 } |
89 | 92 |
90 // Returns a valid time response. Update as follows: | |
91 // | |
92 // curl http://clients2.google.com/time/1/current?cup2key=1:123123123 | |
93 // | |
94 // where 1 is the key version and 123123123 is the nonce. Copy the nonce, the | |
95 // response, and the x-cup-server-proof header into the test. | |
96 static std::unique_ptr<net::test_server::HttpResponse> | |
97 GoodTimeResponseHandler(const net::test_server::HttpRequest& request) { | |
98 net::test_server::BasicHttpResponse* response = | |
99 new net::test_server::BasicHttpResponse(); | |
100 response->set_code(net::HTTP_OK); | |
101 response->set_content( | |
102 ")]}'\n" | |
103 "{\"current_time_millis\":1461621971825,\"server_nonce\":-6." | |
104 "006853099049523E85}"); | |
105 response->AddCustomHeader( | |
106 "x-cup-server-proof", | |
107 "304402202e0f24db1ea69f1bbe81da4108f381fcf7a2781c53cf7663cb47083cb5fe8e" | |
108 "fd" | |
109 "022009d2b67c0deceaaf849f7c529be96701ed5f15d5efcaf401a94e0801accc9832:" | |
110 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); | |
111 return std::unique_ptr<net::test_server::HttpResponse>(response); | |
112 } | |
113 | |
114 // Good signature over invalid data, though made with a non-production key. | 93 // Good signature over invalid data, though made with a non-production key. |
115 static std::unique_ptr<net::test_server::HttpResponse> BadDataResponseHandler( | 94 static std::unique_ptr<net::test_server::HttpResponse> BadDataResponseHandler( |
116 const net::test_server::HttpRequest& request) { | 95 const net::test_server::HttpRequest& request) { |
117 net::test_server::BasicHttpResponse* response = | 96 net::test_server::BasicHttpResponse* response = |
118 new net::test_server::BasicHttpResponse(); | 97 new net::test_server::BasicHttpResponse(); |
119 response->set_code(net::HTTP_OK); | 98 response->set_code(net::HTTP_OK); |
120 response->set_content( | 99 response->set_content( |
121 ")]}'\n" | 100 ")]}'\n" |
122 "{\"current_time_millis\":NaN,\"server_nonce\":9.420921002039447E182}"); | 101 "{\"current_time_millis\":NaN,\"server_nonce\":9.420921002039447E182}"); |
123 response->AddCustomHeader( | 102 response->AddCustomHeader( |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
168 | 147 |
169 // Advances both the system clock and the tick clock. This should be used for | 148 // Advances both the system clock and the tick clock. This should be used for |
170 // the normal passage of time, i.e. when neither clock is doing anything odd. | 149 // the normal passage of time, i.e. when neither clock is doing anything odd. |
171 void AdvanceBoth(const base::TimeDelta& delta) { | 150 void AdvanceBoth(const base::TimeDelta& delta) { |
172 tick_clock_->Advance(delta); | 151 tick_clock_->Advance(delta); |
173 clock_->Advance(delta); | 152 clock_->Advance(delta); |
174 } | 153 } |
175 | 154 |
176 protected: | 155 protected: |
177 base::Thread io_thread_; | 156 base::Thread io_thread_; |
| 157 std::unique_ptr<FieldTrialTest> field_trial_test_; |
178 base::MessageLoop message_loop_; | 158 base::MessageLoop message_loop_; |
179 base::TimeDelta resolution_; | 159 base::TimeDelta resolution_; |
180 base::TimeDelta latency_; | 160 base::TimeDelta latency_; |
181 base::TimeDelta adjustment_; | 161 base::TimeDelta adjustment_; |
182 base::SimpleTestClock* clock_; | 162 base::SimpleTestClock* clock_; |
183 base::SimpleTestTickClock* tick_clock_; | 163 base::SimpleTestTickClock* tick_clock_; |
184 TestingPrefServiceSimple pref_service_; | 164 TestingPrefServiceSimple pref_service_; |
185 std::unique_ptr<NetworkTimeTracker> tracker_; | 165 std::unique_ptr<NetworkTimeTracker> tracker_; |
186 std::unique_ptr<net::EmbeddedTestServer> test_server_; | 166 std::unique_ptr<net::EmbeddedTestServer> test_server_; |
187 }; | 167 }; |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); | 455 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); |
476 histograms.ExpectTotalCount(kFetchValidHistogram, 0); | 456 histograms.ExpectTotalCount(kFetchValidHistogram, 0); |
477 | 457 |
478 base::Time out_network_time; | 458 base::Time out_network_time; |
479 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC_ATTEMPT, | 459 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC_ATTEMPT, |
480 tracker_->GetNetworkTime(&out_network_time, nullptr)); | 460 tracker_->GetNetworkTime(&out_network_time, nullptr)); |
481 // First query should happen soon. | 461 // First query should happen soon. |
482 EXPECT_EQ(base::TimeDelta::FromMinutes(0), | 462 EXPECT_EQ(base::TimeDelta::FromMinutes(0), |
483 tracker_->GetTimerDelayForTesting()); | 463 tracker_->GetTimerDelayForTesting()); |
484 | 464 |
485 test_server_->RegisterRequestHandler( | 465 test_server_->RegisterRequestHandler(base::Bind(&GoodTimeResponseHandler)); |
486 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); | |
487 EXPECT_TRUE(test_server_->Start()); | 466 EXPECT_TRUE(test_server_->Start()); |
488 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | 467 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); |
489 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | 468 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); |
490 tracker_->WaitForFetchForTesting(123123123); | 469 tracker_->WaitForFetchForTesting(123123123); |
491 | 470 |
492 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE, | 471 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE, |
493 tracker_->GetNetworkTime(&out_network_time, nullptr)); | 472 tracker_->GetNetworkTime(&out_network_time, nullptr)); |
494 EXPECT_EQ(base::Time::UnixEpoch() + | 473 EXPECT_EQ(base::Time::UnixEpoch() + |
495 base::TimeDelta::FromMilliseconds(1461621971825), | 474 base::TimeDelta::FromMilliseconds(1461621971825), |
496 out_network_time); | 475 out_network_time); |
497 // Should see no backoff in the success case. | 476 // Should see no backoff in the success case. |
498 EXPECT_EQ(base::TimeDelta::FromMinutes(60), | 477 EXPECT_EQ(base::TimeDelta::FromMinutes(60), |
499 tracker_->GetTimerDelayForTesting()); | 478 tracker_->GetTimerDelayForTesting()); |
500 | 479 |
501 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); | 480 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); |
502 histograms.ExpectTotalCount(kFetchValidHistogram, 1); | 481 histograms.ExpectTotalCount(kFetchValidHistogram, 1); |
503 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1); | 482 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1); |
504 } | 483 } |
505 | 484 |
506 TEST_F(NetworkTimeTrackerTest, NoNetworkQueryWhileSynced) { | 485 TEST_F(NetworkTimeTrackerTest, NoNetworkQueryWhileSynced) { |
507 test_server_->RegisterRequestHandler( | 486 test_server_->RegisterRequestHandler(base::Bind(&GoodTimeResponseHandler)); |
508 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); | |
509 EXPECT_TRUE(test_server_->Start()); | 487 EXPECT_TRUE(test_server_->Start()); |
510 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | 488 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); |
511 | 489 |
512 SetNetworkQueriesWithVariationsService(true, 0.0); | 490 field_trial_test_->SetNetworkQueriesWithVariationsService( |
| 491 true, 0.0, FieldTrialTest::ENABLE_FETCHES_ON_DEMAND); |
513 base::Time in_network_time = clock_->Now(); | 492 base::Time in_network_time = clock_->Now(); |
514 UpdateNetworkTime(in_network_time, resolution_, latency_, | 493 UpdateNetworkTime(in_network_time, resolution_, latency_, |
515 tick_clock_->NowTicks()); | 494 tick_clock_->NowTicks()); |
516 | 495 |
517 // No query should be started so long as NetworkTimeTracker is synced, but the | 496 // No query should be started so long as NetworkTimeTracker is synced, but the |
518 // next check should happen soon. | 497 // next check should happen soon. |
519 EXPECT_FALSE(tracker_->QueryTimeServiceForTesting()); | 498 EXPECT_FALSE(tracker_->QueryTimeServiceForTesting()); |
520 EXPECT_EQ(base::TimeDelta::FromMinutes(6), | 499 EXPECT_EQ(base::TimeDelta::FromMinutes(6), |
521 tracker_->GetTimerDelayForTesting()); | 500 tracker_->GetTimerDelayForTesting()); |
522 | 501 |
523 SetNetworkQueriesWithVariationsService(true, 1.0); | 502 field_trial_test_->SetNetworkQueriesWithVariationsService( |
| 503 true, 1.0, FieldTrialTest::ENABLE_FETCHES_ON_DEMAND); |
524 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | 504 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); |
525 tracker_->WaitForFetchForTesting(123123123); | 505 tracker_->WaitForFetchForTesting(123123123); |
526 EXPECT_EQ(base::TimeDelta::FromMinutes(60), | 506 EXPECT_EQ(base::TimeDelta::FromMinutes(60), |
527 tracker_->GetTimerDelayForTesting()); | 507 tracker_->GetTimerDelayForTesting()); |
528 } | 508 } |
529 | 509 |
530 TEST_F(NetworkTimeTrackerTest, NoNetworkQueryWhileFeatureDisabled) { | 510 TEST_F(NetworkTimeTrackerTest, NoNetworkQueryWhileFeatureDisabled) { |
531 // Disable network time queries and check that a query is not sent. | 511 // Disable network time queries and check that a query is not sent. |
532 SetNetworkQueriesWithVariationsService(false, 0.0); | 512 field_trial_test_->SetNetworkQueriesWithVariationsService( |
| 513 false, 0.0, FieldTrialTest::ENABLE_FETCHES_ON_DEMAND); |
533 EXPECT_FALSE(tracker_->QueryTimeServiceForTesting()); | 514 EXPECT_FALSE(tracker_->QueryTimeServiceForTesting()); |
534 EXPECT_EQ(base::TimeDelta::FromMinutes(6), | 515 EXPECT_EQ(base::TimeDelta::FromMinutes(6), |
535 tracker_->GetTimerDelayForTesting()); | 516 tracker_->GetTimerDelayForTesting()); |
536 | 517 |
537 // Enable time queries and check that a query is sent. | 518 // Enable time queries and check that a query is sent. |
538 SetNetworkQueriesWithVariationsService(true, 0.0); | 519 field_trial_test_->SetNetworkQueriesWithVariationsService( |
| 520 true, 0.0, FieldTrialTest::ENABLE_FETCHES_ON_DEMAND); |
539 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | 521 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); |
540 tracker_->WaitForFetchForTesting(123123123); | 522 tracker_->WaitForFetchForTesting(123123123); |
541 } | 523 } |
542 | 524 |
543 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkBadSignature) { | 525 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkBadSignature) { |
544 base::HistogramTester histograms; | 526 base::HistogramTester histograms; |
545 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); | 527 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); |
546 histograms.ExpectTotalCount(kFetchValidHistogram, 0); | 528 histograms.ExpectTotalCount(kFetchValidHistogram, 0); |
547 | 529 |
548 test_server_->RegisterRequestHandler( | 530 test_server_->RegisterRequestHandler( |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 histograms.ExpectBucketCount(kFetchFailedHistogram, -net::ERR_EMPTY_RESPONSE, | 630 histograms.ExpectBucketCount(kFetchFailedHistogram, -net::ERR_EMPTY_RESPONSE, |
649 1); | 631 1); |
650 histograms.ExpectTotalCount(kFetchValidHistogram, 0); | 632 histograms.ExpectTotalCount(kFetchValidHistogram, 0); |
651 } | 633 } |
652 | 634 |
653 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) { | 635 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) { |
654 base::HistogramTester histograms; | 636 base::HistogramTester histograms; |
655 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); | 637 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); |
656 histograms.ExpectTotalCount(kFetchValidHistogram, 0); | 638 histograms.ExpectTotalCount(kFetchValidHistogram, 0); |
657 | 639 |
658 test_server_->RegisterRequestHandler( | 640 test_server_->RegisterRequestHandler(base::Bind(&GoodTimeResponseHandler)); |
659 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); | |
660 EXPECT_TRUE(test_server_->Start()); | 641 EXPECT_TRUE(test_server_->Start()); |
661 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | 642 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); |
662 | 643 |
663 base::Time out_network_time; | 644 base::Time out_network_time; |
664 | 645 |
665 tracker_->SetMaxResponseSizeForTesting(3); | 646 tracker_->SetMaxResponseSizeForTesting(3); |
666 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | 647 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); |
667 tracker_->WaitForFetchForTesting(123123123); | 648 tracker_->WaitForFetchForTesting(123123123); |
668 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SUCCESSFUL_SYNC, | 649 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SUCCESSFUL_SYNC, |
669 tracker_->GetNetworkTime(&out_network_time, nullptr)); | 650 tracker_->GetNetworkTime(&out_network_time, nullptr)); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SUBSEQUENT_SYNC_PENDING, | 713 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SUBSEQUENT_SYNC_PENDING, |
733 tracker_->GetNetworkTime(&out_network_time, nullptr)); | 714 tracker_->GetNetworkTime(&out_network_time, nullptr)); |
734 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); | 715 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); |
735 histograms.ExpectTotalCount(kFetchValidHistogram, 1); | 716 histograms.ExpectTotalCount(kFetchValidHistogram, 1); |
736 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); | 717 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); |
737 | 718 |
738 tracker_->WaitForFetchForTesting(123123123); | 719 tracker_->WaitForFetchForTesting(123123123); |
739 } | 720 } |
740 | 721 |
741 } // namespace network_time | 722 } // namespace network_time |
OLD | NEW |