15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/run_loop.h" 115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_unittest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/dhcp_proxy_script_fetcher.h" 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/proxy/mock_proxy_script_fetcher.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_resolver.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_script_decider.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_script_fetcher.h" 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "net/url_request/url_request_context.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Error { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFailedDownloading = -100, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFailedParsing = ERR_PAC_SCRIPT_FAILED, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rules { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Rule { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rule(const GURL& url, int fetch_error, bool is_valid_script) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : url(url), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetch_error(fetch_error), 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_valid_script(is_valid_script) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text() const { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_valid_script) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF8ToUTF16(url.spec() + "!FindProxyForURL"); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fetch_error == OK) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF8ToUTF16(url.spec() + "!invalid-script"); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::string16(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fetch_error; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_valid_script; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rule AddSuccessRule(const char* url) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rule rule(GURL(url), OK /*fetch_error*/, true); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_.push_back(rule); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rule; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddFailDownloadRule(const char* url) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_.push_back(Rule(GURL(url), kFailedDownloading /*fetch_error*/, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddFailParsingRule(const char* url) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_.push_back(Rule(GURL(url), OK /*fetch_error*/, false)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Rule& GetRuleByUrl(const GURL& url) const { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RuleList::const_iterator it = rules_.begin(); it != rules_.end(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->url == url) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *it; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Rule not found for " << url; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rules_[0]; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Rule& GetRuleByText(const base::string16& text) const { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RuleList::const_iterator it = rules_.begin(); it != rules_.end(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->text() == text) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *it; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Rule not found for " << text; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rules_[0]; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<Rule> RuleList; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleList rules_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RuleBasedProxyScriptFetcher : public ProxyScriptFetcher { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) explicit RuleBasedProxyScriptFetcher(const Rules* rules) 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : rules_(rules), request_context_(NULL) {} 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetRequestContext(URLRequestContext* context) { 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) request_context_ = context; 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProxyScriptFetcher implementation. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Fetch(const GURL& url, 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* text, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Rules::Rule& rule = rules_->GetRuleByUrl(url); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = rule.fetch_error; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERR_UNEXPECTED, rv); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == OK) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = rule.text(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE {} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual URLRequestContext* GetRequestContext() const OVERRIDE { 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return request_context_; 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Rules* rules_; 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) URLRequestContext* request_context_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// A mock retriever, returns asynchronously when CompleteRequests() is called. 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MockDhcpProxyScriptFetcher : public DhcpProxyScriptFetcher { 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockDhcpProxyScriptFetcher(); 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~MockDhcpProxyScriptFetcher(); 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual int Fetch(base::string16* utf16_text, 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE; 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void Cancel() OVERRIDE; 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual const GURL& GetPacURL() const OVERRIDE; 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void SetPacURL(const GURL& url); 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void CompleteRequests(int result, const base::string16& script); 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CompletionCallback callback_; 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16* utf16_text_; 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL gurl_; 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockDhcpProxyScriptFetcher); 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MockDhcpProxyScriptFetcher::MockDhcpProxyScriptFetcher() { } 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)MockDhcpProxyScriptFetcher::~MockDhcpProxyScriptFetcher() { } 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int MockDhcpProxyScriptFetcher::Fetch(base::string16* utf16_text, 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const CompletionCallback& callback) { 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) utf16_text_ = utf16_text; 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_ = callback; 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ERR_IO_PENDING; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MockDhcpProxyScriptFetcher::Cancel() { } 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const GURL& MockDhcpProxyScriptFetcher::GetPacURL() const { 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return gurl_; 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MockDhcpProxyScriptFetcher::SetPacURL(const GURL& url) { 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gurl_ = url; 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void MockDhcpProxyScriptFetcher::CompleteRequests( 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int result, const base::string16& script) { 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *utf16_text_ = script; 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_.Run(result); 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Succeed using custom PAC script. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacSucceeds) { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, entries.size()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(config.pac_url(), decider.effective_config().pac_url()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fail downloading the custom PAC script. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails1) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, entries.size()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(decider.effective_config().has_pac_url()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fail parsing the custom PAC script. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails2) { 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://custom/proxy.pac"); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedParsing, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fail downloading the custom PAC script, because the fetcher was NULL. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, HasNullProxyScriptFetcher) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(NULL, &dhcp_fetcher, NULL); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_UNEXPECTED, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Succeeds in choosing autodetect (WPAD DNS). 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectSuccess) { 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://wpad/wpad.dat"); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.url, decider.effective_config().pac_url()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ProxyScriptDeciderQuickCheckTest : public ::testing::Test { 308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public: 309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ProxyScriptDeciderQuickCheckTest() 310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) : rule_(rules_.AddSuccessRule("http://wpad/wpad.dat")), 311d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) fetcher_(&rules_) { } 312d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetUp() OVERRIDE { 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) request_context_.set_host_resolver(&resolver_); 315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) fetcher_.SetRequestContext(&request_context_); 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) config_.set_auto_detect(true); 317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) decider_.reset(new ProxyScriptDecider(&fetcher_, &dhcp_fetcher_, NULL)); 318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) int StartDecider() { 321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return decider_->Start(config_, base::TimeDelta(), true, 322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.callback()); 323d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 324d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 325d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) protected: 326d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_ptr<ProxyScriptDecider> decider_; 327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) MockHostResolver resolver_; 328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Rules rules_; 329d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) Rules::Rule rule_; 330d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) TestCompletionCallback callback_; 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RuleBasedProxyScriptFetcher fetcher_; 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ProxyConfig config_; 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher_; 334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 335d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 336d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) URLRequestContext request_context_; 337d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 338d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 339d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Fails if a synchronous DNS lookup success for wpad causes QuickCheck to fail. 340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ProxyScriptDeciderQuickCheckTest, SyncSuccess) { 341d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.set_synchronous_mode(true); 342d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.rules()->AddRule("wpad", "1.2.3.4"); 343d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 344d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(OK, StartDecider()); 345d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(rule_.text(), decider_->script_data()->utf16()); 346d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 347d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(decider_->effective_config().has_pac_url()); 348d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(rule_.url, decider_->effective_config().pac_url()); 349d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 350d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Fails if an asynchronous DNS lookup success for wpad causes QuickCheck to 352d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// fail. 353d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ProxyScriptDeciderQuickCheckTest, AsyncSuccess) { 354d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.set_ondemand_mode(true); 355d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.rules()->AddRule("wpad", "1.2.3.4"); 356d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, StartDecider()); 358d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(resolver_.has_pending_requests()); 359d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.ResolveAllPending(); 360d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.WaitForResult(); 361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(resolver_.has_pending_requests()); 362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(rule_.text(), decider_->script_data()->utf16()); 363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_TRUE(decider_->effective_config().has_pac_url()); 364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(rule_.url, decider_->effective_config().pac_url()); 365d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 366d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Fails if an asynchronous DNS lookup failure (i.e. an NXDOMAIN) still causes 368d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// ProxyScriptDecider to yield a PAC URL. 369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ProxyScriptDeciderQuickCheckTest, AsyncFail) { 370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.set_ondemand_mode(true); 371d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.rules()->AddSimulatedFailure("wpad"); 372d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, StartDecider()); 373d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(resolver_.has_pending_requests()); 374d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.ResolveAllPending(); 375d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.WaitForResult(); 376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(decider_->effective_config().has_pac_url()); 377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Fails if a DNS lookup timeout either causes ProxyScriptDecider to yield a PAC 380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// URL or causes ProxyScriptDecider not to cancel its pending resolution. 381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ProxyScriptDeciderQuickCheckTest, AsyncTimeout) { 382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) resolver_.set_ondemand_mode(true); 383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, StartDecider()); 384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(resolver_.has_pending_requests()); 385d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) callback_.WaitForResult(); 386d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(resolver_.has_pending_requests()); 387d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_FALSE(decider_->effective_config().has_pac_url()); 388d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 389d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 390f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Fails if DHCP check doesn't take place before QuickCheck. 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ProxyScriptDeciderQuickCheckTest, QuickCheckInhibitsDhcp) { 392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockDhcpProxyScriptFetcher dhcp_fetcher; 393f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const char *kPac = "function FindProxyForURL(u,h) { return \"DIRECT\"; }"; 394f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::string16 pac_contents = base::UTF8ToUTF16(kPac); 395f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GURL url("http://foobar/baz"); 396f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) dhcp_fetcher.SetPacURL(url); 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) decider_.reset(new ProxyScriptDecider(&fetcher_, &dhcp_fetcher, NULL)); 398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, StartDecider()); 399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) dhcp_fetcher.CompleteRequests(OK, pac_contents); 400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(decider_->effective_config().has_pac_url()); 401f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(decider_->effective_config().pac_url(), url); 402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 403f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Fails if QuickCheck still happens when disabled. To ensure QuickCheck is not 4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// happening, we add a synchronous failing resolver, which would ordinarily 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// mean a QuickCheck failure, then ensure that our ProxyScriptFetcher is still 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// asked to fetch. 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ProxyScriptDeciderQuickCheckTest, QuickCheckDisabled) { 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char *kPac = "function FindProxyForURL(u,h) { return \"DIRECT\"; }"; 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resolver_.set_synchronous_mode(true); 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) resolver_.rules()->AddSimulatedFailure("wpad"); 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) MockProxyScriptFetcher fetcher; 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decider_.reset(new ProxyScriptDecider(&fetcher, &dhcp_fetcher_, NULL)); 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, StartDecider()); 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(fetcher.has_pending_request()); 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fetcher.NotifyFetchCompletion(OK, kPac); 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 419f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(ProxyScriptDeciderQuickCheckTest, ExplicitPacUrl) { 420f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const char *kCustomUrl = "http://custom/proxy.pac"; 421f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) config_.set_pac_url(GURL(kCustomUrl)); 422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) Rules::Rule rule = rules_.AddSuccessRule(kCustomUrl); 423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resolver_.rules()->AddSimulatedFailure("wpad"); 424f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) resolver_.rules()->AddRule("custom", "1.2.3.4"); 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, StartDecider()); 426f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) callback_.WaitForResult(); 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(decider_->effective_config().has_pac_url()); 428f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(rule.url, decider_->effective_config().pac_url()); 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (downloading), but succeeds in choosing the custom PAC. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomSuccess1) { 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.url, decider.effective_config().pac_url()); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (no DHCP config, DNS PAC fails parsing), but succeeds in 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// choosing the custom PAC. 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomSuccess2) { 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.proxy_rules().ParseFromString("unused-manual-proxy:99"); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://wpad/wpad.dat"); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start(config, base::TimeDelta(), 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, callback.callback())); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the effective configuration no longer contains auto detect or 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any of the manual settings. 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().Equals( 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig::CreateFromCustomPacURL(GURL("http://custom/proxy.pac")))); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (Note that various states are repeated since both WPAD and custom 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PAC scripts are tried). 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10u, entries.size()); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is the DHCP phase, which fails fetching rather than parsing, so 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there is no pair of SET_PAC_SCRIPT events. 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEvent( 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::TYPE_PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::PHASE_NONE)); 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is the DNS phase, which attempts a fetch but fails. 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 4, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 5, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEvent( 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 6, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::TYPE_PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::PHASE_NONE)); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finally, the custom PAC URL phase. 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 7, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 8, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 9, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (downloading), and fails at custom PAC (downloading). 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomFails1) { 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (downloading), and fails at custom PAC (parsing). 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomFails2) { 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://custom/proxy.pac"); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedParsing, 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a copy-paste of CustomPacFails1, with the exception that we give it 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a 1 millisecond delay. This means it will now complete asynchronously. 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Moreover, we test the NetLog to make sure it logged the pause. 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails1_WithPositiveDelay) { 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta::FromMilliseconds(1), 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, callback.callback())); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, callback.WaitForResult()); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(6u, entries.size()); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_WAIT)); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_WAIT)); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 4, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 5, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a copy-paste of CustomPacFails1, with the exception that we give it 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a -5 second delay instead of a 0 ms delay. This change should have no effect 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so the rest of the test is unchanged. 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails1_WithNegativeDelay) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta::FromSeconds(-5), 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, callback.callback())); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, entries.size()); 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SynchronousSuccessDhcpFetcher : public DhcpProxyScriptFetcher { 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit SynchronousSuccessDhcpFetcher(const base::string16& expected_text) 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : gurl_("http://dhcppac/"), expected_text_(expected_text) { 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual int Fetch(base::string16* utf16_text, 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *utf16_text = expected_text_; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE { 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const GURL& GetPacURL() const OVERRIDE { 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gurl_; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& expected_text() const { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return expected_text_; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gurl_; 664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 expected_text_; 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SynchronousSuccessDhcpFetcher); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All of the tests above that use ProxyScriptDecider have tested 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// failure to fetch a PAC file via DHCP configuration, so we now test 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// success at downloading and parsing, and then success at downloading, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// failure at parsing. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectDhcpSuccess) { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynchronousSuccessDhcpFetcher dhcp_fetcher( 6785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WideToUTF16(L"http://bingo/!FindProxyForURL")); 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddSuccessRule("http://bingo/"); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(dhcp_fetcher.expected_text(), 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.script_data()->utf16()); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://dhcppac/"), decider.effective_config().pac_url()); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectDhcpFailParse) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynchronousSuccessDhcpFetcher dhcp_fetcher( 7015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WideToUTF16(L"http://bingo/!invalid-script")); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://bingo/"); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since there is fallback to DNS-based WPAD, the final error will be that 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it failed downloading, not that it failed parsing. 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, callback.callback())); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(decider.effective_config().has_pac_url()); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AsyncFailDhcpFetcher 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public DhcpProxyScriptFetcher, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<AsyncFailDhcpFetcher> { 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AsyncFailDhcpFetcher() {} 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~AsyncFailDhcpFetcher() {} 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual int Fetch(base::string16* utf16_text, 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = callback; 73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&AsyncFailDhcpFetcher::CallbackWithFailure, AsWeakPtr())); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_IO_PENDING; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE { 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Reset(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const GURL& GetPacURL() const OVERRIDE { 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dummy_gurl_; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallbackWithFailure() { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callback_.is_null()) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Run(ERR_PAC_NOT_IN_DHCP); 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dummy_gurl_; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback_; 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, DhcpCancelledByDestructor) { 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This regression test would crash before 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://codereview.chromium.org/7044058/ 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Thus, we don't care much about actual results (hence no EXPECT or ASSERT 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // macros below), just that it doesn't crash. 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AsyncFailDhcpFetcher> dhcp_fetcher(new AsyncFailDhcpFetcher()); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scope so ProxyScriptDecider gets destroyed early. 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, dhcp_fetcher.get(), NULL); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, callback.callback()); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the message loop to let the DHCP fetch complete and post the results 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back. Before the fix linked to above, this would try to invoke on 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the callback object provided by ProxyScriptDecider after it was 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no longer valid. 78090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 785