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

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

Issue 1835823002: network_time_tracker: add temporary time protocol. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: msvc Created 4 years, 8 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 "base/compiler_specific.h" 7 #include "base/compiler_specific.h"
8 #include "base/message_loop/message_loop.h"
8 #include "base/test/simple_test_clock.h" 9 #include "base/test/simple_test_clock.h"
9 #include "base/test/simple_test_tick_clock.h" 10 #include "base/test/simple_test_tick_clock.h"
10 #include "components/network_time/network_time_pref_names.h" 11 #include "components/network_time/network_time_pref_names.h"
11 #include "components/prefs/testing_pref_service.h" 12 #include "components/prefs/testing_pref_service.h"
13 #include "net/http/http_response_headers.h"
14 #include "net/url_request/test_url_fetcher_factory.h"
15 #include "net/url_request/url_request_test_util.h"
12 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
13 17
14 namespace network_time { 18 namespace network_time {
15 19
20 struct NetworkTimeTrackerPeer {
estark 2016/03/28 17:35:10 I haven't seen this pattern before. FRIEND_TEST_AL
mab 2016/03/28 19:56:26 No, no, I just wasn't aware of the standard patter
21 void QueryTimeService() { tracker_->QueryTimeService(); }
22
23 bool TimerIsRunning() { return tracker_->query_timer_.IsRunning(); }
24
25 NetworkTimeTracker* tracker_;
26 };
27
16 class NetworkTimeTrackerTest : public testing::Test { 28 class NetworkTimeTrackerTest : public testing::Test {
17 public: 29 public:
18 ~NetworkTimeTrackerTest() override {} 30 ~NetworkTimeTrackerTest() override {}
19 31
20 void SetUp() override { 32 void SetUp() override {
33 url_fetcher_factory_.reset(new net::TestURLFetcherFactory());
21 NetworkTimeTracker::RegisterPrefs(pref_service_.registry()); 34 NetworkTimeTracker::RegisterPrefs(pref_service_.registry());
22 35
23 clock_ = new base::SimpleTestClock(); 36 clock_ = new base::SimpleTestClock();
24 tick_clock_ = new base::SimpleTestTickClock(); 37 tick_clock_ = new base::SimpleTestTickClock();
25 // Do this to be sure that |is_null| returns false. 38 // Do this to be sure that |is_null| returns false.
26 clock_->Advance(base::TimeDelta::FromDays(111)); 39 clock_->Advance(base::TimeDelta::FromDays(111));
27 tick_clock_->Advance(base::TimeDelta::FromDays(222)); 40 tick_clock_->Advance(base::TimeDelta::FromDays(222));
28 41
29 tracker_.reset(new NetworkTimeTracker( 42 tracker_.reset(new NetworkTimeTracker(
30 scoped_ptr<base::Clock>(clock_), 43 scoped_ptr<base::Clock>(clock_),
31 scoped_ptr<base::TickClock>(tick_clock_), 44 scoped_ptr<base::TickClock>(tick_clock_), &pref_service_,
32 &pref_service_)); 45 new net::TestURLRequestContextGetter(message_loop_.task_runner())));
46 peer_.tracker_ = tracker_.get();
33 47
34 // Can not be smaller than 15, it's the NowFromSystemTime() resolution. 48 // Can not be smaller than 15, it's the NowFromSystemTime() resolution.
35 resolution_ = base::TimeDelta::FromMilliseconds(17); 49 resolution_ = base::TimeDelta::FromMilliseconds(17);
36 latency_ = base::TimeDelta::FromMilliseconds(50); 50 latency_ = base::TimeDelta::FromMilliseconds(50);
37 adjustment_ = 7 * base::TimeDelta::FromMilliseconds(kTicksResolutionMs); 51 adjustment_ = 7 * base::TimeDelta::FromMilliseconds(kTicksResolutionMs);
38 } 52 }
39 53
40 // Replaces |tracker_| with a new object, while preserving the 54 // Replaces |tracker_| with a new object, while preserving the
41 // testing clocks. 55 // testing clocks.
42 void Reset() { 56 void Reset() {
43 base::SimpleTestClock* new_clock = new base::SimpleTestClock(); 57 base::SimpleTestClock* new_clock = new base::SimpleTestClock();
44 new_clock->SetNow(clock_->Now()); 58 new_clock->SetNow(clock_->Now());
45 base::SimpleTestTickClock* new_tick_clock = new base::SimpleTestTickClock(); 59 base::SimpleTestTickClock* new_tick_clock = new base::SimpleTestTickClock();
46 new_tick_clock->SetNowTicks(tick_clock_->NowTicks()); 60 new_tick_clock->SetNowTicks(tick_clock_->NowTicks());
47 clock_ = new_clock; 61 clock_ = new_clock;
48 tick_clock_= new_tick_clock; 62 tick_clock_= new_tick_clock;
49 tracker_.reset(new NetworkTimeTracker( 63 tracker_.reset(new NetworkTimeTracker(
50 scoped_ptr<base::Clock>(clock_), 64 scoped_ptr<base::Clock>(clock_),
51 scoped_ptr<base::TickClock>(tick_clock_), 65 scoped_ptr<base::TickClock>(tick_clock_), &pref_service_,
52 &pref_service_)); 66 new net::TestURLRequestContextGetter(message_loop_.task_runner())));
67 peer_.tracker_ = tracker_.get();
53 } 68 }
54 69
55 // Updates the notifier's time with the specified parameters. 70 // Updates the notifier's time with the specified parameters.
56 void UpdateNetworkTime(const base::Time& network_time, 71 void UpdateNetworkTime(const base::Time& network_time,
57 const base::TimeDelta& resolution, 72 const base::TimeDelta& resolution,
58 const base::TimeDelta& latency, 73 const base::TimeDelta& latency,
59 const base::TimeTicks& post_time) { 74 const base::TimeTicks& post_time) {
60 tracker_->UpdateNetworkTime( 75 tracker_->UpdateNetworkTime(
61 network_time, resolution, latency, post_time); 76 network_time, resolution, latency, post_time);
62 } 77 }
63 78
64 // Advances both the system clock and the tick clock. This should be used for 79 // Advances both the system clock and the tick clock. This should be used for
65 // the normal passage of time, i.e. when neither clock is doing anything odd. 80 // the normal passage of time, i.e. when neither clock is doing anything odd.
66 void AdvanceBoth(const base::TimeDelta& delta) { 81 void AdvanceBoth(const base::TimeDelta& delta) {
67 tick_clock_->Advance(delta); 82 tick_clock_->Advance(delta);
68 clock_->Advance(delta); 83 clock_->Advance(delta);
69 } 84 }
70 85
71 protected: 86 protected:
87 base::MessageLoop message_loop_;
72 base::TimeDelta resolution_; 88 base::TimeDelta resolution_;
73 base::TimeDelta latency_; 89 base::TimeDelta latency_;
74 base::TimeDelta adjustment_; 90 base::TimeDelta adjustment_;
75 base::SimpleTestClock* clock_; 91 base::SimpleTestClock* clock_;
76 base::SimpleTestTickClock* tick_clock_; 92 base::SimpleTestTickClock* tick_clock_;
77 TestingPrefServiceSimple pref_service_; 93 TestingPrefServiceSimple pref_service_;
78 scoped_ptr<NetworkTimeTracker> tracker_; 94 scoped_ptr<NetworkTimeTracker> tracker_;
95 scoped_ptr<net::TestURLFetcherFactory> url_fetcher_factory_;
96 NetworkTimeTrackerPeer peer_;
79 }; 97 };
80 98
81 TEST_F(NetworkTimeTrackerTest, Uninitialized) { 99 TEST_F(NetworkTimeTrackerTest, Uninitialized) {
82 base::Time network_time; 100 base::Time network_time;
83 base::TimeDelta uncertainty; 101 base::TimeDelta uncertainty;
84 EXPECT_FALSE(tracker_->GetNetworkTime(&network_time, &uncertainty)); 102 EXPECT_FALSE(tracker_->GetNetworkTime(&network_time, &uncertainty));
85 } 103 }
86 104
87 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) { 105 TEST_F(NetworkTimeTrackerTest, LongPostingDelay) {
88 // The request arrives at the server, which records the time. Advance the 106 // The request arrives at the server, which records the time. Advance the
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_, 302 UpdateNetworkTime(in_network_time - latency_ / 2, resolution_, latency_,
285 tick_clock_->NowTicks()); 303 tick_clock_->NowTicks());
286 304
287 base::Time out_network_time; 305 base::Time out_network_time;
288 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL)); 306 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL));
289 clock_->Advance(base::TimeDelta::FromDays(1)); 307 clock_->Advance(base::TimeDelta::FromDays(1));
290 Reset(); 308 Reset();
291 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL)); 309 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
292 } 310 }
293 311
312 TEST_F(NetworkTimeTrackerTest, UpdateFromNetwork) {
313 base::Time out_network_time;
314 EXPECT_EQ(nullptr, url_fetcher_factory_->GetFetcherByID(0));
315 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
estark 2016/03/28 17:35:10 nullptr instead of NULL
mab 2016/03/28 19:56:26 Done.
316
317 peer_.QueryTimeService();
318 net::TestURLFetcher* fetcher = url_fetcher_factory_->GetFetcherByID(0);
319 EXPECT_NE(nullptr, fetcher);
estark 2016/03/28 17:35:10 ASSERT_NE (if this fails, the test should be abort
mab 2016/03/28 19:56:26 Done.
320 EXPECT_EQ("", fetcher->upload_data());
321
322 fetcher->set_response_code(200);
323 fetcher->SetResponseString(
324 "{\"current_time_millis\":1458939575214,\"server_nonce\":8."
325 "18927404567873E115}");
326 fetcher->set_response_headers(new net::HttpResponseHeaders(
327 "x-cup-server-proof: "
328 "304402206f29b656ee23aafc7b6df4cfaa3bf711018cca2cbdbcb366932ae4433286f1f6"
329 "022061ddbd4a6ea0d5d36b9f3a6c2a37b5ba4b5f42065f93cda5ed5e5fb60419bb81:"
330 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n"
331 "ETag: "
332 "W/"
333 "\"304402206f29b656ee23aafc7b6df4cfaa3bf711018cca2cbdbcb366932ae4433286f1"
334 "f6022061ddbd4a6ea0d5d36b9f3a6c2a37b5ba4b5f42065f93cda5ed5e5fb60419bb81:"
335 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n"));
336 fetcher->delegate()->OnURLFetchComplete(fetcher);
337
338 EXPECT_TRUE(tracker_->GetNetworkTime(&out_network_time, NULL));
339 EXPECT_EQ(base::Time::UnixEpoch() +
340 base::TimeDelta::FromMilliseconds(1458939575214),
341 out_network_time);
342 EXPECT_TRUE(peer_.TimerIsRunning());
343 }
344
345 TEST_F(NetworkTimeTrackerTest, NoNetworkQueryWhileSynced) {
346 base::Time in_network_time = clock_->Now();
347 UpdateNetworkTime(in_network_time, resolution_, latency_,
348 tick_clock_->NowTicks());
349
350 peer_.QueryTimeService();
351 net::TestURLFetcher* fetcher = url_fetcher_factory_->GetFetcherByID(0);
352 EXPECT_EQ(nullptr, fetcher); // No query should be started.
353 }
354
355 TEST_F(NetworkTimeTrackerTest, UpdateFromNetworkBadSignature) {
356 base::Time out_network_time;
357 EXPECT_EQ(nullptr, url_fetcher_factory_->GetFetcherByID(0));
358 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
359
360 peer_.QueryTimeService();
361 net::TestURLFetcher* fetcher = url_fetcher_factory_->GetFetcherByID(0);
362 EXPECT_NE(nullptr, fetcher);
estark 2016/03/28 17:35:10 ASSERT_NE
mab 2016/03/28 19:56:26 Done.
363 EXPECT_EQ("", fetcher->upload_data());
364
365 fetcher->set_response_code(200);
366 fetcher->SetResponseString(
367 "{\"current_time_millis\":1458939575214,\"server_nonce\":8."
368 "18927404567873E115}");
369 fetcher->set_response_headers(new net::HttpResponseHeaders(
370 "x-cup-server-proof: "
371 "304402206f29b656ee23aafc7b6df4cfaa3bf711018cca2cbdbcb366932ae4433286f1f6"
372 "022061ddbd4a6ea0d5d36b9f3a6c2a37b5ba4b5f42065f93cda5ed5e5fb60419bb81:"
373 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n"
374 "ETag: "
375 "W/"
376 "\"304402206f29b656ee23aafc7b6df4cfaa3bf711018cca2cbdbcb366932ae4433286f1"
377 "f6022061ddbd4a6ea0d5d36b9f3a6c2a37b5ba4b5f42065f93cda5ed5e5fb60419bb81:"
378 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n"));
379 fetcher->delegate()->OnURLFetchComplete(fetcher);
380
381 EXPECT_FALSE(tracker_->GetNetworkTime(&out_network_time, NULL));
382 EXPECT_TRUE(peer_.TimerIsRunning());
383 }
384
294 } // namespace network_time 385 } // namespace network_time
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698