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