| Index: content/browser/loader/mojo_async_resource_handler_unittest.cc
|
| diff --git a/content/browser/loader/mojo_async_resource_handler_unittest.cc b/content/browser/loader/mojo_async_resource_handler_unittest.cc
|
| index 46c4cf05e278d5d7288fccdd2830dcfc85d56581..2a29d61f35740c778053c7a7be643e7cb5bccd49 100644
|
| --- a/content/browser/loader/mojo_async_resource_handler_unittest.cc
|
| +++ b/content/browser/loader/mojo_async_resource_handler_unittest.cc
|
| @@ -585,7 +585,8 @@
|
| contents.append(buffer, read_size);
|
| }
|
| EXPECT_EQ(data, contents);
|
| - EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
|
| + EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
|
| + mock_loader_->status());
|
| }
|
|
|
| TEST_F(MojoAsyncResourceHandlerTest,
|
| @@ -722,10 +723,8 @@
|
|
|
| ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| std::string data(mock_loader_->io_buffer_size(), 'a');
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE,
|
| + ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
|
| mock_loader_->OnReadCompleted(data));
|
| - ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
|
| - mock_loader_->OnWillRead());
|
| url_loader_client_.RunUntilResponseBodyArrived();
|
| ASSERT_TRUE(url_loader_client_.response_body().is_valid());
|
|
|
| @@ -765,122 +764,45 @@
|
|
|
| TEST_F(MojoAsyncResourceHandlerTest, BeginWriteReturnsShouldWaitOnWillRead) {
|
| handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
|
| -
|
| - ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| - EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing());
|
| -
|
| - // Bytes are read one-at-a-time, and each OnWillRead() call completes
|
| - // asynchronously. Note that this loop runs 4 times (once for the terminal
|
| - // '\0').
|
| - const char kReadData[] = "ABC";
|
| - for (const char read_char : kReadData) {
|
| - handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
|
| - ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
|
| - mock_loader_->OnWillRead());
|
| - EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing());
|
| -
|
| - handler_->ResetBeginWriteExpectation();
|
| - handler_->OnWritableForTesting();
|
| - EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
|
| -
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE,
|
| - mock_loader_->OnReadCompleted(std::string(1, read_char)));
|
| - url_loader_client_.RunUntilResponseBodyArrived();
|
| -
|
| - // Keep on trying to read the data until it succeeds.
|
| - while (true) {
|
| - char buffer[16];
|
| - uint32_t read_size = sizeof(buffer);
|
| - MojoResult result =
|
| - mojo::ReadDataRaw(url_loader_client_.response_body(), buffer,
|
| - &read_size, MOJO_READ_DATA_FLAG_NONE);
|
| - if (result != MOJO_RESULT_SHOULD_WAIT) {
|
| - ASSERT_EQ(MOJO_RESULT_OK, result);
|
| - ASSERT_EQ(1u, read_size);
|
| - EXPECT_EQ(read_char, buffer[0]);
|
| - break;
|
| - }
|
| -
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| - }
|
| -
|
| - // Should only count as one in-flight request.
|
| - EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing());
|
| -
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE,
|
| - mock_loader_->OnResponseCompleted(
|
| - net::URLRequestStatus::FromError(net::OK)));
|
| -
|
| - url_loader_client_.RunUntilComplete();
|
| - EXPECT_TRUE(url_loader_client_.has_received_completion());
|
| -
|
| - handler_.reset();
|
| - EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing());
|
| -}
|
| -
|
| -// Same as above, but after the first OnWriteable() call, BeginWrite() indicates
|
| -// should wait again. Unclear if this can happen in practice, but seems best to
|
| -// support it.
|
| + ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| +}
|
| +
|
| TEST_F(MojoAsyncResourceHandlerTest,
|
| - BeginWriteReturnsShouldWaitTwiceOnWillRead) {
|
| + BeginWriteReturnsShouldWaitOnWillReadAndThenReturnsOK) {
|
| handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
|
| -
|
| - ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| - EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing());
|
| -
|
| - // Bytes are read one-at-a-time, and each OnWillRead() call completes
|
| - // asynchronously. Note that this loop runs 4 times (once for the terminal
|
| - // '\0').
|
| - const char kReadData[] = "ABC";
|
| - for (const char read_char : kReadData) {
|
| - handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
|
| - ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
|
| - mock_loader_->OnWillRead());
|
| - EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing());
|
| -
|
| - handler_->OnWritableForTesting();
|
| - EXPECT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
|
| - mock_loader_->status());
|
| -
|
| - handler_->ResetBeginWriteExpectation();
|
| - handler_->OnWritableForTesting();
|
| - EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
|
| -
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE,
|
| - mock_loader_->OnReadCompleted(std::string(1, read_char)));
|
| - url_loader_client_.RunUntilResponseBodyArrived();
|
| -
|
| - // Keep on trying to read the data until it succeeds.
|
| - while (true) {
|
| - char buffer[16];
|
| - uint32_t read_size = sizeof(buffer);
|
| - MojoResult result =
|
| - mojo::ReadDataRaw(url_loader_client_.response_body(), buffer,
|
| - &read_size, MOJO_READ_DATA_FLAG_NONE);
|
| - if (result != MOJO_RESULT_SHOULD_WAIT) {
|
| - ASSERT_EQ(MOJO_RESULT_OK, result);
|
| - ASSERT_EQ(1u, read_size);
|
| - EXPECT_EQ(read_char, buffer[0]);
|
| - break;
|
| - }
|
| -
|
| - base::RunLoop().RunUntilIdle();
|
| - }
|
| - }
|
| -
|
| - // Should only count as one in-flight request.
|
| - EXPECT_EQ(1, rdh_.num_in_flight_requests_for_testing());
|
| -
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE,
|
| - mock_loader_->OnResponseCompleted(
|
| - net::URLRequestStatus::FromError(net::OK)));
|
| -
|
| - url_loader_client_.RunUntilComplete();
|
| - EXPECT_TRUE(url_loader_client_.has_received_completion());
|
| -
|
| - handler_.reset();
|
| - EXPECT_EQ(0, rdh_.num_in_flight_requests_for_testing());
|
| + ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| + size_t written = 0;
|
| + while (true) {
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| + MockResourceLoader::Status result = mock_loader_->OnReadCompleted(
|
| + std::string(mock_loader_->io_buffer_size(), 'X'));
|
| + written += mock_loader_->io_buffer_size();
|
| + if (result == MockResourceLoader::Status::CALLBACK_PENDING)
|
| + break;
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, result);
|
| + }
|
| +
|
| + url_loader_client_.RunUntilResponseBodyArrived();
|
| + ASSERT_TRUE(url_loader_client_.response_body().is_valid());
|
| + handler_->ResetBeginWriteExpectation();
|
| + handler_->OnWritableForTesting();
|
| +
|
| + std::string actual;
|
| + while (actual.size() < written) {
|
| + char buf[16];
|
| + uint32_t read_size = sizeof(buf);
|
| + MojoResult result =
|
| + mojo::ReadDataRaw(url_loader_client_.response_body(), buf, &read_size,
|
| + MOJO_READ_DATA_FLAG_NONE);
|
| + ASSERT_TRUE(result == MOJO_RESULT_OK || result == MOJO_RESULT_SHOULD_WAIT);
|
| + if (result == MOJO_RESULT_OK)
|
| + actual.append(buf, read_size);
|
| + base::RunLoop().RunUntilIdle();
|
| + }
|
| +
|
| + EXPECT_EQ(std::string(written, 'X'), actual);
|
| + EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->status());
|
| }
|
|
|
| TEST_F(MojoAsyncResourceHandlerTest,
|
| @@ -947,7 +869,7 @@
|
| mock_loader_->WaitUntilIdleOrCanceled();
|
| EXPECT_FALSE(url_loader_client_.has_received_completion());
|
| EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->status());
|
| - EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, mock_loader_->error_code());
|
| + EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code());
|
| }
|
|
|
| TEST_F(MojoAsyncResourceHandlerUploadTest, UploadProgressHandling) {
|
| @@ -1020,10 +942,12 @@
|
| TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
|
| OnWillReadWithLongContents) {
|
| ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| -
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| std::string expected;
|
| for (int i = 0; i < 3 * mock_loader_->io_buffer_size() + 2; ++i)
|
| expected += ('A' + i % 26);
|
| +
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0));
|
|
|
| size_t written = 0;
|
| std::string actual;
|
| @@ -1031,7 +955,7 @@
|
| while (written < expected.size() &&
|
| mock_loader_->status() == MockResourceLoader::Status::IDLE) {
|
| ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| - size_t to_be_written =
|
| + const size_t to_be_written =
|
| std::min(static_cast<size_t>(mock_loader_->io_buffer_size()),
|
| expected.size() - written);
|
|
|
| @@ -1069,16 +993,10 @@
|
| ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
|
|
| - // Whether the next OnReadCompleted call or OnWillRead returns the error
|
| - // depends on whether or not an intermediary buffer is being used by the
|
| - // MojoAsyncResourceHandler.
|
| handler_->set_begin_write_expectation(MOJO_RESULT_UNKNOWN);
|
| - MockResourceLoader::Status result = mock_loader_->OnReadCompleted(
|
| - std::string(mock_loader_->io_buffer_size(), 'A'));
|
| - if (result == MockResourceLoader::Status::CANCELED)
|
| - return;
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE, result);
|
| - ASSERT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead());
|
| + ASSERT_EQ(MockResourceLoader::Status::CANCELED,
|
| + mock_loader_->OnReadCompleted(
|
| + std::string(mock_loader_->io_buffer_size(), 'A')));
|
| }
|
|
|
| TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
|
| @@ -1086,32 +1004,21 @@
|
| ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
|
|
| - // Whether the next OnReadCompleted call or OnWillRead call completes
|
| - // asynchronously depends on whether or not an intermediary buffer is being
|
| - // used by the MojoAsyncResourceHandler.
|
| handler_->set_begin_write_expectation(MOJO_RESULT_SHOULD_WAIT);
|
| - MockResourceLoader::Status result = mock_loader_->OnReadCompleted(
|
| - std::string(mock_loader_->io_buffer_size() - 1, 'A'));
|
| - if (result == MockResourceLoader::Status::CALLBACK_PENDING)
|
| - return;
|
| -
|
| ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
|
| - mock_loader_->OnWillRead());
|
| + mock_loader_->OnReadCompleted(
|
| + std::string(mock_loader_->io_buffer_size(), 'A')));
|
| }
|
|
|
| TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest,
|
| BeginWriteFailsOnResume) {
|
| ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnReadCompleted(0));
|
|
|
| while (true) {
|
| - // Whether the next OnReadCompleted call or OnWillRead call completes
|
| - // asynchronously depends on whether or not an intermediary buffer is being
|
| - // used by the MojoAsyncResourceHandler.
|
| - MockResourceLoader::Status result = mock_loader_->OnWillRead();
|
| - if (result == MockResourceLoader::Status::CALLBACK_PENDING)
|
| - break;
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE, result);
|
| - result = mock_loader_->OnReadCompleted(
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| + MockResourceLoader::Status result = mock_loader_->OnReadCompleted(
|
| std::string(mock_loader_->io_buffer_size(), 'A'));
|
| if (result == MockResourceLoader::Status::CALLBACK_PENDING)
|
| break;
|
| @@ -1132,25 +1039,16 @@
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| - if (mock_loader_->status() == MockResourceLoader::Status::IDLE)
|
| - EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader_->OnWillRead());
|
| -
|
| EXPECT_FALSE(url_loader_client_.has_received_completion());
|
| - EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES, mock_loader_->error_code());
|
| + EXPECT_EQ(net::ERR_FAILED, mock_loader_->error_code());
|
| }
|
|
|
| TEST_P(MojoAsyncResourceHandlerWithAllocationSizeTest, CancelWhileWaiting) {
|
| ASSERT_TRUE(CallOnWillStartAndOnResponseStarted());
|
|
|
| while (true) {
|
| - // Whether the next OnReadCompleted call or OnWillRead call completes
|
| - // asynchronously depends on whether or not an intermediary buffer is being
|
| - // used by the MojoAsyncResourceHandler.
|
| - MockResourceLoader::Status result = mock_loader_->OnWillRead();
|
| - if (result == MockResourceLoader::Status::CALLBACK_PENDING)
|
| - break;
|
| - ASSERT_EQ(MockResourceLoader::Status::IDLE, result);
|
| - result = mock_loader_->OnReadCompleted(
|
| + ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader_->OnWillRead());
|
| + MockResourceLoader::Status result = mock_loader_->OnReadCompleted(
|
| std::string(mock_loader_->io_buffer_size(), 'A'));
|
| if (result == MockResourceLoader::Status::CALLBACK_PENDING)
|
| break;
|
|
|