summaryrefslogtreecommitdiff
path: root/chromium/components/network_time
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-04-05 14:08:31 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-04-11 07:46:53 +0000
commit6a4cabb866f66d4128a97cdc6d9d08ce074f1247 (patch)
treeab00f70a5e89278d6a0d16ff0c42578dc4d84a2d /chromium/components/network_time
parente733310db58160074f574c429d48f8308c0afe17 (diff)
downloadqtwebengine-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')
-rw-r--r--chromium/components/network_time/network_time_tracker.cc11
-rw-r--r--chromium/components/network_time/network_time_tracker.h6
-rw-r--r--chromium/components/network_time/network_time_tracker_unittest.cc131
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