OLD | NEW |
---|---|
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 Loading... | |
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 |
OLD | NEW |