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

Unified Diff: content/browser/loader/intercepting_resource_handler_unittest.cc

Issue 2668603003: Make ResourceHandler::OnWillRead able to complete asynchronously. (Closed)
Patch Set: One bot doesn't like 256 day timers. :( Created 3 years, 11 months 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698