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

Unified 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, 4 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 side-by-side diff with in-line comments
Download patch
« 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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/network_time/network_time_tracker_unittest.cc
diff --git a/components/network_time/network_time_tracker_unittest.cc b/components/network_time/network_time_tracker_unittest.cc
index 43f7bf6aa530f0a75ca094b3781b486830e7ec7e..93ed60a188a9ea772aed4c77fa332dacbd4973a2 100644
--- a/components/network_time/network_time_tracker_unittest.cc
+++ b/components/network_time/network_time_tracker_unittest.cc
@@ -33,8 +33,15 @@
namespace network_time {
namespace {
+const uint32_t kOneDayInSeconds = 86400;
const char kFetchFailedHistogram[] = "NetworkTimeTracker.UpdateTimeFetchFailed";
const char kFetchValidHistogram[] = "NetworkTimeTracker.UpdateTimeFetchValid";
+const char kClockDivergencePositiveHistogram[] =
+ "NetworkTimeTracker.ClockDivergence.Positive";
+const char kClockDivergenceNegativeHistogram[] =
+ "NetworkTimeTracker.ClockDivergence.Negative";
+const char kWallClockBackwardsHistogram[] =
+ "NetworkTimeTracker.WallClockRanBackwards";
} // namespace
class NetworkTimeTrackerTest : public testing::Test {
@@ -232,7 +239,8 @@ class NetworkTimeTrackerTest : public testing::Test {
TEST_F(NetworkTimeTrackerTest, Uninitialized) {
base::Time network_time;
base::TimeDelta uncertainty;
- EXPECT_FALSE(tracker_->GetNetworkTime(&network_time, &uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&network_time, &uncertainty));
}
TEST_F(NetworkTimeTrackerTest, LongPostingDelay) {
@@ -253,7 +261,8 @@ TEST_F(NetworkTimeTrackerTest, LongPostingDelay) {
base::Time out_network_time;
base::TimeDelta uncertainty;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &uncertainty));
EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
EXPECT_EQ(clock_->Now(), out_network_time);
}
@@ -270,7 +279,8 @@ TEST_F(NetworkTimeTrackerTest, LopsidedLatency) {
// But, the answer is still within the uncertainty bounds!
base::Time out_network_time;
base::TimeDelta uncertainty;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &uncertainty));
EXPECT_LT(out_network_time - uncertainty / 2, clock_->Now());
EXPECT_GT(out_network_time + uncertainty / 2, clock_->Now());
}
@@ -282,12 +292,17 @@ TEST_F(NetworkTimeTrackerTest, ClockIsWack) {
tick_clock_->NowTicks());
base::Time out_network_time;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
EXPECT_EQ(in_network_time, out_network_time);
}
TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) {
// The two clocks are allowed to diverge a little bit.
+ base::HistogramTester histograms;
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
base::Time in_network_time = clock_->Now();
UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
tick_clock_->NowTicks());
@@ -296,10 +311,14 @@ TEST_F(NetworkTimeTrackerTest, ClocksDivergeSlightly) {
tick_clock_->Advance(small);
base::Time out_network_time;
base::TimeDelta out_uncertainty;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
EXPECT_EQ(in_network_time + small, out_network_time);
// The clock divergence should show up in the uncertainty.
EXPECT_EQ(resolution_ + latency_ + adjustment_ + small, out_uncertainty);
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
}
TEST_F(NetworkTimeTrackerTest, NetworkTimeUpdates) {
@@ -310,13 +329,15 @@ TEST_F(NetworkTimeTrackerTest, NetworkTimeUpdates) {
UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_,
tick_clock_->NowTicks());
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &uncertainty));
EXPECT_EQ(clock_->Now(), out_network_time);
EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
// Fake a wait to make sure we keep tracking.
AdvanceBoth(base::TimeDelta::FromSeconds(1));
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &uncertainty));
EXPECT_EQ(clock_->Now(), out_network_time);
EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
@@ -324,29 +345,75 @@ TEST_F(NetworkTimeTrackerTest, NetworkTimeUpdates) {
UpdateNetworkTime(clock_->Now() - latency_ / 2, resolution_, latency_,
tick_clock_->NowTicks());
AdvanceBoth(base::TimeDelta::FromSeconds(1));
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &uncertainty));
EXPECT_EQ(clock_->Now(), out_network_time);
EXPECT_EQ(resolution_ + latency_ + adjustment_, uncertainty);
}
TEST_F(NetworkTimeTrackerTest, SpringForward) {
+ base::HistogramTester histograms;
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
// Simulate the wall clock advancing faster than the tick clock.
UpdateNetworkTime(clock_->Now(), resolution_, latency_,
tick_clock_->NowTicks());
tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
clock_->Advance(base::TimeDelta::FromDays(1));
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 1);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
+ // The recorded clock divergence should be 1 second - 1 day in seconds.
+ histograms.ExpectBucketCount(
+ kClockDivergenceNegativeHistogram,
+ base::TimeDelta::FromSeconds(kOneDayInSeconds - 1).InMilliseconds(), 1);
+}
+
+TEST_F(NetworkTimeTrackerTest, TickClockSpringsForward) {
+ base::HistogramTester histograms;
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
+ // Simulate the tick clock advancing faster than the wall clock.
+ UpdateNetworkTime(clock_->Now(), resolution_, latency_,
+ tick_clock_->NowTicks());
+ tick_clock_->Advance(base::TimeDelta::FromDays(1));
+ clock_->Advance(base::TimeDelta::FromSeconds(1));
+ base::Time out_network_time;
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 1);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
+ // The recorded clock divergence should be 1 day - 1 second.
+ histograms.ExpectBucketCount(
+ kClockDivergencePositiveHistogram,
+ base::TimeDelta::FromSeconds(kOneDayInSeconds - 1).InMilliseconds(), 1);
}
TEST_F(NetworkTimeTrackerTest, FallBack) {
+ base::HistogramTester histograms;
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 0);
// Simulate the wall clock running backward.
UpdateNetworkTime(clock_->Now(), resolution_, latency_,
tick_clock_->NowTicks());
tick_clock_->Advance(base::TimeDelta::FromSeconds(1));
clock_->Advance(base::TimeDelta::FromDays(-1));
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
+ histograms.ExpectTotalCount(kClockDivergencePositiveHistogram, 0);
+ histograms.ExpectTotalCount(kClockDivergenceNegativeHistogram, 0);
+ histograms.ExpectTotalCount(kWallClockBackwardsHistogram, 1);
+ histograms.ExpectBucketCount(
+ kWallClockBackwardsHistogram,
+ base::TimeDelta::FromSeconds(kOneDayInSeconds - 1).InMilliseconds(), 1);
}
TEST_F(NetworkTimeTrackerTest, SuspendAndResume) {
@@ -356,7 +423,8 @@ TEST_F(NetworkTimeTrackerTest, SuspendAndResume) {
tick_clock_->NowTicks());
clock_->Advance(base::TimeDelta::FromHours(1));
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
}
TEST_F(NetworkTimeTrackerTest, Serialize) {
@@ -367,7 +435,8 @@ TEST_F(NetworkTimeTrackerTest, Serialize) {
tick_clock_->NowTicks());
base::Time out_network_time;
base::TimeDelta out_uncertainty;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
EXPECT_EQ(in_network_time, out_network_time);
EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty);
@@ -375,7 +444,8 @@ TEST_F(NetworkTimeTrackerTest, Serialize) {
base::TimeDelta delta = base::TimeDelta::FromDays(6);
AdvanceBoth(delta);
Reset();
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, &out_uncertainty));
EXPECT_EQ(in_network_time + delta, out_network_time);
EXPECT_EQ(resolution_ + latency_ + adjustment_, out_uncertainty);
}
@@ -388,7 +458,8 @@ TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) {
tick_clock_->NowTicks());
base::Time out_network_time;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
double local, network;
const base::DictionaryValue* saved_prefs =
pref_service_.GetDictionary(prefs::kNetworkTimeMapping);
@@ -399,7 +470,8 @@ TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) {
prefs.SetDouble("network", network);
pref_service_.Set(prefs::kNetworkTimeMapping, prefs);
Reset();
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
}
TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) {
@@ -409,10 +481,12 @@ TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) {
UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
tick_clock_->NowTicks());
base::Time out_network_time;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
AdvanceBoth(base::TimeDelta::FromDays(8));
Reset();
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
}
TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) {
@@ -422,10 +496,12 @@ TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) {
UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
tick_clock_->NowTicks());
base::Time out_network_time;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
tick_clock_->Advance(base::TimeDelta::FromDays(1));
Reset();
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
}
TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) {
@@ -436,10 +512,12 @@ TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) {
tick_clock_->NowTicks());
base::Time out_network_time;
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
clock_->Advance(base::TimeDelta::FromDays(1));
Reset();
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_SYNC_LOST,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
}
TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) {
@@ -448,7 +526,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) {
histograms.ExpectTotalCount(kFetchValidHistogram, 0);
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
// First query should happen soon.
EXPECT_EQ(base::TimeDelta::FromMinutes(0),
tracker_->GetTimerDelayForTesting());
@@ -460,7 +539,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) {
EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
tracker_->WaitForFetchForTesting(123123123);
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
EXPECT_EQ(base::Time::UnixEpoch() +
base::TimeDelta::FromMilliseconds(1461621971825),
out_network_time);
@@ -523,7 +603,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkBadSignature) {
tracker_->WaitForFetchForTesting(123123123);
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
EXPECT_EQ(base::TimeDelta::FromMinutes(120),
tracker_->GetTimerDelayForTesting());
@@ -557,7 +638,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkBadData) {
EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
tracker_->WaitForFetchForTesting(123123123);
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
EXPECT_EQ(base::TimeDelta::FromMinutes(120),
tracker_->GetTimerDelayForTesting());
@@ -579,7 +661,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkServerError) {
tracker_->WaitForFetchForTesting(123123123);
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
// Should see backoff in the error case.
EXPECT_EQ(base::TimeDelta::FromMinutes(120),
tracker_->GetTimerDelayForTesting());
@@ -605,7 +688,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkNetworkError) {
tracker_->WaitForFetchForTesting(123123123);
base::Time out_network_time;
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
// Should see backoff in the error case.
EXPECT_EQ(base::TimeDelta::FromMinutes(120),
tracker_->GetTimerDelayForTesting());
@@ -631,7 +715,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) {
tracker_->SetMaxResponseSizeForTesting(3);
EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
tracker_->WaitForFetchForTesting(123123123);
- EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_NO_SYNC,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
histograms.ExpectTotalCount(kFetchValidHistogram, 0);
@@ -639,7 +724,8 @@ TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkLargeResponse) {
tracker_->SetMaxResponseSizeForTesting(1024);
EXPECT_TRUE(tracker_->QueryTimeServiceForTesting());
tracker_->WaitForFetchForTesting(123123123);
- EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
+ EXPECT_EQ(NetworkTimeTracker::NETWORK_TIME_AVAILABLE,
+ tracker_->GetNetworkTime(&out_network_time, nullptr));
histograms.ExpectTotalCount(kFetchFailedHistogram, 1);
histograms.ExpectTotalCount(kFetchValidHistogram, 1);
« 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