OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stack> | 5 #include <stack> |
6 #include <string> | 6 #include <string> |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 void WriteResponseBody(scoped_refptr<IOBuffer> io_buffer, int buf_len) { | 184 void WriteResponseBody(scoped_refptr<IOBuffer> io_buffer, int buf_len) { |
185 EXPECT_FALSE(writer_->IsWritePending()); | 185 EXPECT_FALSE(writer_->IsWritePending()); |
186 write_buffer_ = io_buffer; | 186 write_buffer_ = io_buffer; |
187 expected_write_result_ = buf_len; | 187 expected_write_result_ = buf_len; |
188 writer_->WriteData(write_buffer_.get(), | 188 writer_->WriteData(write_buffer_.get(), |
189 buf_len, | 189 buf_len, |
190 base::Bind(&AppCacheResponseTest::OnWriteComplete, | 190 base::Bind(&AppCacheResponseTest::OnWriteComplete, |
191 base::Unretained(this))); | 191 base::Unretained(this))); |
192 } | 192 } |
193 | 193 |
| 194 void WriteResponseMetadata(scoped_refptr<IOBuffer> io_buffer, int buf_len) { |
| 195 EXPECT_FALSE(metadata_writer_->IsWritePending()); |
| 196 write_buffer_ = io_buffer; |
| 197 expected_write_result_ = buf_len; |
| 198 metadata_writer_->WriteMetadata( |
| 199 write_buffer_.get(), buf_len, |
| 200 base::Bind(&AppCacheResponseTest::OnMetadataWriteComplete, |
| 201 base::Unretained(this))); |
| 202 } |
| 203 |
194 void ReadResponseBody(scoped_refptr<IOBuffer> io_buffer, int buf_len) { | 204 void ReadResponseBody(scoped_refptr<IOBuffer> io_buffer, int buf_len) { |
195 EXPECT_FALSE(reader_->IsReadPending()); | 205 EXPECT_FALSE(reader_->IsReadPending()); |
196 read_buffer_ = io_buffer; | 206 read_buffer_ = io_buffer; |
197 expected_read_result_ = buf_len; | 207 expected_read_result_ = buf_len; |
198 reader_->ReadData(read_buffer_.get(), | 208 reader_->ReadData(read_buffer_.get(), |
199 buf_len, | 209 buf_len, |
200 base::Bind(&AppCacheResponseTest::OnReadComplete, | 210 base::Bind(&AppCacheResponseTest::OnReadComplete, |
201 base::Unretained(this))); | 211 base::Unretained(this))); |
202 } | 212 } |
203 | 213 |
204 // AppCacheResponseReader / Writer completion callbacks | 214 // AppCacheResponseReader / Writer completion callbacks |
205 | 215 |
206 void OnWriteInfoComplete(int result) { | 216 void OnWriteInfoComplete(int result) { |
207 EXPECT_FALSE(writer_->IsWritePending()); | 217 EXPECT_FALSE(writer_->IsWritePending()); |
208 EXPECT_EQ(expected_write_result_, result); | 218 EXPECT_EQ(expected_write_result_, result); |
209 ScheduleNextTask(); | 219 ScheduleNextTask(); |
210 } | 220 } |
211 | 221 |
212 void OnWriteComplete(int result) { | 222 void OnWriteComplete(int result) { |
213 EXPECT_FALSE(writer_->IsWritePending()); | 223 EXPECT_FALSE(writer_->IsWritePending()); |
214 write_callback_was_called_ = true; | 224 write_callback_was_called_ = true; |
215 EXPECT_EQ(expected_write_result_, result); | 225 EXPECT_EQ(expected_write_result_, result); |
216 if (should_delete_writer_in_completion_callback_ && | 226 if (should_delete_writer_in_completion_callback_ && |
217 --writer_deletion_count_down_ == 0) { | 227 --writer_deletion_count_down_ == 0) { |
218 writer_.reset(); | 228 writer_.reset(); |
219 } | 229 } |
220 ScheduleNextTask(); | 230 ScheduleNextTask(); |
221 } | 231 } |
222 | 232 |
| 233 void OnMetadataWriteComplete(int result) { |
| 234 EXPECT_FALSE(metadata_writer_->IsWritePending()); |
| 235 EXPECT_EQ(expected_write_result_, result); |
| 236 ScheduleNextTask(); |
| 237 } |
| 238 |
223 void OnReadInfoComplete(int result) { | 239 void OnReadInfoComplete(int result) { |
224 EXPECT_FALSE(reader_->IsReadPending()); | 240 EXPECT_FALSE(reader_->IsReadPending()); |
225 EXPECT_EQ(expected_read_result_, result); | 241 EXPECT_EQ(expected_read_result_, result); |
226 ScheduleNextTask(); | 242 ScheduleNextTask(); |
227 } | 243 } |
228 | 244 |
229 void OnReadComplete(int result) { | 245 void OnReadComplete(int result) { |
230 EXPECT_FALSE(reader_->IsReadPending()); | 246 EXPECT_FALSE(reader_->IsReadPending()); |
231 read_callback_was_called_ = true; | 247 read_callback_was_called_ = true; |
232 EXPECT_EQ(expected_read_result_, result); | 248 EXPECT_EQ(expected_read_result_, result); |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 EXPECT_EQ(written_response_id_, storage_delegate_->loaded_info_id_); | 382 EXPECT_EQ(written_response_id_, storage_delegate_->loaded_info_id_); |
367 EXPECT_TRUE(storage_delegate_->loaded_info_.get()); | 383 EXPECT_TRUE(storage_delegate_->loaded_info_.get()); |
368 EXPECT_TRUE(CompareHttpResponseInfos( | 384 EXPECT_TRUE(CompareHttpResponseInfos( |
369 write_info_buffer_->http_info.get(), | 385 write_info_buffer_->http_info.get(), |
370 storage_delegate_->loaded_info_->http_response_info())); | 386 storage_delegate_->loaded_info_->http_response_info())); |
371 EXPECT_EQ(basic_response_size(), | 387 EXPECT_EQ(basic_response_size(), |
372 storage_delegate_->loaded_info_->response_data_size()); | 388 storage_delegate_->loaded_info_->response_data_size()); |
373 TestFinished(); | 389 TestFinished(); |
374 } | 390 } |
375 | 391 |
| 392 // Metadata ------------------------------------------------- |
| 393 void Metadata() { |
| 394 // This tests involves multiple async steps. |
| 395 // 1. Write a response headers and body to storage |
| 396 // a. headers |
| 397 // b. body |
| 398 // 2. Write metadata "Metadata First" using AppCacheResponseMetadataWriter. |
| 399 // 3. Check metadata was written. |
| 400 // 4. Write metadata "Second". |
| 401 // 5. Check metadata was written and was truncated . |
| 402 // 6. Write metadata "". |
| 403 // 7. Check metadata was deleted. |
| 404 |
| 405 // Push tasks in reverse order. |
| 406 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_VerifyMetadata, |
| 407 base::Unretained(this), "")); |
| 408 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_LoadResponseInfo, |
| 409 base::Unretained(this))); |
| 410 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_WriteMetadata, |
| 411 base::Unretained(this), "")); |
| 412 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_VerifyMetadata, |
| 413 base::Unretained(this), "Second")); |
| 414 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_LoadResponseInfo, |
| 415 base::Unretained(this))); |
| 416 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_WriteMetadata, |
| 417 base::Unretained(this), "Second")); |
| 418 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_VerifyMetadata, |
| 419 base::Unretained(this), "Metadata First")); |
| 420 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_LoadResponseInfo, |
| 421 base::Unretained(this))); |
| 422 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_WriteMetadata, |
| 423 base::Unretained(this), "Metadata First")); |
| 424 PushNextTask(base::Bind(&AppCacheResponseTest::Metadata_ResetWriter, |
| 425 base::Unretained(this))); |
| 426 writer_.reset(service_->storage()->CreateResponseWriter(GURL(), 0)); |
| 427 written_response_id_ = writer_->response_id(); |
| 428 WriteBasicResponse(); |
| 429 } |
| 430 |
| 431 void Metadata_ResetWriter() { |
| 432 writer_.reset(); |
| 433 ScheduleNextTask(); |
| 434 } |
| 435 |
| 436 void Metadata_WriteMetadata(const char* metadata) { |
| 437 metadata_writer_.reset(service_->storage()->CreateResponseMetadataWriter( |
| 438 0, written_response_id_)); |
| 439 scoped_refptr<IOBuffer> buffer(new WrappedIOBuffer(metadata)); |
| 440 WriteResponseMetadata(buffer.get(), strlen(metadata)); |
| 441 } |
| 442 |
| 443 void Metadata_LoadResponseInfo() { |
| 444 metadata_writer_.reset(); |
| 445 storage_delegate_.reset(new MockStorageDelegate(this)); |
| 446 service_->storage()->LoadResponseInfo(GURL(), 0, written_response_id_, |
| 447 storage_delegate_.get()); |
| 448 } |
| 449 |
| 450 void Metadata_VerifyMetadata(const char* metadata) { |
| 451 EXPECT_EQ(written_response_id_, storage_delegate_->loaded_info_id_); |
| 452 EXPECT_TRUE(storage_delegate_->loaded_info_.get()); |
| 453 const net::HttpResponseInfo* read_head = |
| 454 storage_delegate_->loaded_info_->http_response_info(); |
| 455 EXPECT_TRUE(read_head); |
| 456 const int metadata_size = strlen(metadata); |
| 457 if (metadata_size) { |
| 458 EXPECT_TRUE(read_head->metadata.get()); |
| 459 EXPECT_EQ(metadata_size, read_head->metadata->size()); |
| 460 EXPECT_EQ(0, |
| 461 memcmp(metadata, read_head->metadata->data(), metadata_size)); |
| 462 } else { |
| 463 EXPECT_FALSE(read_head->metadata.get()); |
| 464 } |
| 465 EXPECT_TRUE(CompareHttpResponseInfos( |
| 466 write_info_buffer_->http_info.get(), |
| 467 storage_delegate_->loaded_info_->http_response_info())); |
| 468 EXPECT_EQ(basic_response_size(), |
| 469 storage_delegate_->loaded_info_->response_data_size()); |
| 470 ScheduleNextTask(); |
| 471 } |
| 472 |
376 // AmountWritten ---------------------------------------------------- | 473 // AmountWritten ---------------------------------------------------- |
377 | 474 |
378 void AmountWritten() { | 475 void AmountWritten() { |
379 static const char kHttpHeaders[] = "HTTP/1.0 200 OK\0\0"; | 476 static const char kHttpHeaders[] = "HTTP/1.0 200 OK\0\0"; |
380 std::string raw_headers(kHttpHeaders, arraysize(kHttpHeaders)); | 477 std::string raw_headers(kHttpHeaders, arraysize(kHttpHeaders)); |
381 net::HttpResponseInfo* head = MakeHttpResponseInfo(raw_headers); | 478 net::HttpResponseInfo* head = MakeHttpResponseInfo(raw_headers); |
382 int expected_amount_written = | 479 int expected_amount_written = |
383 GetHttpResponseInfoSize(head) + kNumBlocks * kBlockSize; | 480 GetHttpResponseInfoSize(head) + kNumBlocks * kBlockSize; |
384 | 481 |
385 // Push tasks in reverse order. | 482 // Push tasks in reverse order. |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 scoped_ptr<AppCacheResponseReader> reader_; | 757 scoped_ptr<AppCacheResponseReader> reader_; |
661 scoped_refptr<HttpResponseInfoIOBuffer> read_info_buffer_; | 758 scoped_refptr<HttpResponseInfoIOBuffer> read_info_buffer_; |
662 scoped_refptr<IOBuffer> read_buffer_; | 759 scoped_refptr<IOBuffer> read_buffer_; |
663 int expected_read_result_; | 760 int expected_read_result_; |
664 bool should_delete_reader_in_completion_callback_; | 761 bool should_delete_reader_in_completion_callback_; |
665 int reader_deletion_count_down_; | 762 int reader_deletion_count_down_; |
666 bool read_callback_was_called_; | 763 bool read_callback_was_called_; |
667 | 764 |
668 int64 written_response_id_; | 765 int64 written_response_id_; |
669 scoped_ptr<AppCacheResponseWriter> writer_; | 766 scoped_ptr<AppCacheResponseWriter> writer_; |
| 767 scoped_ptr<AppCacheResponseMetadataWriter> metadata_writer_; |
670 scoped_refptr<HttpResponseInfoIOBuffer> write_info_buffer_; | 768 scoped_refptr<HttpResponseInfoIOBuffer> write_info_buffer_; |
671 scoped_refptr<IOBuffer> write_buffer_; | 769 scoped_refptr<IOBuffer> write_buffer_; |
672 int expected_write_result_; | 770 int expected_write_result_; |
673 bool should_delete_writer_in_completion_callback_; | 771 bool should_delete_writer_in_completion_callback_; |
674 int writer_deletion_count_down_; | 772 int writer_deletion_count_down_; |
675 bool write_callback_was_called_; | 773 bool write_callback_was_called_; |
676 | 774 |
677 static scoped_ptr<base::Thread> io_thread_; | 775 static scoped_ptr<base::Thread> io_thread_; |
678 }; | 776 }; |
679 | 777 |
680 // static | 778 // static |
681 scoped_ptr<base::Thread> AppCacheResponseTest::io_thread_; | 779 scoped_ptr<base::Thread> AppCacheResponseTest::io_thread_; |
682 | 780 |
683 TEST_F(AppCacheResponseTest, ReadNonExistentResponse) { | 781 TEST_F(AppCacheResponseTest, ReadNonExistentResponse) { |
684 RunTestOnIOThread(&AppCacheResponseTest::ReadNonExistentResponse); | 782 RunTestOnIOThread(&AppCacheResponseTest::ReadNonExistentResponse); |
685 } | 783 } |
686 | 784 |
687 TEST_F(AppCacheResponseTest, LoadResponseInfo_Miss) { | 785 TEST_F(AppCacheResponseTest, LoadResponseInfo_Miss) { |
688 RunTestOnIOThread(&AppCacheResponseTest::LoadResponseInfo_Miss); | 786 RunTestOnIOThread(&AppCacheResponseTest::LoadResponseInfo_Miss); |
689 } | 787 } |
690 | 788 |
691 TEST_F(AppCacheResponseTest, LoadResponseInfo_Hit) { | 789 TEST_F(AppCacheResponseTest, LoadResponseInfo_Hit) { |
692 RunTestOnIOThread(&AppCacheResponseTest::LoadResponseInfo_Hit); | 790 RunTestOnIOThread(&AppCacheResponseTest::LoadResponseInfo_Hit); |
693 } | 791 } |
694 | 792 |
| 793 TEST_F(AppCacheResponseTest, Metadata) { |
| 794 RunTestOnIOThread(&AppCacheResponseTest::Metadata); |
| 795 } |
| 796 |
695 TEST_F(AppCacheResponseTest, AmountWritten) { | 797 TEST_F(AppCacheResponseTest, AmountWritten) { |
696 RunTestOnIOThread(&AppCacheResponseTest::AmountWritten); | 798 RunTestOnIOThread(&AppCacheResponseTest::AmountWritten); |
697 } | 799 } |
698 | 800 |
699 TEST_F(AppCacheResponseTest, WriteThenVariouslyReadResponse) { | 801 TEST_F(AppCacheResponseTest, WriteThenVariouslyReadResponse) { |
700 RunTestOnIOThread(&AppCacheResponseTest::WriteThenVariouslyReadResponse); | 802 RunTestOnIOThread(&AppCacheResponseTest::WriteThenVariouslyReadResponse); |
701 } | 803 } |
702 | 804 |
703 TEST_F(AppCacheResponseTest, IOChaining) { | 805 TEST_F(AppCacheResponseTest, IOChaining) { |
704 RunTestOnIOThread(&AppCacheResponseTest::IOChaining); | 806 RunTestOnIOThread(&AppCacheResponseTest::IOChaining); |
705 } | 807 } |
706 | 808 |
707 TEST_F(AppCacheResponseTest, DeleteWithinCallbacks) { | 809 TEST_F(AppCacheResponseTest, DeleteWithinCallbacks) { |
708 RunTestOnIOThread(&AppCacheResponseTest::DeleteWithinCallbacks); | 810 RunTestOnIOThread(&AppCacheResponseTest::DeleteWithinCallbacks); |
709 } | 811 } |
710 | 812 |
711 TEST_F(AppCacheResponseTest, DeleteWithIOPending) { | 813 TEST_F(AppCacheResponseTest, DeleteWithIOPending) { |
712 RunTestOnIOThread(&AppCacheResponseTest::DeleteWithIOPending); | 814 RunTestOnIOThread(&AppCacheResponseTest::DeleteWithIOPending); |
713 } | 815 } |
714 | 816 |
715 } // namespace content | 817 } // namespace content |
OLD | NEW |