proxy_script_decider_unittest.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
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" 105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_unittest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/dhcp_proxy_script_fetcher.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_config.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_resolver.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_script_decider.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/proxy/proxy_script_fetcher.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum Error { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFailedDownloading = -100, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFailedParsing = ERR_PAC_SCRIPT_FAILED, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rules { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct Rule { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rule(const GURL& url, int fetch_error, bool is_valid_script) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : url(url), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fetch_error(fetch_error), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_valid_script(is_valid_script) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 text() const { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_valid_script) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UTF8ToUTF16(url.spec() + "!FindProxyForURL"); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (fetch_error == OK) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return UTF8ToUTF16(url.spec() + "!invalid-script"); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::string16(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int fetch_error; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_valid_script; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rule AddSuccessRule(const char* url) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rule rule(GURL(url), OK /*fetch_error*/, true); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_.push_back(rule); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rule; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddFailDownloadRule(const char* url) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_.push_back(Rule(GURL(url), kFailedDownloading /*fetch_error*/, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false)); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddFailParsingRule(const char* url) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules_.push_back(Rule(GURL(url), OK /*fetch_error*/, false)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Rule& GetRuleByUrl(const GURL& url) const { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RuleList::const_iterator it = rules_.begin(); it != rules_.end(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->url == url) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *it; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Rule not found for " << url; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rules_[0]; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const Rule& GetRuleByText(const base::string16& text) const { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (RuleList::const_iterator it = rules_.begin(); it != rules_.end(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->text() == text) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return *it; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Rule not found for " << text; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rules_[0]; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<Rule> RuleList; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleList rules_; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RuleBasedProxyScriptFetcher : public ProxyScriptFetcher { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit RuleBasedProxyScriptFetcher(const Rules* rules) : rules_(rules) {} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ProxyScriptFetcher implementation. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Fetch(const GURL& url, 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16* text, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Rules::Rule& rule = rules_->GetRuleByUrl(url); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = rule.fetch_error; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(ERR_UNEXPECTED, rv); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rv == OK) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = rule.text(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE {} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual URLRequestContext* GetRequestContext() const OVERRIDE { return NULL; } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Rules* rules_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Succeed using custom PAC script. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacSucceeds) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, entries.size()); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(config.pac_url(), decider.effective_config().pac_url()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fail downloading the custom PAC script. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails1) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, entries.size()); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(decider.effective_config().has_pac_url()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fail parsing the custom PAC script. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails2) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://custom/proxy.pac"); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedParsing, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fail downloading the custom PAC script, because the fetcher was NULL. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, HasNullProxyScriptFetcher) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(NULL, &dhcp_fetcher, NULL); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_UNEXPECTED, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Succeeds in choosing autodetect (WPAD DNS). 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectSuccess) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://wpad/wpad.dat"); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.url, decider.effective_config().pac_url()); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (downloading), but succeeds in choosing the custom PAC. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomSuccess1) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.url, decider.effective_config().pac_url()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (no DHCP config, DNS PAC fails parsing), but succeeds in 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// choosing the custom PAC. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomSuccess2) { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.proxy_rules().ParseFromString("unused-manual-proxy:99"); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://wpad/wpad.dat"); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start(config, base::TimeDelta(), 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, callback.callback())); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(rule.text(), decider.script_data()->utf16()); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the effective configuration no longer contains auto detect or 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // any of the manual settings. 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().Equals( 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig::CreateFromCustomPacURL(GURL("http://custom/proxy.pac")))); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (Note that various states are repeated since both WPAD and custom 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PAC scripts are tried). 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10u, entries.size()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is the DHCP phase, which fails fetching rather than parsing, so 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there is no pair of SET_PAC_SCRIPT events. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEvent( 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::TYPE_PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::PHASE_NONE)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is the DNS phase, which attempts a fetch but fails. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 4, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 5, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEvent( 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 6, 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::TYPE_PROXY_SCRIPT_DECIDER_FALLING_BACK_TO_NEXT_PAC_SOURCE, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::PHASE_NONE)); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Finally, the custom PAC URL phase. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 7, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 8, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 9, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (downloading), and fails at custom PAC (downloading). 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomFails1) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fails at WPAD (downloading), and fails at custom PAC (parsing). 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectFailCustomFails2) { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://custom/proxy.pac"); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedParsing, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a copy-paste of CustomPacFails1, with the exception that we give it 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a 1 millisecond delay. This means it will now complete asynchronously. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Moreover, we test the NetLog to make sure it logged the pause. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails1_WithPositiveDelay) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta::FromMilliseconds(1), 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, callback.callback())); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, callback.WaitForResult()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(6u, entries.size()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_WAIT)); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_WAIT)); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 4, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 5, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a copy-paste of CustomPacFails1, with the exception that we give it 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a -5 second delay instead of a 0 ms delay. This change should have no effect 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// so the rest of the test is unchanged. 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, CustomPacFails1_WithNegativeDelay) { 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DoNothingDhcpProxyScriptFetcher dhcp_fetcher; 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_pac_url(GURL("http://custom/proxy.pac")); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://custom/proxy.pac"); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog log; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, &log); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta::FromSeconds(-5), 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, callback.callback())); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check the NetLog was filled correctly. 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CapturingNetLog::CapturedEntryList entries; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) log.GetEntries(&entries); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4u, entries.size()); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 0, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsBeginEvent( 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 1, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 2, NetLog::TYPE_PROXY_SCRIPT_DECIDER_FETCH_PAC_SCRIPT)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(LogContainsEndEvent( 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) entries, 3, NetLog::TYPE_PROXY_SCRIPT_DECIDER)); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SynchronousSuccessDhcpFetcher : public DhcpProxyScriptFetcher { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit SynchronousSuccessDhcpFetcher(const base::string16& expected_text) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : gurl_("http://dhcppac/"), expected_text_(expected_text) { 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual int Fetch(base::string16* utf16_text, 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *utf16_text = expected_text_; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return OK; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const GURL& GetPacURL() const OVERRIDE { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gurl_; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& expected_text() const { 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return expected_text_; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL gurl_; 479c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::string16 expected_text_; 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SynchronousSuccessDhcpFetcher); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All of the tests above that use ProxyScriptDecider have tested 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// failure to fetch a PAC file via DHCP configuration, so we now test 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// success at downloading and parsing, and then success at downloading, 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// failure at parsing. 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectDhcpSuccess) { 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynchronousSuccessDhcpFetcher dhcp_fetcher( 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WideToUTF16(L"http://bingo/!FindProxyForURL")); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddSuccessRule("http://bingo/"); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, decider.Start( 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config, base::TimeDelta(), true, callback.callback())); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(dhcp_fetcher.expected_text(), 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.script_data()->utf16()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(decider.effective_config().has_pac_url()); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://dhcppac/"), decider.effective_config().pac_url()); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, AutodetectDhcpFailParse) { 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SynchronousSuccessDhcpFetcher dhcp_fetcher( 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WideToUTF16(L"http://bingo/!invalid-script")); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailParsingRule("http://bingo/"); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, &dhcp_fetcher, NULL); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Since there is fallback to DNS-based WPAD, the final error will be that 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it failed downloading, not that it failed parsing. 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kFailedDownloading, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, callback.callback())); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(NULL, decider.script_data()); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(decider.effective_config().has_pac_url()); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AsyncFailDhcpFetcher 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public DhcpProxyScriptFetcher, 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<AsyncFailDhcpFetcher> { 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AsyncFailDhcpFetcher() {} 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~AsyncFailDhcpFetcher() {} 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual int Fetch(base::string16* utf16_text, 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CompletionCallback& callback) OVERRIDE { 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = callback; 54590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->PostTask( 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&AsyncFailDhcpFetcher::CallbackWithFailure, AsWeakPtr())); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_IO_PENDING; 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Cancel() OVERRIDE { 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Reset(); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const GURL& GetPacURL() const OVERRIDE { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dummy_gurl_; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CallbackWithFailure() { 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!callback_.is_null()) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Run(ERR_PAC_NOT_IN_DHCP); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL dummy_gurl_; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback callback_; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ProxyScriptDeciderTest, DhcpCancelledByDestructor) { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This regression test would crash before 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://codereview.chromium.org/7044058/ 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Thus, we don't care much about actual results (hence no EXPECT or ASSERT 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // macros below), just that it doesn't crash. 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Rules rules; 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RuleBasedProxyScriptFetcher fetcher(&rules); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AsyncFailDhcpFetcher> dhcp_fetcher(new AsyncFailDhcpFetcher()); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyConfig config; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.set_auto_detect(true); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rules.AddFailDownloadRule("http://wpad/wpad.dat"); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Scope so ProxyScriptDecider gets destroyed early. 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProxyScriptDecider decider(&fetcher, dhcp_fetcher.get(), NULL); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) decider.Start(config, base::TimeDelta(), true, callback.callback()); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Run the message loop to let the DHCP fetch complete and post the results 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // back. Before the fix linked to above, this would try to invoke on 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the callback object provided by ProxyScriptDecider after it was 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // no longer valid. 59590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->RunUntilIdle(); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 600