Index: webkit/appcache/appcache_url_request_job_unittest.cc |
=================================================================== |
--- webkit/appcache/appcache_url_request_job_unittest.cc (revision 51565) |
+++ webkit/appcache/appcache_url_request_job_unittest.cc (working copy) |
@@ -617,6 +617,69 @@ |
TestFinished(); |
} |
+ // DeliverPartialResponse -------------------------------------- |
+ |
+ void DeliverPartialResponse() { |
+ // This test has several async steps. |
+ // 1. Write a small response to response storage. |
+ // 2. Use URLRequest to retrieve it a subset using a range request |
+ // 3. Verify we received what we expected to receive. |
+ PushNextTask(NewRunnableMethod( |
+ this, &AppCacheURLRequestJobTest::VerifyDeliverPartialResponse)); |
+ PushNextTask(NewRunnableMethod( |
+ this, &AppCacheURLRequestJobTest::MakeRangeRequest)); |
+ writer_.reset(service_->storage()->CreateResponseWriter(GURL())); |
+ written_response_id_ = writer_->response_id(); |
+ WriteBasicResponse(); |
+ // Continues async |
+ } |
+ |
+ void MakeRangeRequest() { |
+ AppCacheStorage* storage = service_->storage(); |
+ request_.reset( |
+ new URLRequest(GURL("http://blah/"), url_request_delegate_.get())); |
+ |
+ // Request a range, the 3 middle chars out of 'Hello' |
+ net::HttpRequestHeaders extra_headers; |
+ extra_headers.SetHeader("Range", "bytes= 1-3"); |
+ request_->SetExtraRequestHeaders(extra_headers); |
+ |
+ // Create job with orders to deliver an appcached entry. |
+ scoped_refptr<AppCacheURLRequestJob> job( |
+ new AppCacheURLRequestJob(request_.get(), storage)); |
+ job->DeliverAppCachedResponse( |
+ GURL(), 111, |
+ AppCacheEntry(AppCacheEntry::EXPLICIT, written_response_id_)); |
+ EXPECT_TRUE(job->is_delivering_appcache_response()); |
+ |
+ // Start the request. |
+ EXPECT_FALSE(job->has_been_started()); |
+ mock_factory_job_ = job; |
+ request_->Start(); |
+ EXPECT_FALSE(mock_factory_job_); |
+ EXPECT_TRUE(job->has_been_started()); |
+ // Completion is async. |
+ } |
+ |
+ void VerifyDeliverPartialResponse() { |
+ EXPECT_TRUE(request_->status().is_success()); |
+ EXPECT_EQ(3, url_request_delegate_->amount_received_); |
+ EXPECT_EQ(0, memcmp(kHttpBasicBody + 1, |
+ url_request_delegate_->received_data_->data(), |
+ 3)); |
+ net::HttpResponseHeaders* headers = |
+ url_request_delegate_->received_info_.headers.get(); |
+ EXPECT_EQ(206, headers->response_code()); |
+ EXPECT_EQ(3, headers->GetContentLength()); |
+ int64 range_start, range_end, object_size; |
+ EXPECT_TRUE( |
+ headers->GetContentRange(&range_start, &range_end, &object_size)); |
+ EXPECT_EQ(1, range_start); |
+ EXPECT_EQ(3, range_end); |
+ EXPECT_EQ(5, object_size); |
+ TestFinished(); |
+ } |
+ |
// CancelRequest -------------------------------------- |
void CancelRequest() { |
@@ -732,6 +795,10 @@ |
RunTestOnIOThread(&AppCacheURLRequestJobTest::DeliverLargeAppCachedResponse); |
} |
+TEST_F(AppCacheURLRequestJobTest, DeliverPartialResponse) { |
+ RunTestOnIOThread(&AppCacheURLRequestJobTest::DeliverPartialResponse); |
+} |
+ |
TEST_F(AppCacheURLRequestJobTest, CancelRequest) { |
RunTestOnIOThread(&AppCacheURLRequestJobTest::CancelRequest); |
} |