| 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 b42196cf0183b723eee4eacfd22071c2ca25ff5a..4544d06ff1c15039c7657b55c4585000809e4086 100644
|
| --- a/components/network_time/network_time_tracker_unittest.cc
|
| +++ b/components/network_time/network_time_tracker_unittest.cc
|
| @@ -7,10 +7,16 @@
|
| #include <memory>
|
|
|
| #include "base/compiler_specific.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/strings/stringprintf.h"
|
| #include "base/test/simple_test_clock.h"
|
| #include "base/test/simple_test_tick_clock.h"
|
| +#include "components/client_update_protocol/ecdsa.h"
|
| #include "components/network_time/network_time_pref_names.h"
|
| #include "components/prefs/testing_pref_service.h"
|
| +#include "net/http/http_response_headers.h"
|
| +#include "net/url_request/test_url_fetcher_factory.h"
|
| +#include "net/url_request/url_request_test_util.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace network_time {
|
| @@ -19,7 +25,8 @@ class NetworkTimeTrackerTest : public testing::Test {
|
| public:
|
| ~NetworkTimeTrackerTest() override {}
|
|
|
| - void SetUp() override {
|
| + NetworkTimeTrackerTest() {
|
| + url_fetcher_factory_.reset(new net::TestURLFetcherFactory());
|
| NetworkTimeTracker::RegisterPrefs(pref_service_.registry());
|
|
|
| clock_ = new base::SimpleTestClock();
|
| @@ -28,9 +35,11 @@ class NetworkTimeTrackerTest : public testing::Test {
|
| clock_->Advance(base::TimeDelta::FromDays(111));
|
| tick_clock_->Advance(base::TimeDelta::FromDays(222));
|
|
|
| + scoped_refptr<net::URLRequestContextGetter> getter =
|
| + new net::TestURLRequestContextGetter(message_loop_.task_runner());
|
| tracker_.reset(new NetworkTimeTracker(
|
| std::unique_ptr<base::Clock>(clock_),
|
| - std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_));
|
| + std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, getter));
|
|
|
| // Can not be smaller than 15, it's the NowFromSystemTime() resolution.
|
| resolution_ = base::TimeDelta::FromMilliseconds(17);
|
| @@ -47,9 +56,19 @@ class NetworkTimeTrackerTest : public testing::Test {
|
| new_tick_clock->SetNowTicks(tick_clock_->NowTicks());
|
| clock_ = new_clock;
|
| tick_clock_= new_tick_clock;
|
| + scoped_refptr<net::URLRequestContextGetter> getter =
|
| + new net::TestURLRequestContextGetter(message_loop_.task_runner());
|
| tracker_.reset(new NetworkTimeTracker(
|
| std::unique_ptr<base::Clock>(clock_),
|
| - std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_));
|
| + std::unique_ptr<base::TickClock>(tick_clock_), &pref_service_, getter));
|
| + }
|
| +
|
| + // Helper for verifying signatures over time server responses. Sets the
|
| + // client's internal nonce, which is normally randomly generated, to a
|
| + // predictable value.
|
| + void OverrideNonce(uint32_t nonce) {
|
| + tracker_->query_signer_->request_query_cup2key_ =
|
| + base::StringPrintf("%d:%u", 1 /* key version */, nonce);
|
| }
|
|
|
| // Updates the notifier's time with the specified parameters.
|
| @@ -69,6 +88,7 @@ class NetworkTimeTrackerTest : public testing::Test {
|
| }
|
|
|
| protected:
|
| + base::MessageLoop message_loop_;
|
| base::TimeDelta resolution_;
|
| base::TimeDelta latency_;
|
| base::TimeDelta adjustment_;
|
| @@ -76,6 +96,7 @@ class NetworkTimeTrackerTest : public testing::Test {
|
| base::SimpleTestTickClock* tick_clock_;
|
| TestingPrefServiceSimple pref_service_;
|
| std::unique_ptr<NetworkTimeTracker> tracker_;
|
| + std::unique_ptr<net::TestURLFetcherFactory> url_fetcher_factory_;
|
| };
|
|
|
| TEST_F(NetworkTimeTrackerTest, Uninitialized) {
|
| @@ -131,7 +152,7 @@ TEST_F(NetworkTimeTrackerTest, ClockIsWack) {
|
| tick_clock_->NowTicks());
|
|
|
| base::Time out_network_time;
|
| - EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL));
|
| + EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| EXPECT_EQ(in_network_time, out_network_time);
|
| }
|
|
|
| @@ -185,7 +206,7 @@ TEST_F(NetworkTimeTrackerTest, SpringForward) {
|
| 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, NULL));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| }
|
|
|
| TEST_F(NetworkTimeTrackerTest, FallBack) {
|
| @@ -195,7 +216,7 @@ TEST_F(NetworkTimeTrackerTest, FallBack) {
|
| 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, NULL));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| }
|
|
|
| TEST_F(NetworkTimeTrackerTest, SuspendAndResume) {
|
| @@ -205,7 +226,7 @@ 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, NULL));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| }
|
|
|
| TEST_F(NetworkTimeTrackerTest, Serialize) {
|
| @@ -237,7 +258,7 @@ TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) {
|
| tick_clock_->NowTicks());
|
|
|
| base::Time out_network_time;
|
| - EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL));
|
| + EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| double local, network;
|
| const base::DictionaryValue* saved_prefs =
|
| pref_service_.GetDictionary(prefs::kNetworkTimeMapping);
|
| @@ -248,7 +269,7 @@ TEST_F(NetworkTimeTrackerTest, DeserializeOldFormat) {
|
| prefs.SetDouble("network", network);
|
| pref_service_.Set(prefs::kNetworkTimeMapping, prefs);
|
| Reset();
|
| - EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| }
|
|
|
| TEST_F(NetworkTimeTrackerTest, SerializeWithLongDelay) {
|
| @@ -258,10 +279,10 @@ 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, NULL));
|
| + EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| AdvanceBoth(base::TimeDelta::FromDays(8));
|
| Reset();
|
| - EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| }
|
|
|
| TEST_F(NetworkTimeTrackerTest, SerializeWithTickClockAdvance) {
|
| @@ -271,10 +292,10 @@ 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, NULL));
|
| + EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| tick_clock_->Advance(base::TimeDelta::FromDays(1));
|
| Reset();
|
| - EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| }
|
|
|
| TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) {
|
| @@ -285,10 +306,89 @@ TEST_F(NetworkTimeTrackerTest, SerializeWithWallClockAdvance) {
|
| tick_clock_->NowTicks());
|
|
|
| base::Time out_network_time;
|
| - EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL));
|
| + EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| clock_->Advance(base::TimeDelta::FromDays(1));
|
| Reset();
|
| - EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| +}
|
| +
|
| +TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) {
|
| + base::Time out_network_time;
|
| + EXPECT_EQ(nullptr, url_fetcher_factory_->GetFetcherByID(0));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| +
|
| + // How to update:
|
| + //
|
| + // curl http://clients2.google.com/time/1/current?cup2key=1:123123123
|
| + //
|
| + // where 1 is the key version and 123123123 is the nonce.
|
| + //
|
| + // Copy the nonce, the response, and the x-cup-server-proof header
|
| + // into the test.
|
| +
|
| + tracker_->QueryTimeService();
|
| + OverrideNonce(123123123);
|
| + net::TestURLFetcher* fetcher = url_fetcher_factory_->GetFetcherByID(0);
|
| + ASSERT_NE(nullptr, fetcher);
|
| + EXPECT_EQ("", fetcher->upload_data());
|
| +
|
| + fetcher->set_response_code(200);
|
| + fetcher->SetResponseString(
|
| + ")]}'\n"
|
| + "{\"current_time_millis\":1461621971825,\"server_nonce\":-6."
|
| + "006853099049523E85}");
|
| +
|
| + net::HttpResponseHeaders* headers =
|
| + new net::HttpResponseHeaders(std::string());
|
| + headers->AddHeader(
|
| + "x-cup-server-proof: "
|
| + "304402202e0f24db1ea69f1bbe81da4108f381fcf7a2781c53cf7663cb47083cb5fe8efd"
|
| + "022009d2b67c0deceaaf849f7c529be96701ed5f15d5efcaf401a94e0801accc9832:"
|
| + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
|
| + fetcher->set_response_headers(headers);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| +
|
| + EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| + EXPECT_EQ(base::Time::UnixEpoch() +
|
| + base::TimeDelta::FromMilliseconds(1461621971825),
|
| + out_network_time);
|
| + EXPECT_TRUE(tracker_->query_timer_.IsRunning());
|
| +}
|
| +
|
| +TEST_F(NetworkTimeTrackerTest, NoNetworkQueryWhileSynced) {
|
| + base::Time in_network_time = clock_->Now();
|
| + UpdateNetworkTime(in_network_time, resolution_, latency_,
|
| + tick_clock_->NowTicks());
|
| +
|
| + tracker_->QueryTimeService();
|
| + net::TestURLFetcher* fetcher = url_fetcher_factory_->GetFetcherByID(0);
|
| + EXPECT_EQ(nullptr, fetcher); // No query should be started.
|
| +}
|
| +
|
| +TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkBadSignature) {
|
| + base::Time out_network_time;
|
| + EXPECT_EQ(nullptr, url_fetcher_factory_->GetFetcherByID(0));
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| +
|
| + tracker_->QueryTimeService();
|
| + OverrideNonce(123123123);
|
| + net::TestURLFetcher* fetcher = url_fetcher_factory_->GetFetcherByID(0);
|
| + ASSERT_NE(nullptr, fetcher);
|
| + EXPECT_EQ("", fetcher->upload_data());
|
| +
|
| + fetcher->set_response_code(200);
|
| + fetcher->SetResponseString(
|
| + ")]}'\n"
|
| + "{\"current_time_millis\":1461621971825,\"server_nonce\":-6."
|
| + "006853099049523E85}");
|
| +
|
| + net::HttpResponseHeaders* headers = new net::HttpResponseHeaders("");
|
| + headers->AddHeader("x-cup-server-proof: deadbeef:deadbeef");
|
| + fetcher->set_response_headers(headers);
|
| + fetcher->delegate()->OnURLFetchComplete(fetcher);
|
| +
|
| + EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, nullptr));
|
| + EXPECT_TRUE(tracker_->query_timer_.IsRunning());
|
| }
|
|
|
| } // namespace network_time
|
|
|