• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/proxy/proxy_config_service_common_unittest.h"
6 
7 #include <string>
8 #include <vector>
9 
10 #include "net/proxy/proxy_config.h"
11 
12 #include "testing/gtest/include/gtest/gtest.h"
13 
14 namespace net {
15 
16 namespace {
17 
18 // Helper to verify that |expected_proxy| matches |actual_proxy|. If it does
19 // not, then |*did_fail| is set to true, and |*failure_details| is filled with
20 // a description of the failure.
MatchesProxyServerHelper(const char * failure_message,const char * expected_proxy,const ProxyServer & actual_proxy,::testing::AssertionResult * failure_details,bool * did_fail)21 void MatchesProxyServerHelper(const char* failure_message,
22                               const char* expected_proxy,
23                               const ProxyServer& actual_proxy,
24                               ::testing::AssertionResult* failure_details,
25                               bool* did_fail) {
26   std::string actual_proxy_string;
27   if (actual_proxy.is_valid())
28     actual_proxy_string = actual_proxy.ToURI();
29 
30   if (std::string(expected_proxy) != actual_proxy_string) {
31     *failure_details
32         << failure_message << ". Was expecting: \"" << expected_proxy
33         << "\" but got: \"" << actual_proxy_string << "\"";
34     *did_fail = true;
35   }
36 }
37 
FlattenProxyBypass(const ProxyBypassRules & bypass_rules)38 std::string FlattenProxyBypass(const ProxyBypassRules& bypass_rules) {
39   std::string flattened_proxy_bypass;
40   for (ProxyBypassRules::RuleList::const_iterator it =
41        bypass_rules.rules().begin();
42        it != bypass_rules.rules().end(); ++it) {
43     if (!flattened_proxy_bypass.empty())
44       flattened_proxy_bypass += ",";
45     flattened_proxy_bypass += (*it)->ToString();
46   }
47   return flattened_proxy_bypass;
48 }
49 
50 }  // namespace
51 
ProxyRulesExpectation(ProxyConfig::ProxyRules::Type type,const char * single_proxy,const char * proxy_for_http,const char * proxy_for_https,const char * proxy_for_ftp,const char * fallback_proxy,const char * flattened_bypass_rules,bool reverse_bypass)52 ProxyRulesExpectation::ProxyRulesExpectation(
53     ProxyConfig::ProxyRules::Type type,
54     const char* single_proxy,
55     const char* proxy_for_http,
56     const char* proxy_for_https,
57     const char* proxy_for_ftp,
58     const char* fallback_proxy,
59     const char* flattened_bypass_rules,
60     bool reverse_bypass)
61     : type(type),
62       single_proxy(single_proxy),
63       proxy_for_http(proxy_for_http),
64       proxy_for_https(proxy_for_https),
65       proxy_for_ftp(proxy_for_ftp),
66       fallback_proxy(fallback_proxy),
67       flattened_bypass_rules(flattened_bypass_rules),
68       reverse_bypass(reverse_bypass) {
69 }
70 
71 
Matches(const ProxyConfig::ProxyRules & rules) const72 ::testing::AssertionResult ProxyRulesExpectation::Matches(
73     const ProxyConfig::ProxyRules& rules) const {
74   ::testing::AssertionResult failure_details = ::testing::AssertionFailure();
75   bool failed = false;
76 
77   if (rules.type != type) {
78     failure_details << "Type mismatch. Expected: "
79                     << type << " but was: " << rules.type;
80     failed = true;
81   }
82 
83   MatchesProxyServerHelper("Bad single_proxy", single_proxy,
84                            rules.single_proxy, &failure_details, &failed);
85   MatchesProxyServerHelper("Bad proxy_for_http", proxy_for_http,
86                            rules.proxy_for_http, &failure_details, &failed);
87   MatchesProxyServerHelper("Bad proxy_for_https", proxy_for_https,
88                            rules.proxy_for_https, &failure_details, &failed);
89   MatchesProxyServerHelper("Bad fallback_proxy", fallback_proxy,
90                            rules.fallback_proxy, &failure_details, &failed);
91 
92   std::string actual_flattened_bypass = FlattenProxyBypass(rules.bypass_rules);
93   if (std::string(flattened_bypass_rules) != actual_flattened_bypass) {
94     failure_details
95         << "Bad bypass rules. Expected: \"" << flattened_bypass_rules
96         << "\" but got: \"" << actual_flattened_bypass << "\"";
97     failed = true;
98   }
99 
100   if (rules.reverse_bypass != reverse_bypass) {
101     failure_details << "Bad reverse_bypass. Expected: " << reverse_bypass
102                     << " but got: " << rules.reverse_bypass;
103     failed = true;
104   }
105 
106   return failed ? failure_details : ::testing::AssertionSuccess();
107 }
108 
109 // static
Empty()110 ProxyRulesExpectation ProxyRulesExpectation::Empty() {
111   return ProxyRulesExpectation(ProxyConfig::ProxyRules::TYPE_NO_RULES,
112                                "", "", "", "", "", "", false);
113 }
114 
115 // static
EmptyWithBypass(const char * flattened_bypass_rules)116 ProxyRulesExpectation ProxyRulesExpectation::EmptyWithBypass(
117     const char* flattened_bypass_rules) {
118   return ProxyRulesExpectation(ProxyConfig::ProxyRules::TYPE_NO_RULES,
119                                "", "", "", "", "", flattened_bypass_rules,
120                                false);
121 }
122 
123 // static
Single(const char * single_proxy,const char * flattened_bypass_rules)124 ProxyRulesExpectation ProxyRulesExpectation::Single(
125     const char* single_proxy,
126     const char* flattened_bypass_rules) {
127   return ProxyRulesExpectation(ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY,
128                                single_proxy, "", "", "", "",
129                                flattened_bypass_rules, false);
130 }
131 
132 // static
PerScheme(const char * proxy_http,const char * proxy_https,const char * proxy_ftp,const char * flattened_bypass_rules)133 ProxyRulesExpectation ProxyRulesExpectation::PerScheme(
134     const char* proxy_http,
135     const char* proxy_https,
136     const char* proxy_ftp,
137     const char* flattened_bypass_rules) {
138   return ProxyRulesExpectation(ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME,
139                                "", proxy_http, proxy_https, proxy_ftp, "",
140                                flattened_bypass_rules, false);
141 }
142 
143 // static
PerSchemeWithSocks(const char * proxy_http,const char * proxy_https,const char * proxy_ftp,const char * socks_proxy,const char * flattened_bypass_rules)144 ProxyRulesExpectation ProxyRulesExpectation::PerSchemeWithSocks(
145     const char* proxy_http,
146     const char* proxy_https,
147     const char* proxy_ftp,
148     const char* socks_proxy,
149     const char* flattened_bypass_rules) {
150   return ProxyRulesExpectation(ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME,
151                                "", proxy_http, proxy_https, proxy_ftp,
152                                socks_proxy, flattened_bypass_rules, false);
153 }
154 
155 // static
PerSchemeWithBypassReversed(const char * proxy_http,const char * proxy_https,const char * proxy_ftp,const char * flattened_bypass_rules)156 ProxyRulesExpectation ProxyRulesExpectation::PerSchemeWithBypassReversed(
157     const char* proxy_http,
158     const char* proxy_https,
159     const char* proxy_ftp,
160     const char* flattened_bypass_rules) {
161   return ProxyRulesExpectation(ProxyConfig::ProxyRules::TYPE_PROXY_PER_SCHEME,
162                                "", proxy_http, proxy_https, proxy_ftp, "",
163                                flattened_bypass_rules, true);
164 }
165 
166 }  // namespace net
167