OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "net/proxy/dhcp_proxy_script_adapter_fetcher_win.h" | 5 #include "net/proxy/dhcp_proxy_script_adapter_fetcher_win.h" |
6 | 6 |
7 #include "base/perftimer.h" | 7 #include "base/perftimer.h" |
8 #include "base/synchronization/waitable_event.h" | 8 #include "base/synchronization/waitable_event.h" |
9 #include "base/test/test_timeouts.h" | 9 #include "base/test/test_timeouts.h" |
10 #include "base/timer.h" | 10 #include "base/timer.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 // APIs and the network. In this file we test only by stubbing out | 28 // APIs and the network. In this file we test only by stubbing out |
29 // functionality. | 29 // functionality. |
30 | 30 |
31 // Version of DhcpProxyScriptAdapterFetcher that mocks out dependencies | 31 // Version of DhcpProxyScriptAdapterFetcher that mocks out dependencies |
32 // to allow unit testing. | 32 // to allow unit testing. |
33 class MockDhcpProxyScriptAdapterFetcher | 33 class MockDhcpProxyScriptAdapterFetcher |
34 : public DhcpProxyScriptAdapterFetcher { | 34 : public DhcpProxyScriptAdapterFetcher { |
35 public: | 35 public: |
36 explicit MockDhcpProxyScriptAdapterFetcher(URLRequestContext* context) | 36 explicit MockDhcpProxyScriptAdapterFetcher(URLRequestContext* context) |
37 : DhcpProxyScriptAdapterFetcher(context), | 37 : DhcpProxyScriptAdapterFetcher(context), |
38 dhcp_delay_ms_(1), | 38 dhcp_delay_(base::TimeDelta::FromMilliseconds(1)), |
39 timeout_ms_(TestTimeouts::action_timeout_ms()), | 39 timeout_(TestTimeouts::action_timeout()), |
40 configured_url_(kPacUrl), | 40 configured_url_(kPacUrl), |
41 fetcher_delay_ms_(1), | 41 fetcher_delay_ms_(1), |
42 fetcher_result_(OK), | 42 fetcher_result_(OK), |
43 pac_script_("bingo") { | 43 pac_script_("bingo") { |
44 } | 44 } |
45 | 45 |
46 void Cancel() { | 46 void Cancel() { |
47 DhcpProxyScriptAdapterFetcher::Cancel(); | 47 DhcpProxyScriptAdapterFetcher::Cancel(); |
48 fetcher_ = NULL; | 48 fetcher_ = NULL; |
49 } | 49 } |
(...skipping 18 matching lines...) Expand all Loading... |
68 } | 68 } |
69 | 69 |
70 std::string ImplGetPacURLFromDhcp( | 70 std::string ImplGetPacURLFromDhcp( |
71 const std::string& adapter_name) OVERRIDE { | 71 const std::string& adapter_name) OVERRIDE { |
72 PerfTimer timer; | 72 PerfTimer timer; |
73 test_finished_event_.TimedWait(dhcp_delay_); | 73 test_finished_event_.TimedWait(dhcp_delay_); |
74 return configured_url_; | 74 return configured_url_; |
75 } | 75 } |
76 | 76 |
77 base::WaitableEvent test_finished_event_; | 77 base::WaitableEvent test_finished_event_; |
78 TimeDelta dhcp_delay_; | 78 base::TimeDelta dhcp_delay_; |
79 std::string configured_url_; | 79 std::string configured_url_; |
80 }; | 80 }; |
81 | 81 |
82 virtual DhcpQuery* ImplCreateDhcpQuery() OVERRIDE { | 82 virtual DhcpQuery* ImplCreateDhcpQuery() OVERRIDE { |
83 dhcp_query_ = new DelayingDhcpQuery(); | 83 dhcp_query_ = new DelayingDhcpQuery(); |
84 dhcp_query_->dhcp_delay_ = TimeDelta::FromMilliseconds(dhcp_delay_ms_); | 84 dhcp_query_->dhcp_delay_ = dhcp_delay_; |
85 dhcp_query_->configured_url_ = configured_url_; | 85 dhcp_query_->configured_url_ = configured_url_; |
86 return dhcp_query_; | 86 return dhcp_query_; |
87 } | 87 } |
88 | 88 |
89 // Use a shorter timeout so tests can finish more quickly. | 89 // Use a shorter timeout so tests can finish more quickly. |
90 virtual base::TimeDelta ImplGetTimeout() const OVERRIDE { | 90 virtual base::TimeDelta ImplGetTimeout() const OVERRIDE { |
91 return base::TimeDelta::FromMilliseconds(timeout_ms_); | 91 return timeout_; |
92 } | 92 } |
93 | 93 |
94 void OnFetcherTimer() { | 94 void OnFetcherTimer() { |
95 // Note that there is an assumption by this mock implementation that | 95 // Note that there is an assumption by this mock implementation that |
96 // DhcpProxyScriptAdapterFetcher::Fetch will call ImplCreateScriptFetcher | 96 // DhcpProxyScriptAdapterFetcher::Fetch will call ImplCreateScriptFetcher |
97 // and call Fetch on the fetcher before the message loop is re-entered. | 97 // and call Fetch on the fetcher before the message loop is re-entered. |
98 // This holds true today, but if you hit this DCHECK the problem can | 98 // This holds true today, but if you hit this DCHECK the problem can |
99 // possibly be resolved by having a separate subclass of | 99 // possibly be resolved by having a separate subclass of |
100 // MockProxyScriptFetcher that adds the delay internally (instead of | 100 // MockProxyScriptFetcher that adds the delay internally (instead of |
101 // the simple approach currently used in ImplCreateScriptFetcher above). | 101 // the simple approach currently used in ImplCreateScriptFetcher above). |
102 DCHECK(fetcher_ && fetcher_->has_pending_request()); | 102 DCHECK(fetcher_ && fetcher_->has_pending_request()); |
103 fetcher_->NotifyFetchCompletion(fetcher_result_, pac_script_); | 103 fetcher_->NotifyFetchCompletion(fetcher_result_, pac_script_); |
104 fetcher_ = NULL; | 104 fetcher_ = NULL; |
105 } | 105 } |
106 | 106 |
107 bool IsWaitingForFetcher() const { | 107 bool IsWaitingForFetcher() const { |
108 return state() == STATE_WAIT_URL; | 108 return state() == STATE_WAIT_URL; |
109 } | 109 } |
110 | 110 |
111 bool WasCancelled() const { | 111 bool WasCancelled() const { |
112 return state() == STATE_CANCEL; | 112 return state() == STATE_CANCEL; |
113 } | 113 } |
114 | 114 |
115 void FinishTest() { | 115 void FinishTest() { |
116 DCHECK(dhcp_query_); | 116 DCHECK(dhcp_query_); |
117 dhcp_query_->test_finished_event_.Signal(); | 117 dhcp_query_->test_finished_event_.Signal(); |
118 } | 118 } |
119 | 119 |
120 int dhcp_delay_ms_; | 120 base::TimeDelta dhcp_delay_; |
121 int timeout_ms_; | 121 base::TimeDelta timeout_; |
122 std::string configured_url_; | 122 std::string configured_url_; |
123 int fetcher_delay_ms_; | 123 int fetcher_delay_ms_; |
124 int fetcher_result_; | 124 int fetcher_result_; |
125 std::string pac_script_; | 125 std::string pac_script_; |
126 MockProxyScriptFetcher* fetcher_; | 126 MockProxyScriptFetcher* fetcher_; |
127 base::OneShotTimer<MockDhcpProxyScriptAdapterFetcher> fetcher_timer_; | 127 base::OneShotTimer<MockDhcpProxyScriptAdapterFetcher> fetcher_timer_; |
128 scoped_refptr<DelayingDhcpQuery> dhcp_query_; | 128 scoped_refptr<DelayingDhcpQuery> dhcp_query_; |
129 }; | 129 }; |
130 | 130 |
131 class FetcherClient { | 131 class FetcherClient { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 } | 176 } |
177 | 177 |
178 TEST(DhcpProxyScriptAdapterFetcher, TimeoutDuringDhcp) { | 178 TEST(DhcpProxyScriptAdapterFetcher, TimeoutDuringDhcp) { |
179 // Does a Fetch() with a long enough delay on accessing DHCP that the | 179 // Does a Fetch() with a long enough delay on accessing DHCP that the |
180 // fetcher should time out. This is to test a case manual testing found, | 180 // fetcher should time out. This is to test a case manual testing found, |
181 // where under certain circumstances (e.g. adapter enabled for DHCP and | 181 // where under certain circumstances (e.g. adapter enabled for DHCP and |
182 // needs to retrieve its configuration from DHCP, but no DHCP server | 182 // needs to retrieve its configuration from DHCP, but no DHCP server |
183 // present on the network) accessing DHCP can take on the order of tens | 183 // present on the network) accessing DHCP can take on the order of tens |
184 // of seconds. | 184 // of seconds. |
185 FetcherClient client; | 185 FetcherClient client; |
186 client.fetcher_->dhcp_delay_ms_ = TestTimeouts::action_max_timeout_ms(); | 186 client.fetcher_->dhcp_delay_ = TestTimeouts::action_max_timeout(); |
187 client.fetcher_->timeout_ms_ = 25; | 187 client.fetcher_->timeout_ = base::TimeDelta::FromMilliseconds(25); |
188 | 188 |
189 PerfTimer timer; | 189 PerfTimer timer; |
190 client.RunTest(); | 190 client.RunTest(); |
191 // An error different from this would be received if the timeout didn't | 191 // An error different from this would be received if the timeout didn't |
192 // kick in. | 192 // kick in. |
193 client.WaitForResult(ERR_TIMED_OUT); | 193 client.WaitForResult(ERR_TIMED_OUT); |
194 | 194 |
195 ASSERT_TRUE(client.fetcher_->DidFinish()); | 195 ASSERT_TRUE(client.fetcher_->DidFinish()); |
196 EXPECT_EQ(ERR_TIMED_OUT, client.fetcher_->GetResult()); | 196 EXPECT_EQ(ERR_TIMED_OUT, client.fetcher_->GetResult()); |
197 EXPECT_EQ(string16(L""), client.fetcher_->GetPacScript()); | 197 EXPECT_EQ(string16(L""), client.fetcher_->GetPacScript()); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 ASSERT_TRUE(client.fetcher_->DidFinish()); | 288 ASSERT_TRUE(client.fetcher_->DidFinish()); |
289 EXPECT_EQ(OK, client.fetcher_->GetResult()); | 289 EXPECT_EQ(OK, client.fetcher_->GetResult()); |
290 EXPECT_EQ(string16(L"-downloadable.pac-\n"), client.fetcher_->GetPacScript()); | 290 EXPECT_EQ(string16(L"-downloadable.pac-\n"), client.fetcher_->GetPacScript()); |
291 EXPECT_EQ(configured_url, | 291 EXPECT_EQ(configured_url, |
292 client.fetcher_->GetPacURL()); | 292 client.fetcher_->GetPacURL()); |
293 } | 293 } |
294 | 294 |
295 } // namespace | 295 } // namespace |
296 | 296 |
297 } // namespace net | 297 } // namespace net |
OLD | NEW |