Index: content/browser/renderer_host/resource_dispatcher_host_unittest.cc |
diff --git a/content/browser/renderer_host/resource_dispatcher_host_unittest.cc b/content/browser/renderer_host/resource_dispatcher_host_unittest.cc |
index 01fc598d4b374db44b95ff83ebf5f6d388bc8576..f3d71e5f32ebbe51f2b62ed7f904df5bb6ba14bb 100644 |
--- a/content/browser/renderer_host/resource_dispatcher_host_unittest.cc |
+++ b/content/browser/renderer_host/resource_dispatcher_host_unittest.cc |
@@ -265,6 +265,31 @@ class URLRequestTestDelayedStartJob : public net::URLRequestTestJob { |
URLRequestTestDelayedStartJob* |
URLRequestTestDelayedStartJob::list_head_ = NULL; |
+// This class is a variation on URLRequestTestJob in that it |
+// returns IO_pending errors before every read, not just the first one. |
+class URLRequestTestDelayedCompletionJob : public net::URLRequestTestJob { |
+ public: |
+ explicit URLRequestTestDelayedCompletionJob(net::URLRequest* request) |
+ : net::URLRequestTestJob(request) {} |
+ URLRequestTestDelayedCompletionJob(net::URLRequest* request, |
+ bool auto_advance) |
+ : net::URLRequestTestJob(request, auto_advance) {} |
+ URLRequestTestDelayedCompletionJob(net::URLRequest* request, |
+ const std::string& response_headers, |
+ const std::string& response_data, |
+ bool auto_advance) |
+ : net::URLRequestTestJob(request, response_headers, |
+ response_data, auto_advance) {} |
+ |
+ protected: |
+ ~URLRequestTestDelayedCompletionJob() {} |
+ |
+ private: |
+ virtual bool NextReadAsync() OVERRIDE { return true; } |
+}; |
+ |
+ |
+ |
// Associated with an URLRequest to determine if the URLRequest gets deleted. |
class TestUserData : public base::SupportsUserData::Data { |
public: |
@@ -378,6 +403,7 @@ class ResourceDispatcherHostTest : public testing::Test, |
&ResourceDispatcherHostTest::Factory); |
EnsureTestSchemeIsAllowed(); |
delay_start_ = false; |
+ delay_complete_ = false; |
} |
virtual void TearDown() { |
@@ -455,6 +481,8 @@ class ResourceDispatcherHostTest : public testing::Test, |
if (test_fixture_->response_headers_.empty()) { |
if (delay_start_) { |
return new URLRequestTestDelayedStartJob(request); |
+ } else if (delay_complete_) { |
+ return new URLRequestTestDelayedCompletionJob(request); |
} else { |
return new net::URLRequestTestJob(request); |
} |
@@ -463,6 +491,10 @@ class ResourceDispatcherHostTest : public testing::Test, |
return new URLRequestTestDelayedStartJob( |
request, test_fixture_->response_headers_, |
test_fixture_->response_data_, false); |
+ } else if (delay_complete_) { |
+ return new URLRequestTestDelayedCompletionJob( |
+ request, test_fixture_->response_headers_, |
+ test_fixture_->response_data_, false); |
} else { |
return new net::URLRequestTestJob(request, |
test_fixture_->response_headers_, |
@@ -476,6 +508,10 @@ class ResourceDispatcherHostTest : public testing::Test, |
delay_start_ = delay_job_start; |
} |
+ void SetDelayedCompleteJobGeneration(bool delay_job_complete) { |
+ delay_complete_ = delay_job_complete; |
+ } |
+ |
MessageLoopForIO message_loop_; |
BrowserThreadImpl ui_thread_; |
BrowserThreadImpl file_thread_; |
@@ -492,10 +528,12 @@ class ResourceDispatcherHostTest : public testing::Test, |
ResourceType::Type resource_type_; |
static ResourceDispatcherHostTest* test_fixture_; |
static bool delay_start_; |
+ static bool delay_complete_; |
}; |
// Static. |
ResourceDispatcherHostTest* ResourceDispatcherHostTest::test_fixture_ = NULL; |
bool ResourceDispatcherHostTest::delay_start_ = false; |
+bool ResourceDispatcherHostTest::delay_complete_ = false; |
void ResourceDispatcherHostTest::MakeTestRequest(int render_view_id, |
int request_id, |
@@ -1245,8 +1283,16 @@ TEST_F(ResourceDispatcherHostTest, IgnoreCancelForDownloads) { |
response.size())); |
std::string response_data("01234567890123456789\x01foobar"); |
+ // Get past sniffing metrics in the BufferedResourceHandler. Note that |
+ // if we don't get past the sniffing metrics, the result will be that |
+ // the BufferedResourceHandler won't have figured out that it's a download, |
+ // won't have constructed a DownloadResourceHandler, and and the request |
+ // will be successfully canceled below, failing the test. |
+ response_data.resize(1025, ' '); |
+ |
SetResponse(raw_headers, response_data); |
SetResourceType(ResourceType::MAIN_FRAME); |
+ SetDelayedCompleteJobGeneration(true); |
HandleScheme("http"); |
MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); |
@@ -1279,9 +1325,12 @@ TEST_F(ResourceDispatcherHostTest, CancelRequestsForContext) { |
std::string raw_headers(net::HttpUtil::AssembleRawHeaders(response.data(), |
response.size())); |
std::string response_data("01234567890123456789\x01foobar"); |
+ // Get past sniffing metrics. |
+ response_data.resize(1025, ' '); |
SetResponse(raw_headers, response_data); |
SetResourceType(ResourceType::MAIN_FRAME); |
+ SetDelayedCompleteJobGeneration(true); |
HandleScheme("http"); |
MakeTestRequest(render_view_id, request_id, GURL("http://example.com/blah")); |