Index: content/browser/loader/resource_loader_unittest.cc |
diff --git a/content/browser/loader/resource_loader_unittest.cc b/content/browser/loader/resource_loader_unittest.cc |
index 7aade9492a10ee8d1035e7f61a0dec735f9f530a..6515453be66ce231384b8924578637c0bfd2bba7 100644 |
--- a/content/browser/loader/resource_loader_unittest.cc |
+++ b/content/browser/loader/resource_loader_unittest.cc |
@@ -396,10 +396,16 @@ class ResourceLoaderTest : public testing::Test, |
test_url_request_context_.Init(); |
} |
- // URL with a response body of test_data(). |
- GURL test_direct_url() const { return net::URLRequestTestJob::test_url_1(); } |
+ // URL with a response body of test_data() where reads complete synchronously. |
+ GURL test_sync_url() const { return net::URLRequestTestJob::test_url_1(); } |
- // URL that redirects to test_direct_url(). The ResourceLoader is set up to |
+ // URL with a response body of test_data() where reads complete |
+ // asynchronously. |
+ GURL test_async_url() const { |
+ return net::URLRequestTestJob::test_url_auto_advance_async_reads_1(); |
+ } |
+ |
+ // URL that redirects to test_sync_url(). The ResourceLoader is set up to |
// use this URL by default. |
GURL test_redirect_url() const { |
return net::URLRequestTestJob::test_url_redirect_to_url_1(); |
@@ -522,6 +528,11 @@ class ResourceLoaderTest : public testing::Test, |
void DidFinishLoading(ResourceLoader* loader) override { |
EXPECT_EQ(loader, loader_.get()); |
EXPECT_EQ(0, did_finish_loading_); |
+ |
+ // Shouldn't be in a recursive ResourceHandler call - this is normally where |
+ // the ResourceLoader (And thus the ResourceHandler chain) is destroyed. |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->call_depth()); |
+ |
++did_finish_loading_; |
} |
std::unique_ptr<net::ClientCertStore> CreateClientCertStore( |
@@ -562,7 +573,7 @@ class ClientCertResourceLoaderTest : public ResourceLoaderTest { |
void SetUp() override { |
ResourceLoaderTest::SetUp(); |
// These tests don't expect any redirects. |
- SetUpResourceLoaderForUrl(test_direct_url()); |
+ SetUpResourceLoaderForUrl(test_sync_url()); |
} |
}; |
@@ -744,6 +755,22 @@ TEST_F(ResourceLoaderTest, SyncResourceHandler) { |
EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
} |
+// Same as above, except reads complete asynchronously, and there's no redirect. |
+TEST_F(ResourceLoaderTest, SyncResourceHandlerAsyncReads) { |
+ SetUpResourceLoaderForUrl(test_async_url()); |
+ |
+ loader_->StartRequest(); |
+ raw_ptr_resource_handler_->WaitUntilResponseComplete(); |
+ EXPECT_EQ(1, did_start_request_); |
+ EXPECT_EQ(0, did_received_redirect_); |
+ EXPECT_EQ(1, did_receive_response_); |
+ EXPECT_EQ(1, did_finish_loading_); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ EXPECT_EQ(net::OK, raw_ptr_resource_handler_->final_status().error()); |
+ EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
+} |
+ |
// Test the case the ResourceHandler defers everything. |
TEST_F(ResourceLoaderTest, AsyncResourceHandler) { |
raw_ptr_resource_handler_->set_defer_on_will_start(true); |
@@ -835,6 +862,85 @@ TEST_F(ResourceLoaderTest, AsyncResourceHandler) { |
EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
} |
+// Same as above, except reads complete asynchronously and there's no redirect. |
+TEST_F(ResourceLoaderTest, AsyncResourceHandlerAsyncReads) { |
+ SetUpResourceLoaderForUrl(test_async_url()); |
+ |
+ raw_ptr_resource_handler_->set_defer_on_will_start(true); |
+ raw_ptr_resource_handler_->set_defer_on_response_started(true); |
+ raw_ptr_resource_handler_->set_defer_on_read_completed(true); |
+ raw_ptr_resource_handler_->set_defer_on_read_eof(true); |
+ raw_ptr_resource_handler_->set_defer_on_response_completed(true); |
+ |
+ // Start and run until OnWillStart. |
+ loader_->StartRequest(); |
+ raw_ptr_resource_handler_->WaitUntilDeferred(); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_will_start_called()); |
+ |
+ // Spinning the message loop should not advance the state further. |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(0, did_start_request_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_will_start_called()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_request_redirected_called()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ // Resume and run until OnResponseStarted. |
+ raw_ptr_resource_handler_->Resume(); |
+ raw_ptr_resource_handler_->WaitUntilDeferred(); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_started_called()); |
+ |
+ // Spinning the message loop should not advance the state further. |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, did_receive_response_); |
+ EXPECT_EQ(0, did_finish_loading_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_started_called()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_will_read_called()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ // Resume and run until OnReadCompleted. |
+ raw_ptr_resource_handler_->Resume(); |
+ raw_ptr_resource_handler_->WaitUntilDeferred(); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_completed_called()); |
+ |
+ // Spinning the message loop should not advance the state further. |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_will_read_called()); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_completed_called()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_read_eof()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ // Resume and run until the final 0-byte read, signalling EOF. |
+ raw_ptr_resource_handler_->Resume(); |
+ raw_ptr_resource_handler_->WaitUntilDeferred(); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_eof()); |
+ |
+ // Spinning the message loop should not advance the state further. |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_eof()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_response_completed_called()); |
+ EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
+ |
+ // Resume and run until OnResponseCompleted is called, which again defers the |
+ // request. |
+ raw_ptr_resource_handler_->Resume(); |
+ raw_ptr_resource_handler_->WaitUntilResponseComplete(); |
+ EXPECT_EQ(0, did_finish_loading_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ EXPECT_EQ(net::OK, raw_ptr_resource_handler_->final_status().error()); |
+ EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
+ |
+ // Resume and run until all pending tasks. Note that OnResponseCompleted was |
+ // invoked in the previous section, so can't use RunUntilCompleted(). |
+ raw_ptr_resource_handler_->Resume(); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, did_finish_loading_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ EXPECT_EQ(net::OK, raw_ptr_resource_handler_->final_status().error()); |
+ EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
+} |
+ |
TEST_F(ResourceLoaderTest, SyncCancelOnWillStart) { |
raw_ptr_resource_handler_->set_on_will_start_result(false); |
@@ -925,7 +1031,42 @@ TEST_F(ResourceLoaderTest, SyncCancelOnReadCompleted) { |
} |
TEST_F(ResourceLoaderTest, SyncCancelOnReceivedEof) { |
- raw_ptr_resource_handler_->set_on_on_read_eof_result(false); |
+ raw_ptr_resource_handler_->set_on_read_eof_result(false); |
+ |
+ loader_->StartRequest(); |
+ raw_ptr_resource_handler_->WaitUntilResponseComplete(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, did_receive_response_); |
+ EXPECT_EQ(1, did_finish_loading_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_eof()); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ EXPECT_EQ(net::ERR_ABORTED, |
+ raw_ptr_resource_handler_->final_status().error()); |
+ EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
+} |
+ |
+TEST_F(ResourceLoaderTest, SyncCancelOnAsyncReadCompleted) { |
+ SetUpResourceLoaderForUrl(test_async_url()); |
+ raw_ptr_resource_handler_->set_on_read_completed_result(false); |
+ |
+ loader_->StartRequest(); |
+ raw_ptr_resource_handler_->WaitUntilResponseComplete(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, did_receive_response_); |
+ EXPECT_EQ(1, did_finish_loading_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_completed_called()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_read_eof()); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ EXPECT_EQ(net::ERR_ABORTED, |
+ raw_ptr_resource_handler_->final_status().error()); |
+ EXPECT_LT(0u, raw_ptr_resource_handler_->body().size()); |
+} |
+ |
+TEST_F(ResourceLoaderTest, SyncCancelOnAsyncReceivedEof) { |
+ SetUpResourceLoaderForUrl(test_async_url()); |
+ raw_ptr_resource_handler_->set_on_read_eof_result(false); |
loader_->StartRequest(); |
raw_ptr_resource_handler_->WaitUntilResponseComplete(); |
@@ -1028,6 +1169,41 @@ TEST_F(ResourceLoaderTest, AsyncCancelOnReceivedEof) { |
EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
} |
+TEST_F(ResourceLoaderTest, AsyncCancelOnAsyncReadCompleted) { |
+ SetUpResourceLoaderForUrl(test_async_url()); |
+ raw_ptr_resource_handler_->set_defer_on_read_completed(true); |
+ |
+ loader_->StartRequest(); |
+ raw_ptr_resource_handler_->WaitUntilDeferred(); |
+ raw_ptr_resource_handler_->CancelWithError(net::ERR_FAILED); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, did_receive_response_); |
+ EXPECT_EQ(1, did_finish_loading_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_completed_called()); |
+ EXPECT_EQ(0, raw_ptr_resource_handler_->on_read_eof()); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ EXPECT_EQ(net::ERR_FAILED, raw_ptr_resource_handler_->final_status().error()); |
+ EXPECT_LT(0u, raw_ptr_resource_handler_->body().size()); |
+} |
+ |
+TEST_F(ResourceLoaderTest, AsyncCancelOnAsyncReceivedEof) { |
+ SetUpResourceLoaderForUrl(test_async_url()); |
+ raw_ptr_resource_handler_->set_defer_on_read_eof(true); |
+ |
+ loader_->StartRequest(); |
+ raw_ptr_resource_handler_->WaitUntilDeferred(); |
+ raw_ptr_resource_handler_->CancelWithError(net::ERR_FAILED); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(1, did_receive_response_); |
+ EXPECT_EQ(1, did_finish_loading_); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_read_eof()); |
+ EXPECT_EQ(1, raw_ptr_resource_handler_->on_response_completed_called()); |
+ |
+ EXPECT_EQ(net::ERR_FAILED, raw_ptr_resource_handler_->final_status().error()); |
+ EXPECT_EQ(test_data(), raw_ptr_resource_handler_->body()); |
+} |
+ |
TEST_F(ResourceLoaderTest, RequestFailsOnStart) { |
SetUpResourceLoaderForUrl( |
net::URLRequestFailedJob::GetMockHttpUrlWithFailurePhase( |