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

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

Issue 2565173006: Measure time between secure time queries (Closed)
Patch Set: Created 4 years 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 <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 20 matching lines...) Expand all
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698