OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "googleurl/src/gurl.h" | 5 #include "googleurl/src/gurl.h" |
6 #include "net/base/net_errors.h" | 6 #include "net/base/net_errors.h" |
7 #include "net/proxy/proxy_service.h" | 7 #include "net/proxy/proxy_service.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 | 9 |
10 namespace { | 10 namespace { |
11 | 11 |
12 // TODO(eroman): get rid of synchronous usages of ProxyService::ResolveProxy(). | |
13 | |
14 class MockProxyConfigService: public net::ProxyConfigService { | 12 class MockProxyConfigService: public net::ProxyConfigService { |
15 public: | 13 public: |
16 MockProxyConfigService() {} // Direct connect. | 14 MockProxyConfigService() {} // Direct connect. |
17 explicit MockProxyConfigService(const net::ProxyConfig& pc) : config(pc) {} | 15 explicit MockProxyConfigService(const net::ProxyConfig& pc) : config(pc) {} |
18 explicit MockProxyConfigService(const std::string& pac_url) { | 16 explicit MockProxyConfigService(const std::string& pac_url) { |
19 config.pac_url = GURL(pac_url); | 17 config.pac_url = GURL(pac_url); |
20 } | 18 } |
21 | 19 |
22 virtual int GetProxyConfig(net::ProxyConfig* results) { | 20 virtual int GetProxyConfig(net::ProxyConfig* results) { |
23 *results = config; | 21 *results = config; |
(...skipping 24 matching lines...) Expand all Loading... |
48 net::ProxyInfo info; | 46 net::ProxyInfo info; |
49 | 47 |
50 // info is only returned if query_url in GetProxyForURL matches this: | 48 // info is only returned if query_url in GetProxyForURL matches this: |
51 std::string info_predicate_query_host; | 49 std::string info_predicate_query_host; |
52 | 50 |
53 // If true, then GetProxyForURL will fail, which simulates failure to | 51 // If true, then GetProxyForURL will fail, which simulates failure to |
54 // download or execute the PAC file. | 52 // download or execute the PAC file. |
55 bool fail_get_proxy_for_url; | 53 bool fail_get_proxy_for_url; |
56 }; | 54 }; |
57 | 55 |
| 56 class SyncProxyService { |
| 57 public: |
| 58 SyncProxyService(net::ProxyConfigService* config_service, |
| 59 net::ProxyResolver* resolver) |
| 60 : io_thread_("IO_Thread"), |
| 61 service_(config_service, resolver) { |
| 62 base::Thread::Options options; |
| 63 options.message_loop_type = MessageLoop::TYPE_IO; |
| 64 io_thread_.StartWithOptions(options); |
| 65 sync_proxy_service_ = new net::SyncProxyServiceHelper( |
| 66 io_thread_.message_loop(), &service_); |
| 67 } |
| 68 |
| 69 int ResolveProxy(const GURL& url, net::ProxyInfo* proxy_info) { |
| 70 return sync_proxy_service_->ResolveProxy(url, proxy_info); |
| 71 } |
| 72 |
| 73 int ReconsiderProxyAfterError(const GURL& url, net::ProxyInfo* proxy_info) { |
| 74 return sync_proxy_service_->ReconsiderProxyAfterError(url, proxy_info); |
| 75 } |
| 76 |
| 77 private: |
| 78 base::Thread io_thread_; |
| 79 net::ProxyService service_; |
| 80 scoped_refptr<net::SyncProxyServiceHelper> sync_proxy_service_; |
| 81 }; |
| 82 |
58 } // namespace | 83 } // namespace |
59 | 84 |
60 // GetAnnotatedList() is used to generate a string for mozilla's GetProxyForUrl | 85 // GetAnnotatedList() is used to generate a string for mozilla's GetProxyForUrl |
61 // NPAPI extension. Check that it adheres to the expected format. | 86 // NPAPI extension. Check that it adheres to the expected format. |
62 TEST(ProxyListTest, GetAnnotatedList) { | 87 TEST(ProxyListTest, GetAnnotatedList) { |
63 net::ProxyList proxy_list; | 88 net::ProxyList proxy_list; |
64 | 89 |
65 std::vector<std::string> proxies; | 90 std::vector<std::string> proxies; |
66 proxies.push_back("www.first.com:80"); | 91 proxies.push_back("www.first.com:80"); |
67 proxies.push_back("www.second.com:80"); | 92 proxies.push_back("www.second.com:80"); |
68 proxy_list.SetVector(proxies); | 93 proxy_list.SetVector(proxies); |
69 | 94 |
70 EXPECT_EQ(std::string("PROXY www.first.com:80;PROXY www.second.com:80"), | 95 EXPECT_EQ(std::string("PROXY www.first.com:80;PROXY www.second.com:80"), |
71 proxy_list.GetAnnotatedList()); | 96 proxy_list.GetAnnotatedList()); |
72 } | 97 } |
73 | 98 |
74 TEST(ProxyServiceTest, Direct) { | 99 TEST(ProxyServiceTest, Direct) { |
75 net::ProxyService service(new MockProxyConfigService, | 100 SyncProxyService service(new MockProxyConfigService, |
76 new MockProxyResolver); | 101 new MockProxyResolver); |
77 | 102 |
78 GURL url("http://www.google.com/"); | 103 GURL url("http://www.google.com/"); |
79 | 104 |
80 net::ProxyInfo info; | 105 net::ProxyInfo info; |
81 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 106 int rv = service.ResolveProxy(url, &info); |
82 EXPECT_EQ(rv, net::OK); | 107 EXPECT_EQ(rv, net::OK); |
83 EXPECT_TRUE(info.is_direct()); | 108 EXPECT_TRUE(info.is_direct()); |
84 } | 109 } |
85 | 110 |
86 TEST(ProxyServiceTest, PAC) { | 111 TEST(ProxyServiceTest, PAC) { |
87 MockProxyConfigService* config_service = | 112 MockProxyConfigService* config_service = |
88 new MockProxyConfigService("http://foopy/proxy.pac"); | 113 new MockProxyConfigService("http://foopy/proxy.pac"); |
89 | 114 |
90 MockProxyResolver* resolver = new MockProxyResolver; | 115 MockProxyResolver* resolver = new MockProxyResolver; |
91 resolver->info.UseNamedProxy("foopy"); | 116 resolver->info.UseNamedProxy("foopy"); |
92 resolver->info_predicate_query_host = "www.google.com"; | 117 resolver->info_predicate_query_host = "www.google.com"; |
93 | 118 |
94 net::ProxyService service(config_service, resolver); | 119 SyncProxyService service(config_service, resolver); |
95 | 120 |
96 GURL url("http://www.google.com/"); | 121 GURL url("http://www.google.com/"); |
97 | 122 |
98 net::ProxyInfo info; | 123 net::ProxyInfo info; |
99 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 124 int rv = service.ResolveProxy(url, &info); |
100 EXPECT_EQ(rv, net::OK); | 125 EXPECT_EQ(rv, net::OK); |
101 EXPECT_FALSE(info.is_direct()); | 126 EXPECT_FALSE(info.is_direct()); |
102 EXPECT_EQ(info.proxy_server(), "foopy"); | 127 EXPECT_EQ(info.proxy_server(), "foopy"); |
103 } | 128 } |
104 | 129 |
105 TEST(ProxyServiceTest, PAC_FailoverToDirect) { | 130 TEST(ProxyServiceTest, PAC_FailoverToDirect) { |
106 MockProxyConfigService* config_service = | 131 MockProxyConfigService* config_service = |
107 new MockProxyConfigService("http://foopy/proxy.pac"); | 132 new MockProxyConfigService("http://foopy/proxy.pac"); |
108 | 133 |
109 MockProxyResolver* resolver = new MockProxyResolver; | 134 MockProxyResolver* resolver = new MockProxyResolver; |
110 resolver->info.UseNamedProxy("foopy:8080"); | 135 resolver->info.UseNamedProxy("foopy:8080"); |
111 resolver->info_predicate_query_host = "www.google.com"; | 136 resolver->info_predicate_query_host = "www.google.com"; |
112 | 137 |
113 net::ProxyService service(config_service, resolver); | 138 SyncProxyService service(config_service, resolver); |
114 | 139 |
115 GURL url("http://www.google.com/"); | 140 GURL url("http://www.google.com/"); |
116 | 141 |
117 net::ProxyInfo info; | 142 net::ProxyInfo info; |
118 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 143 int rv = service.ResolveProxy(url, &info); |
119 EXPECT_EQ(rv, net::OK); | 144 EXPECT_EQ(rv, net::OK); |
120 EXPECT_FALSE(info.is_direct()); | 145 EXPECT_FALSE(info.is_direct()); |
121 EXPECT_EQ(info.proxy_server(), "foopy:8080"); | 146 EXPECT_EQ(info.proxy_server(), "foopy:8080"); |
122 | 147 |
123 // Now, imagine that connecting to foopy:8080 fails. | 148 // Now, imagine that connecting to foopy:8080 fails. |
124 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 149 rv = service.ReconsiderProxyAfterError(url, &info); |
125 EXPECT_EQ(rv, net::OK); | 150 EXPECT_EQ(rv, net::OK); |
126 EXPECT_TRUE(info.is_direct()); | 151 EXPECT_TRUE(info.is_direct()); |
127 } | 152 } |
128 | 153 |
129 TEST(ProxyServiceTest, PAC_FailsToDownload) { | 154 TEST(ProxyServiceTest, PAC_FailsToDownload) { |
130 // Test what happens when we fail to download the PAC URL. | 155 // Test what happens when we fail to download the PAC URL. |
131 | 156 |
132 MockProxyConfigService* config_service = | 157 MockProxyConfigService* config_service = |
133 new MockProxyConfigService("http://foopy/proxy.pac"); | 158 new MockProxyConfigService("http://foopy/proxy.pac"); |
134 | 159 |
135 MockProxyResolver* resolver = new MockProxyResolver; | 160 MockProxyResolver* resolver = new MockProxyResolver; |
136 resolver->info.UseNamedProxy("foopy:8080"); | 161 resolver->info.UseNamedProxy("foopy:8080"); |
137 resolver->info_predicate_query_host = "www.google.com"; | 162 resolver->info_predicate_query_host = "www.google.com"; |
138 resolver->fail_get_proxy_for_url = true; | 163 resolver->fail_get_proxy_for_url = true; |
139 | 164 |
140 net::ProxyService service(config_service, resolver); | 165 SyncProxyService service(config_service, resolver); |
141 | 166 |
| 167 // The first resolve fails in the MockProxyResolver. |
142 GURL url("http://www.google.com/"); | 168 GURL url("http://www.google.com/"); |
143 net::ProxyInfo info; | 169 net::ProxyInfo info; |
144 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 170 int rv = service.ResolveProxy(url, &info); |
| 171 EXPECT_EQ(rv, net::ERR_FAILED); |
| 172 |
| 173 // The second resolve request will automatically select direct connect, |
| 174 // because it has cached the configuration as being bad. |
| 175 rv = service.ResolveProxy(url, &info); |
145 EXPECT_EQ(rv, net::OK); | 176 EXPECT_EQ(rv, net::OK); |
146 EXPECT_TRUE(info.is_direct()); | 177 EXPECT_TRUE(info.is_direct()); |
147 | 178 |
148 rv = service.ResolveProxy(url, &info, NULL, NULL); | |
149 EXPECT_EQ(rv, net::OK); | |
150 EXPECT_TRUE(info.is_direct()); | |
151 | |
152 resolver->fail_get_proxy_for_url = false; | 179 resolver->fail_get_proxy_for_url = false; |
153 resolver->info.UseNamedProxy("foopy_valid:8080"); | 180 resolver->info.UseNamedProxy("foopy_valid:8080"); |
154 | 181 |
155 // But, if that fails, then we should give the proxy config another shot | 182 // But, if that fails, then we should give the proxy config another shot |
156 // since we have never tried it with this URL before. | 183 // since we have never tried it with this URL before. |
157 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 184 rv = service.ReconsiderProxyAfterError(url, &info); |
158 EXPECT_EQ(rv, net::OK); | 185 EXPECT_EQ(rv, net::OK); |
159 EXPECT_FALSE(info.is_direct()); | 186 EXPECT_FALSE(info.is_direct()); |
160 EXPECT_EQ(info.proxy_server(), "foopy_valid:8080"); | 187 EXPECT_EQ(info.proxy_server(), "foopy_valid:8080"); |
161 } | 188 } |
162 | 189 |
163 TEST(ProxyServiceTest, ProxyFallback) { | 190 TEST(ProxyServiceTest, ProxyFallback) { |
164 // Test what happens when we specify multiple proxy servers and some of them | 191 // Test what happens when we specify multiple proxy servers and some of them |
165 // are bad. | 192 // are bad. |
166 | 193 |
167 MockProxyConfigService* config_service = | 194 MockProxyConfigService* config_service = |
168 new MockProxyConfigService("http://foopy/proxy.pac"); | 195 new MockProxyConfigService("http://foopy/proxy.pac"); |
169 | 196 |
170 MockProxyResolver* resolver = new MockProxyResolver; | 197 MockProxyResolver* resolver = new MockProxyResolver; |
171 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); | 198 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); |
172 resolver->info_predicate_query_host = "www.google.com"; | 199 resolver->info_predicate_query_host = "www.google.com"; |
173 resolver->fail_get_proxy_for_url = false; | 200 resolver->fail_get_proxy_for_url = false; |
174 | 201 |
175 net::ProxyService service(config_service, resolver); | 202 SyncProxyService service(config_service, resolver); |
176 | 203 |
177 GURL url("http://www.google.com/"); | 204 GURL url("http://www.google.com/"); |
178 | 205 |
179 // Get the proxy information. | 206 // Get the proxy information. |
180 net::ProxyInfo info; | 207 net::ProxyInfo info; |
181 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 208 int rv = service.ResolveProxy(url, &info); |
182 EXPECT_EQ(rv, net::OK); | 209 EXPECT_EQ(rv, net::OK); |
183 EXPECT_FALSE(info.is_direct()); | 210 EXPECT_FALSE(info.is_direct()); |
184 | 211 |
185 // The first item is valid. | 212 // The first item is valid. |
186 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); | 213 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); |
187 | 214 |
188 // Fake an error on the proxy. | 215 // Fake an error on the proxy. |
189 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 216 rv = service.ReconsiderProxyAfterError(url, &info); |
190 EXPECT_EQ(rv, net::OK); | 217 EXPECT_EQ(rv, net::OK); |
191 | 218 |
192 // The second proxy should be specified. | 219 // The second proxy should be specified. |
193 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); | 220 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); |
194 | 221 |
195 // Create a new resolver that returns 3 proxies. The second one is already | 222 // Create a new resolver that returns 3 proxies. The second one is already |
196 // known to be bad. | 223 // known to be bad. |
197 config_service->config.pac_url = GURL("http://foopy/proxy.pac"); | 224 config_service->config.pac_url = GURL("http://foopy/proxy.pac"); |
198 resolver->info.UseNamedProxy("foopy3:7070;foopy1:8080;foopy2:9090"); | 225 resolver->info.UseNamedProxy("foopy3:7070;foopy1:8080;foopy2:9090"); |
199 resolver->info_predicate_query_host = "www.google.com"; | 226 resolver->info_predicate_query_host = "www.google.com"; |
200 resolver->fail_get_proxy_for_url = false; | 227 resolver->fail_get_proxy_for_url = false; |
201 | 228 |
202 rv = service.ResolveProxy(url, &info, NULL, NULL); | 229 rv = service.ResolveProxy(url, &info); |
203 EXPECT_EQ(rv, net::OK); | 230 EXPECT_EQ(rv, net::OK); |
204 EXPECT_FALSE(info.is_direct()); | 231 EXPECT_FALSE(info.is_direct()); |
205 EXPECT_EQ(info.proxy_server(), "foopy3:7070"); | 232 EXPECT_EQ(info.proxy_server(), "foopy3:7070"); |
206 | 233 |
207 // We fake another error. It should now try the third one. | 234 // We fake another error. It should now try the third one. |
208 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 235 rv = service.ReconsiderProxyAfterError(url, &info); |
209 EXPECT_EQ(rv, net::OK); | 236 EXPECT_EQ(rv, net::OK); |
210 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); | 237 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); |
211 | 238 |
212 // Fake another error, the last proxy is gone, the list should now be empty. | 239 // Fake another error, the last proxy is gone, the list should now be empty. |
213 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 240 rv = service.ReconsiderProxyAfterError(url, &info); |
214 EXPECT_EQ(rv, net::OK); // We try direct. | 241 EXPECT_EQ(rv, net::OK); // We try direct. |
215 EXPECT_TRUE(info.is_direct()); | 242 EXPECT_TRUE(info.is_direct()); |
216 | 243 |
217 // If it fails again, we don't have anything else to try. | 244 // If it fails again, we don't have anything else to try. |
218 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 245 rv = service.ReconsiderProxyAfterError(url, &info); |
219 EXPECT_EQ(rv, net::ERR_FAILED); // We try direct. | 246 EXPECT_EQ(rv, net::ERR_FAILED); // We try direct. |
220 | 247 |
221 // TODO(nsylvain): Test that the proxy can be retried after the delay. | 248 // TODO(nsylvain): Test that the proxy can be retried after the delay. |
222 } | 249 } |
223 | 250 |
224 TEST(ProxyServiceTest, ProxyFallback_NewSettings) { | 251 TEST(ProxyServiceTest, ProxyFallback_NewSettings) { |
225 // Test proxy failover when new settings are available. | 252 // Test proxy failover when new settings are available. |
226 | 253 |
227 MockProxyConfigService* config_service = | 254 MockProxyConfigService* config_service = |
228 new MockProxyConfigService("http://foopy/proxy.pac"); | 255 new MockProxyConfigService("http://foopy/proxy.pac"); |
229 | 256 |
230 MockProxyResolver* resolver = new MockProxyResolver; | 257 MockProxyResolver* resolver = new MockProxyResolver; |
231 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); | 258 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); |
232 resolver->info_predicate_query_host = "www.google.com"; | 259 resolver->info_predicate_query_host = "www.google.com"; |
233 resolver->fail_get_proxy_for_url = false; | 260 resolver->fail_get_proxy_for_url = false; |
234 | 261 |
235 net::ProxyService service(config_service, resolver); | 262 SyncProxyService service(config_service, resolver); |
236 | 263 |
237 GURL url("http://www.google.com/"); | 264 GURL url("http://www.google.com/"); |
238 | 265 |
239 // Get the proxy information. | 266 // Get the proxy information. |
240 net::ProxyInfo info; | 267 net::ProxyInfo info; |
241 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 268 int rv = service.ResolveProxy(url, &info); |
242 EXPECT_EQ(rv, net::OK); | 269 EXPECT_EQ(rv, net::OK); |
243 EXPECT_FALSE(info.is_direct()); | 270 EXPECT_FALSE(info.is_direct()); |
244 | 271 |
245 // The first item is valid. | 272 // The first item is valid. |
246 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); | 273 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); |
247 | 274 |
248 // Fake an error on the proxy, and also a new configuration on the proxy. | 275 // Fake an error on the proxy, and also a new configuration on the proxy. |
249 config_service->config = net::ProxyConfig(); | 276 config_service->config = net::ProxyConfig(); |
250 config_service->config.pac_url = GURL("http://foopy-new/proxy.pac"); | 277 config_service->config.pac_url = GURL("http://foopy-new/proxy.pac"); |
251 | 278 |
252 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 279 rv = service.ReconsiderProxyAfterError(url, &info); |
253 EXPECT_EQ(rv, net::OK); | 280 EXPECT_EQ(rv, net::OK); |
254 | 281 |
255 // The first proxy is still there since the configuration changed. | 282 // The first proxy is still there since the configuration changed. |
256 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); | 283 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); |
257 | 284 |
258 // We fake another error. It should now ignore the first one. | 285 // We fake another error. It should now ignore the first one. |
259 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 286 rv = service.ReconsiderProxyAfterError(url, &info); |
260 EXPECT_EQ(rv, net::OK); | 287 EXPECT_EQ(rv, net::OK); |
261 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); | 288 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); |
262 | 289 |
263 // We simulate a new configuration. | 290 // We simulate a new configuration. |
264 config_service->config = net::ProxyConfig(); | 291 config_service->config = net::ProxyConfig(); |
265 config_service->config.pac_url = GURL("http://foopy-new2/proxy.pac"); | 292 config_service->config.pac_url = GURL("http://foopy-new2/proxy.pac"); |
266 | 293 |
267 // We fake anothe error. It should go back to the first proxy. | 294 // We fake anothe error. It should go back to the first proxy. |
268 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 295 rv = service.ReconsiderProxyAfterError(url, &info); |
269 EXPECT_EQ(rv, net::OK); | 296 EXPECT_EQ(rv, net::OK); |
270 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); | 297 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); |
271 } | 298 } |
272 | 299 |
273 TEST(ProxyServiceTest, ProxyFallback_BadConfig) { | 300 TEST(ProxyServiceTest, ProxyFallback_BadConfig) { |
274 // Test proxy failover when the configuration is bad. | 301 // Test proxy failover when the configuration is bad. |
275 | 302 |
276 MockProxyConfigService* config_service = | 303 MockProxyConfigService* config_service = |
277 new MockProxyConfigService("http://foopy/proxy.pac"); | 304 new MockProxyConfigService("http://foopy/proxy.pac"); |
278 | 305 |
279 MockProxyResolver* resolver = new MockProxyResolver; | 306 MockProxyResolver* resolver = new MockProxyResolver; |
280 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); | 307 resolver->info.UseNamedProxy("foopy1:8080;foopy2:9090"); |
281 resolver->info_predicate_query_host = "www.google.com"; | 308 resolver->info_predicate_query_host = "www.google.com"; |
282 resolver->fail_get_proxy_for_url = false; | 309 resolver->fail_get_proxy_for_url = false; |
283 | 310 |
284 net::ProxyService service(config_service, resolver); | 311 SyncProxyService service(config_service, resolver); |
285 | 312 |
286 GURL url("http://www.google.com/"); | 313 GURL url("http://www.google.com/"); |
287 | 314 |
288 // Get the proxy information. | 315 // Get the proxy information. |
289 net::ProxyInfo info; | 316 net::ProxyInfo info; |
290 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 317 int rv = service.ResolveProxy(url, &info); |
291 EXPECT_EQ(rv, net::OK); | 318 EXPECT_EQ(rv, net::OK); |
292 EXPECT_FALSE(info.is_direct()); | 319 EXPECT_FALSE(info.is_direct()); |
293 | 320 |
294 // The first item is valid. | 321 // The first item is valid. |
295 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); | 322 EXPECT_EQ(info.proxy_server(), "foopy1:8080"); |
296 | 323 |
297 // Fake a proxy error. | 324 // Fake a proxy error. |
298 rv = service.ReconsiderProxyAfterError(url, &info, NULL, NULL); | 325 rv = service.ReconsiderProxyAfterError(url, &info); |
299 EXPECT_EQ(rv, net::OK); | 326 EXPECT_EQ(rv, net::OK); |
300 | 327 |
301 // The first proxy is ignored, and the second one is selected. | 328 // The first proxy is ignored, and the second one is selected. |
302 EXPECT_FALSE(info.is_direct()); | 329 EXPECT_FALSE(info.is_direct()); |
303 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); | 330 EXPECT_EQ(info.proxy_server(), "foopy2:9090"); |
304 | 331 |
305 // Fake a PAC failure. | 332 // Fake a PAC failure. |
306 net::ProxyInfo info2; | 333 net::ProxyInfo info2; |
307 resolver->fail_get_proxy_for_url = true; | 334 resolver->fail_get_proxy_for_url = true; |
308 rv = service.ResolveProxy(url, &info2, NULL, NULL); | 335 rv = service.ResolveProxy(url, &info2); |
309 EXPECT_EQ(rv, net::OK); | 336 EXPECT_EQ(rv, net::ERR_FAILED); |
310 | 337 |
311 // No proxy servers are returned. It's a direct connection. | 338 // No proxy servers are returned. It's a direct connection. |
312 EXPECT_TRUE(info2.is_direct()); | 339 EXPECT_TRUE(info2.is_direct()); |
313 | 340 |
314 // The PAC is now fixed and will return a proxy server. | 341 // The PAC is now fixed and will return a proxy server. |
315 // It should also clear the list of bad proxies. | 342 // It should also clear the list of bad proxies. |
316 resolver->fail_get_proxy_for_url = false; | 343 resolver->fail_get_proxy_for_url = false; |
317 | 344 |
318 // Try to resolve, it will still return "direct" because we have no reason | 345 // Try to resolve, it will still return "direct" because we have no reason |
319 // to check the config since everything works. | 346 // to check the config since everything works. |
320 net::ProxyInfo info3; | 347 net::ProxyInfo info3; |
321 rv = service.ResolveProxy(url, &info3, NULL, NULL); | 348 rv = service.ResolveProxy(url, &info3); |
322 EXPECT_EQ(rv, net::OK); | 349 EXPECT_EQ(rv, net::OK); |
323 EXPECT_TRUE(info3.is_direct()); | 350 EXPECT_TRUE(info3.is_direct()); |
324 | 351 |
325 // But if the direct connection fails, we check if the ProxyInfo tried to | 352 // But if the direct connection fails, we check if the ProxyInfo tried to |
326 // resolve the proxy before, and if not (like in this case), we give the | 353 // resolve the proxy before, and if not (like in this case), we give the |
327 // PAC another try. | 354 // PAC another try. |
328 rv = service.ReconsiderProxyAfterError(url, &info3, NULL, NULL); | 355 rv = service.ReconsiderProxyAfterError(url, &info3); |
329 EXPECT_EQ(rv, net::OK); | 356 EXPECT_EQ(rv, net::OK); |
330 | 357 |
331 // The first proxy is still there since the list of bad proxies got cleared. | 358 // The first proxy is still there since the list of bad proxies got cleared. |
332 EXPECT_FALSE(info3.is_direct()); | 359 EXPECT_FALSE(info3.is_direct()); |
333 EXPECT_EQ(info3.proxy_server(), "foopy1:8080"); | 360 EXPECT_EQ(info3.proxy_server(), "foopy1:8080"); |
334 } | 361 } |
335 | 362 |
336 TEST(ProxyServiceTest, ProxyBypassList) { | 363 TEST(ProxyServiceTest, ProxyBypassList) { |
337 // Test what happens when a proxy bypass list is specified. | 364 // Test what happens when a proxy bypass list is specified. |
338 | 365 |
339 net::ProxyConfig config; | 366 net::ProxyConfig config; |
340 config.proxy_server = "foopy1:8080;foopy2:9090"; | 367 config.proxy_server = "foopy1:8080;foopy2:9090"; |
341 config.auto_detect = false; | 368 config.auto_detect = false; |
342 config.proxy_bypass_local_names = true; | 369 config.proxy_bypass_local_names = true; |
343 | 370 |
344 net::ProxyService service(new MockProxyConfigService(config), | 371 SyncProxyService service(new MockProxyConfigService(config), |
345 new MockProxyResolver()); | 372 new MockProxyResolver()); |
346 GURL url("http://www.google.com/"); | 373 GURL url("http://www.google.com/"); |
347 // Get the proxy information. | 374 // Get the proxy information. |
348 net::ProxyInfo info; | 375 net::ProxyInfo info; |
349 int rv = service.ResolveProxy(url, &info, NULL, NULL); | 376 int rv = service.ResolveProxy(url, &info); |
350 EXPECT_EQ(rv, net::OK); | 377 EXPECT_EQ(rv, net::OK); |
351 EXPECT_FALSE(info.is_direct()); | 378 EXPECT_FALSE(info.is_direct()); |
352 | 379 |
353 net::ProxyService service1(new MockProxyConfigService(config), | 380 SyncProxyService service1(new MockProxyConfigService(config), |
354 new MockProxyResolver()); | 381 new MockProxyResolver()); |
355 GURL test_url1("local"); | 382 GURL test_url1("local"); |
356 net::ProxyInfo info1; | 383 net::ProxyInfo info1; |
357 rv = service1.ResolveProxy(test_url1, &info1, NULL, NULL); | 384 rv = service1.ResolveProxy(test_url1, &info1); |
358 EXPECT_EQ(rv, net::OK); | 385 EXPECT_EQ(rv, net::OK); |
359 EXPECT_TRUE(info1.is_direct()); | 386 EXPECT_TRUE(info1.is_direct()); |
360 | 387 |
361 config.proxy_bypass.clear(); | 388 config.proxy_bypass.clear(); |
362 config.proxy_bypass.push_back("*.org"); | 389 config.proxy_bypass.push_back("*.org"); |
363 config.proxy_bypass_local_names = true; | 390 config.proxy_bypass_local_names = true; |
364 net::ProxyService service2(new MockProxyConfigService(config), | 391 SyncProxyService service2(new MockProxyConfigService(config), |
365 new MockProxyResolver); | 392 new MockProxyResolver); |
366 GURL test_url2("http://www.webkit.org"); | 393 GURL test_url2("http://www.webkit.org"); |
367 net::ProxyInfo info2; | 394 net::ProxyInfo info2; |
368 rv = service2.ResolveProxy(test_url2, &info2, NULL, NULL); | 395 rv = service2.ResolveProxy(test_url2, &info2); |
369 EXPECT_EQ(rv, net::OK); | 396 EXPECT_EQ(rv, net::OK); |
370 EXPECT_TRUE(info2.is_direct()); | 397 EXPECT_TRUE(info2.is_direct()); |
371 | 398 |
372 config.proxy_bypass.clear(); | 399 config.proxy_bypass.clear(); |
373 config.proxy_bypass.push_back("*.org"); | 400 config.proxy_bypass.push_back("*.org"); |
374 config.proxy_bypass.push_back("7*"); | 401 config.proxy_bypass.push_back("7*"); |
375 config.proxy_bypass_local_names = true; | 402 config.proxy_bypass_local_names = true; |
376 net::ProxyService service3(new MockProxyConfigService(config), | 403 SyncProxyService service3(new MockProxyConfigService(config), |
377 new MockProxyResolver); | 404 new MockProxyResolver); |
378 GURL test_url3("http://74.125.19.147"); | 405 GURL test_url3("http://74.125.19.147"); |
379 net::ProxyInfo info3; | 406 net::ProxyInfo info3; |
380 rv = service3.ResolveProxy(test_url3, &info3, NULL, NULL); | 407 rv = service3.ResolveProxy(test_url3, &info3); |
381 EXPECT_EQ(rv, net::OK); | 408 EXPECT_EQ(rv, net::OK); |
382 EXPECT_TRUE(info3.is_direct()); | 409 EXPECT_TRUE(info3.is_direct()); |
383 | 410 |
384 config.proxy_bypass.clear(); | 411 config.proxy_bypass.clear(); |
385 config.proxy_bypass.push_back("*.org"); | 412 config.proxy_bypass.push_back("*.org"); |
386 config.proxy_bypass_local_names = true; | 413 config.proxy_bypass_local_names = true; |
387 net::ProxyService service4(new MockProxyConfigService(config), | 414 SyncProxyService service4(new MockProxyConfigService(config), |
388 new MockProxyResolver); | 415 new MockProxyResolver); |
389 GURL test_url4("http://www.msn.com"); | 416 GURL test_url4("http://www.msn.com"); |
390 net::ProxyInfo info4; | 417 net::ProxyInfo info4; |
391 rv = service4.ResolveProxy(test_url4, &info4, NULL, NULL); | 418 rv = service4.ResolveProxy(test_url4, &info4); |
392 EXPECT_EQ(rv, net::OK); | 419 EXPECT_EQ(rv, net::OK); |
393 EXPECT_FALSE(info4.is_direct()); | 420 EXPECT_FALSE(info4.is_direct()); |
394 | 421 |
395 config.proxy_bypass.clear(); | 422 config.proxy_bypass.clear(); |
396 config.proxy_bypass.push_back("*.MSN.COM"); | 423 config.proxy_bypass.push_back("*.MSN.COM"); |
397 config.proxy_bypass_local_names = true; | 424 config.proxy_bypass_local_names = true; |
398 net::ProxyService service5(new MockProxyConfigService(config), | 425 SyncProxyService service5(new MockProxyConfigService(config), |
399 new MockProxyResolver); | 426 new MockProxyResolver); |
400 GURL test_url5("http://www.msnbc.msn.com"); | 427 GURL test_url5("http://www.msnbc.msn.com"); |
401 net::ProxyInfo info5; | 428 net::ProxyInfo info5; |
402 rv = service5.ResolveProxy(test_url5, &info5, NULL, NULL); | 429 rv = service5.ResolveProxy(test_url5, &info5); |
403 EXPECT_EQ(rv, net::OK); | 430 EXPECT_EQ(rv, net::OK); |
404 EXPECT_TRUE(info5.is_direct()); | 431 EXPECT_TRUE(info5.is_direct()); |
405 | 432 |
406 config.proxy_bypass.clear(); | 433 config.proxy_bypass.clear(); |
407 config.proxy_bypass.push_back("*.msn.com"); | 434 config.proxy_bypass.push_back("*.msn.com"); |
408 config.proxy_bypass_local_names = true; | 435 config.proxy_bypass_local_names = true; |
409 net::ProxyService service6(new MockProxyConfigService(config), | 436 SyncProxyService service6(new MockProxyConfigService(config), |
410 new MockProxyResolver); | 437 new MockProxyResolver); |
411 GURL test_url6("HTTP://WWW.MSNBC.MSN.COM"); | 438 GURL test_url6("HTTP://WWW.MSNBC.MSN.COM"); |
412 net::ProxyInfo info6; | 439 net::ProxyInfo info6; |
413 rv = service6.ResolveProxy(test_url6, &info6, NULL, NULL); | 440 rv = service6.ResolveProxy(test_url6, &info6); |
414 EXPECT_EQ(rv, net::OK); | 441 EXPECT_EQ(rv, net::OK); |
415 EXPECT_TRUE(info6.is_direct()); | 442 EXPECT_TRUE(info6.is_direct()); |
416 } | 443 } |
417 | 444 |
418 TEST(ProxyServiceTest, PerProtocolProxyTests) { | 445 TEST(ProxyServiceTest, PerProtocolProxyTests) { |
419 net::ProxyConfig config; | 446 net::ProxyConfig config; |
420 config.proxy_server = "http=foopy1:8080;https=foopy2:8080"; | 447 config.proxy_server = "http=foopy1:8080;https=foopy2:8080"; |
421 config.auto_detect = false; | 448 config.auto_detect = false; |
422 | 449 |
423 net::ProxyService service1(new MockProxyConfigService(config), | 450 SyncProxyService service1(new MockProxyConfigService(config), |
424 new MockProxyResolver); | 451 new MockProxyResolver); |
425 GURL test_url1("http://www.msn.com"); | 452 GURL test_url1("http://www.msn.com"); |
426 net::ProxyInfo info1; | 453 net::ProxyInfo info1; |
427 int rv = service1.ResolveProxy(test_url1, &info1, NULL, NULL); | 454 int rv = service1.ResolveProxy(test_url1, &info1); |
428 EXPECT_EQ(rv, net::OK); | 455 EXPECT_EQ(rv, net::OK); |
429 EXPECT_FALSE(info1.is_direct()); | 456 EXPECT_FALSE(info1.is_direct()); |
430 EXPECT_TRUE(info1.proxy_server() == "foopy1:8080"); | 457 EXPECT_TRUE(info1.proxy_server() == "foopy1:8080"); |
431 | 458 |
432 net::ProxyService service2(new MockProxyConfigService(config), | 459 SyncProxyService service2(new MockProxyConfigService(config), |
433 new MockProxyResolver); | 460 new MockProxyResolver); |
434 GURL test_url2("ftp://ftp.google.com"); | 461 GURL test_url2("ftp://ftp.google.com"); |
435 net::ProxyInfo info2; | 462 net::ProxyInfo info2; |
436 rv = service2.ResolveProxy(test_url2, &info2, NULL, NULL); | 463 rv = service2.ResolveProxy(test_url2, &info2); |
437 EXPECT_EQ(rv, net::OK); | 464 EXPECT_EQ(rv, net::OK); |
438 EXPECT_TRUE(info2.is_direct()); | 465 EXPECT_TRUE(info2.is_direct()); |
439 EXPECT_TRUE(info2.proxy_server() == ""); | 466 EXPECT_TRUE(info2.proxy_server() == ""); |
440 | 467 |
441 net::ProxyService service3(new MockProxyConfigService(config), | 468 SyncProxyService service3(new MockProxyConfigService(config), |
442 new MockProxyResolver); | 469 new MockProxyResolver); |
443 GURL test_url3("https://webbranch.techcu.com"); | 470 GURL test_url3("https://webbranch.techcu.com"); |
444 net::ProxyInfo info3; | 471 net::ProxyInfo info3; |
445 rv = service3.ResolveProxy(test_url3, &info3, NULL, NULL); | 472 rv = service3.ResolveProxy(test_url3, &info3); |
446 EXPECT_EQ(rv, net::OK); | 473 EXPECT_EQ(rv, net::OK); |
447 EXPECT_FALSE(info3.is_direct()); | 474 EXPECT_FALSE(info3.is_direct()); |
448 EXPECT_TRUE(info3.proxy_server() == "foopy2:8080"); | 475 EXPECT_TRUE(info3.proxy_server() == "foopy2:8080"); |
449 | 476 |
450 config.proxy_server = "foopy1:8080"; | 477 config.proxy_server = "foopy1:8080"; |
451 net::ProxyService service4(new MockProxyConfigService(config), | 478 SyncProxyService service4(new MockProxyConfigService(config), |
452 new MockProxyResolver); | 479 new MockProxyResolver); |
453 GURL test_url4("www.microsoft.com"); | 480 GURL test_url4("www.microsoft.com"); |
454 net::ProxyInfo info4; | 481 net::ProxyInfo info4; |
455 rv = service4.ResolveProxy(test_url4, &info4, NULL, NULL); | 482 rv = service4.ResolveProxy(test_url4, &info4); |
456 EXPECT_EQ(rv, net::OK); | 483 EXPECT_EQ(rv, net::OK); |
457 EXPECT_FALSE(info4.is_direct()); | 484 EXPECT_FALSE(info4.is_direct()); |
458 EXPECT_TRUE(info4.proxy_server() == "foopy1:8080"); | 485 EXPECT_TRUE(info4.proxy_server() == "foopy1:8080"); |
459 } | 486 } |
460 | 487 |
OLD | NEW |