Home | History | Annotate | Download | only in proxy
      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.
     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 
     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 
     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 
     72 ::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
    110 ProxyRulesExpectation ProxyRulesExpectation::Empty() {
    111   return ProxyRulesExpectation(ProxyConfig::ProxyRules::TYPE_NO_RULES,
    112                                "", "", "", "", "", "", false);
    113 }
    114 
    115 // static
    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
    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
    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
    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
    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