extension_proxy_apitest.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1// Copyright (c) 2010 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 "chrome/browser/extensions/extension_apitest.h"
6#include "chrome/browser/prefs/pref_service.h"
7#include "chrome/browser/prefs/proxy_config_dictionary.h"
8#include "chrome/browser/profiles/profile.h"
9#include "chrome/browser/ui/browser.h"
10#include "chrome/common/chrome_switches.h"
11#include "chrome/common/extensions/extension.h"
12#include "chrome/common/pref_names.h"
13
14namespace {
15
16const char kNoServer[] = "";
17const char kNoBypass[] = "";
18const char kNoPac[] = "";
19
20}  // namespace
21
22class ProxySettingsApiTest : public ExtensionApiTest {
23 protected:
24  void ValidateSettings(int expected_mode,
25                        const std::string& expected_server,
26                        const std::string& bypass,
27                        const std::string& expected_pac_url,
28                        PrefService* pref_service) {
29    const PrefService::Preference* pref =
30        pref_service->FindPreference(prefs::kProxy);
31    ASSERT_TRUE(pref != NULL);
32    EXPECT_TRUE(pref->IsExtensionControlled());
33
34    ProxyConfigDictionary dict(pref_service->GetDictionary(prefs::kProxy));
35
36    ProxyPrefs::ProxyMode mode;
37    ASSERT_TRUE(dict.GetMode(&mode));
38    EXPECT_EQ(expected_mode, mode);
39
40    std::string value;
41    if (!bypass.empty()) {
42       ASSERT_TRUE(dict.GetBypassList(&value));
43       EXPECT_EQ(bypass, value);
44     } else {
45       EXPECT_FALSE(dict.GetBypassList(&value));
46     }
47
48    if (!expected_pac_url.empty()) {
49       ASSERT_TRUE(dict.GetPacUrl(&value));
50       EXPECT_EQ(expected_pac_url, value);
51     } else {
52       EXPECT_FALSE(dict.GetPacUrl(&value));
53     }
54
55    if (!expected_server.empty()) {
56      ASSERT_TRUE(dict.GetProxyServer(&value));
57      EXPECT_EQ(expected_server, value);
58    } else {
59      EXPECT_FALSE(dict.GetProxyServer(&value));
60    }
61  }
62
63  void ExpectNoSettings(PrefService* pref_service) {
64    const PrefService::Preference* pref =
65        pref_service->FindPreference(prefs::kProxy);
66    ASSERT_TRUE(pref != NULL);
67    EXPECT_FALSE(pref->IsExtensionControlled());
68  }
69};
70
71// Tests direct connection settings.
72IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyDirectSettings) {
73  CommandLine::ForCurrentProcess()->AppendSwitch(
74      switches::kEnableExperimentalExtensionApis);
75
76  ASSERT_TRUE(RunExtensionTest("proxy/direct")) << message_;
77  const Extension* extension = GetSingleLoadedExtension();
78  ASSERT_TRUE(extension);
79
80  PrefService* pref_service = browser()->profile()->GetPrefs();
81  ValidateSettings(ProxyPrefs::MODE_DIRECT, kNoServer, kNoBypass, kNoPac,
82                   pref_service);
83}
84
85// Tests auto-detect settings.
86IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyAutoSettings) {
87  CommandLine::ForCurrentProcess()->AppendSwitch(
88      switches::kEnableExperimentalExtensionApis);
89
90  ASSERT_TRUE(RunExtensionTest("proxy/auto")) << message_;
91  const Extension* extension = GetSingleLoadedExtension();
92  ASSERT_TRUE(extension);
93
94  PrefService* pref_service = browser()->profile()->GetPrefs();
95  ValidateSettings(ProxyPrefs::MODE_AUTO_DETECT, kNoServer, kNoBypass, kNoPac,
96                   pref_service);
97}
98
99// Tests PAC proxy settings.
100IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyPacScript) {
101  CommandLine::ForCurrentProcess()->AppendSwitch(
102      switches::kEnableExperimentalExtensionApis);
103
104  ASSERT_TRUE(RunExtensionTest("proxy/pac")) << message_;
105  const Extension* extension = GetSingleLoadedExtension();
106  ASSERT_TRUE(extension);
107
108  PrefService* pref_service = browser()->profile()->GetPrefs();
109  ValidateSettings(ProxyPrefs::MODE_PAC_SCRIPT, kNoServer, kNoBypass,
110                   "http://wpad/windows.pac", pref_service);
111}
112
113// Tests setting a single proxy to cover all schemes.
114IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyFixedSingle) {
115  CommandLine::ForCurrentProcess()->AppendSwitch(
116      switches::kEnableExperimentalExtensionApis);
117
118  ASSERT_TRUE(RunExtensionTest("proxy/single")) << message_;
119  const Extension* extension = GetSingleLoadedExtension();
120  ASSERT_TRUE(extension);
121
122  PrefService* pref_service = browser()->profile()->GetPrefs();
123  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
124                 "127.0.0.1:100",
125                 kNoBypass,
126                 kNoPac,
127                 pref_service);
128}
129
130// Tests setting to use the system's proxy settings.
131IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxySystem) {
132  CommandLine::ForCurrentProcess()->AppendSwitch(
133      switches::kEnableExperimentalExtensionApis);
134
135  ASSERT_TRUE(RunExtensionTest("proxy/system")) << message_;
136  const Extension* extension = GetSingleLoadedExtension();
137  ASSERT_TRUE(extension);
138
139  PrefService* pref_service = browser()->profile()->GetPrefs();
140  ValidateSettings(ProxyPrefs::MODE_SYSTEM, kNoServer, kNoBypass, kNoPac,
141                   pref_service);
142}
143
144// Tests setting separate proxies for each scheme.
145IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyFixedIndividual) {
146  CommandLine::ForCurrentProcess()->AppendSwitch(
147      switches::kEnableExperimentalExtensionApis);
148
149  ASSERT_TRUE(RunExtensionTest("proxy/individual")) << message_;
150  const Extension* extension = GetSingleLoadedExtension();
151  ASSERT_TRUE(extension);
152
153  PrefService* pref_service = browser()->profile()->GetPrefs();
154  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
155                   "http=1.1.1.1:80;"  // http:// is pruned.
156                       "https=2.2.2.2:80;"  // http:// is pruned.
157                       "ftp=3.3.3.3:9000;"  // http:// is pruned.
158                       "socks=socks4://4.4.4.4:9090",
159                   kNoBypass,
160                   kNoPac,
161                   pref_service);
162
163  // Now check the incognito preferences.
164  pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
165  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
166                   "http=1.1.1.1:80;"
167                       "https=2.2.2.2:80;"
168                       "ftp=3.3.3.3:9000;"
169                       "socks=socks4://4.4.4.4:9090",
170                   kNoBypass,
171                   kNoPac,
172                   pref_service);
173}
174
175// Tests setting values only for incognito mode
176IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
177    ProxyFixedIndividualIncognitoOnly) {
178  CommandLine::ForCurrentProcess()->AppendSwitch(
179      switches::kEnableExperimentalExtensionApis);
180
181  ASSERT_TRUE(RunExtensionTest("proxy/individual_incognito_only")) << message_;
182  const Extension* extension = GetSingleLoadedExtension();
183  ASSERT_TRUE(extension);
184
185  PrefService* pref_service = browser()->profile()->GetPrefs();
186  ExpectNoSettings(pref_service);
187
188  // Now check the incognito preferences.
189  pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
190  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
191                   "http=1.1.1.1:80;"
192                       "https=socks5://2.2.2.2:1080;"  // socks5 equals socks.
193                       "ftp=3.3.3.3:9000;"
194                       "socks=socks4://4.4.4.4:9090",
195                   kNoBypass,
196                   kNoPac,
197                   pref_service);
198}
199
200// Tests setting values also for incognito mode
201IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
202    ProxyFixedIndividualIncognitoAlso) {
203  CommandLine::ForCurrentProcess()->AppendSwitch(
204      switches::kEnableExperimentalExtensionApis);
205
206  ASSERT_TRUE(RunExtensionTest("proxy/individual_incognito_also")) << message_;
207  const Extension* extension = GetSingleLoadedExtension();
208  ASSERT_TRUE(extension);
209
210  PrefService* pref_service = browser()->profile()->GetPrefs();
211  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
212                   "http=1.1.1.1:80;"
213                       "https=socks5://2.2.2.2:1080;"
214                       "ftp=3.3.3.3:9000;"
215                       "socks=socks4://4.4.4.4:9090",
216                   kNoBypass,
217                   kNoPac,
218                   pref_service);
219
220  // Now check the incognito preferences.
221  pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
222  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
223                   "http=5.5.5.5:80;"
224                       "https=socks5://6.6.6.6:1080;"
225                       "ftp=7.7.7.7:9000;"
226                       "socks=socks4://8.8.8.8:9090",
227                   kNoBypass,
228                   kNoPac,
229                   pref_service);
230}
231
232// Tests setting and unsetting values
233IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest, ProxyFixedIndividualRemove) {
234  CommandLine::ForCurrentProcess()->AppendSwitch(
235      switches::kEnableExperimentalExtensionApis);
236
237  ASSERT_TRUE(RunExtensionTest("proxy/individual_remove")) << message_;
238  const Extension* extension = GetSingleLoadedExtension();
239  ASSERT_TRUE(extension);
240
241  PrefService* pref_service = browser()->profile()->GetPrefs();
242  ExpectNoSettings(pref_service);
243}
244
245IN_PROC_BROWSER_TEST_F(ProxySettingsApiTest,
246    ProxyBypass) {
247  CommandLine::ForCurrentProcess()->AppendSwitch(
248      switches::kEnableExperimentalExtensionApis);
249
250  ASSERT_TRUE(RunExtensionTest("proxy/bypass")) << message_;
251  const Extension* extension = GetSingleLoadedExtension();
252  ASSERT_TRUE(extension);
253
254  PrefService* pref_service = browser()->profile()->GetPrefs();
255  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
256                   "http=1.1.1.1:80",
257                   "localhost,::1,foo.bar,<local>",
258                   kNoPac,
259                   pref_service);
260
261  // Now check the incognito preferences.
262  pref_service = browser()->profile()->GetOffTheRecordProfile()->GetPrefs();
263  ValidateSettings(ProxyPrefs::MODE_FIXED_SERVERS,
264                   "http=1.1.1.1:80",
265                   "localhost,::1,foo.bar,<local>",
266                   kNoPac,
267                   pref_service);
268}
269