Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(322)

Side by Side Diff: net/cert_net/cert_net_fetcher_impl_unittest.cc

Issue 2595723002: Allow CertNetFetcher to be shutdown from the network thread (Closed)
Patch Set: tweak comments Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "net/cert_net/cert_net_fetcher_impl.h" 5 #include "net/cert_net/cert_net_fetcher_impl.h"
6 6
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/compiler_specific.h" 10 #include "base/compiler_specific.h"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/run_loop.h" 12 #include "base/run_loop.h"
13 #include "base/synchronization/lock.h" 13 #include "base/synchronization/lock.h"
14 #include "net/cert/cert_net_fetcher.h" 14 #include "net/cert/cert_net_fetcher.h"
15 #include "net/cert/ct_policy_enforcer.h" 15 #include "net/cert/ct_policy_enforcer.h"
16 #include "net/cert/mock_cert_verifier.h" 16 #include "net/cert/mock_cert_verifier.h"
17 #include "net/cert/multi_log_ct_verifier.h" 17 #include "net/cert/multi_log_ct_verifier.h"
18 #include "net/dns/mock_host_resolver.h" 18 #include "net/dns/mock_host_resolver.h"
19 #include "net/http/http_server_properties_impl.h" 19 #include "net/http/http_server_properties_impl.h"
20 #include "net/test/embedded_test_server/embedded_test_server.h" 20 #include "net/test/embedded_test_server/embedded_test_server.h"
21 #include "net/test/gtest_util.h" 21 #include "net/test/gtest_util.h"
22 #include "net/test/url_request/url_request_hanging_read_job.h"
22 #include "net/url_request/url_request_job_factory_impl.h" 23 #include "net/url_request/url_request_job_factory_impl.h"
23 #include "net/url_request/url_request_test_util.h" 24 #include "net/url_request/url_request_test_util.h"
24 #include "testing/gmock/include/gmock/gmock.h" 25 #include "testing/gmock/include/gmock/gmock.h"
25 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
26 #include "testing/platform_test.h" 27 #include "testing/platform_test.h"
27 28
28 using net::test::IsOk; 29 using net::test::IsOk;
29 30
30 // TODO(eroman): Test that cookies aren't sent. 31 // TODO(eroman): Test that cookies aren't sent.
31 32
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 }; 107 };
107 108
108 class CertNetFetcherImplTest : public PlatformTest { 109 class CertNetFetcherImplTest : public PlatformTest {
109 public: 110 public:
110 CertNetFetcherImplTest() { 111 CertNetFetcherImplTest() {
111 test_server_.AddDefaultHandlers(base::FilePath(kDocRoot)); 112 test_server_.AddDefaultHandlers(base::FilePath(kDocRoot));
112 StartNetworkThread(); 113 StartNetworkThread();
113 } 114 }
114 115
115 ~CertNetFetcherImplTest() override { 116 ~CertNetFetcherImplTest() override {
117 if (!network_thread_)
118 return;
116 network_thread_->task_runner()->PostTask( 119 network_thread_->task_runner()->PostTask(
117 FROM_HERE, base::Bind(&CertNetFetcherImplTest::TeardownOnNetworkThread, 120 FROM_HERE, base::Bind(&CertNetFetcherImplTest::TeardownOnNetworkThread,
118 base::Unretained(this))); 121 base::Unretained(this)));
119 network_thread_->Stop(); 122 network_thread_->Stop();
120 } 123 }
121 124
122 protected: 125 protected:
123 std::unique_ptr<CertNetFetcher> CreateFetcher() { 126 CertNetFetcher* fetcher() const { return fetcher_.get(); }
124 scoped_refptr<TrivialURLRequestContextGetter> context_getter( 127
125 new TrivialURLRequestContextGetter(&state_->context, 128 void CreateFetcherOnNetworkThread(base::WaitableEvent* done) {
126 network_thread_->task_runner())); 129 fetcher_ =
127 return CreateCertNetFetcher(context_getter.get()); 130 CreateCertNetFetcher(network_thread_->task_runner(), &state_->context);
131 done->Signal();
132 }
133
134 void CreateFetcher() {
135 base::WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL,
136 base::WaitableEvent::InitialState::NOT_SIGNALED);
137 network_thread_->task_runner()->PostTask(
138 FROM_HERE,
139 base::Bind(&CertNetFetcherImplTest::CreateFetcherOnNetworkThread,
140 base::Unretained(this), &done));
141 done.Wait();
142 }
143
144 void ShutDownFetcherOnNetworkThread(base::WaitableEvent* done) {
145 fetcher_->Shutdown();
146 done->Signal();
147 }
148
149 void ShutDownFetcher() {
150 base::WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL,
151 base::WaitableEvent::InitialState::NOT_SIGNALED);
152 network_thread_->task_runner()->PostTask(
153 FROM_HERE,
154 base::Bind(&CertNetFetcherImplTest::ShutDownFetcherOnNetworkThread,
155 base::Unretained(this), &done));
156 done.Wait();
128 } 157 }
129 158
130 int NumCreatedRequests() { 159 int NumCreatedRequests() {
131 int count = 0; 160 int count = 0;
132 base::WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL, 161 base::WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL,
133 base::WaitableEvent::InitialState::NOT_SIGNALED); 162 base::WaitableEvent::InitialState::NOT_SIGNALED);
134 network_thread_->task_runner()->PostTask( 163 network_thread_->task_runner()->PostTask(
135 FROM_HERE, base::Bind(&CertNetFetcherImplTest::CountCreatedRequests, 164 FROM_HERE, base::Bind(&CertNetFetcherImplTest::CountCreatedRequests,
136 base::Unretained(this), &count, &done)); 165 base::Unretained(this), &count, &done));
137 done.Wait(); 166 done.Wait();
(...skipping 14 matching lines...) Expand all
152 base::Unretained(this), &done)); 181 base::Unretained(this), &done));
153 done.Wait(); 182 done.Wait();
154 } 183 }
155 184
156 void InitOnNetworkThread(base::WaitableEvent* done) { 185 void InitOnNetworkThread(base::WaitableEvent* done) {
157 state_.reset(new NetworkThreadState); 186 state_.reset(new NetworkThreadState);
158 state_->context.set_network_delegate(&state_->network_delegate); 187 state_->context.set_network_delegate(&state_->network_delegate);
159 done->Signal(); 188 done->Signal();
160 } 189 }
161 190
162 void TeardownOnNetworkThread() { state_.reset(); } 191 void ResetStateOnNetworkThread(base::WaitableEvent* done) {
192 state_.reset();
193 done->Signal();
194 }
195
196 void ResetState() {
197 base::WaitableEvent done(base::WaitableEvent::ResetPolicy::MANUAL,
198 base::WaitableEvent::InitialState::NOT_SIGNALED);
199 network_thread_->task_runner()->PostTask(
200 FROM_HERE,
201 base::Bind(&CertNetFetcherImplTest::ResetStateOnNetworkThread,
202 base::Unretained(this), &done));
203 done.Wait();
204 }
205
206 void TeardownOnNetworkThread() {
207 state_.reset();
208 fetcher_ = nullptr;
209 }
163 210
164 void CountCreatedRequests(int* count, base::WaitableEvent* done) { 211 void CountCreatedRequests(int* count, base::WaitableEvent* done) {
165 *count = state_->network_delegate.created_requests(); 212 *count = state_->network_delegate.created_requests();
166 done->Signal(); 213 done->Signal();
167 } 214 }
168 215
169 EmbeddedTestServer test_server_; 216 EmbeddedTestServer test_server_;
170 std::unique_ptr<base::Thread> network_thread_; 217 std::unique_ptr<base::Thread> network_thread_;
218 scoped_refptr<CertNetFetcher> fetcher_;
171 219
172 std::unique_ptr<NetworkThreadState> state_; 220 std::unique_ptr<NetworkThreadState> state_;
173 }; 221 };
174 222
175 // Helper to start an AIA fetch using default parameters. 223 // Helper to start an AIA fetch using default parameters.
176 WARN_UNUSED_RESULT std::unique_ptr<CertNetFetcher::Request> StartRequest( 224 WARN_UNUSED_RESULT std::unique_ptr<CertNetFetcher::Request> StartRequest(
177 CertNetFetcher* fetcher, 225 CertNetFetcher* fetcher,
178 const GURL& url) { 226 const GURL& url) {
179 return fetcher->FetchCaIssuers(url, CertNetFetcher::DEFAULT, 227 return fetcher->FetchCaIssuers(url, CertNetFetcher::DEFAULT,
180 CertNetFetcher::DEFAULT); 228 CertNetFetcher::DEFAULT);
181 } 229 }
182 230
183 // Fetch a few unique URLs using GET in parallel. Each URL has a different body 231 // Fetch a few unique URLs using GET in parallel. Each URL has a different body
184 // and Content-Type. 232 // and Content-Type.
185 TEST_F(CertNetFetcherImplTest, ParallelFetchNoDuplicates) { 233 TEST_F(CertNetFetcherImplTest, ParallelFetchNoDuplicates) {
186 ASSERT_TRUE(test_server_.Start()); 234 ASSERT_TRUE(test_server_.Start());
187 235 CreateFetcher();
188 auto fetcher = CreateFetcher();
189 236
190 // Request a URL with Content-Type "application/pkix-cert" 237 // Request a URL with Content-Type "application/pkix-cert"
191 GURL url1 = test_server_.GetURL("/cert.crt"); 238 GURL url1 = test_server_.GetURL("/cert.crt");
192 std::unique_ptr<CertNetFetcher::Request> request1 = 239 std::unique_ptr<CertNetFetcher::Request> request1 =
193 StartRequest(fetcher.get(), url1); 240 StartRequest(fetcher(), url1);
194 241
195 // Request a URL with Content-Type "application/pkix-crl" 242 // Request a URL with Content-Type "application/pkix-crl"
196 GURL url2 = test_server_.GetURL("/root.crl"); 243 GURL url2 = test_server_.GetURL("/root.crl");
197 std::unique_ptr<CertNetFetcher::Request> request2 = 244 std::unique_ptr<CertNetFetcher::Request> request2 =
198 StartRequest(fetcher.get(), url2); 245 StartRequest(fetcher(), url2);
199 246
200 // Request a URL with Content-Type "application/pkcs7-mime" 247 // Request a URL with Content-Type "application/pkcs7-mime"
201 GURL url3 = test_server_.GetURL("/certs.p7c"); 248 GURL url3 = test_server_.GetURL("/certs.p7c");
202 std::unique_ptr<CertNetFetcher::Request> request3 = 249 std::unique_ptr<CertNetFetcher::Request> request3 =
203 StartRequest(fetcher.get(), url3); 250 StartRequest(fetcher(), url3);
204 251
205 // Wait for all of the requests to complete and verify the fetch results. 252 // Wait for all of the requests to complete and verify the fetch results.
206 VerifySuccess("-cert.crt-\n", request1.get()); 253 VerifySuccess("-cert.crt-\n", request1.get());
207 VerifySuccess("-root.crl-\n", request2.get()); 254 VerifySuccess("-root.crl-\n", request2.get());
208 VerifySuccess("-certs.p7c-\n", request3.get()); 255 VerifySuccess("-certs.p7c-\n", request3.get());
209 256
210 EXPECT_EQ(3, NumCreatedRequests()); 257 EXPECT_EQ(3, NumCreatedRequests());
211 } 258 }
212 259
213 // Fetch a caIssuers URL which has an unexpected extension and Content-Type. 260 // Fetch a caIssuers URL which has an unexpected extension and Content-Type.
214 // The extension is .txt and the Content-Type is text/plain. Despite being 261 // The extension is .txt and the Content-Type is text/plain. Despite being
215 // unusual this succeeds as the extension and Content-Type are not required to 262 // unusual this succeeds as the extension and Content-Type are not required to
216 // be meaningful. 263 // be meaningful.
217 TEST_F(CertNetFetcherImplTest, ContentTypeDoesntMatter) { 264 TEST_F(CertNetFetcherImplTest, ContentTypeDoesntMatter) {
218 ASSERT_TRUE(test_server_.Start()); 265 ASSERT_TRUE(test_server_.Start());
219 266 CreateFetcher();
220 auto fetcher = CreateFetcher();
221 267
222 GURL url = test_server_.GetURL("/foo.txt"); 268 GURL url = test_server_.GetURL("/foo.txt");
223 std::unique_ptr<CertNetFetcher::Request> request = 269 std::unique_ptr<CertNetFetcher::Request> request =
224 StartRequest(fetcher.get(), url); 270 StartRequest(fetcher(), url);
225 VerifySuccess("-foo.txt-\n", request.get()); 271 VerifySuccess("-foo.txt-\n", request.get());
226 } 272 }
227 273
228 // Fetch a URLs whose HTTP response code is not 200. These are considered 274 // Fetch a URLs whose HTTP response code is not 200. These are considered
229 // failures. 275 // failures.
230 TEST_F(CertNetFetcherImplTest, HttpStatusCode) { 276 TEST_F(CertNetFetcherImplTest, HttpStatusCode) {
231 ASSERT_TRUE(test_server_.Start()); 277 ASSERT_TRUE(test_server_.Start());
232 278 CreateFetcher();
233 auto fetcher = CreateFetcher();
234 279
235 // Response was HTTP status 404. 280 // Response was HTTP status 404.
236 { 281 {
237 GURL url = test_server_.GetURL("/404.html"); 282 GURL url = test_server_.GetURL("/404.html");
238 std::unique_ptr<CertNetFetcher::Request> request = 283 std::unique_ptr<CertNetFetcher::Request> request =
239 StartRequest(fetcher.get(), url); 284 StartRequest(fetcher(), url);
240 VerifyFailure(ERR_FAILED, request.get()); 285 VerifyFailure(ERR_FAILED, request.get());
241 } 286 }
242 287
243 // Response was HTTP status 500. 288 // Response was HTTP status 500.
244 { 289 {
245 GURL url = test_server_.GetURL("/500.html"); 290 GURL url = test_server_.GetURL("/500.html");
246 std::unique_ptr<CertNetFetcher::Request> request = 291 std::unique_ptr<CertNetFetcher::Request> request =
247 StartRequest(fetcher.get(), url); 292 StartRequest(fetcher(), url);
248 VerifyFailure(ERR_FAILED, request.get()); 293 VerifyFailure(ERR_FAILED, request.get());
249 } 294 }
250 } 295 }
251 296
252 // Fetching a URL with a Content-Disposition header should have no effect. 297 // Fetching a URL with a Content-Disposition header should have no effect.
253 TEST_F(CertNetFetcherImplTest, ContentDisposition) { 298 TEST_F(CertNetFetcherImplTest, ContentDisposition) {
254 ASSERT_TRUE(test_server_.Start()); 299 ASSERT_TRUE(test_server_.Start());
255 300 CreateFetcher();
256 auto fetcher = CreateFetcher();
257 301
258 GURL url = test_server_.GetURL("/downloadable.js"); 302 GURL url = test_server_.GetURL("/downloadable.js");
259 std::unique_ptr<CertNetFetcher::Request> request = 303 std::unique_ptr<CertNetFetcher::Request> request =
260 StartRequest(fetcher.get(), url); 304 StartRequest(fetcher(), url);
261 VerifySuccess("-downloadable.js-\n", request.get()); 305 VerifySuccess("-downloadable.js-\n", request.get());
262 } 306 }
263 307
264 // Verifies that a cachable request will be served from the HTTP cache the 308 // Verifies that a cachable request will be served from the HTTP cache the
265 // second time it is requested. 309 // second time it is requested.
266 TEST_F(CertNetFetcherImplTest, Cache) { 310 TEST_F(CertNetFetcherImplTest, Cache) {
267 ASSERT_TRUE(test_server_.Start()); 311 ASSERT_TRUE(test_server_.Start());
268 312
269 auto fetcher = CreateFetcher(); 313 CreateFetcher();
270 314
271 // Fetch a URL whose HTTP headers make it cacheable for 1 hour. 315 // Fetch a URL whose HTTP headers make it cacheable for 1 hour.
272 GURL url(test_server_.GetURL("/cacheable_1hr.crt")); 316 GURL url(test_server_.GetURL("/cacheable_1hr.crt"));
273 { 317 {
274 std::unique_ptr<CertNetFetcher::Request> request = 318 std::unique_ptr<CertNetFetcher::Request> request =
275 StartRequest(fetcher.get(), url); 319 StartRequest(fetcher(), url);
276 VerifySuccess("-cacheable_1hr.crt-\n", request.get()); 320 VerifySuccess("-cacheable_1hr.crt-\n", request.get());
277 } 321 }
278 322
279 EXPECT_EQ(1, NumCreatedRequests()); 323 EXPECT_EQ(1, NumCreatedRequests());
280 324
281 // Kill the HTTP server. 325 // Kill the HTTP server.
282 ASSERT_TRUE(test_server_.ShutdownAndWaitUntilComplete()); 326 ASSERT_TRUE(test_server_.ShutdownAndWaitUntilComplete());
283 327
284 // Fetch again -- will fail unless served from cache. 328 // Fetch again -- will fail unless served from cache.
285 { 329 {
286 std::unique_ptr<CertNetFetcher::Request> request = 330 std::unique_ptr<CertNetFetcher::Request> request =
287 StartRequest(fetcher.get(), url); 331 StartRequest(fetcher(), url);
288 VerifySuccess("-cacheable_1hr.crt-\n", request.get()); 332 VerifySuccess("-cacheable_1hr.crt-\n", request.get());
289 } 333 }
290 334
291 EXPECT_EQ(2, NumCreatedRequests()); 335 EXPECT_EQ(2, NumCreatedRequests());
292 } 336 }
293 337
294 // Verify that the maximum response body constraints are enforced by fetching a 338 // Verify that the maximum response body constraints are enforced by fetching a
295 // resource that is larger than the limit. 339 // resource that is larger than the limit.
296 TEST_F(CertNetFetcherImplTest, TooLarge) { 340 TEST_F(CertNetFetcherImplTest, TooLarge) {
297 ASSERT_TRUE(test_server_.Start()); 341 ASSERT_TRUE(test_server_.Start());
298 342
299 auto fetcher = CreateFetcher(); 343 CreateFetcher();
300 344
301 // This file has a response body 12 bytes long. So setting the maximum to 11 345 // This file has a response body 12 bytes long. So setting the maximum to 11
302 // bytes will cause it to fail. 346 // bytes will cause it to fail.
303 GURL url(test_server_.GetURL("/certs.p7c")); 347 GURL url(test_server_.GetURL("/certs.p7c"));
304 std::unique_ptr<CertNetFetcher::Request> request = 348 std::unique_ptr<CertNetFetcher::Request> request =
305 fetcher->FetchCaIssuers(url, CertNetFetcher::DEFAULT, 11); 349 fetcher()->FetchCaIssuers(url, CertNetFetcher::DEFAULT, 11);
306 350
307 VerifyFailure(ERR_FILE_TOO_BIG, request.get()); 351 VerifyFailure(ERR_FILE_TOO_BIG, request.get());
308 } 352 }
309 353
310 // Set the timeout to 10 milliseconds, and try fetching a URL that takes 5 354 // Set the timeout to 10 milliseconds, and try fetching a URL that takes 5
311 // seconds to complete. It should fail due to a timeout. 355 // seconds to complete. It should fail due to a timeout.
312 TEST_F(CertNetFetcherImplTest, Hang) { 356 TEST_F(CertNetFetcherImplTest, Hang) {
313 ASSERT_TRUE(test_server_.Start()); 357 ASSERT_TRUE(test_server_.Start());
314 358
315 auto fetcher = CreateFetcher(); 359 CreateFetcher();
316 360
317 GURL url(test_server_.GetURL("/slow/certs.p7c?5")); 361 GURL url(test_server_.GetURL("/slow/certs.p7c?5"));
318 std::unique_ptr<CertNetFetcher::Request> request = 362 std::unique_ptr<CertNetFetcher::Request> request =
319 fetcher->FetchCaIssuers(url, 10, CertNetFetcher::DEFAULT); 363 fetcher()->FetchCaIssuers(url, 10, CertNetFetcher::DEFAULT);
320 VerifyFailure(ERR_TIMED_OUT, request.get()); 364 VerifyFailure(ERR_TIMED_OUT, request.get());
321 } 365 }
322 366
323 // Verify that if a response is gzip-encoded it gets inflated before being 367 // Verify that if a response is gzip-encoded it gets inflated before being
324 // returned to the caller. 368 // returned to the caller.
325 TEST_F(CertNetFetcherImplTest, Gzip) { 369 TEST_F(CertNetFetcherImplTest, Gzip) {
326 ASSERT_TRUE(test_server_.Start()); 370 ASSERT_TRUE(test_server_.Start());
327 371
328 auto fetcher = CreateFetcher(); 372 CreateFetcher();
329 373
330 GURL url(test_server_.GetURL("/gzipped_crl")); 374 GURL url(test_server_.GetURL("/gzipped_crl"));
331 std::unique_ptr<CertNetFetcher::Request> request = 375 std::unique_ptr<CertNetFetcher::Request> request =
332 StartRequest(fetcher.get(), url); 376 StartRequest(fetcher(), url);
333 VerifySuccess("-gzipped_crl-\n", request.get()); 377 VerifySuccess("-gzipped_crl-\n", request.get());
334 } 378 }
335 379
336 // Try fetching an unsupported URL scheme (https). 380 // Try fetching an unsupported URL scheme (https).
337 TEST_F(CertNetFetcherImplTest, HttpsNotAllowed) { 381 TEST_F(CertNetFetcherImplTest, HttpsNotAllowed) {
338 ASSERT_TRUE(test_server_.Start()); 382 ASSERT_TRUE(test_server_.Start());
339 383
340 auto fetcher = CreateFetcher(); 384 CreateFetcher();
341 385
342 GURL url("https://foopy/foo.crt"); 386 GURL url("https://foopy/foo.crt");
343 std::unique_ptr<CertNetFetcher::Request> request = 387 std::unique_ptr<CertNetFetcher::Request> request =
344 StartRequest(fetcher.get(), url); 388 StartRequest(fetcher(), url);
345 VerifyFailure(ERR_DISALLOWED_URL_SCHEME, request.get()); 389 VerifyFailure(ERR_DISALLOWED_URL_SCHEME, request.get());
346 390
347 // No request was created because the URL scheme was unsupported. 391 // No request was created because the URL scheme was unsupported.
348 EXPECT_EQ(0, NumCreatedRequests()); 392 EXPECT_EQ(0, NumCreatedRequests());
349 } 393 }
350 394
351 // Try fetching a URL which redirects to https. 395 // Try fetching a URL which redirects to https.
352 TEST_F(CertNetFetcherImplTest, RedirectToHttpsNotAllowed) { 396 TEST_F(CertNetFetcherImplTest, RedirectToHttpsNotAllowed) {
353 ASSERT_TRUE(test_server_.Start()); 397 ASSERT_TRUE(test_server_.Start());
354 398
355 auto fetcher = CreateFetcher(); 399 CreateFetcher();
356 400
357 GURL url(test_server_.GetURL("/redirect_https")); 401 GURL url(test_server_.GetURL("/redirect_https"));
358 402
359 std::unique_ptr<CertNetFetcher::Request> request = 403 std::unique_ptr<CertNetFetcher::Request> request =
360 StartRequest(fetcher.get(), url); 404 StartRequest(fetcher(), url);
361 VerifyFailure(ERR_DISALLOWED_URL_SCHEME, request.get()); 405 VerifyFailure(ERR_DISALLOWED_URL_SCHEME, request.get());
362 406
363 EXPECT_EQ(1, NumCreatedRequests()); 407 EXPECT_EQ(1, NumCreatedRequests());
364 } 408 }
365 409
366 // Try fetching an unsupported URL scheme (https) and then immediately 410 // Try fetching an unsupported URL scheme (https) and then immediately
367 // cancelling. This is a bit special because this codepath needs to post a task. 411 // cancelling. This is a bit special because this codepath needs to post a task.
368 TEST_F(CertNetFetcherImplTest, CancelHttpsNotAllowed) { 412 TEST_F(CertNetFetcherImplTest, CancelHttpsNotAllowed) {
369 ASSERT_TRUE(test_server_.Start()); 413 ASSERT_TRUE(test_server_.Start());
370 414
371 auto fetcher = CreateFetcher(); 415 CreateFetcher();
372 416
373 GURL url("https://foopy/foo.crt"); 417 GURL url("https://foopy/foo.crt");
374 std::unique_ptr<CertNetFetcher::Request> request = 418 std::unique_ptr<CertNetFetcher::Request> request =
375 StartRequest(fetcher.get(), url); 419 StartRequest(fetcher(), url);
376 420
377 // Cancel the request (May or may not have started yet, as the request is 421 // Cancel the request (May or may not have started yet, as the request is
378 // running on another thread). 422 // running on another thread).
379 request.reset(); 423 request.reset();
380 } 424 }
381 425
382 // Start a few requests, and cancel one of them before running the message loop 426 // Start a few requests, and cancel one of them before running the message loop
383 // again. 427 // again.
384 TEST_F(CertNetFetcherImplTest, CancelBeforeRunningMessageLoop) { 428 TEST_F(CertNetFetcherImplTest, CancelBeforeRunningMessageLoop) {
385 ASSERT_TRUE(test_server_.Start()); 429 ASSERT_TRUE(test_server_.Start());
386 430
387 auto fetcher = CreateFetcher(); 431 CreateFetcher();
388 432
389 GURL url1 = test_server_.GetURL("/cert.crt"); 433 GURL url1 = test_server_.GetURL("/cert.crt");
390 std::unique_ptr<CertNetFetcher::Request> request1 = 434 std::unique_ptr<CertNetFetcher::Request> request1 =
391 StartRequest(fetcher.get(), url1); 435 StartRequest(fetcher(), url1);
392 436
393 GURL url2 = test_server_.GetURL("/root.crl"); 437 GURL url2 = test_server_.GetURL("/root.crl");
394 std::unique_ptr<CertNetFetcher::Request> request2 = 438 std::unique_ptr<CertNetFetcher::Request> request2 =
395 StartRequest(fetcher.get(), url2); 439 StartRequest(fetcher(), url2);
396 440
397 GURL url3 = test_server_.GetURL("/certs.p7c"); 441 GURL url3 = test_server_.GetURL("/certs.p7c");
398 442
399 std::unique_ptr<CertNetFetcher::Request> request3 = 443 std::unique_ptr<CertNetFetcher::Request> request3 =
400 StartRequest(fetcher.get(), url3); 444 StartRequest(fetcher(), url3);
401 445
402 // Cancel the second request. 446 // Cancel the second request.
403 request2.reset(); 447 request2.reset();
404 448
405 // Wait for the non-cancelled requests to complete, and verify the fetch 449 // Wait for the non-cancelled requests to complete, and verify the fetch
406 // results. 450 // results.
407 VerifySuccess("-cert.crt-\n", request1.get()); 451 VerifySuccess("-cert.crt-\n", request1.get());
408 VerifySuccess("-certs.p7c-\n", request3.get()); 452 VerifySuccess("-certs.p7c-\n", request3.get());
409 } 453 }
410 454
411 // Start several requests, and cancel one of them after the first has completed. 455 // Start several requests, and cancel one of them after the first has completed.
412 // NOTE: The python test server is single threaded and can only service one 456 // NOTE: The python test server is single threaded and can only service one
413 // request at a time. After a socket is opened by the server it waits for it to 457 // request at a time. After a socket is opened by the server it waits for it to
414 // be completed, and any subsequent request will hang until the first socket is 458 // be completed, and any subsequent request will hang until the first socket is
415 // closed. 459 // closed.
416 // Cancelling the first request can therefore be problematic, since if 460 // Cancelling the first request can therefore be problematic, since if
417 // cancellation is done after the socket is opened but before reading/writing, 461 // cancellation is done after the socket is opened but before reading/writing,
418 // then the socket is re-cycled and things will be stalled until the cleanup 462 // then the socket is re-cycled and things will be stalled until the cleanup
419 // timer (10 seconds) closes it. 463 // timer (10 seconds) closes it.
420 // To work around this, the last request is cancelled, and hope that the 464 // To work around this, the last request is cancelled, and hope that the
421 // requests are given opened sockets in a FIFO order. 465 // requests are given opened sockets in a FIFO order.
422 // TODO(eroman): Make this more robust. 466 // TODO(eroman): Make this more robust.
423 // TODO(eroman): Rename this test. 467 // TODO(eroman): Rename this test.
424 TEST_F(CertNetFetcherImplTest, CancelAfterRunningMessageLoop) { 468 TEST_F(CertNetFetcherImplTest, CancelAfterRunningMessageLoop) {
425 ASSERT_TRUE(test_server_.Start()); 469 ASSERT_TRUE(test_server_.Start());
426 470
427 auto fetcher = CreateFetcher(); 471 CreateFetcher();
428 472
429 GURL url1 = test_server_.GetURL("/cert.crt"); 473 GURL url1 = test_server_.GetURL("/cert.crt");
430 474
431 std::unique_ptr<CertNetFetcher::Request> request1 = 475 std::unique_ptr<CertNetFetcher::Request> request1 =
432 StartRequest(fetcher.get(), url1); 476 StartRequest(fetcher(), url1);
433 477
434 GURL url2 = test_server_.GetURL("/certs.p7c"); 478 GURL url2 = test_server_.GetURL("/certs.p7c");
435 std::unique_ptr<CertNetFetcher::Request> request2 = 479 std::unique_ptr<CertNetFetcher::Request> request2 =
436 StartRequest(fetcher.get(), url2); 480 StartRequest(fetcher(), url2);
437 481
438 GURL url3("ftp://www.not.supported.com/foo"); 482 GURL url3("ftp://www.not.supported.com/foo");
439 std::unique_ptr<CertNetFetcher::Request> request3 = 483 std::unique_ptr<CertNetFetcher::Request> request3 =
440 StartRequest(fetcher.get(), url3); 484 StartRequest(fetcher(), url3);
441 485
442 // Wait for the ftp request to complete (it should complete right away since 486 // Wait for the ftp request to complete (it should complete right away since
443 // it doesn't even try to connect to the server). 487 // it doesn't even try to connect to the server).
444 VerifyFailure(ERR_DISALLOWED_URL_SCHEME, request3.get()); 488 VerifyFailure(ERR_DISALLOWED_URL_SCHEME, request3.get());
445 489
446 // Cancel the second outstanding request. 490 // Cancel the second outstanding request.
447 request2.reset(); 491 request2.reset();
448 492
449 // Wait for the first request to complete and verify the fetch result. 493 // Wait for the first request to complete and verify the fetch result.
450 VerifySuccess("-cert.crt-\n", request1.get()); 494 VerifySuccess("-cert.crt-\n", request1.get());
451 } 495 }
452 496
453 // Fetch the same URLs in parallel and verify that only 1 request is made per 497 // Fetch the same URLs in parallel and verify that only 1 request is made per
454 // URL. 498 // URL.
455 TEST_F(CertNetFetcherImplTest, ParallelFetchDuplicates) { 499 TEST_F(CertNetFetcherImplTest, ParallelFetchDuplicates) {
456 ASSERT_TRUE(test_server_.Start()); 500 ASSERT_TRUE(test_server_.Start());
457 501
458 auto fetcher = CreateFetcher(); 502 CreateFetcher();
459 503
460 GURL url1 = test_server_.GetURL("/cert.crt"); 504 GURL url1 = test_server_.GetURL("/cert.crt");
461 GURL url2 = test_server_.GetURL("/root.crl"); 505 GURL url2 = test_server_.GetURL("/root.crl");
462 506
463 // Issue 3 requests for url1, and 3 requests for url2 507 // Issue 3 requests for url1, and 3 requests for url2
464 std::unique_ptr<CertNetFetcher::Request> request1 = 508 std::unique_ptr<CertNetFetcher::Request> request1 =
465 StartRequest(fetcher.get(), url1); 509 StartRequest(fetcher(), url1);
466 510
467 std::unique_ptr<CertNetFetcher::Request> request2 = 511 std::unique_ptr<CertNetFetcher::Request> request2 =
468 StartRequest(fetcher.get(), url2); 512 StartRequest(fetcher(), url2);
469 513
470 std::unique_ptr<CertNetFetcher::Request> request3 = 514 std::unique_ptr<CertNetFetcher::Request> request3 =
471 StartRequest(fetcher.get(), url1); 515 StartRequest(fetcher(), url1);
472 516
473 std::unique_ptr<CertNetFetcher::Request> request4 = 517 std::unique_ptr<CertNetFetcher::Request> request4 =
474 StartRequest(fetcher.get(), url2); 518 StartRequest(fetcher(), url2);
475 519
476 std::unique_ptr<CertNetFetcher::Request> request5 = 520 std::unique_ptr<CertNetFetcher::Request> request5 =
477 StartRequest(fetcher.get(), url2); 521 StartRequest(fetcher(), url2);
478 522
479 std::unique_ptr<CertNetFetcher::Request> request6 = 523 std::unique_ptr<CertNetFetcher::Request> request6 =
480 StartRequest(fetcher.get(), url1); 524 StartRequest(fetcher(), url1);
481 525
482 // Cancel all but one of the requests for url1. 526 // Cancel all but one of the requests for url1.
483 request1.reset(); 527 request1.reset();
484 request3.reset(); 528 request3.reset();
485 529
486 // Wait for the remaining requests to finish and verify the fetch results. 530 // Wait for the remaining requests to finish and verify the fetch results.
487 VerifySuccess("-root.crl-\n", request2.get()); 531 VerifySuccess("-root.crl-\n", request2.get());
488 VerifySuccess("-root.crl-\n", request4.get()); 532 VerifySuccess("-root.crl-\n", request4.get());
489 VerifySuccess("-root.crl-\n", request5.get()); 533 VerifySuccess("-root.crl-\n", request5.get());
490 VerifySuccess("-cert.crt-\n", request6.get()); 534 VerifySuccess("-cert.crt-\n", request6.get());
491 535
492 // Verify that only 2 URLRequests were started even though 6 requests were 536 // Verify that only 2 URLRequests were started even though 6 requests were
493 // issued. 537 // issued.
494 EXPECT_EQ(2, NumCreatedRequests()); 538 EXPECT_EQ(2, NumCreatedRequests());
495 } 539 }
496 540
497 // Cancel a request and then start another one for the same URL. 541 // Cancel a request and then start another one for the same URL.
498 TEST_F(CertNetFetcherImplTest, CancelThenStart) { 542 TEST_F(CertNetFetcherImplTest, CancelThenStart) {
499 ASSERT_TRUE(test_server_.Start()); 543 ASSERT_TRUE(test_server_.Start());
500 544
501 auto fetcher = CreateFetcher(); 545 CreateFetcher();
502 546
503 GURL url = test_server_.GetURL("/cert.crt"); 547 GURL url = test_server_.GetURL("/cert.crt");
504 548
505 std::unique_ptr<CertNetFetcher::Request> request1 = 549 std::unique_ptr<CertNetFetcher::Request> request1 =
506 StartRequest(fetcher.get(), url); 550 StartRequest(fetcher(), url);
507 request1.reset(); 551 request1.reset();
508 552
509 std::unique_ptr<CertNetFetcher::Request> request2 = 553 std::unique_ptr<CertNetFetcher::Request> request2 =
510 StartRequest(fetcher.get(), url); 554 StartRequest(fetcher(), url);
511 555
512 std::unique_ptr<CertNetFetcher::Request> request3 = 556 std::unique_ptr<CertNetFetcher::Request> request3 =
513 StartRequest(fetcher.get(), url); 557 StartRequest(fetcher(), url);
514 request3.reset(); 558 request3.reset();
515 559
516 // All but |request2| were canceled. 560 // All but |request2| were canceled.
517 VerifySuccess("-cert.crt-\n", request2.get()); 561 VerifySuccess("-cert.crt-\n", request2.get());
518 } 562 }
519 563
520 // Start duplicate requests and then cancel all of them. 564 // Start duplicate requests and then cancel all of them.
521 TEST_F(CertNetFetcherImplTest, CancelAll) { 565 TEST_F(CertNetFetcherImplTest, CancelAll) {
522 ASSERT_TRUE(test_server_.Start()); 566 ASSERT_TRUE(test_server_.Start());
523 567
524 auto fetcher = CreateFetcher(); 568 CreateFetcher();
525 std::unique_ptr<CertNetFetcher::Request> request[3]; 569 std::unique_ptr<CertNetFetcher::Request> request[3];
526 570
527 GURL url = test_server_.GetURL("/cert.crt"); 571 GURL url = test_server_.GetURL("/cert.crt");
528 572
529 for (size_t i = 0; i < arraysize(request); ++i) { 573 for (size_t i = 0; i < arraysize(request); ++i) {
530 request[i] = StartRequest(fetcher.get(), url); 574 request[i] = StartRequest(fetcher(), url);
531 } 575 }
532 576
533 // Cancel all the requests. 577 // Cancel all the requests.
534 for (size_t i = 0; i < arraysize(request); ++i) 578 for (size_t i = 0; i < arraysize(request); ++i)
535 request[i].reset(); 579 request[i].reset();
536 580
537 EXPECT_EQ(1, NumCreatedRequests()); 581 EXPECT_EQ(1, NumCreatedRequests());
538 } 582 }
539 583
584 // Tests that Requests are not created after CertNetFetcher has been shutdown.
585 TEST_F(CertNetFetcherImplTest, NoRequestsAfterShutdown) {
586 ASSERT_TRUE(test_server_.Start());
587 CreateFetcher();
588 ShutDownFetcher();
589
590 GURL url = test_server_.GetURL("/cert.crt");
591 std::unique_ptr<CertNetFetcher::Request> request =
592 StartRequest(fetcher(), url);
593
594 EXPECT_FALSE(request);
595 EXPECT_EQ(0, NumCreatedRequests());
596 }
597
598 // Tests that outstanding Requests are cancelled when Shutdown is called.
599 TEST_F(CertNetFetcherImplTest, ShutdownCancelsRequests) {
600 URLRequestHangingReadJob::AddUrlHandler();
601 CreateFetcher();
602
603 GURL url = URLRequestHangingReadJob::GetMockHttpUrl();
604 std::unique_ptr<CertNetFetcher::Request> request =
605 StartRequest(fetcher(), url);
606
607 ShutDownFetcher();
608 VerifyFailure(ERR_ABORTED, request.get());
609 }
610
611 // Tests that Requests are not created after the network thread is gone.
612 TEST_F(CertNetFetcherImplTest, NoRequestsAfterNetworkThreadDead) {
613 ASSERT_TRUE(test_server_.Start());
614 CreateFetcher();
615 ResetState();
616 network_thread_.reset();
617
618 GURL url = test_server_.GetURL("/cert.crt");
619 std::unique_ptr<CertNetFetcher::Request> request =
620 StartRequest(fetcher(), url);
621
622 EXPECT_FALSE(request);
623 }
624
540 } // namespace 625 } // namespace
541 626
542 } // namespace net 627 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698