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

Side by Side Diff: content/browser/loader/intercepting_resource_handler_unittest.cc

Issue 2436163002: When InterceptingResourceHandler swaps in a handler, call OnWillStart. (Closed)
Patch Set: Remove unused value, reorder defer/results (They don't quite match...) Created 4 years, 2 months 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
« no previous file with comments | « content/browser/loader/intercepting_resource_handler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "content/browser/loader/intercepting_resource_handler.h" 5 #include "content/browser/loader/intercepting_resource_handler.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 #include <string> 10 #include <string>
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 44
45 private: 45 private:
46 int resume_calls_ = 0; 46 int resume_calls_ = 0;
47 47
48 DISALLOW_COPY_AND_ASSIGN(TestResourceController); 48 DISALLOW_COPY_AND_ASSIGN(TestResourceController);
49 }; 49 };
50 50
51 // TODO(yhirano): This class should use a similar pattern with 51 // TODO(yhirano): This class should use a similar pattern with
52 // TestResourceHandler in mime_sniffing_resource_handler_unittest.cc. Consider 52 // TestResourceHandler in mime_sniffing_resource_handler_unittest.cc. Consider
53 // unifying the two classes. 53 // unifying the two classes.
54 class TestResourceHandler : public ResourceHandler { 54 class TestResourceHandler : public ResourceHandler {
mmenke 2016/10/21 18:00:49 I want to move this class to a separate file, and
55 public: 55 public:
56 // A test version of a ResourceHandler. |request_status| will be updated when 56 // A test version of a ResourceHandler. |request_status| will be updated when
57 // the response is complete with the final status of the request received by 57 // the response is complete with the final status of the request received by
58 // the handler and |body| will be updated on each OnReadCompleted call. 58 // the handler and |body| will be updated on each OnReadCompleted call.
59 explicit TestResourceHandler(net::URLRequestStatus* request_status, 59 explicit TestResourceHandler(net::URLRequestStatus* request_status,
60 std::string* body) 60 std::string* body)
61 : TestResourceHandler(request_status, 61 : ResourceHandler(nullptr), request_status_(request_status), body_(body) {
62 body, 62 SetBufferSize(2048);
63 true /* on_response_started_result */,
64 true /* on_will_read_result */,
65 true /* on_read_completed_result */) {}
66
67 // This constructor allows to specify return values for OnResponseStarted,
68 // OnWillRead and OnReadCompleted.
69 TestResourceHandler(net::URLRequestStatus* request_status,
70 std::string* body,
71 bool on_response_started_result,
72 bool on_will_read_result,
73 bool on_read_completed_result)
74 : TestResourceHandler(request_status,
75 body,
76 2048 /* buffer_size */,
77 on_response_started_result,
78 on_will_read_result,
79 on_read_completed_result,
80 false /* defer_on_response_started */,
81 false /* defer_on_response_completed */,
82 false /* defer_on_read_completed */) {}
83
84 TestResourceHandler(net::URLRequestStatus* request_status,
85 std::string* body,
86 size_t buffer_size,
87 bool on_response_started_result,
88 bool on_will_read_result,
89 bool on_read_completed_result,
90 bool defer_on_response_started,
91 bool defer_on_read_completed,
92 bool defer_on_response_completed)
93 : ResourceHandler(nullptr),
94 request_status_(request_status),
95 body_(body),
96 buffer_(new net::IOBuffer(buffer_size)),
97 buffer_size_(buffer_size),
98 on_response_started_result_(on_response_started_result),
99 on_will_read_result_(on_will_read_result),
100 on_read_completed_result_(on_read_completed_result),
101 defer_on_response_started_(defer_on_response_started),
102 defer_on_read_completed_(defer_on_read_completed),
103 defer_on_response_completed_(defer_on_response_completed) {
104 memset(buffer_->data(), '\0', buffer_size_);
105 } 63 }
106 64
107 ~TestResourceHandler() override {} 65 ~TestResourceHandler() override {}
108 66
109 void SetController(ResourceController* controller) override {} 67 void SetController(ResourceController* controller) override {}
110 68
111 bool OnRequestRedirected(const net::RedirectInfo& redirect_info, 69 bool OnRequestRedirected(const net::RedirectInfo& redirect_info,
112 ResourceResponse* response, 70 ResourceResponse* response,
113 bool* defer) override { 71 bool* defer) override {
114 NOTREACHED(); 72 NOTREACHED();
115 return false; 73 return false;
116 } 74 }
117 75
118 bool OnResponseStarted(ResourceResponse* response, bool* defer) override { 76 bool OnResponseStarted(ResourceResponse* response, bool* defer) override {
119 EXPECT_FALSE(is_completed_); 77 EXPECT_TRUE(will_start_called_);
78 EXPECT_FALSE(response_started_called_);
79 EXPECT_FALSE(response_completed_called_);
80 response_started_called_ = true;
81
120 if (!on_response_started_result_) 82 if (!on_response_started_result_)
121 return false; 83 return false;
122 *defer = defer_on_response_started_; 84 *defer = defer_on_response_started_;
123 defer_on_response_started_ = false; 85 defer_on_response_started_ = false;
124 return true; 86 return true;
125 } 87 }
126 88
127 bool OnWillStart(const GURL& url, bool* defer) override { 89 bool OnWillStart(const GURL& url, bool* defer) override {
128 EXPECT_FALSE(is_completed_); 90 EXPECT_FALSE(response_started_called_);
91 EXPECT_FALSE(will_start_called_);
92 EXPECT_FALSE(response_completed_called_);
93 will_start_called_ = true;
94
95 if (!on_will_start_result_)
96 return false;
97
98 *defer = defer_on_will_start_;
129 return true; 99 return true;
130 } 100 }
131 101
132 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf, 102 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
133 int* buf_size, 103 int* buf_size,
134 int min_size) override { 104 int min_size) override {
135 EXPECT_FALSE(is_completed_); 105 EXPECT_FALSE(response_completed_called_);
106
136 *buf = buffer_; 107 *buf = buffer_;
137 *buf_size = buffer_size_; 108 *buf_size = buffer_size_;
138 memset(buffer_->data(), '\0', buffer_size_); 109 memset(buffer_->data(), '\0', buffer_size_);
139 return on_will_read_result_; 110 return on_will_read_result_;
140 } 111 }
141 112
142 bool OnReadCompleted(int bytes_read, bool* defer) override { 113 bool OnReadCompleted(int bytes_read, bool* defer) override {
143 EXPECT_FALSE(is_completed_); 114 EXPECT_TRUE(will_start_called_);
115 EXPECT_TRUE(response_started_called_);
116 EXPECT_FALSE(response_completed_called_);
117
144 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_); 118 EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_);
145 body_->append(buffer_->data(), bytes_read); 119 body_->append(buffer_->data(), bytes_read);
146 if (!on_read_completed_result_) 120 if (!on_read_completed_result_)
147 return false; 121 return false;
148 *defer = defer_on_read_completed_; 122 *defer = defer_on_read_completed_;
149 defer_on_read_completed_ = false; 123 defer_on_read_completed_ = false;
150 return true; 124 return true;
151 } 125 }
152 126
153 void OnResponseCompleted(const net::URLRequestStatus& status, 127 void OnResponseCompleted(const net::URLRequestStatus& status,
154 bool* defer) override { 128 bool* defer) override {
155 EXPECT_FALSE(is_completed_); 129 EXPECT_FALSE(response_completed_called_);
156 is_completed_ = true; 130 response_completed_called_ = true;
157 *request_status_ = status; 131 *request_status_ = status;
158 *defer = defer_on_response_completed_; 132 *defer = defer_on_response_completed_;
159 defer_on_response_completed_ = false; 133 defer_on_response_completed_ = false;
160 } 134 }
161 135
162 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); } 136 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); }
163 137
164 scoped_refptr<net::IOBuffer> buffer() const { return buffer_; } 138 scoped_refptr<net::IOBuffer> buffer() const { return buffer_; }
165 139
140 // Sets the size of the read buffer returned by OnWillRead. Releases reference
141 // to previous read buffer.
142 void SetBufferSize(int buffer_size) {
143 buffer_ = new net::IOBuffer(buffer_size);
144 buffer_size_ = buffer_size;
145 memset(buffer_->data(), '\0', buffer_size);
146 }
147
148 void set_on_will_start_result(bool on_will_start_result) {
149 on_will_start_result_ = on_will_start_result;
150 }
151 void set_on_response_started_result(bool on_response_started_result) {
152 on_response_started_result_ = on_response_started_result;
153 }
154 void set_on_will_read_result(bool on_will_read_result) {
155 on_will_read_result_ = on_will_read_result;
156 }
157 void set_on_read_completed_result(bool on_read_completed_result) {
158 on_read_completed_result_ = on_read_completed_result;
159 }
160
161 void set_defer_on_will_start(bool defer_on_will_start) {
162 defer_on_will_start_ = defer_on_will_start;
163 }
164 void set_defer_on_response_started(bool defer_on_response_started) {
165 defer_on_response_started_ = defer_on_response_started;
166 }
167 void set_defer_on_read_completed(bool defer_on_read_completed) {
168 defer_on_read_completed_ = defer_on_read_completed;
169 }
170 void set_defer_on_response_completed(bool defer_on_response_completed) {
171 defer_on_response_completed_ = defer_on_response_completed;
172 }
173
166 private: 174 private:
167 net::URLRequestStatus* request_status_; 175 net::URLRequestStatus* request_status_;
168 std::string* body_; 176 std::string* body_;
169 scoped_refptr<net::IOBuffer> buffer_; 177 scoped_refptr<net::IOBuffer> buffer_;
170 const size_t buffer_size_; 178 size_t buffer_size_;
171 const bool on_response_started_result_; 179
172 const bool on_will_read_result_; 180 bool on_will_start_result_ = true;
173 const bool on_read_completed_result_; 181 bool on_response_started_result_ = true;
174 bool defer_on_response_started_; 182 bool on_will_read_result_ = true;
175 bool defer_on_read_completed_; 183 bool on_read_completed_result_ = true;
176 bool defer_on_response_completed_; 184
177 bool is_completed_ = false; 185 bool defer_on_will_start_ = false;
186 bool defer_on_response_started_ = false;
187 bool defer_on_read_completed_ = false;
188 bool defer_on_response_completed_ = false;
189
190 bool will_start_called_ = false;
191 bool response_started_called_ = false;
192 bool response_completed_called_ = false;
178 193
179 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler); 194 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler);
180 }; 195 };
181 196
182 class InterceptingResourceHandlerTest : public testing::Test { 197 class InterceptingResourceHandlerTest : public testing::Test {
183 public: 198 public:
184 InterceptingResourceHandlerTest() {} 199 InterceptingResourceHandlerTest() {}
185 200
186 private: 201 private:
187 TestBrowserThreadBundle thread_bundle_; 202 TestBrowserThreadBundle thread_bundle_;
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 0, // render_frame_id 461 0, // render_frame_id
447 true, // is_main_frame 462 true, // is_main_frame
448 false, // parent_is_main_frame 463 false, // parent_is_main_frame
449 true, // allow_download 464 true, // allow_download
450 true, // is_async 465 true, // is_async
451 false); // is_using_lofi 466 false); // is_using_lofi
452 467
453 net::URLRequestStatus old_handler_status; 468 net::URLRequestStatus old_handler_status;
454 std::string old_handler_body; 469 std::string old_handler_body;
455 std::unique_ptr<TestResourceHandler> old_handler( 470 std::unique_ptr<TestResourceHandler> old_handler(
456 new TestResourceHandler(&old_handler_status, &old_handler_body, 471 new TestResourceHandler(&old_handler_status, &old_handler_body));
457 true, // on_response_started 472 old_handler->set_on_will_read_result(false);
458 false, // on_will_read
459 true)); // on_read_completed
460 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 473 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
461 new InterceptingResourceHandler(std::move(old_handler), request.get())); 474 new InterceptingResourceHandler(std::move(old_handler), request.get()));
462 475
463 scoped_refptr<ResourceResponse> response(new ResourceResponse); 476 scoped_refptr<ResourceResponse> response(new ResourceResponse);
464 477
465 // Simulate the MimeSniffingResourceHandler buffering the data. The old 478 // Simulate the MimeSniffingResourceHandler buffering the data. The old
466 // handler should tell the caller to fail. 479 // handler should tell the caller to fail.
467 scoped_refptr<net::IOBuffer> read_buffer; 480 scoped_refptr<net::IOBuffer> read_buffer;
468 int buf_size = 0; 481 int buf_size = 0;
469 bool defer = false; 482 bool defer = false;
470 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 483 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
471 EXPECT_FALSE(defer); 484 EXPECT_FALSE(defer);
472 EXPECT_FALSE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 485 EXPECT_FALSE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
473 } 486 }
474 487
488 // Tests that the handler behaves properly if the new handler fails in
489 // OnWillStart.
490 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsOnWillStart) {
491 net::URLRequestContext context;
492 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
493 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
494 ResourceRequestInfo::AllocateForTesting(request.get(),
495 RESOURCE_TYPE_MAIN_FRAME,
496 nullptr, // context
497 0, // render_process_id
498 0, // render_view_id
499 0, // render_frame_id
500 true, // is_main_frame
501 false, // parent_is_main_frame
502 true, // allow_download
503 true, // is_async
504 false); // is_using_lofi
505
506 net::URLRequestStatus old_handler_status;
507 std::string old_handler_body;
508 std::unique_ptr<TestResourceHandler> old_handler(
509 new TestResourceHandler(&old_handler_status, &old_handler_body));
510 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
511 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
512 new InterceptingResourceHandler(std::move(old_handler), request.get()));
513
514 scoped_refptr<ResourceResponse> response(new ResourceResponse);
515
516 // Simulate the MimeSniffingResourceHandler buffering the data.
517 scoped_refptr<net::IOBuffer> read_buffer;
518 int buf_size = 0;
519 bool defer = false;
520 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
521 EXPECT_FALSE(defer);
522 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
523
524 const char kData[] = "The data";
525 ASSERT_NE(read_buffer.get(), old_buffer.get());
526 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
527 memcpy(read_buffer->data(), kData, sizeof(kData));
528
529 // Simulate the MimeSniffingResourceHandler asking the
530 // InterceptingResourceHandler to switch to a new handler.
531 net::URLRequestStatus new_handler_status;
532 std::string new_handler_body;
533 std::unique_ptr<TestResourceHandler> new_handler(
534 new TestResourceHandler(&new_handler_status, &new_handler_body));
535 new_handler->set_on_will_start_result(false);
536 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
537
538 // The response is received. The new ResourceHandler should tell us to fail.
539 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
540 EXPECT_FALSE(defer);
541 }
542
475 // Tests that the handler behaves properly if the new handler fails response 543 // Tests that the handler behaves properly if the new handler fails response
476 // started. 544 // started.
477 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) { 545 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) {
478 net::URLRequestContext context; 546 net::URLRequestContext context;
479 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 547 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
480 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 548 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
481 ResourceRequestInfo::AllocateForTesting(request.get(), 549 ResourceRequestInfo::AllocateForTesting(request.get(),
482 RESOURCE_TYPE_MAIN_FRAME, 550 RESOURCE_TYPE_MAIN_FRAME,
483 nullptr, // context 551 nullptr, // context
484 0, // render_process_id 552 0, // render_process_id
(...skipping 26 matching lines...) Expand all
511 const char kData[] = "The data"; 579 const char kData[] = "The data";
512 ASSERT_NE(read_buffer.get(), old_buffer.get()); 580 ASSERT_NE(read_buffer.get(), old_buffer.get());
513 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 581 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
514 memcpy(read_buffer->data(), kData, sizeof(kData)); 582 memcpy(read_buffer->data(), kData, sizeof(kData));
515 583
516 // Simulate the MimeSniffingResourceHandler asking the 584 // Simulate the MimeSniffingResourceHandler asking the
517 // InterceptingResourceHandler to switch to a new handler. 585 // InterceptingResourceHandler to switch to a new handler.
518 net::URLRequestStatus new_handler_status; 586 net::URLRequestStatus new_handler_status;
519 std::string new_handler_body; 587 std::string new_handler_body;
520 std::unique_ptr<TestResourceHandler> new_handler( 588 std::unique_ptr<TestResourceHandler> new_handler(
521 new TestResourceHandler(&new_handler_status, &new_handler_body, 589 new TestResourceHandler(&new_handler_status, &new_handler_body));
522 false, // on_response_started 590 new_handler->set_on_response_started_result(false);
523 true, // on_will_read
524 true)); // on_read_completed
525 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 591 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
526 592
527 // The response is received. The new ResourceHandler should tell us to fail. 593 // The response is received. The new ResourceHandler should tell us to fail.
528 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 594 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
529 EXPECT_FALSE(defer); 595 EXPECT_FALSE(defer);
530 } 596 }
531 597
532 // Tests that the handler behaves properly if the new handler fails will read. 598 // Tests that the handler behaves properly if the new handler fails will read.
533 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) { 599 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) {
534 net::URLRequestContext context; 600 net::URLRequestContext context;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 const char kData[] = "The data"; 633 const char kData[] = "The data";
568 ASSERT_NE(read_buffer.get(), old_buffer.get()); 634 ASSERT_NE(read_buffer.get(), old_buffer.get());
569 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 635 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
570 memcpy(read_buffer->data(), kData, sizeof(kData)); 636 memcpy(read_buffer->data(), kData, sizeof(kData));
571 637
572 // Simulate the MimeSniffingResourceHandler asking the 638 // Simulate the MimeSniffingResourceHandler asking the
573 // InterceptingResourceHandler to switch to a new handler. 639 // InterceptingResourceHandler to switch to a new handler.
574 net::URLRequestStatus new_handler_status; 640 net::URLRequestStatus new_handler_status;
575 std::string new_handler_body; 641 std::string new_handler_body;
576 std::unique_ptr<TestResourceHandler> new_handler( 642 std::unique_ptr<TestResourceHandler> new_handler(
577 new TestResourceHandler(&new_handler_status, &new_handler_body, 643 new TestResourceHandler(&new_handler_status, &new_handler_body));
578 true, // on_response_started 644 new_handler->set_on_will_read_result(false);
579 false, // on_will_read
580 true)); // on_read_completed
581 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 645 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
582 646
583 // The response is received. The new handler should not have been asked to 647 // The response is received. The new handler should not have been asked to
584 // read yet. 648 // read yet.
585 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 649 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
586 EXPECT_FALSE(defer); 650 EXPECT_FALSE(defer);
587 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); 651 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
588 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); 652 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
589 653
590 // The read is replayed by the MimeSniffingResourceHandler. The new 654 // The read is replayed by the MimeSniffingResourceHandler. The new
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 const char kData[] = "The data"; 696 const char kData[] = "The data";
633 ASSERT_NE(read_buffer.get(), old_buffer.get()); 697 ASSERT_NE(read_buffer.get(), old_buffer.get());
634 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData)); 698 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
635 memcpy(read_buffer->data(), kData, sizeof(kData)); 699 memcpy(read_buffer->data(), kData, sizeof(kData));
636 700
637 // Simulate the MimeSniffingResourceHandler asking the 701 // Simulate the MimeSniffingResourceHandler asking the
638 // InterceptingResourceHandler to switch to a new handler. 702 // InterceptingResourceHandler to switch to a new handler.
639 net::URLRequestStatus new_handler_status; 703 net::URLRequestStatus new_handler_status;
640 std::string new_handler_body; 704 std::string new_handler_body;
641 std::unique_ptr<TestResourceHandler> new_handler( 705 std::unique_ptr<TestResourceHandler> new_handler(
642 new TestResourceHandler(&new_handler_status, &new_handler_body, 706 new TestResourceHandler(&new_handler_status, &new_handler_body));
643 true, // on_response_started 707 new_handler->set_on_read_completed_result(false);
644 true, // on_will_read
645 false)); // on_read_completed
646 intercepting_handler->UseNewHandler(std::move(new_handler), std::string()); 708 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
647 709
648 // The response is received. 710 // The response is received.
649 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 711 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
650 EXPECT_FALSE(defer); 712 EXPECT_FALSE(defer);
651 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); 713 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
652 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error()); 714 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
653 715
654 // The read is replayed by the MimeSniffingResourceHandler. The new handler 716 // The read is replayed by the MimeSniffingResourceHandler. The new handler
655 // should tell the caller to fail. 717 // should tell the caller to fail.
(...skipping 19 matching lines...) Expand all
675 true, // allow_download 737 true, // allow_download
676 true, // is_async 738 true, // is_async
677 false); // is_using_lofi 739 false); // is_using_lofi
678 740
679 std::unique_ptr<TestResourceController> resource_controller = 741 std::unique_ptr<TestResourceController> resource_controller =
680 base::MakeUnique<TestResourceController>(); 742 base::MakeUnique<TestResourceController>();
681 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING, 743 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING,
682 0}; 744 0};
683 std::string old_handler_body; 745 std::string old_handler_body;
684 std::unique_ptr<TestResourceHandler> old_handler( 746 std::unique_ptr<TestResourceHandler> old_handler(
685 new TestResourceHandler(&old_handler_status, &old_handler_body, 747 new TestResourceHandler(&old_handler_status, &old_handler_body));
686 10, // buffer_size 748 old_handler->SetBufferSize(10);
687 true, // on_response_started 749 old_handler->set_defer_on_read_completed(true);
688 true, // on_will_read 750
689 true, // on_read_completed
690 false, // defer_on_response_started
691 true, // defer_on_read_completed
692 false)); // defer_on_response_completed
693 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer(); 751 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
694 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 752 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
695 new InterceptingResourceHandler(std::move(old_handler), request.get())); 753 new InterceptingResourceHandler(std::move(old_handler), request.get()));
696 intercepting_handler->SetController(resource_controller.get()); 754 intercepting_handler->SetController(resource_controller.get());
697 755
698 scoped_refptr<ResourceResponse> response(new ResourceResponse); 756 scoped_refptr<ResourceResponse> response(new ResourceResponse);
699 757
700 // Simulate the MimeSniffingResourceHandler buffering the data. 758 // Simulate the MimeSniffingResourceHandler buffering the data.
701 scoped_refptr<net::IOBuffer> read_buffer; 759 scoped_refptr<net::IOBuffer> read_buffer;
702 int buf_size = 0; 760 int buf_size = 0;
703 bool defer = false; 761 bool defer = false;
704 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 762 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
705 EXPECT_FALSE(defer); 763 EXPECT_FALSE(defer);
706 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 764 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
707 765
708 const char kData[] = "The data"; 766 const char kData[] = "The data";
709 ASSERT_NE(read_buffer.get(), old_buffer.get()); 767 ASSERT_NE(read_buffer.get(), old_buffer.get());
710 ASSERT_GT(static_cast<size_t>(buf_size), strlen(kData)); 768 ASSERT_GT(static_cast<size_t>(buf_size), strlen(kData));
711 memcpy(read_buffer->data(), kData, strlen(kData)); 769 memcpy(read_buffer->data(), kData, strlen(kData));
712 770
713 // Simulate the MimeSniffingResourceHandler asking the 771 // Simulate the MimeSniffingResourceHandler asking the
714 // InterceptingResourceHandler to switch to a new handler. 772 // InterceptingResourceHandler to switch to a new handler.
715 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, 773 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
716 0}; 774 0};
717 775
718 std::string new_handler_body; 776 std::string new_handler_body;
719 const std::string kPayload = "The long long long long long payload"; 777 const std::string kPayload = "The long long long long long payload";
720 ASSERT_GT(kPayload.size(), static_cast<size_t>(buf_size)); 778 ASSERT_GT(kPayload.size(), static_cast<size_t>(buf_size));
721 std::unique_ptr<TestResourceHandler> new_handler( 779 std::unique_ptr<TestResourceHandler> new_handler(
722 new TestResourceHandler(&new_handler_status, &new_handler_body, 780 new TestResourceHandler(&new_handler_status, &new_handler_body));
723 1, // buffer_size 781 new_handler->SetBufferSize(1);
724 true, // on_response_started 782 new_handler->set_defer_on_will_start(true);
725 true, // on_will_read 783 new_handler->set_defer_on_response_started(true);
726 true, // on_read_completed 784 new_handler->set_defer_on_read_completed(true);
727 true, // defer_on_response_started 785 new_handler->set_defer_on_response_completed(true);
728 true, // defer_on_read_completed
729 true)); // defer_on_response_completed
730 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload); 786 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
731 // The response is received. 787
788 // The response is received, and then deferred by the old handler's
789 // OnReadCompleted method.
732 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 790 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
733 ASSERT_TRUE(defer); 791 ASSERT_TRUE(defer);
734 792
735 // The old handler has received the first N bytes of the payload synchronously 793 // The old handler has received the first N bytes of the payload synchronously
736 // where N is the size of the buffer exposed via OnWillRead. 794 // where N is the size of the buffer exposed via OnWillRead.
737 EXPECT_EQ("The long l", old_handler_body); 795 EXPECT_EQ("The long l", old_handler_body);
738 EXPECT_EQ(std::string(), new_handler_body); 796 EXPECT_EQ(std::string(), new_handler_body);
739 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::IO_PENDING); 797 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::IO_PENDING);
740 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING); 798 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
741 799
800 // Run until the new handler's OnWillStart method defers the request.
742 intercepting_handler->Resume(); 801 intercepting_handler->Resume();
743 EXPECT_EQ(0, resource_controller->resume_calls()); 802 EXPECT_EQ(0, resource_controller->resume_calls());
744 EXPECT_EQ(kPayload, old_handler_body); 803 EXPECT_EQ(kPayload, old_handler_body);
745 EXPECT_EQ(std::string(), new_handler_body); 804 EXPECT_EQ(std::string(), new_handler_body);
746 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS); 805 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
747 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING); 806 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
748 807
808 // Run until the new handler's OnResponseStarted method defers the request.
809 intercepting_handler->Resume();
810 EXPECT_EQ(0, resource_controller->resume_calls());
811 EXPECT_EQ(std::string(), new_handler_body);
812 EXPECT_EQ(old_handler_status.status(), net::URLRequestStatus::SUCCESS);
813 EXPECT_EQ(new_handler_status.status(), net::URLRequestStatus::IO_PENDING);
814
815 // Resuming should finally call back into the ResourceController.
749 intercepting_handler->Resume(); 816 intercepting_handler->Resume();
750 EXPECT_EQ(1, resource_controller->resume_calls()); 817 EXPECT_EQ(1, resource_controller->resume_calls());
751 818
819 // Data is read, the new handler defers completion of the read.
752 defer = false; 820 defer = false;
753 ASSERT_TRUE(intercepting_handler->OnReadCompleted(strlen(kData), &defer)); 821 ASSERT_TRUE(intercepting_handler->OnReadCompleted(strlen(kData), &defer));
754 ASSERT_TRUE(defer); 822 ASSERT_TRUE(defer);
755 823
756 EXPECT_EQ(kPayload, old_handler_body); 824 EXPECT_EQ(kPayload, old_handler_body);
757 EXPECT_EQ("T", new_handler_body); 825 EXPECT_EQ("T", new_handler_body);
758 826
759 intercepting_handler->Resume(); 827 intercepting_handler->Resume();
760 EXPECT_EQ(2, resource_controller->resume_calls()); 828 EXPECT_EQ(2, resource_controller->resume_calls());
761 EXPECT_EQ(kPayload, old_handler_body); 829 EXPECT_EQ(kPayload, old_handler_body);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
857 memcpy(read_buffer->data(), kData, strlen(kData)); 925 memcpy(read_buffer->data(), kData, strlen(kData));
858 926
859 // Simulate the MimeSniffingResourceHandler asking the 927 // Simulate the MimeSniffingResourceHandler asking the
860 // InterceptingResourceHandler to switch to a new handler. 928 // InterceptingResourceHandler to switch to a new handler.
861 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, 929 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
862 0}; 930 0};
863 931
864 std::string new_handler_body; 932 std::string new_handler_body;
865 const std::string kPayload = "The payload"; 933 const std::string kPayload = "The payload";
866 std::unique_ptr<TestResourceHandler> new_handler( 934 std::unique_ptr<TestResourceHandler> new_handler(
867 new TestResourceHandler(&new_handler_status, &new_handler_body, 935 new TestResourceHandler(&new_handler_status, &new_handler_body));
868 1, // buffer_size 936 new_handler->SetBufferSize(1);
869 true, // on_response_started 937 new_handler->set_defer_on_response_started(true);
870 true, // on_will_read 938 new_handler->set_defer_on_response_completed(true);
871 true, // on_read_completed
872 true, // defer_on_response_started
873 false, // defer_on_read_completed
874 true)); // defer_on_response_completed
875 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload); 939 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
876 940
877 // The response is received. 941 // The response is received.
878 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 942 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
879 ASSERT_TRUE(defer); 943 ASSERT_TRUE(defer);
880 944
881 EXPECT_EQ(net::URLRequestStatus::SUCCESS, old_handler_status.status()); 945 EXPECT_EQ(net::URLRequestStatus::SUCCESS, old_handler_status.status());
882 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); 946 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
883 947
884 defer = false; 948 defer = false;
(...skipping 22 matching lines...) Expand all
907 true, // allow_download 971 true, // allow_download
908 true, // is_async 972 true, // is_async
909 false); // is_using_lofi 973 false); // is_using_lofi
910 974
911 std::unique_ptr<TestResourceController> resource_controller = 975 std::unique_ptr<TestResourceController> resource_controller =
912 base::MakeUnique<TestResourceController>(); 976 base::MakeUnique<TestResourceController>();
913 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING, 977 net::URLRequestStatus old_handler_status = {net::URLRequestStatus::IO_PENDING,
914 0}; 978 0};
915 std::string old_handler_body; 979 std::string old_handler_body;
916 std::unique_ptr<TestResourceHandler> old_handler( 980 std::unique_ptr<TestResourceHandler> old_handler(
917 new TestResourceHandler(&old_handler_status, &old_handler_body, 981 new TestResourceHandler(&old_handler_status, &old_handler_body));
918 2048, // buffer_size 982 old_handler->set_defer_on_read_completed(true);
919 true, // on_response_started
920 true, // on_will_read
921 true, // on_read_completed
922 false, // defer_on_response_started
923 true, // defer_on_read_completed
924 false)); // defer_on_response_completed
925 983
926 std::unique_ptr<InterceptingResourceHandler> intercepting_handler( 984 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
927 new InterceptingResourceHandler(std::move(old_handler), request.get())); 985 new InterceptingResourceHandler(std::move(old_handler), request.get()));
928 intercepting_handler->SetController(resource_controller.get()); 986 intercepting_handler->SetController(resource_controller.get());
929 987
930 scoped_refptr<ResourceResponse> response(new ResourceResponse); 988 scoped_refptr<ResourceResponse> response(new ResourceResponse);
931 989
932 // Simulate the MimeSniffingResourceHandler buffering the data. 990 // Simulate the MimeSniffingResourceHandler buffering the data.
933 scoped_refptr<net::IOBuffer> read_buffer; 991 scoped_refptr<net::IOBuffer> read_buffer;
934 int buf_size = 0; 992 int buf_size = 0;
935 bool defer = false; 993 bool defer = false;
936 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer)); 994 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
937 EXPECT_FALSE(defer); 995 EXPECT_FALSE(defer);
938 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1)); 996 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
939 997
940 const char kData[] = "The data"; 998 const char kData[] = "The data";
941 ASSERT_GT(static_cast<size_t>(buf_size), strlen(kData)); 999 ASSERT_GT(static_cast<size_t>(buf_size), strlen(kData));
942 memcpy(read_buffer->data(), kData, strlen(kData)); 1000 memcpy(read_buffer->data(), kData, strlen(kData));
943 1001
944 // Simulate the MimeSniffingResourceHandler asking the 1002 // Simulate the MimeSniffingResourceHandler asking the
945 // InterceptingResourceHandler to switch to a new handler. 1003 // InterceptingResourceHandler to switch to a new handler.
946 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING, 1004 net::URLRequestStatus new_handler_status = {net::URLRequestStatus::IO_PENDING,
947 0}; 1005 0};
948 1006
949 std::string new_handler_body; 1007 std::string new_handler_body;
950 const std::string kPayload = "The payload"; 1008 const std::string kPayload = "The payload";
951 std::unique_ptr<TestResourceHandler> new_handler( 1009 std::unique_ptr<TestResourceHandler> new_handler(
952 new TestResourceHandler(&new_handler_status, &new_handler_body, 1010 new TestResourceHandler(&new_handler_status, &new_handler_body));
953 1, // buffer_size 1011 new_handler->SetBufferSize(1);
954 true, // on_response_started 1012 new_handler->set_defer_on_response_completed(true);
955 true, // on_will_read
956 true, // on_read_completed
957 false, // defer_on_response_started
958 false, // defer_on_read_completed
959 true)); // defer_on_response_completed
960 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload); 1013 intercepting_handler->UseNewHandler(std::move(new_handler), kPayload);
961 1014
962 // The response is received. 1015 // The response is received.
963 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer)); 1016 ASSERT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
964 ASSERT_TRUE(defer); 1017 ASSERT_TRUE(defer);
965 1018
966 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status.status()); 1019 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, old_handler_status.status());
967 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status()); 1020 EXPECT_EQ(net::URLRequestStatus::IO_PENDING, new_handler_status.status());
968 1021
969 defer = false; 1022 defer = false;
970 intercepting_handler->OnResponseCompleted( 1023 intercepting_handler->OnResponseCompleted(
971 {net::URLRequestStatus::CANCELED, net::ERR_FAILED}, &defer); 1024 {net::URLRequestStatus::CANCELED, net::ERR_FAILED}, &defer);
972 ASSERT_TRUE(defer); 1025 ASSERT_TRUE(defer);
973 EXPECT_EQ(0, resource_controller->resume_calls()); 1026 EXPECT_EQ(0, resource_controller->resume_calls());
974 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status()); 1027 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
975 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status()); 1028 EXPECT_EQ(net::URLRequestStatus::CANCELED, new_handler_status.status());
976 } 1029 }
977 1030
978 } // namespace 1031 } // namespace
979 1032
980 } // namespace content 1033 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/intercepting_resource_handler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698