Chromium Code Reviews| Index: content/browser/loader/intercepting_resource_handler_unittest.cc |
| diff --git a/content/browser/loader/intercepting_resource_handler_unittest.cc b/content/browser/loader/intercepting_resource_handler_unittest.cc |
| index 5e41a48f20607cd26674ac8332760e3b0bdce5e2..8a8611d14a8953a59513f7d83945d69e531f53a7 100644 |
| --- a/content/browser/loader/intercepting_resource_handler_unittest.cc |
| +++ b/content/browser/loader/intercepting_resource_handler_unittest.cc |
| @@ -36,22 +36,6 @@ namespace content { |
| namespace { |
| -class TestResourceController : public ResourceController { |
| - public: |
| - TestResourceController() = default; |
| - void Cancel() override {} |
| - void CancelAndIgnore() override {} |
| - void CancelWithError(int error_code) override {} |
| - void Resume() override { ++resume_calls_; } |
| - |
| - int resume_calls() const { return resume_calls_; } |
| - |
| - private: |
| - int resume_calls_ = 0; |
| - |
| - DISALLOW_COPY_AND_ASSIGN(TestResourceController); |
| -}; |
| - |
| class InterceptingResourceHandlerTest : public testing::Test { |
| public: |
| InterceptingResourceHandlerTest() |
| @@ -383,8 +367,10 @@ TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) { |
| // OnResponseStarted and OnReadCompleted. |
| TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
| const char kData[] = "The data"; |
| - const std::string kPayload = "The long long long long long payload"; |
| - const int kOldHandlerBufferSize = 10; |
| + const char kPayload[] = "The long long long long long payload"; |
| + // This should be less than half the size of the payload, so it needs at least |
| + // 3 reads to receive. |
| + const int kOldHandlerBufferSize = arraysize(kPayload) / 3; |
| // When sending a payload to the old ResourceHandler, the |
| // InterceptingResourceHandler doesn't send a final EOF read. |
| @@ -392,13 +378,35 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
| // entirely? |
| old_handler_->set_expect_eof_read(false); |
| old_handler_->SetBufferSize(kOldHandlerBufferSize); |
| + old_handler_->set_defer_on_will_read(true); |
| old_handler_->set_defer_on_read_completed(true); |
| scoped_refptr<net::IOBuffer> old_buffer = old_handler_->buffer(); |
| // Simulate the MimeSniffingResourceHandler buffering the data. |
| + |
| ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| mock_loader_->OnWillStart(request_->url())); |
| - ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| + // The old handler defers the read. |
| + ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| + mock_loader_->OnWillRead()); |
| + old_handler_->WaitUntilDeferred(); |
| + |
| + EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); |
| + EXPECT_EQ(1, old_handler_->on_will_read_called()); |
| + EXPECT_EQ(0, old_handler_->on_read_completed_called()); |
| + EXPECT_EQ(0, old_handler_->on_response_completed_called()); |
| + |
| + // Defer the next OnWillRead, too. This is needed to test the case where |
| + // 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.
|
| + // handler. |
| + old_handler_->set_defer_on_will_read(true); |
| + |
| + // The old handle resumes the request. |
| + old_handler_->Resume(); |
| + |
| + // Resume() call may do work asynchronously. Wait until that's done. |
| + mock_loader_->WaitUntilIdleOrCanceled(); |
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
| ASSERT_NE(mock_loader_->io_buffer(), old_buffer.get()); |
| @@ -415,6 +423,7 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
| scoped_new_handler->SetBufferSize(1); |
| scoped_new_handler->set_defer_on_will_start(true); |
| scoped_new_handler->set_defer_on_response_started(true); |
| + scoped_new_handler->set_defer_on_will_read(true); |
| scoped_new_handler->set_defer_on_read_completed(true); |
| scoped_new_handler->set_defer_on_response_completed(true); |
| intercepting_handler_->UseNewHandler(std::move(scoped_new_handler), kPayload); |
| @@ -424,6 +433,11 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
| ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| mock_loader_->OnResponseStarted( |
| make_scoped_refptr(new ResourceResponse()))); |
| + old_handler_->WaitUntilDeferred(); |
| + |
| + EXPECT_EQ(1, old_handler_->on_read_completed_called()); |
| + EXPECT_EQ(0, old_handler_->on_response_completed_called()); |
| + EXPECT_EQ(0, new_handler->on_response_started_called()); |
| // The old handler has received the first N bytes of the payload synchronously |
| // where N is the size of the buffer exposed via OnWillRead. |
| @@ -432,10 +446,24 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
| EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); |
| EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); |
| + // Run until the old handler's OnWillRead method defers the request while |
| + // replaying the payload. |
| + old_handler_->Resume(); |
| + old_handler_->WaitUntilDeferred(); |
| + EXPECT_EQ(2, old_handler_->on_will_read_called()); |
| + EXPECT_EQ(1, old_handler_->on_read_completed_called()); |
| + EXPECT_EQ(0, old_handler_->on_response_completed_called()); |
| + EXPECT_EQ(std::string(kPayload, 0, kOldHandlerBufferSize), old_handler_body_); |
| + EXPECT_EQ(std::string(), new_handler_body); |
| + EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status_.status()); |
| + EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); |
| + |
| // Run until the new handler's OnWillStart method defers the request. |
| old_handler_->Resume(); |
| - // Resume() call may do work asynchronously. Wait until that's done. |
| - base::RunLoop().RunUntilIdle(); |
| + new_handler->WaitUntilDeferred(); |
| + |
| + EXPECT_EQ(1, new_handler->on_will_start_called()); |
| + EXPECT_EQ(0, new_handler->on_response_started_called()); |
| ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| mock_loader_->status()); |
| EXPECT_EQ(kPayload, old_handler_body_); |
| @@ -447,7 +475,10 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
| // Run until the new handler's OnResponseStarted method defers the request. |
| new_handler->Resume(); |
| // Resume() call may do work asynchronously. Wait until that's done. |
| - base::RunLoop().RunUntilIdle(); |
| + new_handler->WaitUntilDeferred(); |
| + |
| + EXPECT_EQ(1, new_handler->on_response_started_called()); |
| + EXPECT_EQ(0, new_handler->on_will_read_called()); |
| ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| mock_loader_->status()); |
| EXPECT_EQ(std::string(), new_handler_body); |
| @@ -458,27 +489,44 @@ TEST_F(InterceptingResourceHandlerTest, DeferredOperations) { |
| mock_loader_->WaitUntilIdleOrCanceled(); |
| ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
| - // Data is read, the new handler defers completion of the read. |
| + // Data is read, the new handler defers OnWillRead. |
| ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
| mock_loader_->OnReadCompleted(kData)); |
| + new_handler->WaitUntilDeferred(); |
| + EXPECT_EQ(1, new_handler->on_will_read_called()); |
| + EXPECT_EQ(0, new_handler->on_read_completed_called()); |
| + |
| + // The new ResourceHandler resumes, and then defers again in OnReadCompleted. |
| + new_handler->Resume(); |
| + new_handler->WaitUntilDeferred(); |
| + EXPECT_EQ(1, new_handler->on_will_read_called()); |
| + EXPECT_EQ(1, new_handler->on_read_completed_called()); |
| + EXPECT_EQ(0, new_handler->on_response_completed_called()); |
| EXPECT_EQ("T", new_handler_body); |
| + // New handler resumes again, everything continues synchronously until all |
| + // written data is consumed. |
| new_handler->Resume(); |
| mock_loader_->WaitUntilIdleOrCanceled(); |
| ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status()); |
| EXPECT_EQ(kData, new_handler_body); |
| EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); |
| + EXPECT_EQ(0, new_handler->on_read_eof_called()); |
| + EXPECT_EQ(0, new_handler->on_response_completed_called()); |
| // Final EOF byte is read. |
| ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead()); |
| ASSERT_EQ(MockResourceLoader::Status::IDLE, |
| mock_loader_->OnReadCompleted("")); |
| + EXPECT_EQ(1, new_handler->on_read_eof_called()); |
| + EXPECT_EQ(0, new_handler->on_response_completed_called()); |
| ASSERT_EQ( |
| MockResourceLoader::Status::CALLBACK_PENDING, |
| mock_loader_->OnResponseCompleted({net::URLRequestStatus::SUCCESS, 0})); |
| EXPECT_EQ(net::URLRequestStatus::SUCCESS, new_handler_status.status()); |
| + EXPECT_EQ(1, new_handler->on_response_completed_called()); |
| } |
| // Test cancellation where there is only the old handler in an |