Chromium Code Reviews| 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 20 matching lines...) Expand all Loading... | |
| 31 namespace { | 31 namespace { |
| 32 const uint32_t kOneDayInSeconds = 86400; | 32 const uint32_t kOneDayInSeconds = 86400; |
| 33 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed"; | 33 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed"; |
| 34 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid"; | 34 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid"; |
| 35 const char kClockDivergencePositiveHistogram[] = | 35 const char kClockDivergencePositiveHistogram[] = |
| 36 "NetworkTimeTracker.ClockDivergence.Positive"; | 36 "NetworkTimeTracker.ClockDivergence.Positive"; |
| 37 const char kClockDivergenceNegativeHistogram[] = | 37 const char kClockDivergenceNegativeHistogram[] = |
| 38 "NetworkTimeTracker.ClockDivergence.Negative"; | 38 "NetworkTimeTracker.ClockDivergence.Negative"; |
| 39 const char kWallClockBackwardsHistogram[] = | 39 const char kWallClockBackwardsHistogram[] = |
| 40 "NetworkTimeTracker.WallClockRanBackwards"; | 40 "NetworkTimeTracker.WallClockRanBackwards"; |
| 41 const char kTimeBetweenFetchesHistogram[] = | |
| 42 "NetworkTimeTracker.TimeBetweenFetchedTimes"; | |
| 41 } // namespace | 43 } // namespace |
| 42 | 44 |
| 43 class NetworkTimeTrackerTest : public ::testing::Test { | 45 class NetworkTimeTrackerTest : public ::testing::Test { |
| 44 public: | 46 public: |
| 45 ~NetworkTimeTrackerTest() override {} | 47 ~NetworkTimeTrackerTest() override {} |
| 46 | 48 |
| 47 NetworkTimeTrackerTest() | 49 NetworkTimeTrackerTest() |
| 48 : io_thread_("IO thread"), | 50 : io_thread_("IO thread"), |
| 49 field_trial_test_(FieldTrialTest::CreateForUnitTest()), | 51 field_trial_test_(FieldTrialTest::CreateForUnitTest()), |
| 50 clock_(new base::SimpleTestClock), | 52 clock_(new base::SimpleTestClock), |
| (...skipping 755 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 806 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | 808 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); |
| 807 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SUBSEQUENT_SYNC_PENDING, | 809 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SUBSEQUENT_SYNC_PENDING, |
| 808 tracker_->GetNetworkTime(&out_network_time, nullptr)); | 810 tracker_->GetNetworkTime(&out_network_time, nullptr)); |
| 809 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); | 811 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); |
| 810 histograms.ExpectTotalCount(kFetchValidHistogram, 1); | 812 histograms.ExpectTotalCount(kFetchValidHistogram, 1); |
| 811 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); | 813 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); |
| 812 | 814 |
| 813 tracker_->WaitForFetchForTesting(123123123); | 815 tracker_->WaitForFetchForTesting(123123123); |
| 814 } | 816 } |
| 815 | 817 |
| 818 // NetworkTimeTrackerTest.TimeBetweenFetchesHistogram needs to make | |
| 819 // several time queries that return different | |
| 820 // times. MultipleGoodTimeResponseHandler is like | |
| 821 // GoodTimeResponseHandler, but returning different times on each of | |
| 822 // three requests that happen in sequence. | |
| 823 // | |
| 824 // See comments inline for how to update the times that are returned. | |
| 825 class MultipleGoodTimeResponseHandler { | |
| 826 public: | |
| 827 MultipleGoodTimeResponseHandler() {} | |
| 828 ~MultipleGoodTimeResponseHandler() {} | |
| 829 | |
| 830 std::unique_ptr<net::test_server::HttpResponse> ResponseHandler( | |
| 831 const net::test_server::HttpRequest& request) { | |
| 832 net::test_server::BasicHttpResponse* response = | |
| 833 new net::test_server::BasicHttpResponse(); | |
| 834 | |
| 835 unsigned int num_responses = sizeof(kJsTimes) / sizeof(double); | |
| 836 if (next_time_index_ >= num_responses) { | |
| 837 response->set_code(net::HTTP_BAD_REQUEST); | |
| 838 return std::unique_ptr<net::test_server::HttpResponse>(response); | |
| 839 } | |
| 840 | |
| 841 response->set_code(net::HTTP_OK); | |
| 842 response->set_content(kTimeResponseBodies[next_time_index_]); | |
| 843 response->AddCustomHeader("x-cup-server-proof", | |
| 844 kTimeProofHeaders[next_time_index_]); | |
| 845 next_time_index_++; | |
| 846 return std::unique_ptr<net::test_server::HttpResponse>(response); | |
| 847 } | |
| 848 | |
| 849 base::Time GetTimeAtIndex(unsigned int i) { | |
| 850 if (i >= sizeof(kJsTimes) / sizeof(double)) | |
| 851 return base::Time(); | |
| 852 return base::Time::FromJsTime(kJsTimes[i]); | |
| 853 } | |
| 854 | |
| 855 private: | |
| 856 // |kJsTimes|, |kTimeResponseBodies|, and |kTimeProofHeaders| contain | |
| 857 // signed responses for three subsequent time queries. (That is, | |
| 858 // kJsTimes[i] is the timestamp contained in kTimeResponseBodies[i] | |
| 859 // with signature in kTimeProofHeader[i].) The test expects that each | |
| 860 // timestamp is greater than the one before it. | |
| 861 // | |
| 862 // Update as follows: | |
| 863 // | |
| 864 // curl -v http://clients2.google.com/time/1/current?cup2key=1:123123123 | |
| 865 // | |
| 866 // where 1 is the key version and 123123123 is the nonce. Copy the | |
| 867 // response and the x-cup-server-proof header into | |
| 868 // |kTimeResponseBodies| and |kTimeProofHeaders| respectively, and the | |
| 869 // 'current_time_millis' value of the response into |kJsTimes|. | |
| 870 const double kJsTimes[3] = {1481653709754, 1481653820879, 1481653880185}; | |
|
meacer
2016/12/14 01:44:38
You can make these static.
estark
2016/12/14 02:31:15
Done.
| |
| 871 const std::string kTimeResponseBodies[3] = { | |
| 872 ")]}'\n" | |
| 873 "{\"current_time_millis\":1481653709754,\"server_nonce\":-2." | |
| 874 "7144232419525693E172}", | |
| 875 ")]}'\n" | |
| 876 "{\"current_time_millis\":1481653820879,\"server_nonce\":1." | |
| 877 "8874633267958474E185}", | |
| 878 ")]}'\n" | |
| 879 "{\"current_time_millis\":1481653880185,\"server_nonce\":1." | |
| 880 "4121510557411994E-89}"}; | |
| 881 const std::string kTimeProofHeaders[3] = { | |
| 882 "3045022006fdfa882460cd43e15b11d7d35cfc3805b0662c558f6efe54f9bf0c38e80650" | |
| 883 "0221009777817152b6cc1c2b2ea765104a1ab6b87a4da1e87686ae0641c25b23161ea8:" | |
| 884 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", | |
| 885 "3045022100b6ebcf0f2f5c42bb18bd097a60c4204dd2ed29cad4992b5fdfcf1b32bdfdc6" | |
| 886 "58022005b378c27dd3ddb6edacce39edc8b4ecf189dff5b64ce99975859f6cdc984e20:" | |
| 887 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", | |
| 888 "304502203911ca3e728adb9da575949a248284018ffa56640761e7a71652cc3fbf772a10" | |
| 889 "022100cc70de806d804ee4d85cf7be8979e41de62e7965b34e76254678a3536debfccb:" | |
| 890 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}; | |
| 891 | |
| 892 // The index into |kJsTimes|, |kTimeResponseBodies|, and | |
| 893 // |kTimeProofHeaders| that will be used in the response in the next | |
| 894 // ResponseHandler() call. | |
| 895 unsigned int next_time_index_ = 0; | |
| 896 | |
| 897 DISALLOW_COPY_AND_ASSIGN(MultipleGoodTimeResponseHandler); | |
| 898 }; | |
| 899 | |
| 900 TEST_F(NetworkTimeTrackerTest, TimeBetweenFetchesHistogram) { | |
| 901 MultipleGoodTimeResponseHandler response_handler; | |
| 902 base::HistogramTester histograms; | |
| 903 histograms.ExpectTotalCount(kTimeBetweenFetchesHistogram, 0); | |
| 904 | |
| 905 test_server_->RegisterRequestHandler( | |
| 906 base::Bind(&MultipleGoodTimeResponseHandler::ResponseHandler, | |
| 907 base::Unretained(&response_handler))); | |
| 908 EXPECT_TRUE(test_server_->Start()); | |
| 909 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); | |
| 910 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | |
| 911 tracker_->WaitForFetchForTesting(123123123); | |
| 912 | |
| 913 base::Time out_network_time; | |
| 914 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE, | |
| 915 tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
| 916 // After the first query, there should be no histogram value because | |
| 917 // there was no delta to record. | |
| 918 histograms.ExpectTotalCount(kTimeBetweenFetchesHistogram, 0); | |
| 919 | |
| 920 // Trigger a second query, which should cause the delta from the first | |
| 921 // query to be recorded. | |
| 922 clock_->Advance(base::TimeDelta::FromHours(1)); | |
| 923 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | |
| 924 tracker_->WaitForFetchForTesting(123123123); | |
| 925 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE, | |
| 926 tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
| 927 histograms.ExpectTotalCount(kTimeBetweenFetchesHistogram, 1); | |
| 928 histograms.ExpectBucketCount( | |
| 929 kTimeBetweenFetchesHistogram, | |
| 930 (response_handler.GetTimeAtIndex(1) - response_handler.GetTimeAtIndex(0)) | |
| 931 .InMilliseconds(), | |
| 932 1); | |
| 933 | |
| 934 // Trigger a third query, which should cause the delta from the second query | |
| 935 // to be recorded. | |
| 936 base::HistogramTester histograms2; | |
| 937 clock_->Advance(base::TimeDelta::FromHours(1)); | |
| 938 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); | |
| 939 tracker_->WaitForFetchForTesting(123123123); | |
| 940 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE, | |
| 941 tracker_->GetNetworkTime(&out_network_time, nullptr)); | |
| 942 histograms2.ExpectTotalCount(kTimeBetweenFetchesHistogram, 1); | |
| 943 histograms2.ExpectBucketCount( | |
| 944 kTimeBetweenFetchesHistogram, | |
| 945 (response_handler.GetTimeAtIndex(2) - response_handler.GetTimeAtIndex(1)) | |
| 946 .InMilliseconds(), | |
| 947 1); | |
| 948 } | |
| 949 | |
| 816 } // namespace network_time | 950 } // namespace network_time |
| OLD | NEW |