1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// found in the LICENSE file.
4201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
5201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/net/pref_proxy_config_service.h"
6201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
7201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/command_line.h"
8201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "base/file_path.h"
9201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/net/chrome_url_request_context.h"
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/prefs/pref_service_mock_builder.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/prefs/proxy_config_dictionary.h"
12201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/chrome_switches.h"
13201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/common/pref_names.h"
14201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/test/testing_pref_service.h"
15201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "net/proxy/proxy_config_service_common_unittest.h"
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "testing/gmock/include/gmock/gmock.h"
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing testing::_;
20201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochusing testing::Mock;
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
22201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace {
23201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochconst char kFixedPacUrl[] = "http://chromium.org/fixed_pac_url";
25201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
26201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Testing proxy config service that allows us to fire notifications at will.
27201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass TestProxyConfigService : public net::ProxyConfigService {
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TestProxyConfigService(const net::ProxyConfig& config,
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                         ConfigAvailability availability)
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      : config_(config),
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        availability_(availability) {}
33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetProxyConfig(const net::ProxyConfig config,
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      ConfigAvailability availability) {
36201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    config_ = config;
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    availability_ = availability;
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    FOR_EACH_OBSERVER(net::ProxyConfigService::Observer, observers_,
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      OnProxyConfigChanged(config, availability));
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void AddObserver(net::ProxyConfigService::Observer* observer) {
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    observers_.AddObserver(observer);
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void RemoveObserver(net::ProxyConfigService::Observer* observer) {
48201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    observers_.RemoveObserver(observer);
49201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
50201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual net::ProxyConfigService::ConfigAvailability GetLatestProxyConfig(
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::ProxyConfig* config) {
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    *config = config_;
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return availability_;
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig config_;
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ConfigAvailability availability_;
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ObserverList<net::ProxyConfigService::Observer, true> observers_;
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
62201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// A mock observer for capturing callbacks.
63201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass MockObserver : public net::ProxyConfigService::Observer {
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MOCK_METHOD2(OnProxyConfigChanged,
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               void(const net::ProxyConfig&,
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    net::ProxyConfigService::ConfigAvailability));
68201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochtemplate<typename TESTBASE>
71201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass PrefProxyConfigServiceTestBase : public TESTBASE {
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch protected:
73201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  PrefProxyConfigServiceTestBase()
74201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      : ui_thread_(BrowserThread::UI, &loop_),
75201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        io_thread_(BrowserThread::IO, &loop_) {}
76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
7721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual void Init(PrefService* pref_service) {
7821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    ASSERT_TRUE(pref_service);
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    PrefProxyConfigService::RegisterPrefs(pref_service);
80201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    fixed_config_.set_pac_url(GURL(kFixedPacUrl));
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    delegate_service_ =
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        new TestProxyConfigService(fixed_config_,
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   net::ProxyConfigService::CONFIG_VALID);
8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    proxy_config_tracker_ = new PrefProxyConfigTracker(pref_service);
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    proxy_config_service_.reset(
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        new PrefProxyConfigService(proxy_config_tracker_.get(),
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                   delegate_service_));
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void TearDown() {
91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    proxy_config_tracker_->DetachFromPrefService();
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    loop_.RunAllPending();
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    proxy_config_service_.reset();
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MessageLoop loop_;
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TestProxyConfigService* delegate_service_; // weak
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_ptr<PrefProxyConfigService> proxy_config_service_;
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig fixed_config_;
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  scoped_refptr<PrefProxyConfigTracker> proxy_config_tracker_;
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BrowserThread ui_thread_;
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  BrowserThread io_thread_;
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass PrefProxyConfigServiceTest
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    : public PrefProxyConfigServiceTestBase<testing::Test> {
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch protected:
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void SetUp() {
11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    pref_service_.reset(new TestingPrefService());
11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    Init(pref_service_.get());
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<TestingPrefService> pref_service_;
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(PrefProxyConfigServiceTest, BaseConfiguration) {
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig actual_config;
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(net::ProxyConfigService::CONFIG_VALID,
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            proxy_config_service_->GetLatestProxyConfig(&actual_config));
122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(GURL(kFixedPacUrl), actual_config.pac_url());
123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(PrefProxyConfigServiceTest, DynamicPrefOverrides) {
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  pref_service_->SetManagedPref(
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      prefs::kProxy,
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ProxyConfigDictionary::CreateFixedServers("http://example.com:3128", ""));
129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  loop_.RunAllPending();
130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig actual_config;
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(net::ProxyConfigService::CONFIG_VALID,
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            proxy_config_service_->GetLatestProxyConfig(&actual_config));
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(actual_config.auto_detect());
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(net::ProxyConfig::ProxyRules::TYPE_SINGLE_PROXY,
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            actual_config.proxy_rules().type);
137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(actual_config.proxy_rules().single_proxy,
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch            net::ProxyServer::FromURI("http://example.com:3128",
139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                      net::ProxyServer::SCHEME_HTTP));
140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  pref_service_->SetManagedPref(prefs::kProxy,
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                ProxyConfigDictionary::CreateAutoDetect());
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  loop_.RunAllPending();
144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(net::ProxyConfigService::CONFIG_VALID,
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            proxy_config_service_->GetLatestProxyConfig(&actual_config));
147201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(actual_config.auto_detect());
148201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
149201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
150201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Compares proxy configurations, but allows different identifiers.
151201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochMATCHER_P(ProxyConfigMatches, config, "") {
152201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig reference(config);
153201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  reference.set_id(arg.id());
154201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  return reference.Equals(arg);
155201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
156201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
157201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(PrefProxyConfigServiceTest, Observers) {
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const net::ProxyConfigService::ConfigAvailability CONFIG_VALID =
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::ProxyConfigService::CONFIG_VALID;
160201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  MockObserver observer;
161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  proxy_config_service_->AddObserver(&observer);
162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Firing the observers in the delegate should trigger a notification.
164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig config2;
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  config2.set_auto_detect(true);
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(observer, OnProxyConfigChanged(ProxyConfigMatches(config2),
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             CONFIG_VALID)).Times(1);
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delegate_service_->SetProxyConfig(config2, CONFIG_VALID);
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  loop_.RunAllPending();
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Mock::VerifyAndClearExpectations(&observer);
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Override configuration, this should trigger a notification.
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig pref_config;
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  pref_config.set_pac_url(GURL(kFixedPacUrl));
17521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(observer, OnProxyConfigChanged(ProxyConfigMatches(pref_config),
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             CONFIG_VALID)).Times(1);
17821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  pref_service_->SetManagedPref(
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      prefs::kProxy,
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ProxyConfigDictionary::CreatePacScript(kFixedPacUrl));
181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  loop_.RunAllPending();
182201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Mock::VerifyAndClearExpectations(&observer);
183201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
184201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Since there are pref overrides, delegate changes should be ignored.
185201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig config3;
186201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  config3.proxy_rules().ParseFromString("http=config3:80");
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(observer, OnProxyConfigChanged(_, _)).Times(0);
188201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  fixed_config_.set_auto_detect(true);
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delegate_service_->SetProxyConfig(config3, CONFIG_VALID);
190201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  loop_.RunAllPending();
191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Mock::VerifyAndClearExpectations(&observer);
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Clear the override should switch back to the fixed configuration.
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(observer, OnProxyConfigChanged(ProxyConfigMatches(config3),
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             CONFIG_VALID)).Times(1);
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  pref_service_->RemoveManagedPref(prefs::kProxy);
197201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  loop_.RunAllPending();
198201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Mock::VerifyAndClearExpectations(&observer);
199201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
200201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Delegate service notifications should show up again.
201201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig config4;
202201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  config4.proxy_rules().ParseFromString("socks:config4");
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(observer, OnProxyConfigChanged(ProxyConfigMatches(config4),
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                             CONFIG_VALID)).Times(1);
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delegate_service_->SetProxyConfig(config4, CONFIG_VALID);
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  loop_.RunAllPending();
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Mock::VerifyAndClearExpectations(&observer);
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  proxy_config_service_->RemoveObserver(&observer);
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(PrefProxyConfigServiceTest, Fallback) {
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const net::ProxyConfigService::ConfigAvailability CONFIG_VALID =
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::ProxyConfigService::CONFIG_VALID;
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MockObserver observer;
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::ProxyConfig actual_config;
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  delegate_service_->SetProxyConfig(net::ProxyConfig::CreateDirect(),
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    net::ProxyConfigService::CONFIG_UNSET);
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  proxy_config_service_->AddObserver(&observer);
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Prepare test data.
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::ProxyConfig recommended_config = net::ProxyConfig::CreateAutoDetect();
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  net::ProxyConfig user_config =
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      net::ProxyConfig::CreateFromCustomPacURL(GURL(kFixedPacUrl));
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set a recommended pref.
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(observer,
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              OnProxyConfigChanged(ProxyConfigMatches(recommended_config),
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   CONFIG_VALID)).Times(1);
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  pref_service_->SetRecommendedPref(
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      prefs::kProxy,
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ProxyConfigDictionary::CreateAutoDetect());
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  loop_.RunAllPending();
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Mock::VerifyAndClearExpectations(&observer);
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(CONFIG_VALID,
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            proxy_config_service_->GetLatestProxyConfig(&actual_config));
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(actual_config.Equals(recommended_config));
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Override in user prefs.
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_CALL(observer,
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              OnProxyConfigChanged(ProxyConfigMatches(user_config),
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   CONFIG_VALID)).Times(1);
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  pref_service_->SetManagedPref(
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      prefs::kProxy,
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      ProxyConfigDictionary::CreatePacScript(kFixedPacUrl));
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  loop_.RunAllPending();
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Mock::VerifyAndClearExpectations(&observer);
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(CONFIG_VALID,
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            proxy_config_service_->GetLatestProxyConfig(&actual_config));
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(actual_config.Equals(user_config));
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Go back to recommended pref.
253201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_CALL(observer,
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen              OnProxyConfigChanged(ProxyConfigMatches(recommended_config),
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   CONFIG_VALID)).Times(1);
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  pref_service_->RemoveManagedPref(prefs::kProxy);
257201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  loop_.RunAllPending();
258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Mock::VerifyAndClearExpectations(&observer);
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(CONFIG_VALID,
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            proxy_config_service_->GetLatestProxyConfig(&actual_config));
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(actual_config.Equals(recommended_config));
262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
263201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  proxy_config_service_->RemoveObserver(&observer);
264201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
265201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
266201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Test parameter object for testing command line proxy configuration.
267201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstruct CommandLineTestParams {
268201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Explicit assignment operator, so testing::TestWithParam works with MSVC.
269201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CommandLineTestParams& operator=(const CommandLineTestParams& other) {
270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    description = other.description;
271201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    for (unsigned int i = 0; i < arraysize(switches); i++)
272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      switches[i] = other.switches[i];
273201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    is_null = other.is_null;
274201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    auto_detect = other.auto_detect;
275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    pac_url = other.pac_url;
276201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    proxy_rules = other.proxy_rules;
277201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return *this;
278201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
279201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
280201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Short description to identify the test.
281201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const char* description;
282201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The command line to build a ProxyConfig from.
284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  struct SwitchValue {
285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const char* name;
286201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    const char* value;
287201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } switches[2];
288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Expected outputs (fields of the ProxyConfig).
290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool is_null;
291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool auto_detect;
292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL pac_url;
293201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyRulesExpectation proxy_rules;
294201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
295201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid PrintTo(const CommandLineTestParams& params, std::ostream* os) {
297201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  *os << params.description;
298201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
299201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass PrefProxyConfigServiceCommandLineTest
301201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    : public PrefProxyConfigServiceTestBase<
302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          testing::TestWithParam<CommandLineTestParams> > {
303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch protected:
304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  PrefProxyConfigServiceCommandLineTest()
305201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      : command_line_(CommandLine::NO_PROGRAM) {}
306201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
307201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void SetUp() {
308201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    for (size_t i = 0; i < arraysize(GetParam().switches); i++) {
309201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const char* name = GetParam().switches[i].name;
310201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const char* value = GetParam().switches[i].value;
311201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      if (name && value)
312201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        command_line_.AppendSwitchASCII(name, value);
313201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      else if (name)
314201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        command_line_.AppendSwitch(name);
315201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    }
31621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    pref_service_.reset(
31721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        PrefServiceMockBuilder().WithCommandLine(&command_line_).Create());
31821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    Init(pref_service_.get());
319201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
322201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CommandLine command_line_;
32321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  scoped_ptr<PrefService> pref_service_;
324201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
325201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
326201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_P(PrefProxyConfigServiceCommandLineTest, CommandLine) {
327201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  net::ProxyConfig config;
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(net::ProxyConfigService::CONFIG_VALID,
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            proxy_config_service_->GetLatestProxyConfig(&config));
330201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
331201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (GetParam().is_null) {
332201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_EQ(GURL(kFixedPacUrl), config.pac_url());
333201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  } else {
334201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_NE(GURL(kFixedPacUrl), config.pac_url());
335201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_EQ(GetParam().auto_detect, config.auto_detect());
336201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_EQ(GetParam().pac_url, config.pac_url());
337201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    EXPECT_TRUE(GetParam().proxy_rules.Matches(config.proxy_rules()));
338201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
339201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
340201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
341201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochstatic const CommandLineTestParams kCommandLineTestParams[] = {
342201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
343201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    "Empty command line",
344201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
345201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    { },
346201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
347201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    true,                                               // is_null
348201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // auto_detect
349201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL(),                                             // pac_url
350201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    net::ProxyRulesExpectation::Empty(),
351201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
352201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
353201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    "No proxy",
354201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
355201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    {
356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kNoProxyServer, NULL },
357201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
358201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
359201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // is_null
360201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // auto_detect
361201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL(),                                             // pac_url
362201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    net::ProxyRulesExpectation::Empty(),
363201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
364201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
365201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    "No proxy with extra parameters.",
366201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
367201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    {
368201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kNoProxyServer, NULL },
369201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kProxyServer, "http://proxy:8888" },
370201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
371201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
372201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // is_null
373201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // auto_detect
374201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL(),                                             // pac_url
375201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    net::ProxyRulesExpectation::Empty(),
376201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
377201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
378201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    "Single proxy.",
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    {
381201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kProxyServer, "http://proxy:8888" },
382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
383201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
384201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // is_null
385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // auto_detect
386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL(),                                             // pac_url
387201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    net::ProxyRulesExpectation::Single(
388201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "proxy:8888",  // single proxy
389201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        ""),           // bypass rules
390201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
391201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
392201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    "Per scheme proxy.",
393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
394201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    {
395201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kProxyServer, "http=httpproxy:8888;ftp=ftpproxy:8889" },
396201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
397201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
398201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // is_null
399201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // auto_detect
400201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL(),                                             // pac_url
401201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    net::ProxyRulesExpectation::PerScheme(
402201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "httpproxy:8888",  // http
403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "",                // https
404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "ftpproxy:8889",   // ftp
405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        ""),               // bypass rules
406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
408201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    "Per scheme proxy with bypass URLs.",
409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    {
411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kProxyServer, "http=httpproxy:8888;ftp=ftpproxy:8889" },
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kProxyBypassList,
413201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        ".google.com, foo.com:99, 1.2.3.4:22, 127.0.0.1/8" },
414201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
415201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // is_null
417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // auto_detect
418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL(),                                             // pac_url
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    net::ProxyRulesExpectation::PerScheme(
420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "httpproxy:8888",  // http
421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "",                // https
422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "ftpproxy:8889",   // ftp
423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        "*.google.com,foo.com:99,1.2.3.4:22,127.0.0.1/8"),
424201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
425201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
42621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    "Pac URL",
427201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
428201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    {
429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kProxyPacUrl, "http://wpad/wpad.dat" },
430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // is_null
433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // auto_detect
434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL("http://wpad/wpad.dat"),                       // pac_url
43521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    net::ProxyRulesExpectation::Empty(),
436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
437201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  {
438201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    "Autodetect",
439201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Input
440201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    {
441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      { switches::kProxyAutoDetect, NULL },
442201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    },
443201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    // Expected result
444201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    false,                                              // is_null
445201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    true,                                               // auto_detect
446201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    GURL(),                                             // pac_url
447201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    net::ProxyRulesExpectation::Empty(),
448201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  },
449201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
450201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
451201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochINSTANTIATE_TEST_CASE_P(
452201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    PrefProxyConfigServiceCommandLineTestInstance,
453201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    PrefProxyConfigServiceCommandLineTest,
454201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    testing::ValuesIn(kCommandLineTestParams));
455201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
456201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}  // namespace
457