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

Side by Side Diff: content/child/web_url_loader_impl_unittest.cc

Issue 1710733002: Move multipart resource handling to core/fetch (2/2) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@multipart-cleanup
Patch Set: rebase Created 4 years, 10 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
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 "content/child/web_url_loader_impl.h" 5 #include "content/child/web_url_loader_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <string.h> 8 #include <string.h>
9 #include <utility> 9 #include <utility>
10 #include <vector> 10 #include <vector>
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 const char kTestData[] = "blah!"; 45 const char kTestData[] = "blah!";
46 46
47 const char kFtpDirMimeType[] = "text/vnd.chromium.ftp-dir"; 47 const char kFtpDirMimeType[] = "text/vnd.chromium.ftp-dir";
48 // Simple FTP directory listing. Tests are not concerned with correct parsing, 48 // Simple FTP directory listing. Tests are not concerned with correct parsing,
49 // but rather correct cleanup when deleted while parsing. Important details of 49 // but rather correct cleanup when deleted while parsing. Important details of
50 // this list are that it contains more than one entry that are not "." or "..". 50 // this list are that it contains more than one entry that are not "." or "..".
51 const char kFtpDirListing[] = 51 const char kFtpDirListing[] =
52 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 goat\n" 52 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 goat\n"
53 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 hat"; 53 "drwxr-xr-x 3 ftp ftp 4096 May 15 18:11 hat";
54 54
55 const char kMultipartResponseMimeType[] = "multipart/x-mixed-replace";
56 const char kMultipartResponseHeaders[] =
57 "HTTP/1.0 200 Peachy\r\n"
58 "Content-Type: multipart/x-mixed-replace; boundary=boundary\r\n\r\n";
59 // Simple multipart response. Imporant details for the tests are that it
60 // contains multiple chunks, and that it doesn't end with a boundary, so will
61 // send data in OnResponseComplete. Also, it will resolve to kTestData.
62 const char kMultipartResponse[] =
63 "--boundary\n"
64 "Content-type: text/html\n\n"
65 "bl"
66 "--boundary\n"
67 "Content-type: text/html\n\n"
68 "ah!";
69
70 class TestResourceDispatcher : public ResourceDispatcher { 55 class TestResourceDispatcher : public ResourceDispatcher {
71 public: 56 public:
72 TestResourceDispatcher() : 57 TestResourceDispatcher() :
73 ResourceDispatcher(nullptr, nullptr), 58 ResourceDispatcher(nullptr, nullptr),
74 canceled_(false) { 59 canceled_(false) {
75 } 60 }
76 61
77 ~TestResourceDispatcher() override {} 62 ~TestResourceDispatcher() override {}
78 63
79 // TestDispatcher implementation: 64 // TestDispatcher implementation:
(...skipping 29 matching lines...) Expand all
109 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcher); 94 DISALLOW_COPY_AND_ASSIGN(TestResourceDispatcher);
110 }; 95 };
111 96
112 class TestWebURLLoaderClient : public blink::WebURLLoaderClient { 97 class TestWebURLLoaderClient : public blink::WebURLLoaderClient {
113 public: 98 public:
114 TestWebURLLoaderClient(ResourceDispatcher* dispatcher, 99 TestWebURLLoaderClient(ResourceDispatcher* dispatcher,
115 scoped_refptr<scheduler::TaskQueue> task_runner) 100 scoped_refptr<scheduler::TaskQueue> task_runner)
116 : loader_(new WebURLLoaderImpl( 101 : loader_(new WebURLLoaderImpl(
117 dispatcher, 102 dispatcher,
118 make_scoped_ptr(new scheduler::WebTaskRunnerImpl(task_runner)))), 103 make_scoped_ptr(new scheduler::WebTaskRunnerImpl(task_runner)))),
119 expect_multipart_response_(false),
120 delete_on_receive_redirect_(false), 104 delete_on_receive_redirect_(false),
121 delete_on_receive_response_(false), 105 delete_on_receive_response_(false),
122 delete_on_receive_data_(false), 106 delete_on_receive_data_(false),
123 delete_on_finish_(false), 107 delete_on_finish_(false),
124 delete_on_fail_(false), 108 delete_on_fail_(false),
125 did_receive_redirect_(false), 109 did_receive_redirect_(false),
126 did_receive_response_(false), 110 did_receive_response_(false),
127 did_finish_(false) {} 111 did_finish_(false) {}
128 112
129 ~TestWebURLLoaderClient() override {} 113 ~TestWebURLLoaderClient() override {}
(...skipping 19 matching lines...) Expand all
149 EXPECT_TRUE(loader_); 133 EXPECT_TRUE(loader_);
150 EXPECT_EQ(loader_.get(), loader); 134 EXPECT_EQ(loader_.get(), loader);
151 } 135 }
152 136
153 void didReceiveResponse( 137 void didReceiveResponse(
154 blink::WebURLLoader* loader, 138 blink::WebURLLoader* loader,
155 const blink::WebURLResponse& response) override { 139 const blink::WebURLResponse& response) override {
156 EXPECT_TRUE(loader_); 140 EXPECT_TRUE(loader_);
157 EXPECT_EQ(loader_.get(), loader); 141 EXPECT_EQ(loader_.get(), loader);
158 142
159 // Only multipart requests may receive multiple response headers.
160 EXPECT_TRUE(expect_multipart_response_ || !did_receive_response_);
hiroshige 2016/02/26 19:02:12 Can this be |EXPECT_FALSE(did_receive_response_);|
yhirano 2016/02/27 01:27:45 Done.
161
162 did_receive_response_ = true; 143 did_receive_response_ = true;
163 response_ = response; 144 response_ = response;
164 if (delete_on_receive_response_) 145 if (delete_on_receive_response_)
165 loader_.reset(); 146 loader_.reset();
166 } 147 }
167 148
168 void didDownloadData(blink::WebURLLoader* loader, 149 void didDownloadData(blink::WebURLLoader* loader,
169 int dataLength, 150 int dataLength,
170 int encodedDataLength) override { 151 int encodedDataLength) override {
171 EXPECT_TRUE(loader_); 152 EXPECT_TRUE(loader_);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 199
219 if (delete_on_fail_) 200 if (delete_on_fail_)
220 loader_.reset(); 201 loader_.reset();
221 } 202 }
222 203
223 WebURLLoaderImpl* loader() { return loader_.get(); } 204 WebURLLoaderImpl* loader() { return loader_.get(); }
224 void DeleteLoader() { 205 void DeleteLoader() {
225 loader_.reset(); 206 loader_.reset();
226 } 207 }
227 208
228 void set_expect_multipart_response() { expect_multipart_response_ = true; }
229
230 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } 209 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; }
231 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } 210 void set_delete_on_receive_response() { delete_on_receive_response_ = true; }
232 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } 211 void set_delete_on_receive_data() { delete_on_receive_data_ = true; }
233 void set_delete_on_finish() { delete_on_finish_ = true; } 212 void set_delete_on_finish() { delete_on_finish_ = true; }
234 void set_delete_on_fail() { delete_on_fail_ = true; } 213 void set_delete_on_fail() { delete_on_fail_ = true; }
235 214
236 bool did_receive_redirect() const { return did_receive_redirect_; } 215 bool did_receive_redirect() const { return did_receive_redirect_; }
237 bool did_receive_response() const { return did_receive_response_; } 216 bool did_receive_response() const { return did_receive_response_; }
238 const std::string& received_data() const { return received_data_; } 217 const std::string& received_data() const { return received_data_; }
239 bool did_finish() const { return did_finish_; } 218 bool did_finish() const { return did_finish_; }
240 const blink::WebURLError& error() const { return error_; } 219 const blink::WebURLError& error() const { return error_; }
241 const blink::WebURLResponse& response() const { return response_; } 220 const blink::WebURLResponse& response() const { return response_; }
242 221
243 private: 222 private:
244 scoped_ptr<WebURLLoaderImpl> loader_; 223 scoped_ptr<WebURLLoaderImpl> loader_;
245 224
246 bool expect_multipart_response_;
247
248 bool delete_on_receive_redirect_; 225 bool delete_on_receive_redirect_;
249 bool delete_on_receive_response_; 226 bool delete_on_receive_response_;
250 bool delete_on_receive_data_; 227 bool delete_on_receive_data_;
251 bool delete_on_finish_; 228 bool delete_on_finish_;
252 bool delete_on_fail_; 229 bool delete_on_fail_;
253 230
254 bool did_receive_redirect_; 231 bool did_receive_redirect_;
255 bool did_receive_response_; 232 bool did_receive_response_;
256 std::string received_data_; 233 std::string received_data_;
257 bool did_finish_; 234 bool did_finish_;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 EXPECT_TRUE(client()->did_receive_response()); 313 EXPECT_TRUE(client()->did_receive_response());
337 } 314 }
338 315
339 void DoReceiveDataFtp() { 316 void DoReceiveDataFtp() {
340 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( 317 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData(
341 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); 318 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing))));
342 // The FTP delegate should modify the data the client sees. 319 // The FTP delegate should modify the data the client sees.
343 EXPECT_NE(kFtpDirListing, client()->received_data()); 320 EXPECT_NE(kFtpDirListing, client()->received_data());
344 } 321 }
345 322
346 void DoReceiveResponseMultipart() {
347 EXPECT_FALSE(client()->did_receive_response());
348 content::ResourceResponseInfo response_info;
349 response_info.headers = new net::HttpResponseHeaders(
350 net::HttpUtil::AssembleRawHeaders(kMultipartResponseHeaders,
351 strlen(kMultipartResponseHeaders)));
352 response_info.mime_type = kMultipartResponseMimeType;
353 peer()->OnReceivedResponse(response_info);
354 EXPECT_TRUE(client()->did_receive_response());
355 }
356
357 void DoReceiveDataMultipart() {
358 peer()->OnReceivedData(make_scoped_ptr(
359 new FixedReceivedData(kMultipartResponse, strlen(kMultipartResponse),
360 strlen(kMultipartResponse))));
361 // Multipart delegate should modify the data the client sees.
362 EXPECT_NE(kMultipartResponse, client()->received_data());
363 }
364
365 TestWebURLLoaderClient* client() { return client_.get(); } 323 TestWebURLLoaderClient* client() { return client_.get(); }
366 TestResourceDispatcher* dispatcher() { return &dispatcher_; } 324 TestResourceDispatcher* dispatcher() { return &dispatcher_; }
367 RequestPeer* peer() { return dispatcher()->peer(); } 325 RequestPeer* peer() { return dispatcher()->peer(); }
368 base::MessageLoop* message_loop() { return &message_loop_; } 326 base::MessageLoop* message_loop() { return &message_loop_; }
369 327
370 private: 328 private:
371 base::MessageLoop message_loop_; 329 base::MessageLoop message_loop_;
372 // WorkerScheduler is needed because WebURLLoaderImpl needs a 330 // WorkerScheduler is needed because WebURLLoaderImpl needs a
373 // scheduler::TaskQueue. 331 // scheduler::TaskQueue.
374 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; 332 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_;
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 } 546 }
589 547
590 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { 548 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) {
591 client()->set_delete_on_fail(); 549 client()->set_delete_on_fail();
592 DoStartAsyncRequest(); 550 DoStartAsyncRequest();
593 DoReceiveResponseFtp(); 551 DoReceiveResponseFtp();
594 DoReceiveDataFtp(); 552 DoReceiveDataFtp();
595 DoFailRequest(); 553 DoFailRequest();
596 } 554 }
597 555
598 // Multipart integration tests. These are focused more on safe deletion than
599 // correct parsing of Multipart responses.
600
601 TEST_F(WebURLLoaderImplTest, Multipart) {
602 client()->set_expect_multipart_response();
603 DoStartAsyncRequest();
604 DoReceiveResponseMultipart();
605 DoReceiveDataMultipart();
606 DoCompleteRequest();
607 EXPECT_EQ(kTestData, client()->received_data());
608 EXPECT_FALSE(dispatcher()->canceled());
609 }
610
611 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveFirstResponse) {
612 client()->set_expect_multipart_response();
613 client()->set_delete_on_receive_response();
614 DoStartAsyncRequest();
615 DoReceiveResponseMultipart();
616 EXPECT_EQ("", client()->received_data());
617 }
618
619 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveSecondResponse) {
620 client()->set_expect_multipart_response();
621 DoStartAsyncRequest();
622 DoReceiveResponseMultipart();
623 client()->set_delete_on_receive_response();
624 DoReceiveDataMultipart();
625 EXPECT_EQ("", client()->received_data());
626 }
627
628 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveFirstData) {
629 client()->set_expect_multipart_response();
630 client()->set_delete_on_receive_data();
631 DoStartAsyncRequest();
632 DoReceiveResponseMultipart();
633 DoReceiveDataMultipart();
634 EXPECT_EQ("bl", client()->received_data());
635 }
636
637 TEST_F(WebURLLoaderImplTest, MultipartDeleteOnReceiveMoreData) {
638 client()->set_expect_multipart_response();
639 DoStartAsyncRequest();
640 DoReceiveResponseMultipart();
641 DoReceiveDataMultipart();
642 // For multipart responses, the delegate may send some data when notified
643 // of a request completing.
644 client()->set_delete_on_receive_data();
645 peer()->OnCompletedRequest(net::OK, false, false, "", base::TimeTicks(),
646 strlen(kTestData));
647 EXPECT_FALSE(client()->did_finish());
648 EXPECT_EQ(kTestData, client()->received_data());
649 }
650
651 TEST_F(WebURLLoaderImplTest, MultipartDeleteFinish) {
652 client()->set_expect_multipart_response();
653 client()->set_delete_on_finish();
654 DoStartAsyncRequest();
655 DoReceiveResponseMultipart();
656 DoReceiveDataMultipart();
657 DoCompleteRequest();
658 EXPECT_EQ(kTestData, client()->received_data());
659 }
660
661 TEST_F(WebURLLoaderImplTest, MultipartDeleteFail) {
662 client()->set_expect_multipart_response();
663 client()->set_delete_on_fail();
664 DoStartAsyncRequest();
665 DoReceiveResponseMultipart();
666 DoReceiveDataMultipart();
667 DoFailRequest();
668 }
669
670 // PlzNavigate: checks that the stream override parameters provided on 556 // PlzNavigate: checks that the stream override parameters provided on
671 // navigation commit are properly applied. 557 // navigation commit are properly applied.
672 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { 558 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) {
673 // Initialize the request and the stream override. 559 // Initialize the request and the stream override.
674 const GURL kNavigationURL = GURL(kTestURL); 560 const GURL kNavigationURL = GURL(kTestURL);
675 const GURL kStreamURL = GURL("http://bar"); 561 const GURL kStreamURL = GURL("http://bar");
676 const std::string kMimeType = "text/html"; 562 const std::string kMimeType = "text/html";
677 blink::WebURLRequest request; 563 blink::WebURLRequest request;
678 request.initialize(); 564 request.initialize();
679 request.setURL(kNavigationURL); 565 request.setURL(kNavigationURL);
(...skipping 25 matching lines...) Expand all
705 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1()); 591 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1());
706 592
707 DoReceiveData(); 593 DoReceiveData();
708 DoCompleteRequest(); 594 DoCompleteRequest();
709 EXPECT_FALSE(dispatcher()->canceled()); 595 EXPECT_FALSE(dispatcher()->canceled());
710 EXPECT_EQ(kTestData, client()->received_data()); 596 EXPECT_EQ(kTestData, client()->received_data());
711 } 597 }
712 598
713 } // namespace 599 } // namespace
714 } // namespace content 600 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698