Index: net/http/http_network_transaction_unittest.cc |
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc |
index 58e839b48bd8da01fe80a4aedab8b21777ba43d8..1079a24874de1c4a81bcbfc69f4d6c53a23f9c95 100644 |
--- a/net/http/http_network_transaction_unittest.cc |
+++ b/net/http/http_network_transaction_unittest.cc |
@@ -72,6 +72,7 @@ |
#include "net/proxy/proxy_config_service_fixed.h" |
#include "net/proxy/proxy_info.h" |
#include "net/proxy/proxy_resolver.h" |
+#include "net/proxy/proxy_resolver_factory.h" |
#include "net/proxy/proxy_server.h" |
#include "net/proxy/proxy_service.h" |
#include "net/socket/client_socket_factory.h" |
@@ -378,6 +379,20 @@ std::unique_ptr<HttpNetworkSession> CreateSessionWithThrottler( |
return session; |
} |
+class FailingProxyResolverFactory : public ProxyResolverFactory { |
+ public: |
+ FailingProxyResolverFactory() : ProxyResolverFactory(false) {} |
+ |
+ // ProxyResolverFactory override. |
+ int CreateProxyResolver( |
+ const scoped_refptr<ProxyResolverScriptData>& script_data, |
+ std::unique_ptr<ProxyResolver>* result, |
+ const CompletionCallback& callback, |
+ std::unique_ptr<Request>* request) override { |
+ return ERR_PAC_SCRIPT_FAILED; |
+ } |
+}; |
+ |
} // namespace |
class HttpNetworkTransactionTest : public PlatformTest { |
@@ -16871,4 +16886,73 @@ TEST_F(HttpNetworkTransactionTest, MatchContentEncoding4) { |
"www.foo.com/other", true); |
} |
+TEST_F(HttpNetworkTransactionTest, ProxyResolutionFailsSync) { |
+ ProxyConfig proxy_config; |
+ proxy_config.set_pac_url(GURL("http://fooproxyurl")); |
+ proxy_config.set_pac_mandatory(true); |
+ MockAsyncProxyResolver resolver; |
+ session_deps_.proxy_service.reset(new ProxyService( |
+ base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), |
+ base::WrapUnique(new FailingProxyResolverFactory), nullptr)); |
+ |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
+ |
+ TestCompletionCallback callback; |
+ |
+ int rv = trans.Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
+ EXPECT_THAT(callback.WaitForResult(), |
+ IsError(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED)); |
+} |
+ |
+TEST_F(HttpNetworkTransactionTest, ProxyResolutionFailsAsync) { |
+ ProxyConfig proxy_config; |
+ proxy_config.set_pac_url(GURL("http://fooproxyurl")); |
+ proxy_config.set_pac_mandatory(true); |
+ MockAsyncProxyResolverFactory* proxy_resolver_factory = |
+ new MockAsyncProxyResolverFactory(false); |
+ MockAsyncProxyResolver resolver; |
+ session_deps_.proxy_service.reset( |
+ new ProxyService(base::MakeUnique<ProxyConfigServiceFixed>(proxy_config), |
+ base::WrapUnique(proxy_resolver_factory), nullptr)); |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
+ |
+ TestCompletionCallback callback; |
+ int rv = trans.Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
+ |
+ proxy_resolver_factory->pending_requests()[0]->CompleteNowWithForwarder( |
+ ERR_FAILED, &resolver); |
+ EXPECT_THAT(callback.WaitForResult(), |
+ IsError(ERR_MANDATORY_PROXY_CONFIGURATION_FAILED)); |
+} |
+ |
+TEST_F(HttpNetworkTransactionTest, NoSupportedProxies) { |
+ session_deps_.proxy_service = |
+ ProxyService::CreateFixedFromPacResult("QUIC myproxy.org:443"); |
+ session_deps_.enable_quic = false; |
+ std::unique_ptr<HttpNetworkSession> session(CreateSession(&session_deps_)); |
+ |
+ HttpRequestInfo request; |
+ request.method = "GET"; |
+ request.url = GURL("http://www.example.org/"); |
+ |
+ TestCompletionCallback callback; |
+ HttpNetworkTransaction trans(DEFAULT_PRIORITY, session.get()); |
+ int rv = trans.Start(&request, callback.callback(), NetLogWithSource()); |
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
+ |
+ EXPECT_THAT(callback.WaitForResult(), IsError(ERR_NO_SUPPORTED_PROXIES)); |
+} |
+ |
} // namespace net |