| Index: net/proxy/proxy_service_unittest.cc
|
| diff --git a/net/proxy/proxy_service_unittest.cc b/net/proxy/proxy_service_unittest.cc
|
| index c57b23834f90683b68f594eb962f5dd284b2adfd..49d726805aa2f292a158d635defe236c8b787db0 100644
|
| --- a/net/proxy/proxy_service_unittest.cc
|
| +++ b/net/proxy/proxy_service_unittest.cc
|
| @@ -3685,4 +3685,104 @@ TEST_F(ProxyServiceTest, SanitizeUrlForPacScriptCryptographic) {
|
| }
|
| }
|
|
|
| +TEST_F(ProxyServiceTest, RequestsHangAfterShutdown) {
|
| + MockAsyncProxyResolverFactory* factory =
|
| + new MockAsyncProxyResolverFactory(false);
|
| + ProxyService service(
|
| + base::MakeUnique<MockProxyConfigService>(ProxyConfig::CreateDirect()),
|
| + base::WrapUnique(factory), nullptr);
|
| +
|
| + GURL url("http://www.google.com/");
|
| +
|
| + service.ShutDown();
|
| +
|
| + ProxyInfo info;
|
| + TestCompletionCallback callback;
|
| + ProxyService::PacRequest* request;
|
| + int rv = service.ResolveProxy(url, std::string(), &info, callback.callback(),
|
| + &request, nullptr, NetLogWithSource());
|
| + EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
|
| + EXPECT_TRUE(factory->pending_requests().empty());
|
| + EXPECT_EQ(LOAD_STATE_RESOLVING_PROXY_FOR_URL, service.GetLoadState(request));
|
| + EXPECT_FALSE(callback.have_result());
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(callback.have_result());
|
| + service.CancelPacRequest(request);
|
| +
|
| + EXPECT_FALSE(service.TryResolveProxySynchronously(
|
| + url, std::string(), &info, nullptr, NetLogWithSource()));
|
| +}
|
| +
|
| +TEST_F(ProxyServiceTest, ProxyResolverShutdownDuringPacRequest) {
|
| + MockProxyConfigService* config_service =
|
| + new MockProxyConfigService("http://foopy/proxy.pac");
|
| +
|
| + MockAsyncProxyResolver resolver;
|
| + MockAsyncProxyResolverFactory* factory =
|
| + new MockAsyncProxyResolverFactory(false);
|
| +
|
| + ProxyService service(base::WrapUnique(config_service),
|
| + base::WrapUnique(factory), nullptr);
|
| +
|
| + // Start request.
|
| + GURL url("http://www.google.com/");
|
| + ProxyInfo info;
|
| + ProxyService::PacRequest* request;
|
| + TestCompletionCallback callback;
|
| + int rv = service.ResolveProxy(url, std::string(), &info, callback.callback(),
|
| + &request, nullptr, NetLogWithSource());
|
| + EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
|
| +
|
| + ASSERT_EQ(1u, factory->pending_requests().size());
|
| + EXPECT_EQ(GURL("http://foopy/proxy.pac"),
|
| + factory->pending_requests()[0]->script_data()->url());
|
| +
|
| + service.ShutDown();
|
| + EXPECT_EQ(0u, factory->pending_requests().size());
|
| + EXPECT_EQ(1u, factory->cancelled_requests().size());
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(callback.have_result());
|
| + service.CancelPacRequest(request);
|
| +}
|
| +
|
| +TEST_F(ProxyServiceTest, ProxyResolverShutdownAfterPacRequestDuringResolve) {
|
| + MockProxyConfigService* config_service =
|
| + new MockProxyConfigService("http://foopy/proxy.pac");
|
| +
|
| + MockAsyncProxyResolver resolver;
|
| + MockAsyncProxyResolverFactory* factory =
|
| + new MockAsyncProxyResolverFactory(false);
|
| +
|
| + ProxyService service(base::WrapUnique(config_service),
|
| + base::WrapUnique(factory), nullptr);
|
| +
|
| + // Start request.
|
| + GURL url("http://www.google.com/");
|
| + ProxyInfo info;
|
| + ProxyService::PacRequest* request;
|
| + TestCompletionCallback callback;
|
| + int rv = service.ResolveProxy(url, std::string(), &info, callback.callback(),
|
| + &request, nullptr, NetLogWithSource());
|
| + EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
|
| +
|
| + ASSERT_EQ(1u, factory->pending_requests().size());
|
| + EXPECT_EQ(GURL("http://foopy/proxy.pac"),
|
| + factory->pending_requests()[0]->script_data()->url());
|
| + factory->pending_requests()[0]->CompleteNowWithForwarder(OK, &resolver);
|
| + EXPECT_EQ(0u, factory->pending_requests().size());
|
| + // Checks that the one resolve job for |url| is outstanding.
|
| + GetPendingJobsForURLs(resolver, url);
|
| +
|
| + service.ShutDown();
|
| + EXPECT_EQ(0u, factory->cancelled_requests().size());
|
| + // Checks that no resolve jobs are outstanding.
|
| + GetPendingJobsForURLs(resolver);
|
| +
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(callback.have_result());
|
| + service.CancelPacRequest(request);
|
| +}
|
| +
|
| } // namespace net
|
|
|