Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Side by Side Diff: net/http/http_transaction_test_util.cc

Issue 2519473002: Fixes the cache lock issue. (Closed)
Patch Set: Initial patch Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698