OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/net/net_error_tab_helper.h" | |
6 | |
7 #include "base/message_loop.h" | |
8 #include "chrome/common/net/net_error_info.h" | |
9 #include "content/public/browser/browser_thread.h" | |
10 #include "content/public/common/page_transition_types.h" | |
11 #include "content/public/test/test_browser_thread.h" | |
12 #include "net/base/net_errors.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 using base::MessageLoop; | |
16 using chrome_browser_net::NetErrorTabHelper; | |
17 using chrome_common_net::DnsProbeStatus; | |
18 using content::BrowserThread; | |
19 using content::TestBrowserThread; | |
20 | |
21 class TestNetErrorTabHelper : public NetErrorTabHelper { | |
22 public: | |
23 TestNetErrorTabHelper() | |
24 : NetErrorTabHelper(NULL), | |
25 mock_probe_running_(false), | |
26 last_status_sent_(chrome_common_net::DNS_PROBE_MAX), | |
27 mock_sent_count_(0) {} | |
28 | |
29 void FinishProbe(DnsProbeStatus status) { | |
30 EXPECT_TRUE(mock_probe_running_); | |
31 OnDnsProbeFinished(status); | |
32 mock_probe_running_ = false; | |
33 } | |
34 | |
35 bool mock_probe_running() const { return mock_probe_running_; } | |
36 DnsProbeStatus last_status_sent() const { return last_status_sent_; } | |
37 int mock_sent_count() const { return mock_sent_count_; } | |
38 | |
39 private: | |
40 virtual void StartDnsProbe() OVERRIDE { | |
41 EXPECT_FALSE(mock_probe_running_); | |
42 mock_probe_running_ = true; | |
43 } | |
44 | |
45 virtual void SendInfo() OVERRIDE { | |
46 last_status_sent_ = dns_probe_status(); | |
47 mock_sent_count_++; | |
48 } | |
49 | |
50 bool mock_probe_running_; | |
51 DnsProbeStatus last_status_sent_; | |
52 int mock_sent_count_; | |
53 }; | |
54 | |
55 class NetErrorTabHelperTest : public testing::Test { | |
56 protected: | |
57 enum MainFrame { SUB_FRAME, MAIN_FRAME }; | |
58 enum ErrorPage { NORMAL_PAGE, ERROR_PAGE }; | |
59 enum ErrorType { DNS_ERROR, OTHER_ERROR }; | |
60 | |
61 NetErrorTabHelperTest() | |
62 : fake_ui_thread_(BrowserThread::UI, &message_loop_) { | |
63 NetErrorTabHelper::set_state_for_testing( | |
64 NetErrorTabHelper::TESTING_FORCE_ENABLED); | |
65 } | |
66 | |
67 void StartProvisionalLoad(MainFrame main_frame, ErrorPage error_page) { | |
68 tab_helper_.DidStartProvisionalLoadForFrame( | |
69 1, // frame_id | |
70 0, // parent_frame_id | |
71 (main_frame == MAIN_FRAME), | |
72 bogus_url_, // validated_url | |
73 (error_page == ERROR_PAGE), | |
74 false, // is_iframe_srcdoc | |
75 NULL); // render_view_host | |
76 } | |
77 | |
78 void CommitProvisionalLoad(MainFrame main_frame) { | |
79 tab_helper_.DidCommitProvisionalLoadForFrame( | |
80 1, // frame id | |
81 (main_frame == MAIN_FRAME), | |
82 bogus_url_, // url | |
83 content::PAGE_TRANSITION_TYPED, | |
84 NULL); // render_view_host | |
85 } | |
86 | |
87 void FailProvisionalLoad(MainFrame main_frame, ErrorType error_type) { | |
88 int net_error; | |
89 | |
90 if (error_type == DNS_ERROR) | |
91 net_error = net::ERR_NAME_NOT_RESOLVED; | |
92 else | |
93 net_error = net::ERR_TIMED_OUT; | |
94 | |
95 tab_helper_.DidFailProvisionalLoad( | |
96 1, // frame id | |
97 (main_frame == MAIN_FRAME), | |
98 bogus_url_, // validated_url | |
99 net_error, | |
100 string16(), | |
101 NULL); // render_view_host | |
102 } | |
103 | |
104 void FinishProbe(DnsProbeStatus status) { | |
105 tab_helper_.FinishProbe(status); | |
106 } | |
107 | |
108 bool probe_running() { return tab_helper_.mock_probe_running(); } | |
109 DnsProbeStatus last_status_sent() { return tab_helper_.last_status_sent(); } | |
110 int sent_count() { return tab_helper_.mock_sent_count(); } | |
111 | |
112 private: | |
113 MessageLoop message_loop_; | |
114 TestBrowserThread fake_ui_thread_; | |
115 TestNetErrorTabHelper tab_helper_; | |
116 GURL bogus_url_; | |
117 }; | |
118 | |
119 TEST_F(NetErrorTabHelperTest, Null) { | |
120 EXPECT_FALSE(probe_running()); | |
121 } | |
122 | |
123 TEST_F(NetErrorTabHelperTest, MainFrameNonDnsError) { | |
124 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
125 FailProvisionalLoad(MAIN_FRAME, OTHER_ERROR); | |
126 EXPECT_FALSE(probe_running()); | |
127 EXPECT_EQ(0, sent_count()); | |
128 } | |
129 | |
130 TEST_F(NetErrorTabHelperTest, NonMainFrameDnsError) { | |
131 StartProvisionalLoad(SUB_FRAME, NORMAL_PAGE); | |
132 FailProvisionalLoad(SUB_FRAME, DNS_ERROR); | |
133 EXPECT_FALSE(probe_running()); | |
134 EXPECT_EQ(0, sent_count()); | |
135 } | |
136 | |
137 // Test full-blown DNS error page loads. Note that the helper (can) see two | |
mmenke
2013/07/15 16:33:22
optional nit: Not sure what meaning "full-blown" a
Deprecated (see juliatuttle)
2013/07/15 19:33:38
Done.
| |
138 // error page loads: Link Doctor loads an empty HTML page so the user knows | |
139 // something is going on, then fails over to the normal error page if and when | |
140 // Link Doctor fails to load or declines to provide a page. | |
141 | |
142 TEST_F(NetErrorTabHelperTest, ProbeResponseBeforeFirstCommit) { | |
143 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
144 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
145 EXPECT_TRUE(probe_running()); | |
146 EXPECT_EQ(0, sent_count()); | |
147 | |
148 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
149 EXPECT_TRUE(probe_running()); | |
150 EXPECT_EQ(0, sent_count()); | |
151 | |
152 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
153 EXPECT_FALSE(probe_running()); | |
154 EXPECT_EQ(0, sent_count()); | |
155 | |
156 CommitProvisionalLoad(MAIN_FRAME); | |
157 EXPECT_FALSE(probe_running()); | |
158 EXPECT_EQ(1, sent_count()); | |
159 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
160 | |
161 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
162 EXPECT_FALSE(probe_running()); | |
163 EXPECT_EQ(1, sent_count()); | |
164 | |
165 CommitProvisionalLoad(MAIN_FRAME); | |
166 EXPECT_FALSE(probe_running()); | |
167 EXPECT_EQ(2, sent_count()); | |
168 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
169 } | |
170 | |
171 TEST_F(NetErrorTabHelperTest, ProbeResponseBetweenFirstAndSecondCommit) { | |
172 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
173 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
174 EXPECT_TRUE(probe_running()); | |
175 EXPECT_EQ(0, sent_count()); | |
176 | |
177 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
178 EXPECT_TRUE(probe_running()); | |
179 EXPECT_EQ(0, sent_count()); | |
180 | |
181 CommitProvisionalLoad(MAIN_FRAME); | |
182 EXPECT_TRUE(probe_running()); | |
183 EXPECT_EQ(1, sent_count()); | |
184 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
185 | |
186 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
187 EXPECT_FALSE(probe_running()); | |
188 EXPECT_EQ(2, sent_count()); | |
189 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
190 | |
191 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
192 EXPECT_FALSE(probe_running()); | |
193 EXPECT_EQ(2, sent_count()); | |
194 | |
195 CommitProvisionalLoad(MAIN_FRAME); | |
196 EXPECT_FALSE(probe_running()); | |
197 EXPECT_EQ(3, sent_count()); | |
198 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
199 } | |
200 | |
201 TEST_F(NetErrorTabHelperTest, ProbeResponseAfterSecondCommit) { | |
202 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
203 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
204 EXPECT_TRUE(probe_running()); | |
205 EXPECT_EQ(0, sent_count()); | |
206 | |
207 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
208 EXPECT_TRUE(probe_running()); | |
209 EXPECT_EQ(0, sent_count()); | |
210 | |
211 CommitProvisionalLoad(MAIN_FRAME); | |
212 EXPECT_TRUE(probe_running()); | |
213 EXPECT_EQ(1, sent_count()); | |
214 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
215 | |
216 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
217 EXPECT_TRUE(probe_running()); | |
218 EXPECT_EQ(1, sent_count()); | |
219 | |
220 CommitProvisionalLoad(MAIN_FRAME); | |
221 EXPECT_TRUE(probe_running()); | |
222 EXPECT_EQ(2, sent_count()); | |
223 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
224 | |
225 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
226 EXPECT_FALSE(probe_running()); | |
227 EXPECT_EQ(3, sent_count()); | |
228 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
229 } | |
230 | |
231 // Send result even if a new page load has started; the error page is still | |
232 // visible, and the user might cancel the load. | |
233 TEST_F(NetErrorTabHelperTest, ProbeResponseAfterNewStart) { | |
234 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
235 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
236 EXPECT_TRUE(probe_running()); | |
237 EXPECT_EQ(0, sent_count()); | |
238 | |
239 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
240 EXPECT_TRUE(probe_running()); | |
241 EXPECT_EQ(0, sent_count()); | |
242 | |
243 CommitProvisionalLoad(MAIN_FRAME); | |
244 EXPECT_TRUE(probe_running()); | |
245 EXPECT_EQ(1, sent_count()); | |
246 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
247 | |
248 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
249 EXPECT_TRUE(probe_running()); | |
250 EXPECT_EQ(1, sent_count()); | |
251 | |
252 CommitProvisionalLoad(MAIN_FRAME); | |
253 EXPECT_TRUE(probe_running()); | |
254 EXPECT_EQ(2, sent_count()); | |
255 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
256 | |
257 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
258 EXPECT_TRUE(probe_running()); | |
259 EXPECT_EQ(2, sent_count()); | |
260 | |
261 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
262 EXPECT_FALSE(probe_running()); | |
263 EXPECT_EQ(3, sent_count()); | |
264 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
265 } | |
266 | |
267 // Don't send result if a new page has committed; the result would go to the | |
268 // wrong page, and the error page is gone anyway. | |
269 TEST_F(NetErrorTabHelperTest, ProbeResponseAfterNewCommit) { | |
270 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
271 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
272 EXPECT_TRUE(probe_running()); | |
273 EXPECT_EQ(0, sent_count()); | |
274 | |
275 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
276 EXPECT_TRUE(probe_running()); | |
277 EXPECT_EQ(0, sent_count()); | |
278 | |
279 CommitProvisionalLoad(MAIN_FRAME); | |
280 EXPECT_TRUE(probe_running()); | |
281 EXPECT_EQ(1, sent_count()); | |
282 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
283 | |
284 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
285 EXPECT_TRUE(probe_running()); | |
286 EXPECT_EQ(1, sent_count()); | |
287 | |
288 CommitProvisionalLoad(MAIN_FRAME); | |
289 EXPECT_TRUE(probe_running()); | |
290 EXPECT_EQ(2, sent_count()); | |
291 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
292 | |
293 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
294 EXPECT_TRUE(probe_running()); | |
295 EXPECT_EQ(2, sent_count()); | |
296 | |
297 CommitProvisionalLoad(MAIN_FRAME); | |
298 EXPECT_TRUE(probe_running()); | |
299 EXPECT_EQ(2, sent_count()); | |
300 | |
301 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
302 EXPECT_FALSE(probe_running()); | |
303 EXPECT_EQ(2, sent_count()); | |
304 } | |
305 | |
306 TEST_F(NetErrorTabHelperTest, MultipleDnsErrorsWithProbesWithoutErrorPages) { | |
307 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
308 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
309 EXPECT_TRUE(probe_running()); | |
310 EXPECT_EQ(0, sent_count()); | |
311 | |
312 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
313 EXPECT_FALSE(probe_running()); | |
314 EXPECT_EQ(0, sent_count()); | |
315 | |
316 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
317 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
318 EXPECT_TRUE(probe_running()); | |
319 EXPECT_EQ(0, sent_count()); | |
320 | |
321 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET); | |
322 EXPECT_FALSE(probe_running()); | |
323 EXPECT_EQ(0, sent_count()); | |
324 } | |
325 | |
326 TEST_F(NetErrorTabHelperTest, MultipleDnsErrorsWithProbesAndErrorPages) { | |
327 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
328 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
329 EXPECT_TRUE(probe_running()); | |
330 EXPECT_EQ(0, sent_count()); | |
331 | |
332 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
333 CommitProvisionalLoad(MAIN_FRAME); | |
334 EXPECT_TRUE(probe_running()); | |
335 EXPECT_EQ(1, sent_count()); | |
336 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
337 | |
338 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
339 EXPECT_FALSE(probe_running()); | |
340 EXPECT_EQ(2, sent_count()); | |
341 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
342 | |
343 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
344 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
345 EXPECT_TRUE(probe_running()); | |
346 EXPECT_EQ(2, sent_count()); | |
347 | |
348 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
349 CommitProvisionalLoad(MAIN_FRAME); | |
350 EXPECT_TRUE(probe_running()); | |
351 EXPECT_EQ(3, sent_count()); | |
352 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
353 | |
354 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET); | |
355 EXPECT_FALSE(probe_running()); | |
356 EXPECT_EQ(4, sent_count()); | |
357 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET, | |
358 last_status_sent()); | |
359 } | |
360 | |
361 // If multiple DNS errors occur in a row before a probe result, don't start | |
362 // multiple probes. | |
363 TEST_F(NetErrorTabHelperTest, CoalesceFailures) { | |
364 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
365 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
366 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
367 CommitProvisionalLoad(MAIN_FRAME); | |
368 EXPECT_TRUE(probe_running()); | |
369 EXPECT_EQ(1, sent_count()); | |
370 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
371 | |
372 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
373 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
374 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
375 CommitProvisionalLoad(MAIN_FRAME); | |
376 EXPECT_TRUE(probe_running()); | |
377 EXPECT_EQ(2, sent_count()); | |
378 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
379 | |
380 StartProvisionalLoad(MAIN_FRAME, NORMAL_PAGE); | |
381 FailProvisionalLoad(MAIN_FRAME, DNS_ERROR); | |
382 StartProvisionalLoad(MAIN_FRAME, ERROR_PAGE); | |
383 CommitProvisionalLoad(MAIN_FRAME); | |
384 EXPECT_TRUE(probe_running()); | |
385 EXPECT_EQ(3, sent_count()); | |
386 EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, last_status_sent()); | |
387 | |
388 FinishProbe(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN); | |
389 EXPECT_FALSE(probe_running()); | |
390 EXPECT_EQ(4, sent_count()); | |
391 EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, last_status_sent()); | |
392 } | |
OLD | NEW |