OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "content/browser/loader/intercepting_resource_handler.h" | 5 #include "content/browser/loader/intercepting_resource_handler.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <string> | 10 #include <string> |
(...skipping 18 matching lines...) Expand all Loading... | |
29 #include "net/url_request/url_request_context.h" | 29 #include "net/url_request/url_request_context.h" |
30 #include "net/url_request/url_request_status.h" | 30 #include "net/url_request/url_request_status.h" |
31 #include "net/url_request/url_request_test_util.h" | 31 #include "net/url_request/url_request_test_util.h" |
32 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
33 #include "url/gurl.h" | 33 #include "url/gurl.h" |
34 | 34 |
35 namespace content { | 35 namespace content { |
36 | 36 |
37 namespace { | 37 namespace { |
38 | 38 |
39 class TestResourceController : public ResourceController { | |
40 public: | |
41 TestResourceController() = default; | |
42 void Cancel() override {} | |
43 void CancelAndIgnore() override {} | |
44 void CancelWithError(int error_code) override {} | |
45 void Resume() override { ++resume_calls_; } | |
46 | |
47 int resume_calls() const { return resume_calls_; } | |
48 | |
49 private: | |
50 int resume_calls_ = 0; | |
51 | |
52 DISALLOW_COPY_AND_ASSIGN(TestResourceController); | |
53 }; | |
54 | |
55 class InterceptingResourceHandlerTest : public testing::Test { | 39 class InterceptingResourceHandlerTest : public testing::Test { |
56 public: | 40 public: |
57 InterceptingResourceHandlerTest() | 41 InterceptingResourceHandlerTest() |
58 : request_(context_.CreateRequest(GURL("http://www.google.com"), | 42 : request_(context_.CreateRequest(GURL("http://www.google.com"), |
59 net::DEFAULT_PRIORITY, | 43 net::DEFAULT_PRIORITY, |
60 nullptr)), | 44 nullptr)), |
61 old_handler_status_( | 45 old_handler_status_( |
62 net::URLRequestStatus::FromError(net::ERR_IO_PENDING)) { | 46 net::URLRequestStatus::FromError(net::ERR_IO_PENDING)) { |
63 ResourceRequestInfo::AllocateForTesting(request_.get(), | 47 ResourceRequestInfo::AllocateForTesting(request_.get(), |
64 RESOURCE_TYPE_MAIN_FRAME, | 48 RESOURCE_TYPE_MAIN_FRAME, |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
376 ASSERT_EQ(MockResourceLoader::Status::CANCELED, | 360 ASSERT_EQ(MockResourceLoader::Status::CANCELED, |
377 mock_loader_->OnReadCompleted(kData)); | 361 mock_loader_->OnReadCompleted(kData)); |
378 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code()); | 362 EXPECT_EQ(net::ERR_ABORTED, mock_loader_->error_code()); |
379 } | 363 } |
380 | 364 |
381 // The old handler sets |defer| to true in OnReadCompleted and | 365 // The old handler sets |defer| to true in OnReadCompleted and |
382 // OnResponseCompleted. The new handler sets |defer| to true in | 366 // OnResponseCompleted. The new handler sets |defer| to true in |
383 // OnResponseStarted and OnReadCompleted. | 367 // OnResponseStarted and OnReadCompleted. |
384 TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { | 368 TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
385 const char kData[] = "The data"; | 369 const char kData[] = "The data"; |
386 const std::string kPayload = "The long long long long long payload"; | 370 const char kPayload[] = "The long long long long long payload"; |
387 const int kOldHandlerBufferSize = 10; | 371 // This should be less than half the size of the payload, so it needs at least |
372 // 3 reads to receive. | |
373 const int kOldHandlerBufferSize = arraysize(kPayload) / 3; | |
388 | 374 |
389 // When sending a payload to the old ResourceHandler, the | 375 // When sending a payload to the old ResourceHandler, the |
390 // InterceptingResourceHandler doesn't send a final EOF read. | 376 // InterceptingResourceHandler doesn't send a final EOF read. |
391 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read | 377 // TODO(mmenke): Should it? Or can we just get rid of that 0-byte read |
392 // entirely? | 378 // entirely? |
393 old_handler_->set_expect_eof_read(false); | 379 old_handler_->set_expect_eof_read(false); |
394 old_handler_->SetBufferSize(kOldHandlerBufferSize); | 380 old_handler_->SetBufferSize(kOldHandlerBufferSize); |
381 old_handler_->set_defer_on_will_read(true); | |
395 old_handler_->set_defer_on_read_completed(true); | 382 old_handler_->set_defer_on_read_completed(true); |
396 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); | 383 scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); |
397 | 384 |
398 // Simulate the MimeSniffingResourceHandler buffering the data. | 385 // Simulate the MimeSniffingResourceHandler buffering the data. |
386 | |
399 ASSERT_EQ(MockResourceLoader::Status::IDLE, | 387 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
400 mock_loader_->OnWillStart(request_->url())); | 388 mock_loader_->OnWillStart(request_->url())); |
401 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 389 // The old handler defers the read. |
390 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | |
391 mock_loader_->OnWillRead()); | |
392 old_handler_->WaitUntilDeferred(); | |
393 | |
394 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); | |
395 EXPECT_EQ(1, old_handler_->on_will_read_called()); | |
396 EXPECT_EQ(0, old_handler_->on_read_completed_called()); | |
397 EXPECT_EQ(0, old_handler_->on_response_completed_called()); | |
398 | |
399 // Defer the next OnWillRead, too. This is needed to test the case where | |
400 // OnWillRead completes asynchornously when passing the payload to the old | |
Charlie Harrison
2017/02/16 21:25:04
s/asynchornously/asynchronously
mmenke
2017/03/08 19:16:07
Done.
| |
401 // handler. | |
402 old_handler_->set_defer_on_will_read(true); | |
403 | |
404 // The old handle resumes the request. | |
405 old_handler_->Resume(); | |
406 | |
407 // Resume() call may do work asynchronously. Wait until that's done. | |
408 mock_loader_->WaitUntilIdleOrCanceled(); | |
409 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); | |
402 | 410 |
403 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get()); | 411 ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get()); |
404 | 412 |
405 // Simulate the MimeSniffingResourceHandler asking the | 413 // Simulate the MimeSniffingResourceHandler asking the |
406 // InterceptingResourceHandler to switch to a new handler. | 414 // InterceptingResourceHandler to switch to a new handler. |
407 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, | 415 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, |
408 0}; | 416 0}; |
409 | 417 |
410 std::string new_handler_body; | 418 std::string new_handler_body; |
411 std::unique_ptr<TestResourceHandler> scoped_new_handler( | 419 std::unique_ptr<TestResourceHandler> scoped_new_handler( |
412 new TestResourceHandler(&new_handler_status, &new_handler_body)); | 420 new TestResourceHandler(&new_handler_status, &new_handler_body)); |
413 base::WeakPtr<TestResourceHandler> new_handler = | 421 base::WeakPtr<TestResourceHandler> new_handler = |
414 scoped_new_handler->GetWeakPtr(); | 422 scoped_new_handler->GetWeakPtr(); |
415 scoped_new_handler->SetBufferSize(1); | 423 scoped_new_handler->SetBufferSize(1); |
416 scoped_new_handler->set_defer_on_will_start(true); | 424 scoped_new_handler->set_defer_on_will_start(true); |
417 scoped_new_handler->set_defer_on_response_started(true); | 425 scoped_new_handler->set_defer_on_response_started(true); |
426 scoped_new_handler->set_defer_on_will_read(true); | |
418 scoped_new_handler->set_defer_on_read_completed(true); | 427 scoped_new_handler->set_defer_on_read_completed(true); |
419 scoped_new_handler->set_defer_on_response_completed(true); | 428 scoped_new_handler->set_defer_on_response_completed(true); |
420 intercepting_handler_->UseNewHandler(std::move(scoped_new_handler), kPayload); | 429 intercepting_handler_->UseNewHandler(std::move(scoped_new_handler), kPayload); |
421 | 430 |
422 // The response is received, and then deferred by the old handler's | 431 // The response is received, and then deferred by the old handler's |
423 // OnReadCompleted method. | 432 // OnReadCompleted method. |
424 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 433 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
425 mock_loader_->OnResponseStarted( | 434 mock_loader_->OnResponseStarted( |
426 make_scoped_refptr(new ResourceResponse()))); | 435 make_scoped_refptr(new ResourceResponse()))); |
436 old_handler_->WaitUntilDeferred(); | |
437 | |
438 EXPECT_EQ(1, old_handler_->on_read_completed_called()); | |
439 EXPECT_EQ(0, old_handler_->on_response_completed_called()); | |
440 EXPECT_EQ(0, new_handler->on_response_started_called()); | |
427 | 441 |
428 // The old handler has received the first N bytes of the payload synchronously | 442 // The old handler has received the first N bytes of the payload synchronously |
429 // where N is the size of the buffer exposed via OnWillRead. | 443 // where N is the size of the buffer exposed via OnWillRead. |
430 EXPECT_EQ(std::string(kPayload, 0, kOldHandlerBufferSize), old_handler_body_); | 444 EXPECT_EQ(std::string(kPayload, 0, kOldHandlerBufferSize), old_handler_body_); |
431 EXPECT_EQ(std::string(), new_handler_body); | 445 EXPECT_EQ(std::string(), new_handler_body); |
432 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); | 446 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); |
433 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); | 447 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); |
434 | 448 |
449 // Run until the old handler's OnWillRead method defers the request while | |
450 // replaying the payload. | |
451 old_handler_->Resume(); | |
452 old_handler_->WaitUntilDeferred(); | |
453 EXPECT_EQ(2, old_handler_->on_will_read_called()); | |
454 EXPECT_EQ(1, old_handler_->on_read_completed_called()); | |
455 EXPECT_EQ(0, old_handler_->on_response_completed_called()); | |
456 EXPECT_EQ(std::string(kPayload, 0, kOldHandlerBufferSize), old_handler_body_); | |
457 EXPECT_EQ(std::string(), new_handler_body); | |
458 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); | |
459 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); | |
460 | |
435 // Run until the new handler's OnWillStart method defers the request. | 461 // Run until the new handler's OnWillStart method defers the request. |
436 old_handler_->Resume(); | 462 old_handler_->Resume(); |
437 // Resume() call may do work asynchronously. Wait until that's done. | 463 new_handler->WaitUntilDeferred(); |
438 base::RunLoop().RunUntilIdle(); | 464 |
465 EXPECT_EQ(1, new_handler->on_will_start_called()); | |
466 EXPECT_EQ(0, new_handler->on_response_started_called()); | |
439 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 467 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
440 mock_loader_->status()); | 468 mock_loader_->status()); |
441 EXPECT_EQ(kPayload, old_handler_body_); | 469 EXPECT_EQ(kPayload, old_handler_body_); |
442 EXPECT_EQ(net::URLRequestStatus::SUCCESS, old_handler_status_.status()); | 470 EXPECT_EQ(net::URLRequestStatus::SUCCESS, old_handler_status_.status()); |
443 EXPECT_FALSE(old_handler_); | 471 EXPECT_FALSE(old_handler_); |
444 EXPECT_EQ(std::string(), new_handler_body); | 472 EXPECT_EQ(std::string(), new_handler_body); |
445 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); | 473 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); |
446 | 474 |
447 // Run until the new handler's OnResponseStarted method defers the request. | 475 // Run until the new handler's OnResponseStarted method defers the request. |
448 new_handler->Resume(); | 476 new_handler->Resume(); |
449 // Resume() call may do work asynchronously. Wait until that's done. | 477 // Resume() call may do work asynchronously. Wait until that's done. |
450 base::RunLoop().RunUntilIdle(); | 478 new_handler->WaitUntilDeferred(); |
479 | |
480 EXPECT_EQ(1, new_handler->on_response_started_called()); | |
481 EXPECT_EQ(0, new_handler->on_will_read_called()); | |
451 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 482 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
452 mock_loader_->status()); | 483 mock_loader_->status()); |
453 EXPECT_EQ(std::string(), new_handler_body); | 484 EXPECT_EQ(std::string(), new_handler_body); |
454 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); | 485 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); |
455 | 486 |
456 // Resuming should finally call back into the ResourceController. | 487 // Resuming should finally call back into the ResourceController. |
457 new_handler->Resume(); | 488 new_handler->Resume(); |
458 mock_loader_->WaitUntilIdleOrCanceled(); | 489 mock_loader_->WaitUntilIdleOrCanceled(); |
459 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); | 490 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
460 | 491 |
461 // Data is read, the new handler defers completion of the read. | 492 // Data is read, the new handler defers OnWillRead. |
462 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, | 493 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
463 mock_loader_->OnReadCompleted(kData)); | 494 mock_loader_->OnReadCompleted(kData)); |
495 new_handler->WaitUntilDeferred(); | |
496 EXPECT_EQ(1, new_handler->on_will_read_called()); | |
497 EXPECT_EQ(0, new_handler->on_read_completed_called()); | |
498 | |
499 // The new ResourceHandler resumes, and then defers again in OnReadCompleted. | |
500 new_handler->Resume(); | |
501 new_handler->WaitUntilDeferred(); | |
502 EXPECT_EQ(1, new_handler->on_will_read_called()); | |
503 EXPECT_EQ(1, new_handler->on_read_completed_called()); | |
504 EXPECT_EQ(0, new_handler->on_response_completed_called()); | |
464 | 505 |
465 EXPECT_EQ("T", new_handler_body); | 506 EXPECT_EQ("T", new_handler_body); |
466 | 507 |
508 // New handler resumes again, everything continues synchronously until all | |
509 // written data is consumed. | |
467 new_handler->Resume(); | 510 new_handler->Resume(); |
468 mock_loader_->WaitUntilIdleOrCanceled(); | 511 mock_loader_->WaitUntilIdleOrCanceled(); |
469 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); | 512 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
470 EXPECT_EQ(kData, new_handler_body); | 513 EXPECT_EQ(kData, new_handler_body); |
471 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); | 514 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); |
515 EXPECT_EQ(0, new_handler->on_read_eof_called()); | |
516 EXPECT_EQ(0, new_handler->on_response_completed_called()); | |
472 | 517 |
473 // Final EOF byte is read. | 518 // Final EOF byte is read. |
474 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); | 519 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
475 ASSERT_EQ(MockResourceLoader::Status::IDLE, | 520 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
476 mock_loader_->OnReadCompleted("")); | 521 mock_loader_->OnReadCompleted("")); |
522 EXPECT_EQ(1, new_handler->on_read_eof_called()); | |
523 EXPECT_EQ(0, new_handler->on_response_completed_called()); | |
477 | 524 |
478 ASSERT_EQ( | 525 ASSERT_EQ( |
479 MockResourceLoader::Status::CALLBACK_PENDING, | 526 MockResourceLoader::Status::CALLBACK_PENDING, |
480 mock_loader_->OnResponseCompleted({net::URLRequestStatus::SUCCESS, 0})); | 527 mock_loader_->OnResponseCompleted({net::URLRequestStatus::SUCCESS, 0})); |
481 EXPECT_EQ(net::URLRequestStatus::SUCCESS, new_handler_status.status()); | 528 EXPECT_EQ(net::URLRequestStatus::SUCCESS, new_handler_status.status()); |
529 EXPECT_EQ(1, new_handler->on_response_completed_called()); | |
482 } | 530 } |
483 | 531 |
484 // Test cancellation where there is only the old handler in an | 532 // Test cancellation where there is only the old handler in an |
485 // InterceptingResourceHandler. | 533 // InterceptingResourceHandler. |
486 TEST_F(InterceptingResourceHandlerTest, CancelOldHandler) { | 534 TEST_F(InterceptingResourceHandlerTest, CancelOldHandler) { |
487 ASSERT_EQ(MockResourceLoader::Status::IDLE, | 535 ASSERT_EQ(MockResourceLoader::Status::IDLE, |
488 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel( | 536 mock_loader_->OnResponseCompletedFromExternalOutOfBandCancel( |
489 {net::URLRequestStatus::CANCELED, net::ERR_FAILED})); | 537 {net::URLRequestStatus::CANCELED, net::ERR_FAILED})); |
490 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status()); | 538 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status()); |
491 EXPECT_EQ(net::ERR_FAILED, old_handler_status_.error()); | 539 EXPECT_EQ(net::ERR_FAILED, old_handler_status_.error()); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
573 {net::URLRequestStatus::CANCELED, net::ERR_FAILED})); | 621 {net::URLRequestStatus::CANCELED, net::ERR_FAILED})); |
574 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status()); | 622 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status_.status()); |
575 EXPECT_EQ(net::ERR_FAILED, old_handler_status_.error()); | 623 EXPECT_EQ(net::ERR_FAILED, old_handler_status_.error()); |
576 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status()); | 624 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status()); |
577 EXPECT_EQ(net::ERR_FAILED, new_handler_status.error()); | 625 EXPECT_EQ(net::ERR_FAILED, new_handler_status.error()); |
578 } | 626 } |
579 | 627 |
580 } // namespace | 628 } // namespace |
581 | 629 |
582 } // namespace content | 630 } // namespace content |
OLD | NEW |