Index: net/proxy/mojo_proxy_resolver_impl_unittest.cc |
diff --git a/net/proxy/mojo_proxy_resolver_impl_unittest.cc b/net/proxy/mojo_proxy_resolver_impl_unittest.cc |
index b045b27b3008507f88f72db220ed8d34bbcd045d..fb722c0a38e0a7ce3faaeb8a71f552955e83bee2 100644 |
--- a/net/proxy/mojo_proxy_resolver_impl_unittest.cc |
+++ b/net/proxy/mojo_proxy_resolver_impl_unittest.cc |
@@ -102,68 +102,87 @@ void TestRequestClient::OnConnectionError() { |
class MockProxyResolverV8Tracing : public ProxyResolverV8Tracing { |
public: |
- struct Request { |
+ struct Job { |
GURL url; |
ProxyInfo* results; |
- CompletionCallback callback; |
bool cancelled = false; |
+ void Complete(int result) { |
+ DCHECK(!callback_.is_null()); |
+ callback_.Run(result); |
+ callback_.Reset(); |
+ } |
+ |
+ bool WasCompleted() { return callback_.is_null(); } |
+ |
+ void SetCallback(CompletionCallback callback) { callback_ = callback; } |
+ |
+ private: |
+ CompletionCallback callback_; |
+ }; |
+ |
+ class RequestImpl : public ProxyResolver::Request { |
+ public: |
+ RequestImpl(Job* job, MockProxyResolverV8Tracing* resolver) |
+ : job_(job), resolver_(resolver) {} |
+ |
+ ~RequestImpl() override { |
+ if (job_->WasCompleted()) |
+ return; |
+ job_->cancelled = true; |
+ if (!resolver_->cancel_callback_.is_null()) { |
+ resolver_->cancel_callback_.Run(); |
+ resolver_->cancel_callback_.Reset(); |
+ } |
+ } |
+ |
+ LoadState GetLoadState() override { |
+ return LOAD_STATE_RESOLVING_PROXY_FOR_URL; |
+ } |
+ |
+ private: |
+ Job* job_; |
+ MockProxyResolverV8Tracing* resolver_; |
}; |
+ |
MockProxyResolverV8Tracing() {} |
// ProxyResolverV8Tracing overrides. |
void GetProxyForURL(const GURL& url, |
ProxyInfo* results, |
const CompletionCallback& callback, |
- ProxyResolver::RequestHandle* request, |
+ scoped_ptr<ProxyResolver::Request>* request, |
scoped_ptr<Bindings> bindings) override; |
- void CancelRequest(ProxyResolver::RequestHandle request_handle) override; |
- LoadState GetLoadState(ProxyResolver::RequestHandle request) const override; |
- // Wait until the mock resolver has received a CancelRequest call. |
+ // Wait until the request are cancelled. |
void WaitForCancel(); |
- const std::vector<Request>& pending_requests() { return pending_requests_; } |
+ const std::vector<scoped_ptr<Job>>& pending_jobs() { return pending_jobs_; } |
private: |
base::Closure cancel_callback_; |
- std::vector<Request> pending_requests_; |
+ std::vector<scoped_ptr<Job>> pending_jobs_; |
}; |
void MockProxyResolverV8Tracing::GetProxyForURL( |
const GURL& url, |
ProxyInfo* results, |
const CompletionCallback& callback, |
- ProxyResolver::RequestHandle* request, |
+ scoped_ptr<ProxyResolver::Request>* request, |
scoped_ptr<Bindings> bindings) { |
- pending_requests_.push_back(Request()); |
- auto& pending_request = pending_requests_.back(); |
- pending_request.url = url; |
- pending_request.results = results; |
- pending_request.callback = callback; |
- *request = |
- reinterpret_cast<ProxyResolver::RequestHandle>(pending_requests_.size()); |
+ pending_jobs_.push_back(make_scoped_ptr(new Job())); |
+ auto pending_job = pending_jobs_.back().get(); |
+ pending_job->url = url; |
+ pending_job->results = results; |
+ pending_job->SetCallback(callback); |
+ request->reset(new RequestImpl(pending_job, this)); |
} |
-void MockProxyResolverV8Tracing::CancelRequest( |
- ProxyResolver::RequestHandle request_handle) { |
- size_t id = reinterpret_cast<size_t>(request_handle) - 1; |
- pending_requests_[id].cancelled = true; |
- if (!cancel_callback_.is_null()) { |
- cancel_callback_.Run(); |
- cancel_callback_.Reset(); |
- } |
-} |
- |
-LoadState MockProxyResolverV8Tracing::GetLoadState( |
- ProxyResolver::RequestHandle request) const { |
- return LOAD_STATE_RESOLVING_PROXY_FOR_URL; |
-} |
void MockProxyResolverV8Tracing::WaitForCancel() { |
- while (std::find_if(pending_requests_.begin(), pending_requests_.end(), |
- [](const Request& request) { |
- return request.cancelled; |
- }) != pending_requests_.end()) { |
+ while (std::find_if(pending_jobs_.begin(), pending_jobs_.end(), |
+ [](const scoped_ptr<Job>& job) { |
+ return job->cancelled; |
+ }) != pending_jobs_.end()) { |
base::RunLoop run_loop; |
cancel_callback_ = run_loop.QuitClosure(); |
run_loop.Run(); |
@@ -193,19 +212,19 @@ TEST_F(MojoProxyResolverImplTest, GetProxyForUrl) { |
TestRequestClient client(mojo::GetProxy(&client_ptr)); |
resolver_->GetProxyForUrl("http://example.com", std::move(client_ptr)); |
- ASSERT_EQ(1u, mock_proxy_resolver_->pending_requests().size()); |
- const MockProxyResolverV8Tracing::Request& request = |
- mock_proxy_resolver_->pending_requests()[0]; |
- EXPECT_EQ(GURL("http://example.com"), request.url); |
+ ASSERT_EQ(1u, mock_proxy_resolver_->pending_jobs().size()); |
+ MockProxyResolverV8Tracing::Job* job = |
+ mock_proxy_resolver_->pending_jobs()[0].get(); |
+ EXPECT_EQ(GURL("http://example.com"), job->url); |
- request.results->UsePacString( |
+ job->results->UsePacString( |
"PROXY proxy.example.com:1; " |
"SOCKS4 socks4.example.com:2; " |
"SOCKS5 socks5.example.com:3; " |
"HTTPS https.example.com:4; " |
"QUIC quic.example.com:65000; " |
"DIRECT"); |
- request.callback.Run(OK); |
+ job->Complete(OK); |
client.WaitForResult(); |
EXPECT_EQ(OK, client.error()); |
@@ -240,11 +259,11 @@ TEST_F(MojoProxyResolverImplTest, GetProxyForUrlFailure) { |
TestRequestClient client(mojo::GetProxy(&client_ptr)); |
resolver_->GetProxyForUrl("http://example.com", std::move(client_ptr)); |
- ASSERT_EQ(1u, mock_proxy_resolver_->pending_requests().size()); |
- const MockProxyResolverV8Tracing::Request& request = |
- mock_proxy_resolver_->pending_requests()[0]; |
- EXPECT_EQ(GURL("http://example.com"), request.url); |
- request.callback.Run(ERR_FAILED); |
+ ASSERT_EQ(1u, mock_proxy_resolver_->pending_jobs().size()); |
+ MockProxyResolverV8Tracing::Job* job = |
+ mock_proxy_resolver_->pending_jobs()[0].get(); |
+ EXPECT_EQ(GURL("http://example.com"), job->url); |
+ job->Complete(ERR_FAILED); |
client.WaitForResult(); |
EXPECT_EQ(ERR_FAILED, client.error()); |
@@ -261,17 +280,17 @@ TEST_F(MojoProxyResolverImplTest, GetProxyForUrlMultiple) { |
resolver_->GetProxyForUrl("http://example.com", std::move(client_ptr1)); |
resolver_->GetProxyForUrl("https://example.com", std::move(client_ptr2)); |
- ASSERT_EQ(2u, mock_proxy_resolver_->pending_requests().size()); |
- const MockProxyResolverV8Tracing::Request& request1 = |
- mock_proxy_resolver_->pending_requests()[0]; |
- EXPECT_EQ(GURL("http://example.com"), request1.url); |
- const MockProxyResolverV8Tracing::Request& request2 = |
- mock_proxy_resolver_->pending_requests()[1]; |
- EXPECT_EQ(GURL("https://example.com"), request2.url); |
- request1.results->UsePacString("HTTPS proxy.example.com:12345"); |
- request1.callback.Run(OK); |
- request2.results->UsePacString("SOCKS5 another-proxy.example.com:6789"); |
- request2.callback.Run(OK); |
+ ASSERT_EQ(2u, mock_proxy_resolver_->pending_jobs().size()); |
+ MockProxyResolverV8Tracing::Job* job1 = |
+ mock_proxy_resolver_->pending_jobs()[0].get(); |
+ EXPECT_EQ(GURL("http://example.com"), job1->url); |
+ MockProxyResolverV8Tracing::Job* job2 = |
+ mock_proxy_resolver_->pending_jobs()[1].get(); |
+ EXPECT_EQ(GURL("https://example.com"), job2->url); |
+ job1->results->UsePacString("HTTPS proxy.example.com:12345"); |
+ job1->Complete(OK); |
+ job2->results->UsePacString("SOCKS5 another-proxy.example.com:6789"); |
+ job2->Complete(OK); |
client1.WaitForResult(); |
client2.WaitForResult(); |
@@ -300,11 +319,11 @@ TEST_F(MojoProxyResolverImplTest, DestroyClient) { |
new TestRequestClient(mojo::GetProxy(&client_ptr))); |
resolver_->GetProxyForUrl("http://example.com", std::move(client_ptr)); |
- ASSERT_EQ(1u, mock_proxy_resolver_->pending_requests().size()); |
- const MockProxyResolverV8Tracing::Request& request = |
- mock_proxy_resolver_->pending_requests()[0]; |
- EXPECT_EQ(GURL("http://example.com"), request.url); |
- request.results->UsePacString("PROXY proxy.example.com:8080"); |
+ ASSERT_EQ(1u, mock_proxy_resolver_->pending_jobs().size()); |
+ const MockProxyResolverV8Tracing::Job* job = |
+ mock_proxy_resolver_->pending_jobs()[0].get(); |
+ EXPECT_EQ(GURL("http://example.com"), job->url); |
+ job->results->UsePacString("PROXY proxy.example.com:8080"); |
client.reset(); |
mock_proxy_resolver_->WaitForCancel(); |
} |
@@ -314,7 +333,7 @@ TEST_F(MojoProxyResolverImplTest, DestroyService) { |
TestRequestClient client(mojo::GetProxy(&client_ptr)); |
resolver_->GetProxyForUrl("http://example.com", std::move(client_ptr)); |
- ASSERT_EQ(1u, mock_proxy_resolver_->pending_requests().size()); |
+ ASSERT_EQ(1u, mock_proxy_resolver_->pending_jobs().size()); |
resolver_impl_.reset(); |
client.event_waiter().WaitForEvent(TestRequestClient::CONNECTION_ERROR); |
} |