| 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 "net/http/http_transaction_test_util.h" | 5 #include "net/http/http_transaction_test_util.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <unordered_map> | 8 #include <unordered_map> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 mock_transactions.erase(GURL(trans->url).spec()); | 141 mock_transactions.erase(GURL(trans->url).spec()); |
| 142 } | 142 } |
| 143 | 143 |
| 144 MockHttpRequest::MockHttpRequest(const MockTransaction& t) { | 144 MockHttpRequest::MockHttpRequest(const MockTransaction& t) { |
| 145 url = GURL(t.url); | 145 url = GURL(t.url); |
| 146 method = t.method; | 146 method = t.method; |
| 147 extra_headers.AddHeadersFromString(t.request_headers); | 147 extra_headers.AddHeadersFromString(t.request_headers); |
| 148 load_flags = t.load_flags; | 148 load_flags = t.load_flags; |
| 149 } | 149 } |
| 150 | 150 |
| 151 Context::Context() : result(ERR_IO_PENDING) {} |
| 152 Context::~Context() { |
| 153 if (trans.get()) { |
| 154 trans->Orphan(std::move(trans)); |
| 155 } |
| 156 } |
| 157 |
| 151 //----------------------------------------------------------------------------- | 158 //----------------------------------------------------------------------------- |
| 152 | 159 |
| 153 // static | 160 // static |
| 154 int TestTransactionConsumer::quit_counter_ = 0; | 161 int TestTransactionConsumer::quit_counter_ = 0; |
| 155 | 162 |
| 156 TestTransactionConsumer::TestTransactionConsumer( | 163 TestTransactionConsumer::TestTransactionConsumer( |
| 157 RequestPriority priority, | 164 RequestPriority priority, |
| 158 HttpTransactionFactory* factory) | 165 HttpTransactionFactory* factory) |
| 159 : state_(IDLE), error_(OK) { | 166 : state_(IDLE), error_(OK) { |
| 160 // Disregard the error code. | 167 // Disregard the error code. |
| 161 factory->CreateTransaction(priority, &trans_); | 168 factory->CreateTransaction(priority, &trans_); |
| 162 ++quit_counter_; | 169 ++quit_counter_; |
| 163 } | 170 } |
| 164 | 171 |
| 165 TestTransactionConsumer::~TestTransactionConsumer() { | 172 TestTransactionConsumer::~TestTransactionConsumer() { |
| 173 trans_->Orphan(std::move(trans_)); |
| 166 } | 174 } |
| 167 | 175 |
| 168 void TestTransactionConsumer::Start(const HttpRequestInfo* request, | 176 void TestTransactionConsumer::Start(const HttpRequestInfo* request, |
| 169 const NetLogWithSource& net_log) { | 177 const NetLogWithSource& net_log) { |
| 170 state_ = STARTING; | 178 state_ = STARTING; |
| 171 int result = trans_->Start( | 179 int result = trans_->Start( |
| 172 request, base::Bind(&TestTransactionConsumer::OnIOComplete, | 180 request, base::Bind(&TestTransactionConsumer::OnIOComplete, |
| 173 base::Unretained(this)), net_log); | 181 base::Unretained(this)), net_log); |
| 174 if (result != ERR_IO_PENDING) | 182 if (result != ERR_IO_PENDING) |
| 175 DidStart(result); | 183 DidStart(result); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 int MockNetworkTransaction::Start(const HttpRequestInfo* request, | 251 int MockNetworkTransaction::Start(const HttpRequestInfo* request, |
| 244 const CompletionCallback& callback, | 252 const CompletionCallback& callback, |
| 245 const NetLogWithSource& net_log) { | 253 const NetLogWithSource& net_log) { |
| 246 if (request_) | 254 if (request_) |
| 247 return ERR_FAILED; | 255 return ERR_FAILED; |
| 248 | 256 |
| 249 request_ = request; | 257 request_ = request; |
| 250 return StartInternal(request, callback, net_log); | 258 return StartInternal(request, callback, net_log); |
| 251 } | 259 } |
| 252 | 260 |
| 261 void MockNetworkTransaction::Orphan(std::unique_ptr<HttpTransaction> trans) { |
| 262 trans.reset(); |
| 263 } |
| 264 |
| 253 int MockNetworkTransaction::RestartIgnoringLastError( | 265 int MockNetworkTransaction::RestartIgnoringLastError( |
| 254 const CompletionCallback& callback) { | 266 const CompletionCallback& callback) { |
| 255 return ERR_FAILED; | 267 return ERR_FAILED; |
| 256 } | 268 } |
| 257 | 269 |
| 258 int MockNetworkTransaction::RestartWithCertificate( | 270 int MockNetworkTransaction::RestartWithCertificate( |
| 259 X509Certificate* client_cert, | 271 X509Certificate* client_cert, |
| 260 SSLPrivateKey* client_private_key, | 272 SSLPrivateKey* client_private_key, |
| 261 const CompletionCallback& callback) { | 273 const CompletionCallback& callback) { |
| 262 return ERR_FAILED; | 274 return ERR_FAILED; |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 480 void MockNetworkTransaction::SetBeforeHeadersSentCallback( | 492 void MockNetworkTransaction::SetBeforeHeadersSentCallback( |
| 481 const BeforeHeadersSentCallback& callback) {} | 493 const BeforeHeadersSentCallback& callback) {} |
| 482 | 494 |
| 483 int MockNetworkTransaction::ResumeNetworkStart() { | 495 int MockNetworkTransaction::ResumeNetworkStart() { |
| 484 // Should not get here. | 496 // Should not get here. |
| 485 return ERR_FAILED; | 497 return ERR_FAILED; |
| 486 } | 498 } |
| 487 | 499 |
| 488 void MockNetworkTransaction::GetConnectionAttempts( | 500 void MockNetworkTransaction::GetConnectionAttempts( |
| 489 ConnectionAttempts* out) const { | 501 ConnectionAttempts* out) const { |
| 490 NOTIMPLEMENTED(); | 502 return; |
| 491 } | 503 } |
| 492 | 504 |
| 493 void MockNetworkTransaction::CallbackLater(const CompletionCallback& callback, | 505 void MockNetworkTransaction::CallbackLater(const CompletionCallback& callback, |
| 494 int result) { | 506 int result) { |
| 495 base::ThreadTaskRunnerHandle::Get()->PostTask( | 507 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 496 FROM_HERE, base::Bind(&MockNetworkTransaction::RunCallback, | 508 FROM_HERE, base::Bind(&MockNetworkTransaction::RunCallback, |
| 497 weak_factory_.GetWeakPtr(), callback, result)); | 509 weak_factory_.GetWeakPtr(), callback, result)); |
| 498 } | 510 } |
| 499 | 511 |
| 500 void MockNetworkTransaction::RunCallback(const CompletionCallback& callback, | 512 void MockNetworkTransaction::RunCallback(const CompletionCallback& callback, |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 574 if (rv > 0) | 586 if (rv > 0) |
| 575 content.append(buf->data(), rv); | 587 content.append(buf->data(), rv); |
| 576 else if (rv < 0) | 588 else if (rv < 0) |
| 577 return rv; | 589 return rv; |
| 578 } while (rv > 0); | 590 } while (rv > 0); |
| 579 | 591 |
| 580 result->swap(content); | 592 result->swap(content); |
| 581 return OK; | 593 return OK; |
| 582 } | 594 } |
| 583 | 595 |
| 596 // The 1st transaction reads from the network and the subsequent transactions |
| 597 // are able to read from the cache even before the complete response is written |
| 598 // to the cache. |
| 599 int ReadSharedWritersCacheRead(std::vector<Context*>& context_list, |
| 600 std::vector<std::string>& results) { |
| 601 int rv; |
| 602 |
| 603 size_t i = 0; |
| 604 HttpTransaction* trans = nullptr; |
| 605 do { |
| 606 Context* c = context_list.at(i); |
| 607 trans = c->trans.get(); |
| 608 scoped_refptr<IOBuffer> buf(new IOBuffer(256)); |
| 609 rv = trans->Read(buf.get(), 256, c->callback.callback()); |
| 610 if (rv == ERR_IO_PENDING) |
| 611 rv = c->callback.WaitForResult(); |
| 612 |
| 613 if (rv > 0) |
| 614 results.at(i).append(buf->data(), rv); |
| 615 else if (rv < 0) |
| 616 return rv; |
| 617 |
| 618 i = (i == context_list.size() - 1) ? 0 : i + 1; |
| 619 } while (rv > 0); |
| 620 |
| 621 return OK; |
| 622 } |
| 623 |
| 624 // The 1st transaction reads from the network and read is invoked on other |
| 625 // transactions even before the 1st one's io callback is invoked. The other |
| 626 // transactions should have data written in their read buffers as part |
| 627 // of the 1st transaction's callback. |
| 628 int ReadSharedWritersJoinedRead(std::vector<Context*>& context_list, |
| 629 std::vector<std::string>& results) { |
| 630 int rv = 0; |
| 631 do { |
| 632 // Invoke Read for all transactions. |
| 633 std::vector<scoped_refptr<IOBuffer>> buffers(context_list.size()); |
| 634 for (size_t i = 0; i < context_list.size(); i++) { |
| 635 HttpTransaction* trans = context_list[i]->trans.get(); |
| 636 buffers[i] = new IOBuffer(30); |
| 637 rv = trans->Read(buffers[i].get(), 30, |
| 638 context_list[i]->callback.callback()); |
| 639 // Invoking stop caching here should not have any impact since there are |
| 640 // multiple transactions waiting for this resource. |
| 641 if (i == 0) |
| 642 trans->StopCaching(); |
| 643 } |
| 644 if (rv == ERR_IO_PENDING) { |
| 645 Context* ct = *(context_list.begin()); |
| 646 rv = ct->callback.WaitForResult(); |
| 647 } |
| 648 |
| 649 if (rv > 0) { |
| 650 for (size_t i = 0; i < results.size(); i++) { |
| 651 results[i].append(buffers[i]->data(), rv); |
| 652 } |
| 653 } else if (rv < 0) |
| 654 return rv; |
| 655 |
| 656 } while (rv > 0); |
| 657 |
| 658 return OK; |
| 659 } |
| 660 |
| 661 int ReadSharedWritersJoinedReadDoneReading(std::vector<Context*>& context_list, |
| 662 std::vector<std::string>& results) { |
| 663 int rv = 0; |
| 664 int cnt = 0; |
| 665 do { |
| 666 // Invoke Read for all transactions. |
| 667 std::vector<scoped_refptr<IOBuffer>> buffers(context_list.size()); |
| 668 for (size_t i = 0; i < context_list.size(); i++) { |
| 669 HttpTransaction* trans = context_list[i]->trans.get(); |
| 670 buffers[i] = new IOBuffer(30); |
| 671 rv = trans->Read(buffers[i].get(), 30, |
| 672 context_list[i]->callback.callback()); |
| 673 } |
| 674 if (rv == ERR_IO_PENDING) { |
| 675 Context* ct = *(context_list.begin()); |
| 676 rv = ct->callback.WaitForResult(); |
| 677 } |
| 678 |
| 679 if (rv > 0) { |
| 680 for (size_t i = 0; i < results.size(); i++) { |
| 681 results[i].append(buffers[i]->data(), rv); |
| 682 } |
| 683 } else if (rv < 0) |
| 684 return rv; |
| 685 |
| 686 cnt++; |
| 687 if (cnt == 2) { |
| 688 context_list[0]->trans.get()->DoneReading(); |
| 689 } |
| 690 } while (cnt < 2); |
| 691 |
| 692 return OK; |
| 693 } |
| 694 |
| 695 // The 1st transaction reads from the network and read is invoked on other |
| 696 // transactions even before the 1st one's io callback is invoked. Also, the |
| 697 // first transaction is deleted before the io callback is invoked. The other |
| 698 // transactions should have data written in their read buffers as part |
| 699 // of the 1st transaction's callback. |
| 700 int ReadSharedWritersJoinedReadDoomCurrentWriter( |
| 701 std::vector<Context*>& context_list, |
| 702 std::vector<std::string>& results) { |
| 703 int rv = 0; |
| 704 bool first_iter = true; |
| 705 do { |
| 706 // Invoke Read for all transactions. |
| 707 std::vector<scoped_refptr<IOBuffer>> buffers(context_list.size()); |
| 708 for (size_t i = 0; i < context_list.size(); i++) { |
| 709 HttpTransaction* trans = context_list[i]->trans.get(); |
| 710 buffers[i] = new IOBuffer(30); |
| 711 rv = trans->Read(buffers[i].get(), 30, |
| 712 context_list[i]->callback.callback()); |
| 713 } |
| 714 |
| 715 // Delete the 1st transaction. |
| 716 if (first_iter) { |
| 717 Context* c = context_list[0]; |
| 718 context_list.erase(context_list.begin()); |
| 719 delete c; |
| 720 buffers.erase(buffers.begin()); |
| 721 } |
| 722 |
| 723 if (rv == ERR_IO_PENDING) { |
| 724 Context* ct = *(context_list.begin()); |
| 725 rv = ct->callback.WaitForResult(); |
| 726 } |
| 727 |
| 728 if (rv > 0) { |
| 729 for (size_t i = 0; i < context_list.size(); i++) { |
| 730 results[i].append(buffers[i]->data(), rv); |
| 731 } |
| 732 } else if (rv < 0) |
| 733 return rv; |
| 734 |
| 735 first_iter = false; |
| 736 } while (rv > 0); |
| 737 |
| 738 return OK; |
| 739 } |
| 740 |
| 741 int ReadSharedWritersJoinedReadDeleteWaitingWriter( |
| 742 std::vector<Context*>& context_list, |
| 743 std::vector<std::string>& results) { |
| 744 int rv = 0; |
| 745 bool first_iter = true; |
| 746 do { |
| 747 // Invoke Read for all transactions. |
| 748 std::vector<scoped_refptr<IOBuffer>> buffers(context_list.size()); |
| 749 for (size_t i = 0; i < context_list.size(); i++) { |
| 750 HttpTransaction* trans = context_list[i]->trans.get(); |
| 751 buffers[i] = new IOBuffer(30); |
| 752 rv = trans->Read(buffers[i].get(), 30, |
| 753 context_list[i]->callback.callback()); |
| 754 } |
| 755 |
| 756 // Remove a waiting writer transaction. |
| 757 if (first_iter) { |
| 758 auto it = context_list.begin(); |
| 759 it++; |
| 760 if (it != context_list.end()) { |
| 761 Context* c = *it; |
| 762 context_list.erase(it); |
| 763 delete c; |
| 764 auto it1 = buffers.begin(); |
| 765 it1++; |
| 766 buffers.erase(it1); |
| 767 } |
| 768 } |
| 769 |
| 770 if (rv == ERR_IO_PENDING) { |
| 771 Context* ct = *(context_list.begin()); |
| 772 rv = ct->callback.WaitForResult(); |
| 773 } |
| 774 |
| 775 if (rv > 0) { |
| 776 for (size_t i = 0; i < context_list.size(); i++) { |
| 777 results[i].append(buffers[i]->data(), rv); |
| 778 } |
| 779 } else if (rv < 0) |
| 780 return rv; |
| 781 |
| 782 first_iter = false; |
| 783 } while (rv > 0); |
| 784 |
| 785 return OK; |
| 786 } |
| 787 |
| 788 int ReadSharedWritersJoinedReadDeleteIdleWriter( |
| 789 std::vector<Context*>& context_list, |
| 790 std::vector<std::string>& results) { |
| 791 int rv = 0; |
| 792 bool first_iter = true; |
| 793 do { |
| 794 // Invoke Read for all transactions. |
| 795 std::vector<scoped_refptr<IOBuffer>> buffers(context_list.size()); |
| 796 for (size_t i = 0; i < context_list.size(); i++) { |
| 797 HttpTransaction* trans = context_list[i]->trans.get(); |
| 798 buffers[i] = new IOBuffer(30); |
| 799 // Do not invoke Read on the first transaction. |
| 800 if (first_iter && i == 0) |
| 801 continue; |
| 802 rv = trans->Read(buffers[i].get(), 30, |
| 803 context_list[i]->callback.callback()); |
| 804 } |
| 805 |
| 806 // Remove the idle writer transaction. |
| 807 if (first_iter) { |
| 808 auto it = context_list.begin(); |
| 809 Context* c = *it; |
| 810 context_list.erase(it); |
| 811 delete c; |
| 812 auto it1 = buffers.begin(); |
| 813 buffers.erase(it1); |
| 814 } |
| 815 |
| 816 if (rv == ERR_IO_PENDING) { |
| 817 Context* ct = *(context_list.begin()); |
| 818 rv = ct->callback.WaitForResult(); |
| 819 } |
| 820 |
| 821 if (rv > 0) { |
| 822 for (size_t i = 0; i < context_list.size(); i++) { |
| 823 results[i].append(buffers[i]->data(), rv); |
| 824 } |
| 825 } else if (rv < 0) |
| 826 return rv; |
| 827 |
| 828 first_iter = false; |
| 829 } while (rv > 0); |
| 830 |
| 831 return OK; |
| 832 } |
| 833 |
| 584 } // namespace net | 834 } // namespace net |
| OLD | NEW |