diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-04-05 14:08:31 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2017-04-11 07:46:53 +0000 |
commit | 6a4cabb866f66d4128a97cdc6d9d08ce074f1247 (patch) | |
tree | ab00f70a5e89278d6a0d16ff0c42578dc4d84a2d /chromium/components/network_time | |
parent | e733310db58160074f574c429d48f8308c0afe17 (diff) | |
download | qtwebengine-chromium-6a4cabb866f66d4128a97cdc6d9d08ce074f1247.tar.gz |
BASELINE: Update Chromium to 57.0.2987.144
Change-Id: I29db402ff696c71a04c4dbaec822c2e53efe0267
Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
Diffstat (limited to 'chromium/components/network_time')
3 files changed, 148 insertions, 0 deletions
diff --git a/chromium/components/network_time/network_time_tracker.cc b/chromium/components/network_time/network_time_tracker.cc index 89d2ad7f9d2..f1017741e32 100644 --- a/chromium/components/network_time/network_time_tracker.cc +++ b/chromium/components/network_time/network_time_tracker.cc @@ -534,8 +534,19 @@ bool NetworkTimeTracker::UpdateTimeFromResponse() { base::TimeDelta resolution = base::TimeDelta::FromMilliseconds(1) + base::TimeDelta::FromSeconds(kTimeServerMaxSkewSeconds); + + // Record histograms for the latency of the time query and the time delta + // between time fetches. base::TimeDelta latency = tick_clock_->NowTicks() - fetch_started_; UMA_HISTOGRAM_TIMES("NetworkTimeTracker.TimeQueryLatency", latency); + if (!last_fetched_time_.is_null()) { + UMA_HISTOGRAM_CUSTOM_TIMES("NetworkTimeTracker.TimeBetweenFetches", + current_time - last_fetched_time_, + base::TimeDelta::FromHours(1), + base::TimeDelta::FromDays(7), 50); + } + last_fetched_time_ = current_time; + UpdateNetworkTime(current_time, resolution, latency, tick_clock_->NowTicks()); return true; } diff --git a/chromium/components/network_time/network_time_tracker.h b/chromium/components/network_time/network_time_tracker.h index ea5bbc5b91a..92336473678 100644 --- a/chromium/components/network_time/network_time_tracker.h +++ b/chromium/components/network_time/network_time_tracker.h @@ -217,6 +217,12 @@ class NetworkTimeTracker : public net::URLFetcherDelegate { // this NetworkTimeTracker's lifetime. bool time_query_completed_; + // The time that was received from the last network time fetch made by + // CheckTime(). Unlike |network_time_at_least_measurement_|, this time + // is not updated when UpdateNetworkTime() is called. Used for UMA + // metrics. + base::Time last_fetched_time_; + // Callbacks to run when the in-progress time fetch completes. std::vector<base::Closure> fetch_completion_callbacks_; diff --git a/chromium/components/network_time/network_time_tracker_unittest.cc b/chromium/components/network_time/network_time_tracker_unittest.cc index 391d87a3e4a..747a38ae12b 100644 --- a/chromium/components/network_time/network_time_tracker_unittest.cc +++ b/chromium/components/network_time/network_time_tracker_unittest.cc @@ -38,6 +38,8 @@ const char kClockDivergenceNegativeHistogram[] = "NetworkTimeTracker.ClockDivergence.Negative"; const char kWallClockBackwardsHistogram[] = "NetworkTimeTracker.WallClockRanBackwards"; +const char kTimeBetweenFetchesHistogram[] = + "NetworkTimeTracker.TimeBetweenFetches"; } // namespace class NetworkTimeTrackerTest : public ::testing::Test { @@ -813,4 +815,133 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkSubseqeuntSyncPending) { tracker_->WaitForFetchForTesting(123123123); } +namespace { + +// NetworkTimeTrackerTest.TimeBetweenFetchesHistogram needs to make several time +// queries that return different times. MultipleGoodTimeResponseHandler is like +// GoodTimeResponseHandler, but returning different times on each of three +// requests that happen in sequence. +// +// See comments inline for how to update the times that are returned. +class MultipleGoodTimeResponseHandler { + public: + MultipleGoodTimeResponseHandler() {} + ~MultipleGoodTimeResponseHandler() {} + + std::unique_ptr<net::test_server::HttpResponse> ResponseHandler( + const net::test_server::HttpRequest& request); + + // Returns the time that is returned in the (i-1)'th response handled by + // ResponseHandler(), or null base::Time() if too many responses have been + // handled. + base::Time GetTimeAtIndex(unsigned int i); + + private: + // |kJsTimes|, |kTimeResponseBodies|, and |kTimeProofHeaders| contain signed + // responses for three subsequent time queries served by + // MultipleGoodTimeResponseHandler. (That is, kJsTimes[i] is the timestamp + // contained in kTimeResponseBodies[i] with signature in kTimeProofHeader[i].) + // NetworkTimeTrackerTest.TimeBetweenFetchesHistogram expects that each + // timestamp is greater than the one before it. + // + // Update as follows: + // + // curl -v http://clients2.google.com/time/1/current?cup2key=1:123123123 + // + // where 1 is the key version and 123123123 is the nonce. Copy the + // response and the x-cup-server-proof header into + // |kTimeResponseBodies| and |kTimeProofHeaders| respectively, and the + // 'current_time_millis' value of the response into |kJsTimes|. + static const double kJsTimes[]; + static const char* kTimeResponseBodies[]; + static const char* kTimeProofHeaders[]; + + // The index into |kJsTimes|, |kTimeResponseBodies|, and + // |kTimeProofHeaders| that will be used in the response in the next + // ResponseHandler() call. + unsigned int next_time_index_ = 0; + + DISALLOW_COPY_AND_ASSIGN(MultipleGoodTimeResponseHandler); +}; + +const double MultipleGoodTimeResponseHandler::kJsTimes[] = {1481653709754, + 1481653820879}; +const char* MultipleGoodTimeResponseHandler::kTimeResponseBodies[] = { + ")]}'\n" + "{\"current_time_millis\":1481653709754,\"server_nonce\":-2." + "7144232419525693E172}", + ")]}'\n" + "{\"current_time_millis\":1481653820879,\"server_nonce\":1." + "8874633267958474E185}"}; +const char* MultipleGoodTimeResponseHandler::kTimeProofHeaders[] = { + "3045022006fdfa882460cd43e15b11d7d35cfc3805b0662c558f6efe54f9bf0c38e80650" + "0221009777817152b6cc1c2b2ea765104a1ab6b87a4da1e87686ae0641c25b23161ea8:" + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "3045022100b6ebcf0f2f5c42bb18bd097a60c4204dd2ed29cad4992b5fdfcf1b32bdfdc6" + "58022005b378c27dd3ddb6edacce39edc8b4ecf189dff5b64ce99975859f6cdc984e20:" + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}; + +std::unique_ptr<net::test_server::HttpResponse> +MultipleGoodTimeResponseHandler::ResponseHandler( + const net::test_server::HttpRequest& request) { + net::test_server::BasicHttpResponse* response = + new net::test_server::BasicHttpResponse(); + + if (next_time_index_ >= + arraysize(MultipleGoodTimeResponseHandler::kJsTimes)) { + response->set_code(net::HTTP_BAD_REQUEST); + return std::unique_ptr<net::test_server::HttpResponse>(response); + } + + response->set_code(net::HTTP_OK); + response->set_content(kTimeResponseBodies[next_time_index_]); + response->AddCustomHeader("x-cup-server-proof", + kTimeProofHeaders[next_time_index_]); + next_time_index_++; + return std::unique_ptr<net::test_server::HttpResponse>(response); +} + +base::Time MultipleGoodTimeResponseHandler::GetTimeAtIndex(unsigned int i) { + if (i >= arraysize(kJsTimes)) + return base::Time(); + return base::Time::FromJsTime(kJsTimes[i]); +} + +} // namespace + +TEST_F(NetworkTimeTrackerTest, TimeBetweenFetchesHistogram) { + MultipleGoodTimeResponseHandler response_handler; + base::HistogramTester histograms; + histograms.ExpectTotalCount(kTimeBetweenFetchesHistogram, 0); + + test_server_->RegisterRequestHandler( + base::Bind(&MultipleGoodTimeResponseHandler::ResponseHandler, + base::Unretained(&response_handler))); + EXPECT_TRUE(test_server_->Start()); + tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); + EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); + tracker_->WaitForFetchForTesting(123123123); + + base::Time out_network_time; + EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE, + tracker_->GetNetworkTime(&out_network_time, nullptr)); + // After the first query, there should be no histogram value because + // there was no delta to record. + histograms.ExpectTotalCount(kTimeBetweenFetchesHistogram, 0); + + // Trigger a second query, which should cause the delta from the first + // query to be recorded. + clock_->Advance(base::TimeDelta::FromHours(1)); + EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); + tracker_->WaitForFetchForTesting(123123123); + EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE, + tracker_->GetNetworkTime(&out_network_time, nullptr)); + histograms.ExpectTotalCount(kTimeBetweenFetchesHistogram, 1); + histograms.ExpectBucketCount( + kTimeBetweenFetchesHistogram, + (response_handler.GetTimeAtIndex(1) - response_handler.GetTimeAtIndex(0)) + .InMilliseconds(), + 1); +} + } // namespace network_time |