| 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 |