Index: content/browser/loader/mime_sniffing_resource_handler_unittest.cc |
diff --git a/content/browser/loader/mime_sniffing_resource_handler_unittest.cc b/content/browser/loader/mime_sniffing_resource_handler_unittest.cc |
index 102b4411c7eb491db017a23534b182a4e7d4df06..acadb27eab336c85b150a897ac0581f4aad9c179 100644 |
--- a/content/browser/loader/mime_sniffing_resource_handler_unittest.cc |
+++ b/content/browser/loader/mime_sniffing_resource_handler_unittest.cc |
@@ -16,7 +16,7 @@ |
#include "base/single_thread_task_runner.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "content/browser/loader/intercepting_resource_handler.h" |
-#include "content/browser/loader/resource_controller.h" |
+#include "content/browser/loader/mock_resource_loader.h" |
#include "content/browser/loader/resource_dispatcher_host_impl.h" |
#include "content/browser/loader/test_resource_handler.h" |
#include "content/public/browser/resource_dispatcher_host_delegate.h" |
@@ -153,26 +153,6 @@ class TestFakePluginService : public FakePluginService { |
DISALLOW_COPY_AND_ASSIGN(TestFakePluginService); |
}; |
-class TestResourceController : public ResourceController { |
- public: |
- TestResourceController() : cancel_call_count_(0), resume_call_count_(0) {} |
- |
- void Cancel() override { cancel_call_count_++; } |
- |
- void CancelAndIgnore() override { NOTREACHED(); } |
- |
- void CancelWithError(int error_code) override { NOTREACHED(); } |
- |
- void Resume() override { resume_call_count_++; } |
- |
- int cancel_call_count() const { return cancel_call_count_; } |
- int resume_call_count() const { return resume_call_count_; } |
- |
- private: |
- int cancel_call_count_; |
- int resume_call_count_; |
-}; |
- |
} // namespace |
class MimeSniffingResourceHandlerTest : public testing::Test { |
@@ -257,14 +237,13 @@ MimeSniffingResourceHandlerTest::TestAcceptHeaderSettingWithURLRequest( |
new TestResourceHandler()); |
scoped_test_handler->set_on_response_started_result(false); |
- std::unique_ptr<ResourceHandler> mime_sniffing_handler( |
- new MimeSniffingResourceHandler(std::move(scoped_test_handler), nullptr, |
- nullptr, nullptr, request, |
- REQUEST_CONTEXT_TYPE_UNSPECIFIED)); |
+ MimeSniffingResourceHandler mime_sniffing_handler( |
+ std::move(scoped_test_handler), nullptr, nullptr, nullptr, request, |
+ REQUEST_CONTEXT_TYPE_UNSPECIFIED); |
+ MockResourceLoader mock_loader(&mime_sniffing_handler); |
- bool defer = false; |
- mime_sniffing_handler->OnWillStart(request->url(), &defer); |
- content::RunAllPendingInMessageLoop(); |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnWillStart(request->url())); |
std::string accept_header; |
request->extra_request_headers().GetHeader("Accept", &accept_header); |
@@ -302,23 +281,24 @@ bool MimeSniffingResourceHandlerTest::TestStreamIsIntercepted( |
std::unique_ptr<TestResourceHandler> scoped_test_handler( |
new TestResourceHandler()); |
scoped_test_handler->set_on_response_started_result(false); |
- std::unique_ptr<ResourceHandler> mime_handler(new MimeSniffingResourceHandler( |
+ MimeSniffingResourceHandler mime_sniffing_handler( |
std::unique_ptr<ResourceHandler>(std::move(scoped_test_handler)), &host, |
&plugin_service, intercepting_handler.get(), request.get(), |
- REQUEST_CONTEXT_TYPE_UNSPECIFIED)); |
+ REQUEST_CONTEXT_TYPE_UNSPECIFIED); |
- TestResourceController resource_controller; |
- mime_handler->SetController(&resource_controller); |
+ MockResourceLoader mock_loader(&mime_sniffing_handler); |
scoped_refptr<ResourceResponse> response(new ResourceResponse); |
// The MIME type isn't important but it shouldn't be empty. |
response->head.mime_type = "application/pdf"; |
- bool defer = false; |
- mime_handler->OnWillStart(request->url(), &defer); |
- EXPECT_FALSE(defer); |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnWillStart(request->url())); |
- mime_handler->OnResponseStarted(response.get(), &defer); |
+ mock_loader.OnResponseStarted(std::move(response)); |
+ mock_loader.WaitUntilIdleOrCanceled(); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
content::RunAllPendingInMessageLoop(); |
EXPECT_LT(host.intercepted_as_stream_count(), 2); |
@@ -365,17 +345,15 @@ void MimeSniffingResourceHandlerTest::TestHandlerSniffing( |
scoped_test_handler->set_on_read_completed_result(read_completed); |
scoped_test_handler->set_defer_on_read_completed(defer_read_completed); |
TestResourceHandler* test_handler = scoped_test_handler.get(); |
- std::unique_ptr<MimeSniffingResourceHandler> mime_sniffing_handler( |
- new MimeSniffingResourceHandler(std::move(scoped_test_handler), &host, |
- &plugin_service, |
- intercepting_handler.get(), request.get(), |
- REQUEST_CONTEXT_TYPE_UNSPECIFIED)); |
+ MimeSniffingResourceHandler mime_sniffing_handler( |
+ std::move(scoped_test_handler), &host, &plugin_service, |
+ intercepting_handler.get(), request.get(), |
+ REQUEST_CONTEXT_TYPE_UNSPECIFIED); |
- TestResourceController resource_controller; |
- mime_sniffing_handler->SetController(&resource_controller); |
+ MockResourceLoader mock_loader(&mime_sniffing_handler); |
- bool defer = false; |
- mime_sniffing_handler->OnWillStart(GURL(), &defer); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnWillStart(request->url())); |
// The response should be sniffed. |
scoped_refptr<ResourceResponse> response(new ResourceResponse); |
@@ -383,20 +361,17 @@ void MimeSniffingResourceHandlerTest::TestHandlerSniffing( |
// Simulate the response starting. The MimeSniffingHandler should start |
// buffering, so the return value should always be true. |
- EXPECT_TRUE(mime_sniffing_handler->OnResponseStarted(response.get(), &defer)); |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
- EXPECT_EQ(0, resource_controller.resume_call_count()); |
- EXPECT_FALSE(defer); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnResponseStarted(std::move(response))); |
// Read some data to sniff the mime type. This will ask the next |
// ResourceHandler for a buffer. |
- scoped_refptr<net::IOBuffer> read_buffer; |
- int buf_size = 0; |
- EXPECT_EQ(will_read, |
- mime_sniffing_handler->OnWillRead(&read_buffer, &buf_size, -1)); |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
+ mock_loader.OnWillRead(-1); |
if (!will_read) { |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
+ |
EXPECT_EQ(1, test_handler->on_will_start_called()); |
EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
EXPECT_EQ(0, test_handler->on_response_started_called()); |
@@ -408,21 +383,21 @@ void MimeSniffingResourceHandlerTest::TestHandlerSniffing( |
return; |
} |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
+ |
// Simulate an HTML page. The mime sniffer will identify the MimeType and |
// proceed with replay. |
- char data[] = "!DOCTYPE html\n<head>\n<title>Foo</title>\n</head>"; |
- memcpy(read_buffer->data(), data, sizeof(data)); |
- |
- defer = false; |
- bool return_value = |
- mime_sniffing_handler->OnReadCompleted(sizeof(data), &defer); |
+ const char kData[] = "!DOCTYPE html\n<head>\n<title>Foo</title>\n</head>"; |
+ // Construct StringPiece manually, as the terminal null needs to be included, |
+ // so it's sniffed as binary (Not important that it's sniffed as binary, but |
+ // this gaurantees it's sniffed as something, without waiting for more data). |
+ mock_loader.OnReadCompleted(base::StringPiece(kData, sizeof(kData))); |
// If the next handler cancels the response start, the caller of |
// MimeSniffingHandler::OnReadCompleted should be notified immediately. |
if (!response_started) { |
- EXPECT_FALSE(defer); |
- EXPECT_EQ(response_started, return_value); |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
EXPECT_EQ(1, test_handler->on_will_start_called()); |
EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
@@ -435,52 +410,42 @@ void MimeSniffingResourceHandlerTest::TestHandlerSniffing( |
return; |
} |
- // The replay can be deferred both at response started and read replay |
- // stages. |
- EXPECT_EQ(defer, defer_response_started || defer_read_completed); |
if (defer_response_started) { |
- EXPECT_TRUE(defer); |
- EXPECT_TRUE(return_value); |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader.status()); |
EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, |
- mime_sniffing_handler->state_); |
- mime_sniffing_handler->Resume(); |
+ mime_sniffing_handler.state_); |
+ test_handler->Resume(); |
+ // MimeSniffingResourceHandler may not synchronously resume the request. |
+ base::RunLoop().RunUntilIdle(); |
} |
// The body that was sniffed should be transmitted to the next handler. This |
// may cancel the request. |
if (!read_completed) { |
- if (defer_response_started) { |
- EXPECT_EQ(1, resource_controller.cancel_call_count()); |
- } else { |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
- EXPECT_FALSE(return_value); |
- } |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
+ |
// Process all messages to ensure proper test teardown. |
content::RunAllPendingInMessageLoop(); |
return; |
} |
EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, |
- mime_sniffing_handler->state_); |
+ mime_sniffing_handler.state_); |
// The request may be deferred by the next handler once the read is done. |
if (defer_read_completed) { |
- EXPECT_TRUE(defer); |
- mime_sniffing_handler->Resume(); |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader.status()); |
+ test_handler->Resume(); |
+ // MimeSniffingResourceHandler may not synchronously resume the request. |
+ base::RunLoop().RunUntilIdle(); |
} |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, |
- mime_sniffing_handler->state_); |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
- |
- // Even if the next handler defers the request twice, the |
- // MimeSniffingResourceHandler should only call Resume on its controller |
- // once. |
- if (defer_response_started || defer_read_completed) { |
- EXPECT_EQ(1, resource_controller.resume_call_count()); |
- } else { |
- EXPECT_EQ(0, resource_controller.resume_call_count()); |
- } |
+ mime_sniffing_handler.state_); |
EXPECT_EQ(1, test_handler->on_will_start_called()); |
EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
@@ -530,19 +495,15 @@ void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( |
scoped_test_handler->set_on_read_completed_result(read_completed); |
scoped_test_handler->set_defer_on_read_completed(defer_read_completed); |
TestResourceHandler* test_handler = scoped_test_handler.get(); |
- std::unique_ptr<MimeSniffingResourceHandler> mime_sniffing_handler( |
- new MimeSniffingResourceHandler(std::move(scoped_test_handler), &host, |
- &plugin_service, |
- intercepting_handler.get(), request.get(), |
- REQUEST_CONTEXT_TYPE_UNSPECIFIED)); |
- |
- TestResourceController resource_controller; |
- mime_sniffing_handler->SetController(&resource_controller); |
+ MimeSniffingResourceHandler mime_sniffing_handler( |
+ std::move(scoped_test_handler), &host, &plugin_service, |
+ intercepting_handler.get(), request.get(), |
+ REQUEST_CONTEXT_TYPE_UNSPECIFIED); |
- int expected_resume_calls = 0; |
+ MockResourceLoader mock_loader(&mime_sniffing_handler); |
- bool defer = false; |
- mime_sniffing_handler->OnWillStart(GURL(), &defer); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnWillStart(request->url())); |
// The response should not be sniffed. |
scoped_refptr<ResourceResponse> response(new ResourceResponse); |
@@ -550,12 +511,11 @@ void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( |
// Simulate the response starting. There should be no need for buffering, so |
// the return value should be that of the next handler. |
- EXPECT_EQ(response_started, |
- mime_sniffing_handler->OnResponseStarted(response.get(), &defer)); |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
+ mock_loader.OnResponseStarted(std::move(response)); |
if (!response_started) { |
- EXPECT_FALSE(defer); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
EXPECT_EQ(1, test_handler->on_will_start_called()); |
EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
@@ -568,25 +528,26 @@ void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( |
return; |
} |
- EXPECT_EQ(defer_response_started, defer); |
- if (defer) { |
+ if (defer_response_started) { |
+ ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, |
+ mock_loader.status()); |
EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, |
- mime_sniffing_handler->state_); |
- expected_resume_calls++; |
- mime_sniffing_handler->Resume(); |
+ mime_sniffing_handler.state_); |
+ test_handler->Resume(); |
+ // MimeSniffingResourceHandler may not synchronously resume the request. |
+ base::RunLoop().RunUntilIdle(); |
} |
- EXPECT_EQ(expected_resume_calls, resource_controller.resume_call_count()); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
// The MimeSniffingResourceHandler should be acting as a pass-through |
// ResourceHandler. |
- scoped_refptr<net::IOBuffer> read_buffer; |
- int buf_size = 0; |
- EXPECT_EQ(will_read, |
- mime_sniffing_handler->OnWillRead(&read_buffer, &buf_size, -1)); |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
+ mock_loader.OnWillRead(-1); |
if (!will_read) { |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
+ |
EXPECT_EQ(1, test_handler->on_will_start_called()); |
EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
EXPECT_EQ(1, test_handler->on_response_started_called()); |
@@ -598,10 +559,9 @@ void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( |
return; |
} |
- defer = false; |
- EXPECT_EQ(read_completed, |
- mime_sniffing_handler->OnReadCompleted(2000, &defer)); |
- EXPECT_EQ(0, resource_controller.cancel_call_count()); |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
+ |
+ mock_loader.OnReadCompleted(std::string(2000, 'a')); |
EXPECT_EQ(1, test_handler->on_will_start_called()); |
EXPECT_EQ(0, test_handler->on_request_redirected_called()); |
@@ -610,19 +570,21 @@ void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( |
EXPECT_EQ(1, test_handler->on_read_completed_called()); |
if (!read_completed) { |
- EXPECT_FALSE(defer); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
// Process all messages to ensure proper test teardown. |
content::RunAllPendingInMessageLoop(); |
return; |
} |
- EXPECT_EQ(defer_read_completed, defer); |
- if (defer) { |
- expected_resume_calls++; |
- mime_sniffing_handler->Resume(); |
+ if (mock_loader.status() == MockResourceLoader::Status::CALLBACK_PENDING) { |
+ test_handler->Resume(); |
+ // MimeSniffingResourceHandler may not synchronously resume the request. |
+ base::RunLoop().RunUntilIdle(); |
} |
- EXPECT_EQ(expected_resume_calls, resource_controller.resume_call_count()); |
+ |
+ ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); |
// Process all messages to ensure proper test teardown. |
content::RunAllPendingInMessageLoop(); |
@@ -918,19 +880,17 @@ TEST_F(MimeSniffingResourceHandlerTest, 304Handling) { |
std::unique_ptr<ResourceHandler> intercepting_handler( |
new InterceptingResourceHandler(base::MakeUnique<TestResourceHandler>(), |
nullptr)); |
- std::unique_ptr<ResourceHandler> mime_handler(new MimeSniffingResourceHandler( |
+ MimeSniffingResourceHandler mime_sniffing_handler( |
std::unique_ptr<ResourceHandler>(new TestResourceHandler()), &host, |
&plugin_service, |
static_cast<InterceptingResourceHandler*>(intercepting_handler.get()), |
- request.get(), REQUEST_CONTEXT_TYPE_UNSPECIFIED)); |
+ request.get(), REQUEST_CONTEXT_TYPE_UNSPECIFIED); |
- TestResourceController resource_controller; |
- mime_handler->SetController(&resource_controller); |
+ MockResourceLoader mock_loader(&mime_sniffing_handler); |
// Request starts. |
- bool defer = false; |
- mime_handler->OnWillStart(request->url(), &defer); |
- EXPECT_FALSE(defer); |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnWillStart(request->url())); |
// Simulate a 304 response. |
scoped_refptr<ResourceResponse> response(new ResourceResponse); |
@@ -940,8 +900,8 @@ TEST_F(MimeSniffingResourceHandlerTest, 304Handling) { |
// The response is received. No new ResourceHandler should be created to |
// handle the download. |
- mime_handler->OnResponseStarted(response.get(), &defer); |
- EXPECT_FALSE(defer); |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnResponseStarted(std::move(response))); |
EXPECT_FALSE(host.new_resource_handler()); |
content::RunAllPendingInMessageLoop(); |
@@ -973,18 +933,15 @@ TEST_F(MimeSniffingResourceHandlerTest, FetchShouldDisableMimeSniffing) { |
std::unique_ptr<TestResourceHandler> scoped_test_handler( |
new TestResourceHandler()); |
scoped_test_handler->set_on_response_started_result(false); |
- std::unique_ptr<ResourceHandler> mime_sniffing_handler( |
- new MimeSniffingResourceHandler(std::move(scoped_test_handler), &host, |
- &plugin_service, |
- intercepting_handler.get(), request.get(), |
- REQUEST_CONTEXT_TYPE_FETCH)); |
+ MimeSniffingResourceHandler mime_sniffing_handler( |
+ std::move(scoped_test_handler), &host, &plugin_service, |
+ intercepting_handler.get(), request.get(), REQUEST_CONTEXT_TYPE_FETCH); |
- TestResourceController resource_controller; |
- mime_sniffing_handler->SetController(&resource_controller); |
+ MockResourceLoader mock_loader(&mime_sniffing_handler); |
- bool defer = false; |
- mime_sniffing_handler->OnWillStart(GURL(), &defer); |
- ASSERT_FALSE(defer); |
+ // Request starts. |
+ EXPECT_EQ(MockResourceLoader::Status::IDLE, |
+ mock_loader.OnWillStart(request->url())); |
scoped_refptr<ResourceResponse> response(new ResourceResponse); |
response->head.mime_type = "text/plain"; |
@@ -992,8 +949,9 @@ TEST_F(MimeSniffingResourceHandlerTest, FetchShouldDisableMimeSniffing) { |
// |mime_sniffing_handler->OnResponseStarted| should return false because |
// mime sniffing is disabled and the wrapped resource handler returns false |
// on OnResponseStarted. |
- EXPECT_FALSE( |
- mime_sniffing_handler->OnResponseStarted(response.get(), &defer)); |
+ EXPECT_EQ(MockResourceLoader::Status::CANCELED, |
+ mock_loader.OnResponseStarted(std::move(response))); |
+ EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); |
// Process all messages to ensure proper test teardown. |
content::RunAllPendingInMessageLoop(); |