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

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

Issue 2254433003: When network time is unavailable, record the reason in UMA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix maximums to not overflow, and fix unit tests Created 4 years, 3 months 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 <map> 7 #include <map>
8 #include <memory> 8 #include <memory>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
(...skipping 15 matching lines...) Expand all
26 #include "net/http/http_response_headers.h" 26 #include "net/http/http_response_headers.h"
27 #include "net/test/embedded_test_server/embedded_test_server.h" 27 #include "net/test/embedded_test_server/embedded_test_server.h"
28 #include "net/test/embedded_test_server/http_response.h" 28 #include "net/test/embedded_test_server/http_response.h"
29 #include "net/url_request/url_fetcher.h" 29 #include "net/url_request/url_fetcher.h"
30 #include "net/url_request/url_request_test_util.h" 30 #include "net/url_request/url_request_test_util.h"
31 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
32 32
33 namespace network_time { 33 namespace network_time {
34 34
35 namespace { 35 namespace {
36 const uint32_t kOneDayInSeconds = 86400;
36 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed"; 37 const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed";
37 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid"; 38 const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid";
39 const char kClockDivergencePositiveHistogram[] =
40 "NetworkTimeTracker.ClockDivergence.Positive";
41 const char kClockDivergenceNegativeHistogram[] =
42 "NetworkTimeTracker.ClockDivergence.Negative";
43 const char kWallClockBackwardsHistogram[] =
44 "NetworkTimeTracker.WallClockRanBackwards";
38 } // namespace 45 } // namespace
39 46
40 class NetworkTimeTrackerTest : public testing::Test { 47 class NetworkTimeTrackerTest : public testing::Test {
41 public: 48 public:
42 ~NetworkTimeTrackerTest() override {} 49 ~NetworkTimeTrackerTest() override {}
43 50
44 NetworkTimeTrackerTest() 51 NetworkTimeTrackerTest()
45 : io_thread_("IO thread"), 52 : io_thread_("IO thread"),
46 clock_(new base::SimpleTestClock), 53 clock_(new base::SimpleTestClock),
47 tick_clock_(new base::SimpleTestTickClock), 54 tick_clock_(new base::SimpleTestTickClock),
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 TestingPrefServiceSimple pref_service_; 232 TestingPrefServiceSimple pref_service_;
226 std::unique_ptr<base::FieldTrialList> field_trial_list_; 233 std::unique_ptr<base::FieldTrialList> field_trial_list_;
227 std::unique_ptr<NetworkTimeTracker> tracker_; 234 std::unique_ptr<NetworkTimeTracker> tracker_;
228 std::unique_ptr<net::EmbeddedTestServer> test_server_; 235 std::unique_ptr<net::EmbeddedTestServer> test_server_;
229 std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_; 236 std::unique_ptr<base::test::ScopedFeatureList> scoped_feature_list_;
230 }; 237 };
231 238
232 TEST_F(NetworkTimeTrackerTest, Uninitialized) { 239 TEST_F(NetworkTimeTrackerTest, Uninitialized) {
233 base::Time network_time; 240 base::Time network_time;
234 base::TimeDelta uncertainty; 241 base::TimeDelta uncertainty;
235 EXPECT_FALSE(tracker_->GetNetworkTime(&network_time, &uncertainty)); 242 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
243 tracker_->GetNetworkTime(&network_time, &uncertainty));
236 } 244 }
237 245
238 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) { 246 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) {
239 // The request arrives at the server, which records the time. Advance the 247 // The request arrives at the server, which records the time. Advance the
240 // clock to simulate the latency of sending the reply, which we'll say for 248 // clock to simulate the latency of sending the reply, which we'll say for
241 // convenience is half the total latency. 249 // convenience is half the total latency.
242 base::Time in_network_time = clock_->Now(); 250 base::Time in_network_time = clock_->Now();
243 AdvanceBoth(latency_ / 2); 251 AdvanceBoth(latency_ / 2);
244 252
245 // Record the tick counter at the time the reply is received. At this point, 253 // Record the tick counter at the time the reply is received. At this point,
246 // we would post UpdateNetworkTime to be run on the browser thread. 254 // we would post UpdateNetworkTime to be run on the browser thread.
247 base::TimeTicks posting_time = tick_clock_->NowTicks(); 255 base::TimeTicks posting_time = tick_clock_->NowTicks();
248 256
249 // Simulate that it look a long time (1888us) for the browser thread to get 257 // Simulate that it look a long time (1888us) for the browser thread to get
250 // around to executing the update. 258 // around to executing the update.
251 AdvanceBoth(base::TimeDelta::FromMicroseconds(1888)); 259 AdvanceBoth(base::TimeDelta::FromMicroseconds(1888));
252 UpdateNetworkTime(in_network_time, resolution_, latency_, posting_time); 260 UpdateNetworkTime(in_network_time, resolution_, latency_, posting_time);
253 261
254 base::Time out_network_time; 262 base::Time out_network_time;
255 base::TimeDelta uncertainty; 263 base::TimeDelta uncertainty;
256 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 264 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
265 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
257 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 266 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
258 EXPECT_EQ(clock_->Now(), out_network_time); 267 EXPECT_EQ(clock_->Now(), out_network_time);
259 } 268 }
260 269
261 TEST_F(NetworkTimeTrackerTest, LopsidedLatency) { 270 TEST_F(NetworkTimeTrackerTest, LopsidedLatency) {
262 // Simulate that the server received the request instantaneously, and that all 271 // Simulate that the server received the request instantaneously, and that all
263 // of the latency was in sending the reply. (This contradicts the assumption 272 // of the latency was in sending the reply. (This contradicts the assumption
264 // in the code.) 273 // in the code.)
265 base::Time in_network_time = clock_->Now(); 274 base::Time in_network_time = clock_->Now();
266 AdvanceBoth(latency_); 275 AdvanceBoth(latency_);
267 UpdateNetworkTime(in_network_time, resolution_, latency_, 276 UpdateNetworkTime(in_network_time, resolution_, latency_,
268 tick_clock_->NowTicks()); 277 tick_clock_->NowTicks());
269 278
270 // But, the answer is still within the uncertainty bounds! 279 // But, the answer is still within the uncertainty bounds!
271 base::Time out_network_time; 280 base::Time out_network_time;
272 base::TimeDelta uncertainty; 281 base::TimeDelta uncertainty;
273 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 282 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
283 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
274 EXPECT_LT(out_network_time - uncertainty / 2, clock_->Now()); 284 EXPECT_LT(out_network_time - uncertainty / 2, clock_->Now());
275 EXPECT_GT(out_network_time + uncertainty / 2, clock_->Now()); 285 EXPECT_GT(out_network_time + uncertainty / 2, clock_->Now());
276 } 286 }
277 287
278 TEST_F(NetworkTimeTrackerTest, ClockIsWack) { 288 TEST_F(NetworkTimeTrackerTest, ClockIsWack) {
279 // Now let's assume the system clock is completely wrong. 289 // Now let's assume the system clock is completely wrong.
280 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 290 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
281 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 291 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
282 tick_clock_->NowTicks()); 292 tick_clock_->NowTicks());
283 293
284 base::Time out_network_time; 294 base::Time out_network_time;
285 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 295 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
296 tracker_->GetNetworkTime(&out_network_time, nullptr));
286 EXPECT_EQ(in_network_time, out_network_time); 297 EXPECT_EQ(in_network_time, out_network_time);
287 } 298 }
288 299
289 TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) { 300 TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) {
290 // The two clocks are allowed to diverge a little bit. 301 // The two clocks are allowed to diverge a little bit.
302 base::HistogramTester histograms;
303 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
304 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
305 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
291 base::Time in_network_time = clock_->Now(); 306 base::Time in_network_time = clock_->Now();
292 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 307 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
293 tick_clock_->NowTicks()); 308 tick_clock_->NowTicks());
294 309
295 base::TimeDelta small = base::TimeDelta::FromSeconds(30); 310 base::TimeDelta small = base::TimeDelta::FromSeconds(30);
296 tick_clock_->Advance(small); 311 tick_clock_->Advance(small);
297 base::Time out_network_time; 312 base::Time out_network_time;
298 base::TimeDelta out_uncertainty; 313 base::TimeDelta out_uncertainty;
299 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty)); 314 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
315 tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
300 EXPECT_EQ(in_network_time + small, out_network_time); 316 EXPECT_EQ(in_network_time + small, out_network_time);
301 // The clock divergence should show up in the uncertainty. 317 // The clock divergence should show up in the uncertainty.
302 EXPECT_EQ(resolution_ + latency_ + adjustment_ + small, out_uncertainty); 318 EXPECT_EQ(resolution_ + latency_ + adjustment_ + small, out_uncertainty);
319 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
320 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
321 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
303 } 322 }
304 323
305 TEST_F(NetworkTimeTrackerTest, NetworkTimeUpdates) { 324 TEST_F(NetworkTimeTrackerTest, NetworkTimeUpdates) {
306 // Verify that the the tracker receives and properly handles updates to the 325 // Verify that the the tracker receives and properly handles updates to the
307 // network time. 326 // network time.
308 base::Time out_network_time; 327 base::Time out_network_time;
309 base::TimeDelta uncertainty; 328 base::TimeDelta uncertainty;
310 329
311 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_, 330 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_,
312 tick_clock_->NowTicks()); 331 tick_clock_->NowTicks());
313 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 332 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
333 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
314 EXPECT_EQ(clock_->Now(), out_network_time); 334 EXPECT_EQ(clock_->Now(), out_network_time);
315 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 335 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
316 336
317 // Fake a wait to make sure we keep tracking. 337 // Fake a wait to make sure we keep tracking.
318 AdvanceBoth(base::TimeDelta::FromSeconds(1)); 338 AdvanceBoth(base::TimeDelta::FromSeconds(1));
319 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 339 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
340 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
320 EXPECT_EQ(clock_->Now(), out_network_time); 341 EXPECT_EQ(clock_->Now(), out_network_time);
321 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 342 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
322 343
323 // And one more time. 344 // And one more time.
324 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_, 345 UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_,
325 tick_clock_->NowTicks()); 346 tick_clock_->NowTicks());
326 AdvanceBoth(base::TimeDelta::FromSeconds(1)); 347 AdvanceBoth(base::TimeDelta::FromSeconds(1));
327 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty)); 348 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
349 tracker_->GetNetworkTime(&out_network_time, &uncertainty));
328 EXPECT_EQ(clock_->Now(), out_network_time); 350 EXPECT_EQ(clock_->Now(), out_network_time);
329 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty); 351 EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
330 } 352 }
331 353
332 TEST_F(NetworkTimeTrackerTest, SpringForward) { 354 TEST_F(NetworkTimeTrackerTest, SpringForward) {
355 base::HistogramTester histograms;
356 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
357 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
358 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
333 // Simulate the wall clock advancing faster than the tick clock. 359 // Simulate the wall clock advancing faster than the tick clock.
334 UpdateNetworkTime(clock_->Now(), resolution_, latency_, 360 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
335 tick_clock_->NowTicks()); 361 tick_clock_->NowTicks());
336 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); 362 tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
337 clock_->Advance(base::TimeDelta::FromDays(1)); 363 clock_->Advance(base::TimeDelta::FromDays(1));
338 base::Time out_network_time; 364 base::Time out_network_time;
339 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 365 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
366 tracker_->GetNetworkTime(&out_network_time, nullptr));
367 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
368 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 1);
369 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
370 // The recorded clock divergence should be 1 second - 1 day in seconds.
371 histograms.ExpectBucketCount(
372 kClockDivergenceNegativeHistogram,
373 base::TimeDelta::FromSeconds(kOneDayInSeconds - 1).InMilliseconds(), 1);
374 }
375
376 TEST_F(NetworkTimeTrackerTest, TickClockSpringsForward) {
377 base::HistogramTester histograms;
378 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
379 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
380 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
381 // Simulate the tick clock advancing faster than the wall clock.
382 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
383 tick_clock_->NowTicks());
384 tick_clock_->Advance(base::TimeDelta::FromDays(1));
385 clock_->Advance(base::TimeDelta::FromSeconds(1));
386 base::Time out_network_time;
387 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
388 tracker_->GetNetworkTime(&out_network_time, nullptr));
389 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 1);
390 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
391 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
392 // The recorded clock divergence should be 1 day - 1 second.
393 histograms.ExpectBucketCount(
394 kClockDivergencePositiveHistogram,
395 base::TimeDelta::FromSeconds(kOneDayInSeconds - 1).InMilliseconds(), 1);
340 } 396 }
341 397
342 TEST_F(NetworkTimeTrackerTest, FallBack) { 398 TEST_F(NetworkTimeTrackerTest, FallBack) {
399 base::HistogramTester histograms;
400 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
401 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
402 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
343 // Simulate the wall clock running backward. 403 // Simulate the wall clock running backward.
344 UpdateNetworkTime(clock_->Now(), resolution_, latency_, 404 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
345 tick_clock_->NowTicks()); 405 tick_clock_->NowTicks());
346 tick_clock_->Advance(base::TimeDelta::FromSeconds(1)); 406 tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
347 clock_->Advance(base::TimeDelta::FromDays(-1)); 407 clock_->Advance(base::TimeDelta::FromDays(-1));
348 base::Time out_network_time; 408 base::Time out_network_time;
349 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 409 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
410 tracker_->GetNetworkTime(&out_network_time, nullptr));
411 histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
412 histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
413 histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 1);
414 histograms.ExpectBucketCount(
415 kWallClockBackwardsHistogram,
416 base::TimeDelta::FromSeconds(kOneDayInSeconds - 1).InMilliseconds(), 1);
350 } 417 }
351 418
352 TEST_F(NetworkTimeTrackerTest, SuspendAndResume) { 419 TEST_F(NetworkTimeTrackerTest, SuspendAndResume) {
353 // Simulate the wall clock advancing while the tick clock stands still, as 420 // Simulate the wall clock advancing while the tick clock stands still, as
354 // would happen in a suspend+resume cycle. 421 // would happen in a suspend+resume cycle.
355 UpdateNetworkTime(clock_->Now(), resolution_, latency_, 422 UpdateNetworkTime(clock_->Now(), resolution_, latency_,
356 tick_clock_->NowTicks()); 423 tick_clock_->NowTicks());
357 clock_->Advance(base::TimeDelta::FromHours(1)); 424 clock_->Advance(base::TimeDelta::FromHours(1));
358 base::Time out_network_time; 425 base::Time out_network_time;
359 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 426 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
427 tracker_->GetNetworkTime(&out_network_time, nullptr));
360 } 428 }
361 429
362 TEST_F(NetworkTimeTrackerTest, Serialize) { 430 TEST_F(NetworkTimeTrackerTest, Serialize) {
363 // Test that we can serialize and deserialize state and get consistent 431 // Test that we can serialize and deserialize state and get consistent
364 // results. 432 // results.
365 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 433 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
366 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 434 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
367 tick_clock_->NowTicks()); 435 tick_clock_->NowTicks());
368 base::Time out_network_time; 436 base::Time out_network_time;
369 base::TimeDelta out_uncertainty; 437 base::TimeDelta out_uncertainty;
370 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty)); 438 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
439 tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
371 EXPECT_EQ(in_network_time, out_network_time); 440 EXPECT_EQ(in_network_time, out_network_time);
372 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty); 441 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty);
373 442
374 // 6 days is just under the threshold for discarding data. 443 // 6 days is just under the threshold for discarding data.
375 base::TimeDelta delta = base::TimeDelta::FromDays(6); 444 base::TimeDelta delta = base::TimeDelta::FromDays(6);
376 AdvanceBoth(delta); 445 AdvanceBoth(delta);
377 Reset(); 446 Reset();
378 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty)); 447 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
448 tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
379 EXPECT_EQ(in_network_time + delta, out_network_time); 449 EXPECT_EQ(in_network_time + delta, out_network_time);
380 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty); 450 EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty);
381 } 451 }
382 452
383 TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) { 453 TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) {
384 // Test that deserializing old data (which do not record the uncertainty and 454 // Test that deserializing old data (which do not record the uncertainty and
385 // tick clock) causes the serialized data to be ignored. 455 // tick clock) causes the serialized data to be ignored.
386 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 456 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
387 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 457 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
388 tick_clock_->NowTicks()); 458 tick_clock_->NowTicks());
389 459
390 base::Time out_network_time; 460 base::Time out_network_time;
391 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 461 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
462 tracker_->GetNetworkTime(&out_network_time, nullptr));
392 double local, network; 463 double local, network;
393 const base::DictionaryValue* saved_prefs = 464 const base::DictionaryValue* saved_prefs =
394 pref_service_.GetDictionary(prefs::kNetworkTimeMapping); 465 pref_service_.GetDictionary(prefs::kNetworkTimeMapping);
395 saved_prefs->GetDouble("local", &local); 466 saved_prefs->GetDouble("local", &local);
396 saved_prefs->GetDouble("network", &network); 467 saved_prefs->GetDouble("network", &network);
397 base::DictionaryValue prefs; 468 base::DictionaryValue prefs;
398 prefs.SetDouble("local", local); 469 prefs.SetDouble("local", local);
399 prefs.SetDouble("network", network); 470 prefs.SetDouble("network", network);
400 pref_service_.Set(prefs::kNetworkTimeMapping, prefs); 471 pref_service_.Set(prefs::kNetworkTimeMapping, prefs);
401 Reset(); 472 Reset();
402 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 473 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
474 tracker_->GetNetworkTime(&out_network_time, nullptr));
403 } 475 }
404 476
405 TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) { 477 TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) {
406 // Test that if the serialized data are more than a week old, they are 478 // Test that if the serialized data are more than a week old, they are
407 // discarded. 479 // discarded.
408 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 480 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
409 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 481 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
410 tick_clock_->NowTicks()); 482 tick_clock_->NowTicks());
411 base::Time out_network_time; 483 base::Time out_network_time;
412 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 484 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
485 tracker_->GetNetworkTime(&out_network_time, nullptr));
413 AdvanceBoth(base::TimeDelta::FromDays(8)); 486 AdvanceBoth(base::TimeDelta::FromDays(8));
414 Reset(); 487 Reset();
415 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 488 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
489 tracker_->GetNetworkTime(&out_network_time, nullptr));
416 } 490 }
417 491
418 TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) { 492 TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) {
419 // Test that serialized data are discarded if the wall clock and tick clock 493 // Test that serialized data are discarded if the wall clock and tick clock
420 // have not advanced consistently since data were serialized. 494 // have not advanced consistently since data were serialized.
421 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 495 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
422 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 496 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
423 tick_clock_->NowTicks()); 497 tick_clock_->NowTicks());
424 base::Time out_network_time; 498 base::Time out_network_time;
425 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 499 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
500 tracker_->GetNetworkTime(&out_network_time, nullptr));
426 tick_clock_->Advance(base::TimeDelta::FromDays(1)); 501 tick_clock_->Advance(base::TimeDelta::FromDays(1));
427 Reset(); 502 Reset();
428 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 503 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
504 tracker_->GetNetworkTime(&out_network_time, nullptr));
429 } 505 }
430 506
431 TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) { 507 TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) {
432 // Test that serialized data are discarded if the wall clock and tick clock 508 // Test that serialized data are discarded if the wall clock and tick clock
433 // have not advanced consistently since data were serialized. 509 // have not advanced consistently since data were serialized.
434 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90); 510 base::Time in_network_time = clock_->Now() - base::TimeDelta::FromDays(90);
435 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 511 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
436 tick_clock_->NowTicks()); 512 tick_clock_->NowTicks());
437 513
438 base::Time out_network_time; 514 base::Time out_network_time;
439 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 515 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
516 tracker_->GetNetworkTime(&out_network_time, nullptr));
440 clock_->Advance(base::TimeDelta::FromDays(1)); 517 clock_->Advance(base::TimeDelta::FromDays(1));
441 Reset(); 518 Reset();
442 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 519 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
520 tracker_->GetNetworkTime(&out_network_time, nullptr));
443 } 521 }
444 522
445 TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) { 523 TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) {
446 base::HistogramTester histograms; 524 base::HistogramTester histograms;
447 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 525 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
448 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 526 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
449 527
450 base::Time out_network_time; 528 base::Time out_network_time;
451 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 529 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
530 tracker_->GetNetworkTime(&out_network_time, nullptr));
452 // First query should happen soon. 531 // First query should happen soon.
453 EXPECT_EQ(base::TimeDelta::FromMinutes(0), 532 EXPECT_EQ(base::TimeDelta::FromMinutes(0),
454 tracker_->GetTimerDelayForTesting()); 533 tracker_->GetTimerDelayForTesting());
455 534
456 test_server_->RegisterRequestHandler( 535 test_server_->RegisterRequestHandler(
457 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); 536 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler));
458 EXPECT_TRUE(test_server_->Start()); 537 EXPECT_TRUE(test_server_->Start());
459 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 538 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
460 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 539 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
461 tracker_->WaitForFetchForTesting(123123123); 540 tracker_->WaitForFetchForTesting(123123123);
462 541
463 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 542 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
543 tracker_->GetNetworkTime(&out_network_time, nullptr));
464 EXPECT_EQ(base::Time::UnixEpoch() + 544 EXPECT_EQ(base::Time::UnixEpoch() +
465 base::TimeDelta::FromMilliseconds(1461621971825), 545 base::TimeDelta::FromMilliseconds(1461621971825),
466 out_network_time); 546 out_network_time);
467 // Should see no backoff in the success case. 547 // Should see no backoff in the success case.
468 EXPECT_EQ(base::TimeDelta::FromMinutes(60), 548 EXPECT_EQ(base::TimeDelta::FromMinutes(60),
469 tracker_->GetTimerDelayForTesting()); 549 tracker_->GetTimerDelayForTesting());
470 550
471 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 551 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
472 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 552 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
473 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1); 553 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 596 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
517 597
518 test_server_->RegisterRequestHandler( 598 test_server_->RegisterRequestHandler(
519 base::Bind(&NetworkTimeTrackerTest::BadSignatureResponseHandler)); 599 base::Bind(&NetworkTimeTrackerTest::BadSignatureResponseHandler));
520 EXPECT_TRUE(test_server_->Start()); 600 EXPECT_TRUE(test_server_->Start());
521 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 601 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
522 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 602 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
523 tracker_->WaitForFetchForTesting(123123123); 603 tracker_->WaitForFetchForTesting(123123123);
524 604
525 base::Time out_network_time; 605 base::Time out_network_time;
526 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 606 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
607 tracker_->GetNetworkTime(&out_network_time, nullptr));
527 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 608 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
528 tracker_->GetTimerDelayForTesting()); 609 tracker_->GetTimerDelayForTesting());
529 610
530 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 611 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
531 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 612 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
532 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); 613 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1);
533 } 614 }
534 615
535 static const uint8_t kDevKeyPubBytes[] = { 616 static const uint8_t kDevKeyPubBytes[] = {
536 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 617 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
(...skipping 13 matching lines...) Expand all
550 test_server_->RegisterRequestHandler( 631 test_server_->RegisterRequestHandler(
551 base::Bind(&NetworkTimeTrackerTest::BadDataResponseHandler)); 632 base::Bind(&NetworkTimeTrackerTest::BadDataResponseHandler));
552 EXPECT_TRUE(test_server_->Start()); 633 EXPECT_TRUE(test_server_->Start());
553 base::StringPiece key = {reinterpret_cast<const char*>(kDevKeyPubBytes), 634 base::StringPiece key = {reinterpret_cast<const char*>(kDevKeyPubBytes),
554 sizeof(kDevKeyPubBytes)}; 635 sizeof(kDevKeyPubBytes)};
555 tracker_->SetPublicKeyForTesting(key); 636 tracker_->SetPublicKeyForTesting(key);
556 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 637 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
557 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 638 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
558 tracker_->WaitForFetchForTesting(123123123); 639 tracker_->WaitForFetchForTesting(123123123);
559 base::Time out_network_time; 640 base::Time out_network_time;
560 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 641 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
642 tracker_->GetNetworkTime(&out_network_time, nullptr));
561 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 643 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
562 tracker_->GetTimerDelayForTesting()); 644 tracker_->GetTimerDelayForTesting());
563 645
564 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 646 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
565 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 647 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
566 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1); 648 histograms.ExpectBucketCount(kFetchValidHistogram, false, 1);
567 } 649 }
568 650
569 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkServerError) { 651 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkServerError) {
570 base::HistogramTester histograms; 652 base::HistogramTester histograms;
571 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 653 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
572 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 654 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
573 655
574 test_server_->RegisterRequestHandler( 656 test_server_->RegisterRequestHandler(
575 base::Bind(&NetworkTimeTrackerTest::ServerErrorResponseHandler)); 657 base::Bind(&NetworkTimeTrackerTest::ServerErrorResponseHandler));
576 EXPECT_TRUE(test_server_->Start()); 658 EXPECT_TRUE(test_server_->Start());
577 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 659 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
578 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 660 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
579 tracker_->WaitForFetchForTesting(123123123); 661 tracker_->WaitForFetchForTesting(123123123);
580 662
581 base::Time out_network_time; 663 base::Time out_network_time;
582 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 664 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
665 tracker_->GetNetworkTime(&out_network_time, nullptr));
583 // Should see backoff in the error case. 666 // Should see backoff in the error case.
584 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 667 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
585 tracker_->GetTimerDelayForTesting()); 668 tracker_->GetTimerDelayForTesting());
586 669
587 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 670 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
588 // There was no network error, so the histogram is recorded as 671 // There was no network error, so the histogram is recorded as
589 // net::OK, indicating that the connection succeeded but there was a 672 // net::OK, indicating that the connection succeeded but there was a
590 // non-200 HTTP status code. 673 // non-200 HTTP status code.
591 histograms.ExpectBucketCount(kFetchFailedHistogram, net::OK, 1); 674 histograms.ExpectBucketCount(kFetchFailedHistogram, net::OK, 1);
592 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 675 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
593 } 676 }
594 677
595 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkNetworkError) { 678 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkNetworkError) {
596 base::HistogramTester histograms; 679 base::HistogramTester histograms;
597 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 680 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
598 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 681 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
599 682
600 test_server_->RegisterRequestHandler( 683 test_server_->RegisterRequestHandler(
601 base::Bind(&NetworkTimeTrackerTest::NetworkErrorResponseHandler)); 684 base::Bind(&NetworkTimeTrackerTest::NetworkErrorResponseHandler));
602 EXPECT_TRUE(test_server_->Start()); 685 EXPECT_TRUE(test_server_->Start());
603 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 686 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
604 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 687 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
605 tracker_->WaitForFetchForTesting(123123123); 688 tracker_->WaitForFetchForTesting(123123123);
606 689
607 base::Time out_network_time; 690 base::Time out_network_time;
608 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 691 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
692 tracker_->GetNetworkTime(&out_network_time, nullptr));
609 // Should see backoff in the error case. 693 // Should see backoff in the error case.
610 EXPECT_EQ(base::TimeDelta::FromMinutes(120), 694 EXPECT_EQ(base::TimeDelta::FromMinutes(120),
611 tracker_->GetTimerDelayForTesting()); 695 tracker_->GetTimerDelayForTesting());
612 696
613 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 697 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
614 histograms.ExpectBucketCount(kFetchFailedHistogram, -net::ERR_EMPTY_RESPONSE, 698 histograms.ExpectBucketCount(kFetchFailedHistogram, -net::ERR_EMPTY_RESPONSE,
615 1); 699 1);
616 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 700 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
617 } 701 }
618 702
619 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) { 703 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) {
620 base::HistogramTester histograms; 704 base::HistogramTester histograms;
621 histograms.ExpectTotalCount(kFetchFailedHistogram, 0); 705 histograms.ExpectTotalCount(kFetchFailedHistogram, 0);
622 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 706 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
623 707
624 test_server_->RegisterRequestHandler( 708 test_server_->RegisterRequestHandler(
625 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler)); 709 base::Bind(&NetworkTimeTrackerTest::GoodTimeResponseHandler));
626 EXPECT_TRUE(test_server_->Start()); 710 EXPECT_TRUE(test_server_->Start());
627 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/")); 711 tracker_->SetTimeServerURLForTesting(test_server_->GetURL("/"));
628 712
629 base::Time out_network_time; 713 base::Time out_network_time;
630 714
631 tracker_->SetMaxResponseSizeForTesting(3); 715 tracker_->SetMaxResponseSizeForTesting(3);
632 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 716 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
633 tracker_->WaitForFetchForTesting(123123123); 717 tracker_->WaitForFetchForTesting(123123123);
634 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 718 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
719 tracker_->GetNetworkTime(&out_network_time, nullptr));
635 720
636 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 721 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
637 histograms.ExpectTotalCount(kFetchValidHistogram, 0); 722 histograms.ExpectTotalCount(kFetchValidHistogram, 0);
638 723
639 tracker_->SetMaxResponseSizeForTesting(1024); 724 tracker_->SetMaxResponseSizeForTesting(1024);
640 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting()); 725 EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
641 tracker_->WaitForFetchForTesting(123123123); 726 tracker_->WaitForFetchForTesting(123123123);
642 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr)); 727 EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
728 tracker_->GetNetworkTime(&out_network_time, nullptr));
643 729
644 histograms.ExpectTotalCount(kFetchFailedHistogram, 1); 730 histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
645 histograms.ExpectTotalCount(kFetchValidHistogram, 1); 731 histograms.ExpectTotalCount(kFetchValidHistogram, 1);
646 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1); 732 histograms.ExpectBucketCount(kFetchValidHistogram, true, 1);
647 } 733 }
648 734
649 } // namespace network_time 735 } // namespace network_time
OLDNEW
« no previous file with comments | « components/network_time/network_time_tracker.cc ('k') | components/ssl_errors/error_classification.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698