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.
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/policy/configuration_policy_pref_store.h"
11 #include "chrome/browser/policy/configuration_policy_pref_store_unittest.h"
12 #include "chrome/browser/prefs/proxy_config_dictionary.h"
13 #include "chrome/browser/prefs/proxy_prefs.h"
14 #include "chrome/common/pref_names.h"
15 #include "policy/policy_constants.h"
16 #include "testing/gtest/include/gtest/gtest.h"
20 // Test cases for the proxy policy settings.
21 class ProxyPolicyHandlerTest
22 : public ConfigurationPolicyPrefStoreTest {
24 virtual void SetUp() OVERRIDE {
25 handler_list_.AddHandler(
26 make_scoped_ptr<ConfigurationPolicyHandler>(new ProxyPolicyHandler));
30 // Verify that all the proxy prefs are set to the specified expected values.
31 void VerifyProxyPrefs(
32 const std::string& expected_proxy_server,
33 const std::string& expected_proxy_pac_url,
34 const std::string& expected_proxy_bypass_list,
35 const ProxyPrefs::ProxyMode& expected_proxy_mode) {
36 const base::Value* value = NULL;
37 ASSERT_TRUE(store_->GetValue(prefs::kProxy, &value));
38 ASSERT_EQ(base::Value::TYPE_DICTIONARY, value->GetType());
39 ProxyConfigDictionary dict(
40 static_cast<const base::DictionaryValue*>(value));
42 if (expected_proxy_server.empty()) {
43 EXPECT_FALSE(dict.GetProxyServer(&s));
45 ASSERT_TRUE(dict.GetProxyServer(&s));
46 EXPECT_EQ(expected_proxy_server, s);
48 if (expected_proxy_pac_url.empty()) {
49 EXPECT_FALSE(dict.GetPacUrl(&s));
51 ASSERT_TRUE(dict.GetPacUrl(&s));
52 EXPECT_EQ(expected_proxy_pac_url, s);
54 if (expected_proxy_bypass_list.empty()) {
55 EXPECT_FALSE(dict.GetBypassList(&s));
57 ASSERT_TRUE(dict.GetBypassList(&s));
58 EXPECT_EQ(expected_proxy_bypass_list, s);
60 ProxyPrefs::ProxyMode mode;
61 ASSERT_TRUE(dict.GetMode(&mode));
62 EXPECT_EQ(expected_proxy_mode, mode);
66 TEST_F(ProxyPolicyHandlerTest, ManualOptions) {
68 policy.Set(key::kProxyBypassList, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
69 base::Value::CreateStringValue("http://chromium.org/override"),
71 policy.Set(key::kProxyServer, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
72 base::Value::CreateStringValue("chromium.org"), NULL);
74 key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
75 base::Value::CreateIntegerValue(
76 ProxyPolicyHandler::PROXY_MANUALLY_CONFIGURED_PROXY_SERVER_MODE),
78 UpdateProviderPolicy(policy);
80 VerifyProxyPrefs("chromium.org",
82 "http://chromium.org/override",
83 ProxyPrefs::MODE_FIXED_SERVERS);
86 TEST_F(ProxyPolicyHandlerTest, ManualOptionsReversedApplyOrder) {
89 key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
90 base::Value::CreateIntegerValue(
91 ProxyPolicyHandler::PROXY_MANUALLY_CONFIGURED_PROXY_SERVER_MODE),
93 policy.Set(key::kProxyBypassList, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
94 base::Value::CreateStringValue("http://chromium.org/override"),
96 policy.Set(key::kProxyServer, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
97 base::Value::CreateStringValue("chromium.org"), NULL);
98 UpdateProviderPolicy(policy);
100 VerifyProxyPrefs("chromium.org",
102 "http://chromium.org/override",
103 ProxyPrefs::MODE_FIXED_SERVERS);
106 TEST_F(ProxyPolicyHandlerTest, ManualOptionsInvalid) {
109 key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
110 base::Value::CreateIntegerValue(
111 ProxyPolicyHandler::PROXY_MANUALLY_CONFIGURED_PROXY_SERVER_MODE),
113 UpdateProviderPolicy(policy);
115 const base::Value* value = NULL;
116 EXPECT_FALSE(store_->GetValue(prefs::kProxy, &value));
119 TEST_F(ProxyPolicyHandlerTest, NoProxyServerMode) {
121 policy.Set(key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
122 base::Value::CreateIntegerValue(
123 ProxyPolicyHandler::PROXY_SERVER_MODE),
125 UpdateProviderPolicy(policy);
127 std::string(), std::string(), std::string(), ProxyPrefs::MODE_DIRECT);
130 TEST_F(ProxyPolicyHandlerTest, NoProxyModeName) {
132 policy.Set(key::kProxyMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
133 base::Value::CreateStringValue(ProxyPrefs::kDirectProxyModeName),
135 UpdateProviderPolicy(policy);
137 std::string(), std::string(), std::string(), ProxyPrefs::MODE_DIRECT);
140 TEST_F(ProxyPolicyHandlerTest, AutoDetectProxyServerMode) {
143 key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
144 base::Value::CreateIntegerValue(
145 ProxyPolicyHandler::PROXY_AUTO_DETECT_PROXY_SERVER_MODE),
147 UpdateProviderPolicy(policy);
148 VerifyProxyPrefs(std::string(),
151 ProxyPrefs::MODE_AUTO_DETECT);
154 TEST_F(ProxyPolicyHandlerTest, AutoDetectProxyModeName) {
156 policy.Set(key::kProxyMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
157 base::Value::CreateStringValue(
158 ProxyPrefs::kAutoDetectProxyModeName),
160 UpdateProviderPolicy(policy);
161 VerifyProxyPrefs(std::string(),
164 ProxyPrefs::MODE_AUTO_DETECT);
167 TEST_F(ProxyPolicyHandlerTest, PacScriptProxyMode) {
169 policy.Set(key::kProxyPacUrl, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
170 base::Value::CreateStringValue("http://short.org/proxy.pac"),
172 policy.Set(key::kProxyMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
173 base::Value::CreateStringValue(
174 ProxyPrefs::kPacScriptProxyModeName),
176 UpdateProviderPolicy(policy);
177 VerifyProxyPrefs(std::string(),
178 "http://short.org/proxy.pac",
180 ProxyPrefs::MODE_PAC_SCRIPT);
183 TEST_F(ProxyPolicyHandlerTest, PacScriptProxyModeInvalid) {
185 policy.Set(key::kProxyMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
186 base::Value::CreateStringValue(
187 ProxyPrefs::kPacScriptProxyModeName),
189 UpdateProviderPolicy(policy);
190 const base::Value* value = NULL;
191 EXPECT_FALSE(store_->GetValue(prefs::kProxy, &value));
194 // Regression test for http://crbug.com/78016, CPanel returns empty strings
195 // for unset properties.
196 TEST_F(ProxyPolicyHandlerTest, PacScriptProxyModeBug78016) {
198 policy.Set(key::kProxyServer,
199 POLICY_LEVEL_MANDATORY,
201 base::Value::CreateStringValue(std::string()),
203 policy.Set(key::kProxyPacUrl,
204 POLICY_LEVEL_MANDATORY,
206 base::Value::CreateStringValue("http://short.org/proxy.pac"),
208 policy.Set(key::kProxyMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
209 base::Value::CreateStringValue(
210 ProxyPrefs::kPacScriptProxyModeName),
212 UpdateProviderPolicy(policy);
213 VerifyProxyPrefs(std::string(),
214 "http://short.org/proxy.pac",
216 ProxyPrefs::MODE_PAC_SCRIPT);
219 TEST_F(ProxyPolicyHandlerTest, UseSystemProxyServerMode) {
221 policy.Set(key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
222 base::Value::CreateIntegerValue(
223 ProxyPolicyHandler::PROXY_USE_SYSTEM_PROXY_SERVER_MODE),
225 UpdateProviderPolicy(policy);
227 std::string(), std::string(), std::string(), ProxyPrefs::MODE_SYSTEM);
230 TEST_F(ProxyPolicyHandlerTest, UseSystemProxyMode) {
232 policy.Set(key::kProxyMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
233 base::Value::CreateStringValue(ProxyPrefs::kSystemProxyModeName),
235 UpdateProviderPolicy(policy);
237 std::string(), std::string(), std::string(), ProxyPrefs::MODE_SYSTEM);
240 TEST_F(ProxyPolicyHandlerTest,
241 ProxyModeOverridesProxyServerMode) {
243 policy.Set(key::kProxyServerMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
244 base::Value::CreateIntegerValue(
245 ProxyPolicyHandler::PROXY_SERVER_MODE),
247 policy.Set(key::kProxyMode, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
248 base::Value::CreateStringValue(
249 ProxyPrefs::kAutoDetectProxyModeName),
251 UpdateProviderPolicy(policy);
252 VerifyProxyPrefs(std::string(),
255 ProxyPrefs::MODE_AUTO_DETECT);
258 TEST_F(ProxyPolicyHandlerTest, ProxyInvalid) {
259 // No mode expects all three parameters being set.
261 policy.Set(key::kProxyPacUrl, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
262 base::Value::CreateStringValue("http://short.org/proxy.pac"),
264 policy.Set(key::kProxyBypassList, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
265 base::Value::CreateStringValue("http://chromium.org/override"),
267 policy.Set(key::kProxyServer, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
268 base::Value::CreateStringValue("chromium.org"), NULL);
269 for (int i = 0; i < ProxyPolicyHandler::MODE_COUNT; ++i) {
270 policy.Set(key::kProxyServerMode, POLICY_LEVEL_MANDATORY,
271 POLICY_SCOPE_USER, base::Value::CreateIntegerValue(i), NULL);
272 UpdateProviderPolicy(policy);
273 const base::Value* value = NULL;
274 EXPECT_FALSE(store_->GetValue(prefs::kProxy, &value));
278 } // namespace policy