17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <set> 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/bind.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/memory/scoped_ptr.h" 99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/path_service.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/prefs/pref_service.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/run_loop.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/threading/thread_restrictions.h" 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/browser_process.h" 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/io_thread.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/net/dns_probe_test_util.h" 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/net/net_error_tab_helper.h" 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/net/url_request_mock_util.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/browser.h" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/ui/tabs/tab_strip_model.h" 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/chrome_paths.h" 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/common/net/net_error_info.h" 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/common/pref_names.h" 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/test/base/in_process_browser_test.h" 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/test/base/ui_test_utils.h" 286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h" 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/browser_thread.h" 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/web_contents.h" 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/test/browser_test_utils.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/base/net_errors.h" 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/dns/dns_test_util.h" 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/test/url_request/url_request_failed_job.h" 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/test/url_request/url_request_mock_http_job.h" 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/url_request/url_request_filter.h" 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "net/url_request/url_request_interceptor.h" 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/url_request/url_request_job.h" 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::Bind; 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::Callback; 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::Closure; 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::ConstRef; 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::FilePath; 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::MessageLoop; 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing base::Unretained; 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing chrome_common_net::DnsProbeStatus; 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing content::BrowserThread; 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing net::URLRequestFailedJob; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing net::URLRequestMockHTTPJob; 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing content::WebContents; 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing google_util::LinkDoctorBaseURL; 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing net::MockDnsClientRule; 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing net::NetworkDelegate; 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing net::URLRequest; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing net::URLRequestFilter; 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using net::URLRequestInterceptor; 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing net::URLRequestJob; 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing ui_test_utils::NavigateToURL; 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochusing ui_test_utils::NavigateToURLBlockUntilNavigationsComplete; 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace chrome_browser_net { 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace { 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Postable function to run a Closure on the UI thread. Since 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// BrowserThread::PostTask returns a bool, it can't directly be posted to 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// another thread. 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void RunClosureOnUIThread(const base::Closure& closure) { 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, closure); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Wraps DnsProbeService and delays callbacks until someone calls 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// CallDelayedCallbacks. This allows the DnsProbeBrowserTest to enforce a 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// stricter ordering of events. 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DelayingDnsProbeService : public DnsProbeService { 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DelayingDnsProbeService() {} 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual ~DelayingDnsProbeService() { 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(delayed_probes_.empty()); 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ProbeDns(const ProbeCallback& callback) OVERRIDE { 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delayed_probes_.push_back(callback); 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void StartDelayedProbes() { 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<ProbeCallback> probes; 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch probes.swap(delayed_probes_); 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (std::vector<ProbeCallback>::const_iterator i = probes.begin(); 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch i != probes.end(); ++i) { 977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeService::ProbeDns(*i); 987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int delayed_probe_count() const { 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return delayed_probes_.size(); 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 1077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::vector<ProbeCallback> delayed_probes_; 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochFilePath GetMockLinkDoctorFilePath() { 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FilePath root_http; 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PathService::Get(chrome::DIR_TEST_DATA, &root_http); 113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return root_http.AppendASCII("mock-link-doctor.json"); 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A request that can be delayed until Resume() is called. Can also run a 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// callback if destroyed without being resumed. Resume can be called either 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// before or after a the request is started. 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DelayableRequest { 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called by a DelayableRequest if it was set to be delayed, and has been 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // destroyed without Undelay being called. 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) typedef base::Callback<void(DelayableRequest* request)> DestructionCallback; 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Resume() = 0; 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~DelayableRequest() {} 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DelayableURLRequestFailedJob : public URLRequestFailedJob, 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public DelayableRequest { 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |destruction_callback| is only called if a delayed request is destroyed 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // without being resumed. 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DelayableURLRequestFailedJob(net::URLRequest* request, 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::NetworkDelegate* network_delegate, 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int net_error, 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool should_delay, 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const DestructionCallback& destruction_callback) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : URLRequestFailedJob(request, network_delegate, net_error), 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_delay_(should_delay), 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_delayed_(false), 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) destruction_callback_(destruction_callback) {} 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Start() OVERRIDE { 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (should_delay_) { 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!start_delayed_); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_delayed_ = true; 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) URLRequestFailedJob::Start(); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Resume() OVERRIDE { 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(should_delay_); 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_delay_ = false; 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (start_delayed_) { 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_delayed_ = false; 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Start(); 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~DelayableURLRequestFailedJob() { 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (should_delay_) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) destruction_callback_.Run(this); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool should_delay_; 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool start_delayed_; 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const DestructionCallback destruction_callback_; 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class DelayableURLRequestMockHTTPJob : public URLRequestMockHTTPJob, 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public DelayableRequest { 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DelayableURLRequestMockHTTPJob( 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::URLRequest* request, 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net::NetworkDelegate* network_delegate, 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::FilePath& file_path, 182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool should_delay, 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const DestructionCallback& destruction_callback) 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : URLRequestMockHTTPJob( 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci request, 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci network_delegate, 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci file_path, 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior( 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)), 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_delay_(should_delay), 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_delayed_(false), 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) destruction_callback_(destruction_callback) {} 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Start() OVERRIDE { 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (should_delay_) { 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(!start_delayed_); 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_delayed_ = true; 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) URLRequestMockHTTPJob::Start(); 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Resume() OVERRIDE { 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DCHECK(should_delay_); 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) should_delay_ = false; 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (start_delayed_) { 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_delayed_ = false; 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Start(); 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~DelayableURLRequestMockHTTPJob() { 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (should_delay_) 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) destruction_callback_.Run(this); 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool should_delay_; 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool start_delayed_; 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const DestructionCallback destruction_callback_; 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Interceptor for navigation correction requests. Can cause requests to 224a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// fail with an error, and/or delay a request until a test allows to continue. 225a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Also can run a callback when a delayed request is cancelled. 22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class BreakableCorrectionInterceptor : public URLRequestInterceptor { 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) explicit BreakableCorrectionInterceptor( 229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const FilePath& mock_corrections_file_path) 230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : mock_corrections_file_path_(mock_corrections_file_path), 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) net_error_(net::OK), 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delay_requests_(false), 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) on_request_destroyed_callback_( 23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::Bind(&BreakableCorrectionInterceptor::OnRequestDestroyed, 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Unretained(this))) { 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~BreakableCorrectionInterceptor() { 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // All delayed requests should have been resumed or cancelled by this point. 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(delayed_requests_.empty()); 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual URLRequestJob* MaybeInterceptRequest( 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) URLRequest* request, 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NetworkDelegate* network_delegate) const OVERRIDE { 2467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (net_error_ != net::OK) { 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DelayableURLRequestFailedJob* job = 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new DelayableURLRequestFailedJob( 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request, network_delegate, net_error_, delay_requests_, 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) on_request_destroyed_callback_); 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (delay_requests_) 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delayed_requests_.insert(job); 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return job; 2547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DelayableURLRequestMockHTTPJob* job = 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new DelayableURLRequestMockHTTPJob( 257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch request, network_delegate, mock_corrections_file_path_, 258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delay_requests_, on_request_destroyed_callback_); 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (delay_requests_) 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delayed_requests_.insert(job); 261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return job; 2627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void set_net_error(int net_error) { net_error_ = net_error; } 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetDelayRequests(bool delay_requests) { 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delay_requests_ = delay_requests; 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Resume all delayed requests if no longer delaying requests. 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!delay_requests) { 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) while (!delayed_requests_.empty()) { 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DelayableRequest* request = *delayed_requests_.begin(); 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delayed_requests_.erase(request); 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) request->Resume(); 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Runs |callback| once all delayed requests have been destroyed. Does not 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // wait for delayed requests that have been resumed. 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetRequestDestructionCallback(const base::Closure& callback) { 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(delayed_request_destruction_callback_.is_null()); 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (delayed_requests_.empty()) { 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback.Run(); 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delayed_request_destruction_callback_ = callback; 289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void OnRequestDestroyed(DelayableRequest* request) { 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_EQ(1u, delayed_requests_.count(request)); 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delayed_requests_.erase(request); 294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (delayed_requests_.empty() && 295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !delayed_request_destruction_callback_.is_null()) { 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delayed_request_destruction_callback_.Run(); 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delayed_request_destruction_callback_.Reset(); 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 302a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const FilePath mock_corrections_file_path_; 3037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int net_error_; 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool delay_requests_; 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called when a request is destroyed. Memeber variable because 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // MaybeCreateJob is "const", so calling base::Bind in that function does 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // not work well. 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const DelayableRequest::DestructionCallback on_request_destroyed_callback_; 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Mutable is needed because MaybeCreateJob is const. 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mutable std::set<DelayableRequest*> delayed_requests_; 313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Closure delayed_request_destruction_callback_; 3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsProbeBrowserTestIOThreadHelper { 3187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 3197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeBrowserTestIOThreadHelper(); 3207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetUpOnIOThread(IOThread* io_thread); 3227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void CleanUpOnIOThreadAndDeleteHelper(); 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetMockDnsClientRules(MockDnsClientRule::Result system_good_result, 3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDnsClientRule::Result public_good_result); 326a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void SetCorrectionServiceNetError(int net_error); 327a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void SetCorrectionServiceDelayRequests(bool delay_requests); 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetRequestDestructionCallback(const base::Closure& callback); 3297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void StartDelayedProbes(int expected_delayed_probe_count); 3307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 3327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IOThread* io_thread_; 3337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeService* original_dns_probe_service_; 3347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DelayingDnsProbeService* delaying_dns_probe_service_; 33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) BreakableCorrectionInterceptor* interceptor_; 336a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch FilePath mock_corrections_file_path_; 3377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 3387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3397dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDnsProbeBrowserTestIOThreadHelper::DnsProbeBrowserTestIOThreadHelper() 3407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : io_thread_(NULL), 3417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch original_dns_probe_service_(NULL), 3427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delaying_dns_probe_service_(NULL), 34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) interceptor_(NULL), 344a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch mock_corrections_file_path_(GetMockLinkDoctorFilePath()) {} 3457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTestIOThreadHelper::SetUpOnIOThread(IOThread* io_thread) { 3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 3487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(io_thread); 3497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(!io_thread_); 3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(!original_dns_probe_service_); 3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(!delaying_dns_probe_service_); 35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CHECK(!interceptor_); 3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch io_thread_ = io_thread; 3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delaying_dns_probe_service_ = new DelayingDnsProbeService(); 3577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IOThread::Globals* globals = io_thread_->globals(); 3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch original_dns_probe_service_ = globals->dns_probe_service.release(); 3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch globals->dns_probe_service.reset(delaying_dns_probe_service_); 3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch URLRequestFailedJob::AddUrlHandler(); 3637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) interceptor_ = 36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new BreakableCorrectionInterceptor(mock_corrections_file_path_); 36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) URLRequestFilter::GetInstance()->AddUrlInterceptor( 36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) LinkDoctorBaseURL(), scoped_ptr<URLRequestInterceptor>(interceptor_)); 3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTestIOThreadHelper::CleanUpOnIOThreadAndDeleteHelper() { 3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch URLRequestFilter::GetInstance()->ClearHandlers(); 3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IOThread::Globals* globals = io_thread_->globals(); 3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<DnsProbeService> delaying_dns_probe_service( 3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch globals->dns_probe_service.release()); 3787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch globals->dns_probe_service.reset(original_dns_probe_service_); 3797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK_EQ(delaying_dns_probe_service_, delaying_dns_probe_service.get()); 3817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delete this; 3837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTestIOThreadHelper::SetMockDnsClientRules( 3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDnsClientRule::Result system_result, 3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDnsClientRule::Result public_result) { 3887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 3897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeService* service = io_thread_->globals()->dns_probe_service.get(); 3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch service->SetSystemClientForTesting( 3927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateMockDnsClientForProbes(system_result)); 3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch service->SetPublicClientForTesting( 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateMockDnsClientForProbes(public_result)); 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 397a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DnsProbeBrowserTestIOThreadHelper::SetCorrectionServiceNetError( 398a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int net_error) { 3997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 4007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) interceptor_->set_net_error(net_error); 4027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 404a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DnsProbeBrowserTestIOThreadHelper::SetCorrectionServiceDelayRequests( 405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool delay_requests) { 406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 40846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) interceptor_->SetDelayRequests(delay_requests); 409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 410f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DnsProbeBrowserTestIOThreadHelper::SetRequestDestructionCallback( 412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const base::Closure& callback) { 413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 414f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) interceptor_->SetRequestDestructionCallback(callback); 416f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTestIOThreadHelper::StartDelayedProbes( 4197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int expected_delayed_probe_count) { 4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(delaying_dns_probe_service_); 4237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int actual_delayed_probe_count = 4257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delaying_dns_probe_service_->delayed_probe_count(); 4267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(expected_delayed_probe_count, actual_delayed_probe_count); 4277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch delaying_dns_probe_service_->StartDelayedProbes(); 4297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass DnsProbeBrowserTest : public InProcessBrowserTest { 4327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 4337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeBrowserTest(); 434f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~DnsProbeBrowserTest(); 4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void SetUpOnMainThread() OVERRIDE; 4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDownOnMainThread() OVERRIDE; 4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch protected: 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Sets the browser object that other methods apply to, and that has the 441f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // DnsProbeStatus messages of its currently active tab monitored. 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void SetActiveBrowser(Browser* browser); 443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 444a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void SetCorrectionServiceBroken(bool broken); 445a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void SetCorrectionServiceDelayRequests(bool delay_requests); 446f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void WaitForDelayedRequestDestruction(); 4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void SetMockDnsClientRules(MockDnsClientRule::Result system_result, 4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDnsClientRule::Result public_result); 449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 450a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // These functions are often used to wait for two navigations because two 451a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // pages are loaded when navigation corrections are enabled: a blank page, so 452a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // the user stops seeing the previous page, and then the error page, either 453a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // with navigation corrections or without them (If the request failed). 454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void NavigateToDnsError(int num_navigations); 455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void NavigateToOtherError(int num_navigations); 4567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void StartDelayedProbes(int expected_delayed_probe_count); 4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeStatus WaitForSentStatus(); 4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int pending_status_count() const { return dns_probe_status_queue_.size(); } 4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string Title(); 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool PageContains(const std::string& expected); 4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checks that the local error page is being displayed, without navigation 465a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // corrections, and with the specified status text. The status text should be 466a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // either a network error or DNS probe status. 467a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ExpectDisplayingLocalErrorPage(const std::string& status_text); 468a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 469a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checks that an error page with mock navigation corrections is being 470a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // displayed, with the specified status text. The status text should be either 471a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // a network error or DNS probe status. 472a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void ExpectDisplayingCorrections(const std::string& status_text); 473a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 4747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch private: 4757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch void OnDnsProbeStatusSent(DnsProbeStatus dns_probe_status); 4767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeBrowserTestIOThreadHelper* helper_; 4787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Browser that methods apply to. 480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Browser* active_browser_; 481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Helper that current has its DnsProbeStatus messages monitored. 482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NetErrorTabHelper* monitored_tab_helper_; 483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool awaiting_dns_probe_status_; 4857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Queue of statuses received but not yet consumed by WaitForSentStatus(). 4867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::list<DnsProbeStatus> dns_probe_status_queue_; 4877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}; 4887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4897dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDnsProbeBrowserTest::DnsProbeBrowserTest() 4907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch : helper_(new DnsProbeBrowserTestIOThreadHelper()), 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_browser_(NULL), 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) monitored_tab_helper_(NULL), 4937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch awaiting_dns_probe_status_(false) { 4947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 4957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)DnsProbeBrowserTest::~DnsProbeBrowserTest() { 497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // No tests should have any unconsumed probe statuses. 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTest::SetUpOnMainThread() { 5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetErrorTabHelper::set_state_for_testing( 503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NetErrorTabHelper::TESTING_DEFAULT); 504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->profile()->GetPrefs()->SetBoolean( 506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs::kAlternateErrorPagesEnabled, true); 5077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::PostTask( 5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::IO, FROM_HERE, 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Bind(&DnsProbeBrowserTestIOThreadHelper::SetUpOnIOThread, 5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Unretained(helper_), 5127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch g_browser_process->io_thread())); 5137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetActiveBrowser(browser()); 5157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void DnsProbeBrowserTest::TearDownOnMainThread() { 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::PostTask( 5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::IO, FROM_HERE, 5207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Bind(&DnsProbeBrowserTestIOThreadHelper::CleanUpOnIOThreadAndDeleteHelper, 5217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Unretained(helper_))); 5227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetErrorTabHelper::set_state_for_testing( 5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NetErrorTabHelper::TESTING_DEFAULT); 5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DnsProbeBrowserTest::SetActiveBrowser(Browser* browser) { 528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If currently watching a NetErrorTabHelper, stop doing so before start 529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // watching another. 530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (monitored_tab_helper_) { 531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) monitored_tab_helper_->set_dns_probe_status_snoop_callback_for_testing( 532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NetErrorTabHelper::DnsProbeStatusSnoopCallback()); 533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_browser_ = browser; 535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) monitored_tab_helper_ = NetErrorTabHelper::FromWebContents( 536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_browser_->tab_strip_model()->GetActiveWebContents()); 537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) monitored_tab_helper_->set_dns_probe_status_snoop_callback_for_testing( 538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Bind(&DnsProbeBrowserTest::OnDnsProbeStatusSent, Unretained(this))); 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 541a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DnsProbeBrowserTest::SetCorrectionServiceBroken(bool broken) { 5427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int net_error = broken ? net::ERR_NAME_NOT_RESOLVED : net::OK; 5437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::PostTask( 5457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::IO, FROM_HERE, 546a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Bind(&DnsProbeBrowserTestIOThreadHelper::SetCorrectionServiceNetError, 5477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Unretained(helper_), 5487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch net_error)); 5497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 551a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DnsProbeBrowserTest::SetCorrectionServiceDelayRequests( 552a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch bool delay_requests) { 553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::PostTask( 554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 555a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch Bind(&DnsProbeBrowserTestIOThreadHelper:: 556a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceDelayRequests, 557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Unretained(helper_), 558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) delay_requests)); 559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 5607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DnsProbeBrowserTest::WaitForDelayedRequestDestruction() { 562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::RunLoop run_loop; 563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::PostTask( 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThread::IO, FROM_HERE, 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Bind(&DnsProbeBrowserTestIOThreadHelper::SetRequestDestructionCallback, 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Unretained(helper_), 567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&RunClosureOnUIThread, 568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) run_loop.QuitClosure()))); 569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) run_loop.Run(); 570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DnsProbeBrowserTest::NavigateToDnsError(int num_navigations) { 5737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NavigateToURLBlockUntilNavigationsComplete( 574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_browser_, 5757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch URLRequestFailedJob::GetMockHttpUrl(net::ERR_NAME_NOT_RESOLVED), 576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) num_navigations); 5777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void DnsProbeBrowserTest::NavigateToOtherError(int num_navigations) { 5807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NavigateToURLBlockUntilNavigationsComplete( 581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_browser_, 5827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch URLRequestFailedJob::GetMockHttpUrl(net::ERR_CONNECTION_REFUSED), 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) num_navigations); 5847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTest::SetMockDnsClientRules( 5877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDnsClientRule::Result system_result, 5887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDnsClientRule::Result public_result) { 5897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::PostTask( 5907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::IO, FROM_HERE, 5917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Bind(&DnsProbeBrowserTestIOThreadHelper::SetMockDnsClientRules, 5927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Unretained(helper_), 5937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch system_result, 5947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public_result)); 5957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 5967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTest::StartDelayedProbes( 5987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int expected_delayed_probe_count) { 5997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::PostTask( 6007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BrowserThread::IO, FROM_HERE, 6017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Bind(&DnsProbeBrowserTestIOThreadHelper::StartDelayedProbes, 6027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Unretained(helper_), 6037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch expected_delayed_probe_count)); 6047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6067dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDnsProbeStatus DnsProbeBrowserTest::WaitForSentStatus() { 6077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(!awaiting_dns_probe_status_); 6087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch while (dns_probe_status_queue_.empty()) { 6097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch awaiting_dns_probe_status_ = true; 6107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MessageLoop::current()->Run(); 6117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch awaiting_dns_probe_status_ = false; 6127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 6137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CHECK(!dns_probe_status_queue_.empty()); 6157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeStatus status = dns_probe_status_queue_.front(); 6167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dns_probe_status_queue_.pop_front(); 6177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return status; 6187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Check title by roundtripping to renderer, to make sure any probe results 6217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// sent before this have been applied. 6227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstd::string DnsProbeBrowserTest::Title() { 6237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string title; 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WebContents* contents = 626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_browser_->tab_strip_model()->GetActiveWebContents(); 6277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool rv = content::ExecuteScriptAndExtractString( 6297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch contents, 6307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "domAutomationController.send(document.title);", 6317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &title); 6327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!rv) 6337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return ""; 6347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return title; 6367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Check text by roundtripping to renderer, to make sure any probe results 6397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// sent before this have been applied. 6407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool DnsProbeBrowserTest::PageContains(const std::string& expected) { 6417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string text_content; 6427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool rv = content::ExecuteScriptAndExtractString( 644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) active_browser_->tab_strip_model()->GetActiveWebContents(), 6457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch "domAutomationController.send(document.body.textContent);", 6467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch &text_content); 6477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!rv) 6487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 6497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 6507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return text_content.find(expected) != std::string::npos; 6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 653a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DnsProbeBrowserTest::ExpectDisplayingLocalErrorPage( 654a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& status_text) { 655a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(PageContains("http://correction1/")); 656a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(PageContains("http://correction2/")); 657a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(PageContains(status_text)); 658a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 659a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 660a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid DnsProbeBrowserTest::ExpectDisplayingCorrections( 661a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& status_text) { 662a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(PageContains("http://correction1/")); 663a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(PageContains("http://correction2/")); 664a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(PageContains(status_text)); 665a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 666a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 6677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DnsProbeBrowserTest::OnDnsProbeStatusSent( 6687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DnsProbeStatus dns_probe_status) { 6697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch dns_probe_status_queue_.push_back(dns_probe_status); 6707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (awaiting_dns_probe_status_) 6717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MessageLoop::current()->Quit(); 6727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 674a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Make sure probes don't break non-DNS error pages when corrections load. 675a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, OtherErrorWithCorrectionsSuccess) { 676a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(false); 6777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToOtherError(2); 679a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingCorrections("ERR_CONNECTION_REFUSED"); 6807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 682a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Make sure probes don't break non-DNS error pages when corrections failed to 6837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// load. 684a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, OtherErrorWithCorrectionsFailure) { 685a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(true); 6867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToOtherError(2); 688a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("ERR_CONNECTION_REFUSED"); 6897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 6907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 691a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Make sure probes don't break DNS error pages when corrections load. 6927dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, 693a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NxdomainProbeResultWithWorkingCorrections) { 694a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(false); 6957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetMockDnsClientRules(MockDnsClientRule::OK, MockDnsClientRule::OK); 6967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(2); 698a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingCorrections("ERR_NAME_NOT_RESOLVED"); 6997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 700a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // One status for committing a blank page before the corrections, and one for 701a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // when the error page with corrections is committed. 7027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 7037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 7047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 705a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingCorrections("ERR_NAME_NOT_RESOLVED"); 7067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch StartDelayedProbes(1); 7087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, 7107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WaitForSentStatus()); 7117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 712a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingCorrections("ERR_NAME_NOT_RESOLVED"); 7137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 7147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 715a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Make sure probes don't break corrections when probes complete before the 716a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// corrections load. 717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, 718a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NxdomainProbeResultWithWorkingSlowCorrections) { 719a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(false); 720a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceDelayRequests(true); 721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetMockDnsClientRules(MockDnsClientRule::OK, MockDnsClientRule::OK); 722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(1); 724a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // A blank page should be displayed while the corrections are loaded. 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A single probe should be triggered by the error page load, and it should 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // be ignored. 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StartDelayedProbes(1); 734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, 735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::TestNavigationObserver observer( 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(), 1); 741a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The corrections finish loading. 742a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceDelayRequests(false); 743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Wait for it to commit. 744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 745a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingCorrections("ERR_NAME_NOT_RESOLVED"); 746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 747a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Committing the corections page should trigger sending the probe result 748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // again. 749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NXDOMAIN, 750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 751a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingCorrections("ERR_NAME_NOT_RESOLVED"); 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Make sure probes update DNS error page properly when they're supposed to. 7557dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, 756a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NoInternetProbeResultWithBrokenCorrections) { 757a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(true); 7587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SetMockDnsClientRules(MockDnsClientRule::TIMEOUT, 7597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch MockDnsClientRule::TIMEOUT); 7607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(2); 7627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 7647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 7657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 766a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checking the page runs the RunLoop, so make sure nothing hairy happens. 7677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 768a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("DNS_PROBE_STARTED"); 7697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 7707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch StartDelayedProbes(1); 7727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 7737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET, 7747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WaitForSentStatus()); 7757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 776a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checking the page runs the RunLoop, so make sure nothing hairy happens. 7777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 778a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("DNS_PROBE_FINISHED_NO_INTERNET"); 779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 781a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Make sure probes don't break corrections when probes complete before the 782a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// corrections request returns an error. 783f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, 784a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch NoInternetProbeResultWithSlowBrokenCorrections) { 785a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(true); 786a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceDelayRequests(true); 787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetMockDnsClientRules(MockDnsClientRule::TIMEOUT, 788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockDnsClientRule::TIMEOUT); 789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(1); 791a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // A blank page should be displayed while the corrections load. 792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // A single probe should be triggered by the error page load, and it should 795f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // be ignored. 796f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 7977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 799f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StartDelayedProbes(1); 801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET, 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 805f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 806f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::TestNavigationObserver observer( 807f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(), 1); 808a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // The corrections request fails. 809a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceDelayRequests(false); 810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Wait for the DNS error page to load instead. 811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) observer.Wait(); 812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The page committing should result in sending the probe results again. 813f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET, 814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 817a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("DNS_PROBE_FINISHED_NO_INTERNET"); 8187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 8197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Double-check to make sure sync failures don't explode. 821a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, SyncFailureWithBrokenCorrections) { 822a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(true); 823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch SetMockDnsClientRules(MockDnsClientRule::FAIL, MockDnsClientRule::FAIL); 8247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 825f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(2); 8267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 8287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 8297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 830a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checking the page runs the RunLoop, so make sure nothing hairy happens. 8317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 832a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("DNS_PROBE_STARTED"); 8337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 8347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch StartDelayedProbes(1); 8367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 8377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE, 8387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch WaitForSentStatus()); 8397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 840a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checking the page runs the RunLoop, so make sure nothing hairy happens. 8417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 842a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("ERR_NAME_NOT_RESOLVED"); 8437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 8447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 8457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 846a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Test that pressing the stop button cancels loading corrections. 847f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// TODO(mmenke): Add a test for the cross process navigation case. 848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// TODO(mmenke): This test could flakily pass due to the timeout on downloading 849a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// the corrections. Disable that timeout for browser tests. 850a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, CorrectionsLoadStopped) { 851a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceDelayRequests(true); 852a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(true); 853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetMockDnsClientRules(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT); 854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(1); 856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StartDelayedProbes(1); 859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET, 860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::Stop(browser()); 866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForDelayedRequestDestruction(); 867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // End up displaying a blank page. 869f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 870f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 871f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 872a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Test that pressing the stop button cancels the load of corrections, and 873a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// receiving a probe result afterwards does not swap in a DNS error page. 874a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, CorrectionsLoadStoppedSlowProbe) { 875a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceDelayRequests(true); 876a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(true); 877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetMockDnsClientRules(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT); 878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(1); 880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 883f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 884f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) chrome::Stop(browser()); 887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForDelayedRequestDestruction(); 888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StartDelayedProbes(1); 893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_NO_INTERNET, 894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("", Title()); 897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Make sure probes don't run for subframe DNS errors. 9007dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, NoProbeInSubframe) { 901a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(false); 9027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FilePath::CharType kIframeDnsErrorHtmlName[] = 9047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FILE_PATH_LITERAL("iframe_dns_error.html"); 9057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NavigateToURL( 9077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch browser(), 9087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch URLRequestMockHTTPJob::GetMockUrl(FilePath(kIframeDnsErrorHtmlName))); 9097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // By the time NavigateToURL returns, the browser will have seen the failed 9117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // provisional load. If a probe was started (or considered but not run), 9127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // then the NetErrorTabHelper would have sent a NetErrorInfo message. Thus, 9137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // if one hasn't been sent by now, the NetErrorTabHelper has not (and won't) 9147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // start a probe for this DNS error. 9157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 9167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Make sure browser sends NOT_RUN properly when probes are disabled. 9197dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, ProbesDisabled) { 920a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Disable probes (And corrections). 921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->profile()->GetPrefs()->SetBoolean( 922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs::kAlternateErrorPagesEnabled, false); 9237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 924a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(true); 925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetMockDnsClientRules(MockDnsClientRule::TIMEOUT, MockDnsClientRule::TIMEOUT); 9267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(1); 9287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(chrome_common_net::DNS_PROBE_NOT_RUN, WaitForSentStatus()); 9307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 931a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checking the page runs the RunLoop, so make sure nothing hairy happens. 9327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 933a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("ERR_NAME_NOT_RESOLVED"); 934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 936a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Test the case that corrections are disabled, but DNS probes are enabled. 937a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// This is the case with Chromium builds. 938a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, CorrectionsDisabled) { 939a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Disable corrections. 940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser()->profile()->GetPrefs()->SetBoolean( 941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) prefs::kAlternateErrorPagesEnabled, false); 942a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Requests to the correction service should work if any are made, so the test 943a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // fails if that happens unexpectedly. 944a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(false); 945a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Normally disabling corrections disables DNS probes, so force DNS probes 946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to be enabled. 947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NetErrorTabHelper::set_state_for_testing( 948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NetErrorTabHelper::TESTING_FORCE_ENABLED); 949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetMockDnsClientRules(MockDnsClientRule::FAIL, MockDnsClientRule::FAIL); 951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 952a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Just one commit and one sent status, since corrections are disabled. 953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(1); 954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 955f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 956a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checking the page runs the RunLoop, so make sure nothing hairy happens. 957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 958a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("DNS_PROBE_STARTED"); 959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StartDelayedProbes(1); 962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE, 964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 966a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("ERR_NAME_NOT_RESOLVED"); 967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 969a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Test incognito mode. Corrections should be disabled, but DNS probes are 970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// still enabled. 971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(DnsProbeBrowserTest, Incognito) { 972a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Requests to the correction service should work if any are made, so the test 973a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // will fail if one is requested unexpectedly. 974a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch SetCorrectionServiceBroken(false); 975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Browser* incognito = CreateIncognitoBrowser(); 977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetActiveBrowser(incognito); 978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetMockDnsClientRules(MockDnsClientRule::FAIL, MockDnsClientRule::FAIL); 980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 981a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Just one commit and one sent status, since the corrections are disabled. 982f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) NavigateToDnsError(1); 983f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_STARTED, WaitForSentStatus()); 984f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 985a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Checking the page runs the RunLoop, so make sure nothing hairy happens. 986f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 987a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("DNS_PROBE_STARTED"); 988f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(0, pending_status_count()); 989f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 990f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) StartDelayedProbes(1); 991f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 992f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(chrome_common_net::DNS_PROBE_FINISHED_INCONCLUSIVE, 993f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WaitForSentStatus()); 9947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_EQ(0, pending_status_count()); 995a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ExpectDisplayingLocalErrorPage("ERR_NAME_NOT_RESOLVED"); 9967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 9977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 9987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace 9997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 10007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace chrome_browser_net 1001