Home | History | Annotate | Download | only in net
      1 // Copyright 2013 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 <string>
      6 
      7 #include "base/memory/scoped_ptr.h"
      8 #include "base/values.h"
      9 #include "chrome/browser/net/proxy_policy_handler.h"
     10 #include "chrome/browser/prefs/proxy_config_dictionary.h"
     11 #include "chrome/browser/prefs/proxy_prefs.h"
     12 #include "chrome/common/pref_names.h"
     13 #include "components/policy/core/browser/configuration_policy_pref_store.h"
     14 #include "components/policy/core/browser/configuration_policy_pref_store_test.h"
     15 #include "components/policy/core/common/policy_service_impl.h"
     16 #include "policy/policy_constants.h"
     17 #include "testing/gtest/include/gtest/gtest.h"
     18 
     19 namespace policy {
     20 
     21 // Test cases for the proxy policy settings.
     22 class ProxyPolicyHandlerTest
     23     : public ConfigurationPolicyPrefStoreTest {
     24  public:
     25   virtual void SetUp() OVERRIDE {
     26     ConfigurationPolicyPrefStoreTest::SetUp();
     27     handler_list_.AddHandler(
     28         make_scoped_ptr<ConfigurationPolicyHandler>(new ProxyPolicyHandler));
     29     // Reset the PolicyServiceImpl to one that has the policy fixup
     30     // preprocessor. The previous store must be nulled out first so that it
     31     // removes itself from the service's observer list.
     32     store_ = NULL;
     33     policy_service_.reset(new PolicyServiceImpl(providers_));
     34     store_ = new ConfigurationPolicyPrefStore(
     35         policy_service_.get(), &handler_list_, POLICY_LEVEL_MANDATORY);
     36   }
     37 
     38  protected:
     39   // Verify that all the proxy prefs are set to the specified expected values.
     40   void VerifyProxyPrefs(
     41       const std::string& expected_proxy_server,
     42       const std::string& expected_proxy_pac_url,
     43       const std::string& expected_proxy_bypass_list,
     44       const ProxyPrefs::ProxyMode& expected_proxy_mode) {
     45     const base::Value* value = NULL;
     46     ASSERT_TRUE(store_->GetValue(prefs::kProxy, &value));
     47     ASSERT_EQ(base::Value::TYPE_DICTIONARY, value->GetType());
     48     ProxyConfigDictionary dict(
     49         static_cast<const base::DictionaryValue*>(value));
     50     std::string s;
     51     if (expected_proxy_server.empty()) {
     52       EXPECT_FALSE(dict.GetProxyServer(&s));
     53     } else {
     54       ASSERT_TRUE(dict.GetProxyServer(&s));
     55       EXPECT_EQ(expected_proxy_server, s);
     56     }
     57     if (expected_proxy_pac_url.empty()) {
     58       EXPECT_FALSE(dict.GetPacUrl(&s));
     59     } else {
     60       ASSERT_TRUE(dict.GetPacUrl(&s));
     61       EXPECT_EQ(expected_proxy_pac_url, s);
     62     }
     63     if (expected_proxy_bypass_list.empty()) {
     64       EXPECT_FALSE(dict.GetBypassList(&s));
     65     } else {
     66       ASSERT_TRUE(dict.GetBypassList(&s));
     67       EXPECT_EQ(expected_proxy_bypass_list, s);
     68     }
     69     ProxyPrefs::ProxyMode mode;
     70     ASSERT_TRUE(dict.GetMode(&mode));
     71     EXPECT_EQ(expected_proxy_mode, mode);
     72   }
     73 };
     74 
     75 TEST_F(ProxyPolicyHandlerTest, ManualOptions) {
     76   PolicyMap policy;
     77   policy.Set(key::kProxyBypassList,
     78              POLICY_LEVEL_MANDATORY,
     79              POLICY_SCOPE_USER,
     80              new base::StringValue("http://chromium.org/override"),
     81              NULL);
     82   policy.Set(key::kProxyServer,
     83              POLICY_LEVEL_MANDATORY,
     84              POLICY_SCOPE_USER,
     85              new base::StringValue("chromium.org"),
     86              NULL);
     87   policy.Set(
     88       key::kProxyServerMode,
     89       POLICY_LEVEL_MANDATORY,
     90       POLICY_SCOPE_USER,
     91       new base::FundamentalValue(
     92           ProxyPolicyHandler::PROXY_MANUALLY_CONFIGURED_PROXY_SERVER_MODE),
     93       NULL);
     94   UpdateProviderPolicy(policy);
     95 
     96   VerifyProxyPrefs("chromium.org",
     97                    std::string(),
     98                    "http://chromium.org/override",
     99                    ProxyPrefs::MODE_FIXED_SERVERS);
    100 }
    101 
    102 TEST_F(ProxyPolicyHandlerTest, ManualOptionsReversedApplyOrder) {
    103   PolicyMap policy;
    104   policy.Set(
    105       key::kProxyServerMode,
    106       POLICY_LEVEL_MANDATORY,
    107       POLICY_SCOPE_USER,
    108       new base::FundamentalValue(
    109           ProxyPolicyHandler::PROXY_MANUALLY_CONFIGURED_PROXY_SERVER_MODE),
    110       NULL);
    111   policy.Set(key::kProxyBypassList,
    112              POLICY_LEVEL_MANDATORY,
    113              POLICY_SCOPE_USER,
    114              new base::StringValue("http://chromium.org/override"),
    115              NULL);
    116   policy.Set(key::kProxyServer,
    117              POLICY_LEVEL_MANDATORY,
    118              POLICY_SCOPE_USER,
    119              new base::StringValue("chromium.org"),
    120              NULL);
    121   UpdateProviderPolicy(policy);
    122 
    123   VerifyProxyPrefs("chromium.org",
    124                    std::string(),
    125                    "http://chromium.org/override",
    126                    ProxyPrefs::MODE_FIXED_SERVERS);
    127 }
    128 
    129 TEST_F(ProxyPolicyHandlerTest, ManualOptionsInvalid) {
    130   PolicyMap policy;
    131   policy.Set(
    132       key::kProxyServerMode,
    133       POLICY_LEVEL_MANDATORY,
    134       POLICY_SCOPE_USER,
    135       new base::FundamentalValue(
    136           ProxyPolicyHandler::PROXY_MANUALLY_CONFIGURED_PROXY_SERVER_MODE),
    137       NULL);
    138   UpdateProviderPolicy(policy);
    139 
    140   const base::Value* value = NULL;
    141   EXPECT_FALSE(store_->GetValue(prefs::kProxy, &value));
    142 }
    143 
    144 TEST_F(ProxyPolicyHandlerTest, NoProxyServerMode) {
    145   PolicyMap policy;
    146   policy.Set(key::kProxyServerMode,
    147              POLICY_LEVEL_MANDATORY,
    148              POLICY_SCOPE_USER,
    149              new base::FundamentalValue(ProxyPolicyHandler::PROXY_SERVER_MODE),
    150              NULL);
    151   UpdateProviderPolicy(policy);
    152   VerifyProxyPrefs(
    153       std::string(), std::string(), std::string(), ProxyPrefs::MODE_DIRECT);
    154 }
    155 
    156 TEST_F(ProxyPolicyHandlerTest, NoProxyModeName) {
    157   PolicyMap policy;
    158   policy.Set(key::kProxyMode,
    159              POLICY_LEVEL_MANDATORY,
    160              POLICY_SCOPE_USER,
    161              new base::StringValue(ProxyPrefs::kDirectProxyModeName),
    162              NULL);
    163   UpdateProviderPolicy(policy);
    164   VerifyProxyPrefs(
    165       std::string(), std::string(), std::string(), ProxyPrefs::MODE_DIRECT);
    166 }
    167 
    168 TEST_F(ProxyPolicyHandlerTest, AutoDetectProxyServerMode) {
    169   PolicyMap policy;
    170   policy.Set(key::kProxyServerMode,
    171              POLICY_LEVEL_MANDATORY,
    172              POLICY_SCOPE_USER,
    173              new base::FundamentalValue(
    174                  ProxyPolicyHandler::PROXY_AUTO_DETECT_PROXY_SERVER_MODE),
    175              NULL);
    176   UpdateProviderPolicy(policy);
    177   VerifyProxyPrefs(std::string(),
    178                    std::string(),
    179                    std::string(),
    180                    ProxyPrefs::MODE_AUTO_DETECT);
    181 }
    182 
    183 TEST_F(ProxyPolicyHandlerTest, AutoDetectProxyModeName) {
    184   PolicyMap policy;
    185   policy.Set(key::kProxyMode,
    186              POLICY_LEVEL_MANDATORY,
    187              POLICY_SCOPE_USER,
    188              new base::StringValue(ProxyPrefs::kAutoDetectProxyModeName),
    189              NULL);
    190   UpdateProviderPolicy(policy);
    191   VerifyProxyPrefs(std::string(),
    192                    std::string(),
    193                    std::string(),
    194                    ProxyPrefs::MODE_AUTO_DETECT);
    195 }
    196 
    197 TEST_F(ProxyPolicyHandlerTest, PacScriptProxyMode) {
    198   PolicyMap policy;
    199   policy.Set(key::kProxyPacUrl,
    200              POLICY_LEVEL_MANDATORY,
    201              POLICY_SCOPE_USER,
    202              new base::StringValue("http://short.org/proxy.pac"),
    203              NULL);
    204   policy.Set(key::kProxyMode,
    205              POLICY_LEVEL_MANDATORY,
    206              POLICY_SCOPE_USER,
    207              new base::StringValue(ProxyPrefs::kPacScriptProxyModeName),
    208              NULL);
    209   UpdateProviderPolicy(policy);
    210   VerifyProxyPrefs(std::string(),
    211                    "http://short.org/proxy.pac",
    212                    std::string(),
    213                    ProxyPrefs::MODE_PAC_SCRIPT);
    214 }
    215 
    216 TEST_F(ProxyPolicyHandlerTest, PacScriptProxyModeInvalid) {
    217   PolicyMap policy;
    218   policy.Set(key::kProxyMode,
    219              POLICY_LEVEL_MANDATORY,
    220              POLICY_SCOPE_USER,
    221              new base::StringValue(ProxyPrefs::kPacScriptProxyModeName),
    222              NULL);
    223   UpdateProviderPolicy(policy);
    224   const base::Value* value = NULL;
    225   EXPECT_FALSE(store_->GetValue(prefs::kProxy, &value));
    226 }
    227 
    228 // Regression test for http://crbug.com/78016, CPanel returns empty strings
    229 // for unset properties.
    230 TEST_F(ProxyPolicyHandlerTest, PacScriptProxyModeBug78016) {
    231   PolicyMap policy;
    232   policy.Set(key::kProxyServer,
    233              POLICY_LEVEL_MANDATORY,
    234              POLICY_SCOPE_USER,
    235              new base::StringValue(std::string()),
    236              NULL);
    237   policy.Set(key::kProxyPacUrl,
    238              POLICY_LEVEL_MANDATORY,
    239              POLICY_SCOPE_USER,
    240              new base::StringValue("http://short.org/proxy.pac"),
    241              NULL);
    242   policy.Set(key::kProxyMode,
    243              POLICY_LEVEL_MANDATORY,
    244              POLICY_SCOPE_USER,
    245              new base::StringValue(ProxyPrefs::kPacScriptProxyModeName),
    246              NULL);
    247   UpdateProviderPolicy(policy);
    248   VerifyProxyPrefs(std::string(),
    249                    "http://short.org/proxy.pac",
    250                    std::string(),
    251                    ProxyPrefs::MODE_PAC_SCRIPT);
    252 }
    253 
    254 TEST_F(ProxyPolicyHandlerTest, UseSystemProxyServerMode) {
    255   PolicyMap policy;
    256   policy.Set(key::kProxyServerMode,
    257              POLICY_LEVEL_MANDATORY,
    258              POLICY_SCOPE_USER,
    259              new base::FundamentalValue(
    260                  ProxyPolicyHandler::PROXY_USE_SYSTEM_PROXY_SERVER_MODE),
    261              NULL);
    262   UpdateProviderPolicy(policy);
    263   VerifyProxyPrefs(
    264       std::string(), std::string(), std::string(), ProxyPrefs::MODE_SYSTEM);
    265 }
    266 
    267 TEST_F(ProxyPolicyHandlerTest, UseSystemProxyMode) {
    268   PolicyMap policy;
    269   policy.Set(key::kProxyMode,
    270              POLICY_LEVEL_MANDATORY,
    271              POLICY_SCOPE_USER,
    272              new base::StringValue(ProxyPrefs::kSystemProxyModeName),
    273              NULL);
    274   UpdateProviderPolicy(policy);
    275   VerifyProxyPrefs(
    276       std::string(), std::string(), std::string(), ProxyPrefs::MODE_SYSTEM);
    277 }
    278 
    279 TEST_F(ProxyPolicyHandlerTest,
    280        ProxyModeOverridesProxyServerMode) {
    281   PolicyMap policy;
    282   policy.Set(key::kProxyServerMode,
    283              POLICY_LEVEL_MANDATORY,
    284              POLICY_SCOPE_USER,
    285              new base::FundamentalValue(ProxyPolicyHandler::PROXY_SERVER_MODE),
    286              NULL);
    287   policy.Set(key::kProxyMode,
    288              POLICY_LEVEL_MANDATORY,
    289              POLICY_SCOPE_USER,
    290              new base::StringValue(ProxyPrefs::kAutoDetectProxyModeName),
    291              NULL);
    292   UpdateProviderPolicy(policy);
    293   VerifyProxyPrefs(std::string(),
    294                    std::string(),
    295                    std::string(),
    296                    ProxyPrefs::MODE_AUTO_DETECT);
    297 }
    298 
    299 TEST_F(ProxyPolicyHandlerTest, ProxyInvalid) {
    300   // No mode expects all three parameters being set.
    301   PolicyMap policy;
    302   policy.Set(key::kProxyPacUrl,
    303              POLICY_LEVEL_MANDATORY,
    304              POLICY_SCOPE_USER,
    305              new base::StringValue("http://short.org/proxy.pac"),
    306              NULL);
    307   policy.Set(key::kProxyBypassList,
    308              POLICY_LEVEL_MANDATORY,
    309              POLICY_SCOPE_USER,
    310              new base::StringValue("http://chromium.org/override"),
    311              NULL);
    312   policy.Set(key::kProxyServer,
    313              POLICY_LEVEL_MANDATORY,
    314              POLICY_SCOPE_USER,
    315              new base::StringValue("chromium.org"),
    316              NULL);
    317   for (int i = 0; i < ProxyPolicyHandler::MODE_COUNT; ++i) {
    318     policy.Set(key::kProxyServerMode,
    319                POLICY_LEVEL_MANDATORY,
    320                POLICY_SCOPE_USER,
    321                new base::FundamentalValue(i),
    322                NULL);
    323     UpdateProviderPolicy(policy);
    324     const base::Value* value = NULL;
    325     EXPECT_FALSE(store_->GetValue(prefs::kProxy, &value));
    326   }
    327 }
    328 
    329 }  // namespace policy
    330