172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <vector> 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/net_errors.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log_unittest.h" 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/base/test_completion_callback.h" 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/proxy/init_proxy_resolver.h" 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/proxy/proxy_config.h" 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/proxy/proxy_resolver.h" 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/proxy/proxy_script_fetcher.h" 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace { 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottenum Error { 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kFailedDownloading = -100, 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kFailedParsing = -200, 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass Rules { 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott struct Rule { 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rule(const GURL& url, 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int fetch_error, 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int set_pac_error) 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : url(url), 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott fetch_error(fetch_error), 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott set_pac_error(set_pac_error) { 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 text() const { 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (set_pac_error == OK) 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return UTF8ToUTF16(url.spec() + "!valid-script"); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (fetch_error == OK) 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return UTF8ToUTF16(url.spec() + "!invalid-script"); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return string16(); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott GURL url; 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int fetch_error; 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int set_pac_error; 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott }; 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rule AddSuccessRule(const char* url) { 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rule rule(GURL(url), OK /*fetch_error*/, OK /*set_pac_error*/); 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules_.push_back(rule); 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rule; 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void AddFailDownloadRule(const char* url) { 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules_.push_back(Rule(GURL(url), kFailedDownloading /*fetch_error*/, 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ERR_UNEXPECTED /*set_pac_error*/)); 60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott void AddFailParsingRule(const char* url) { 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules_.push_back(Rule(GURL(url), OK /*fetch_error*/, 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott kFailedParsing /*set_pac_error*/)); 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Rule& GetRuleByUrl(const GURL& url) const { 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (RuleList::const_iterator it = rules_.begin(); it != rules_.end(); 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++it) { 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (it->url == url) 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *it; 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(FATAL) << "Rule not found for " << url; 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rules_[0]; 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Rule& GetRuleByText(const string16& text) const { 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (RuleList::const_iterator it = rules_.begin(); it != rules_.end(); 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ++it) { 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (it->text() == text) 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return *it; 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LOG(FATAL) << "Rule not found for " << text; 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rules_[0]; 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott typedef std::vector<Rule> RuleList; 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleList rules_; 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass RuleBasedProxyScriptFetcher : public ProxyScriptFetcher { 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott explicit RuleBasedProxyScriptFetcher(const Rules* rules) : rules_(rules) {} 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ProxyScriptFetcher implementation. 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual int Fetch(const GURL& url, 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16* text, 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CompletionCallback* callback) { 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Rules::Rule& rule = rules_->GetRuleByUrl(url); 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int rv = rule.fetch_error; 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_NE(ERR_UNEXPECTED, rv); 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (rv == OK) 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *text = rule.text(); 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rv; 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void Cancel() {} 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual URLRequestContext* GetRequestContext() { return NULL; } 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Rules* rules_; 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass RuleBasedProxyResolver : public ProxyResolver { 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public: 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver(const Rules* rules, bool expects_pac_bytes) 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : ProxyResolver(expects_pac_bytes), rules_(rules) {} 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ProxyResolver implementation: 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual int GetProxyForURL(const GURL& /*url*/, 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyInfo* /*results*/, 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott CompletionCallback* /*callback*/, 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RequestHandle* /*request_handle*/, 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const BoundNetLog& /*net_log*/) { 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return ERR_UNEXPECTED; 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott virtual void CancelRequest(RequestHandle request_handle) { 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott NOTREACHED(); 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 13521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void CancelSetPacScript() { 13621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NOTREACHED(); 13721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 13821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual int SetPacScript( 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const scoped_refptr<ProxyResolverScriptData>& script_data, 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompletionCallback* callback) { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL url = 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch script_data->type() == ProxyResolverScriptData::TYPE_SCRIPT_URL ? 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch script_data->url() : GURL(); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Rules::Rule& rule = expects_pac_bytes() ? 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rules_->GetRuleByText(script_data->utf16()) : 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch rules_->GetRuleByUrl(url); 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int rv = rule.set_pac_error; 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_NE(ERR_UNEXPECTED, rv); 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (expects_pac_bytes()) { 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(rule.text(), script_data->utf16()); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(rule.url, url); 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (rv == OK) 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch script_data_ = script_data; 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott return rv; 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const ProxyResolverScriptData* script_data() const { return script_data_; } 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private: 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott const Rules* rules_; 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<ProxyResolverScriptData> script_data_; 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}; 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Succeed using custom PAC script. 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, CustomPacSucceeds) { 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CapturingNetLog log(CapturingNetLog::kUnbounded); 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, &log); 1863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(OK, init.Init(config, base::TimeDelta(), NULL, &callback)); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(rule.text(), resolver.script_data()->utf16()); 188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check the NetLog was filled correctly. 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CapturingNetLog::EntryList entries; 19121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen log.GetEntries(&entries); 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 19321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(6u, entries.size()); 194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 19521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 0, NetLog::TYPE_INIT_PROXY_RESOLVER)); 196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 19721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 1, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsEndEvent( 19921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 2, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 20121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 3, NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT)); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(LogContainsEndEvent( 20321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 4, NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT)); 204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsEndEvent( 20521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 5, NetLog::TYPE_INIT_PROXY_RESOLVER)); 206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fail downloading the custom PAC script. 209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, CustomPacFails1) { 210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailDownloadRule("http://custom/proxy.pac"); 218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CapturingNetLog log(CapturingNetLog::kUnbounded); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, &log); 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kFailedDownloading, 2233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick init.Init(config, base::TimeDelta(), NULL, &callback)); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NULL, resolver.script_data()); 225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check the NetLog was filled correctly. 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CapturingNetLog::EntryList entries; 22821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen log.GetEntries(&entries); 22921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 23021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(4u, entries.size()); 231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 23221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 0, NetLog::TYPE_INIT_PROXY_RESOLVER)); 233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 23421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 1, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsEndEvent( 23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 2, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(LogContainsEndEvent( 23821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 3, NetLog::TYPE_INIT_PROXY_RESOLVER)); 239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fail parsing the custom PAC script. 242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, CustomPacFails2) { 243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailParsingRule("http://custom/proxy.pac"); 251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, NULL); 2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kFailedParsing, 2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick init.Init(config, base::TimeDelta(), NULL, &callback)); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NULL, resolver.script_data()); 257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fail downloading the custom PAC script, because the fetcher was NULL. 260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, HasNullProxyScriptFetcher) { 261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, NULL, NULL); 2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ERR_UNEXPECTED, 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick init.Init(config, base::TimeDelta(), NULL, &callback)); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NULL, resolver.script_data()); 272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Succeeds in choosing autodetect (wpad). 275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, AutodetectSuccess) { 276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_auto_detect(true); 282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules::Rule rule = rules.AddSuccessRule("http://wpad/wpad.dat"); 284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, NULL); 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(OK, init.Init(config, base::TimeDelta(), NULL, &callback)); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(rule.text(), resolver.script_data()->utf16()); 289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fails at WPAD (downloading), but succeeds in choosing the custom PAC. 292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, AutodetectFailCustomSuccess1) { 293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_auto_detect(true); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailDownloadRule("http://wpad/wpad.dat"); 302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, NULL); 3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(OK, init.Init(config, base::TimeDelta(), NULL, &callback)); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(rule.text(), resolver.script_data()->utf16()); 308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fails at WPAD (parsing), but succeeds in choosing the custom PAC. 311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, AutodetectFailCustomSuccess2) { 312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_auto_detect(true); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick config.proxy_rules().ParseFromString("unused-manual-proxy:99"); 320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailParsingRule("http://wpad/wpad.dat"); 322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CapturingNetLog log(CapturingNetLog::kUnbounded); 3263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ProxyConfig effective_config; 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, &log); 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(OK, init.Init(config, base::TimeDelta(), 3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &effective_config, &callback)); 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(rule.text(), resolver.script_data()->utf16()); 332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Verify that the effective configuration no longer contains auto detect or 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // any of the manual settings. 3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(effective_config.Equals( 3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ProxyConfig::CreateFromCustomPacURL(GURL("http://custom/proxy.pac")))); 3373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Check the NetLog was filled correctly. 339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // (Note that the Fetch and Set states are repeated since both WPAD and custom 340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // PAC scripts are tried). 34172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CapturingNetLog::EntryList entries; 34221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen log.GetEntries(&entries); 34321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 34421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(11u, entries.size()); 345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 34621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 0, NetLog::TYPE_INIT_PROXY_RESOLVER)); 347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 34821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 1, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsEndEvent( 35021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 2, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 35221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 3, NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT)); 353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsEndEvent( 35421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 4, NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT)); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(LogContainsEvent( 35621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 5, 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NetLog::TYPE_INIT_PROXY_RESOLVER_FALLING_BACK_TO_NEXT_PAC_URL, 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NetLog::PHASE_NONE)); 359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 36021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 6, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsEndEvent( 36221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 7, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsBeginEvent( 36421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 8, NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT)); 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(LogContainsEndEvent( 36621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 9, NetLog::TYPE_INIT_PROXY_RESOLVER_SET_PAC_SCRIPT)); 367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_TRUE(LogContainsEndEvent( 36821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 10, NetLog::TYPE_INIT_PROXY_RESOLVER)); 369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fails at WPAD (downloading), and fails at custom PAC (downloading). 372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, AutodetectFailCustomFails1) { 373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_auto_detect(true); 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailDownloadRule("http://wpad/wpad.dat"); 382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailDownloadRule("http://custom/proxy.pac"); 383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, NULL); 3863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kFailedDownloading, 3873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick init.Init(config, base::TimeDelta(), NULL, &callback)); 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NULL, resolver.script_data()); 389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fails at WPAD (downloading), and fails at custom PAC (parsing). 392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, AutodetectFailCustomFails2) { 393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_auto_detect(true); 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailDownloadRule("http://wpad/wpad.dat"); 402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailParsingRule("http://custom/proxy.pac"); 403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, NULL); 4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kFailedParsing, 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick init.Init(config, base::TimeDelta(), NULL, &callback)); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NULL, resolver.script_data()); 409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Fails at WPAD (parsing), but succeeds in choosing the custom PAC. 412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This is the same as AutodetectFailCustomSuccess2, but using a ProxyResolver 413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// that doesn't |expects_pac_bytes|. 414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(InitProxyResolverTest, AutodetectFailCustomSuccess2_NoFetch) { 415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules rules; 416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyResolver resolver(&rules, false /*expects_pac_bytes*/); 417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott RuleBasedProxyScriptFetcher fetcher(&rules); 418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ProxyConfig config; 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_auto_detect(true); 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch config.set_pac_url(GURL("http://custom/proxy.pac")); 422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott rules.AddFailParsingRule(""); // Autodetect. 424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Rules::Rule rule = rules.AddSuccessRule("http://custom/proxy.pac"); 425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott TestCompletionCallback callback; 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch InitProxyResolver init(&resolver, &fetcher, NULL); 4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(OK, init.Init(config, base::TimeDelta(), NULL, &callback)); 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(rule.url, resolver.script_data()->url()); 430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This is a copy-paste of CustomPacFails1, with the exception that we give it 4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// a 1 millisecond delay. This means it will now complete asynchronously. 4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Moreover, we test the NetLog to make sure it logged the pause. 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(InitProxyResolverTest, CustomPacFails1_WithPositiveDelay) { 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Rules rules; 4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RuleBasedProxyScriptFetcher fetcher(&rules); 4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ProxyConfig config; 4413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick config.set_pac_url(GURL("http://custom/proxy.pac")); 4423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick rules.AddFailDownloadRule("http://custom/proxy.pac"); 4443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestCompletionCallback callback; 4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CapturingNetLog log(CapturingNetLog::kUnbounded); 4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitProxyResolver init(&resolver, &fetcher, &log); 4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(ERR_IO_PENDING, 4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick init.Init(config, base::TimeDelta::FromMilliseconds(1), 4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, &callback)); 4513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kFailedDownloading, callback.WaitForResult()); 4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(NULL, resolver.script_data()); 4543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Check the NetLog was filled correctly. 45672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CapturingNetLog::EntryList entries; 45721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen log.GetEntries(&entries); 45821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 45921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(6u, entries.size()); 4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsBeginEvent( 46121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 0, NetLog::TYPE_INIT_PROXY_RESOLVER)); 4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsBeginEvent( 46321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 1, NetLog::TYPE_INIT_PROXY_RESOLVER_WAIT)); 4643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsEndEvent( 46521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 2, NetLog::TYPE_INIT_PROXY_RESOLVER_WAIT)); 4663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsBeginEvent( 46721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 3, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 4683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsEndEvent( 46921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 4, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 4703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsEndEvent( 47121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 5, NetLog::TYPE_INIT_PROXY_RESOLVER)); 4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 4733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This is a copy-paste of CustomPacFails1, with the exception that we give it 4753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// a -5 second delay instead of a 0 ms delay. This change should have no effect 4763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// so the rest of the test is unchanged. 4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST(InitProxyResolverTest, CustomPacFails1_WithNegativeDelay) { 4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick Rules rules; 4793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RuleBasedProxyResolver resolver(&rules, true /*expects_pac_bytes*/); 4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick RuleBasedProxyScriptFetcher fetcher(&rules); 4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ProxyConfig config; 4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick config.set_pac_url(GURL("http://custom/proxy.pac")); 4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick rules.AddFailDownloadRule("http://custom/proxy.pac"); 4863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TestCompletionCallback callback; 4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick CapturingNetLog log(CapturingNetLog::kUnbounded); 4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick InitProxyResolver init(&resolver, &fetcher, &log); 4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(kFailedDownloading, 4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick init.Init(config, base::TimeDelta::FromSeconds(-5), 4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NULL, &callback)); 4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_EQ(NULL, resolver.script_data()); 4943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Check the NetLog was filled correctly. 49672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen CapturingNetLog::EntryList entries; 49721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen log.GetEntries(&entries); 49821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 49921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_EQ(4u, entries.size()); 5003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsBeginEvent( 50121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 0, NetLog::TYPE_INIT_PROXY_RESOLVER)); 5023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsBeginEvent( 50321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 1, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 5043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsEndEvent( 50521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 2, NetLog::TYPE_INIT_PROXY_RESOLVER_FETCH_PAC_SCRIPT)); 5063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXPECT_TRUE(LogContainsEndEvent( 50721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen entries, 3, NetLog::TYPE_INIT_PROXY_RESOLVER)); 5083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 5093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace 511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 512