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

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, 9 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 18 matching lines...) Expand all
148 unsigned long long totalBytesToBeSent) override { 132 unsigned long long totalBytesToBeSent) override {
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 EXPECT_FALSE(did_receive_response_);
159 // Only multipart requests may receive multiple response headers.
160 EXPECT_TRUE(expect_multipart_response_ || !did_receive_response_);
161 143
162 did_receive_response_ = true; 144 did_receive_response_ = true;
163 response_ = response; 145 response_ = response;
164 if (delete_on_receive_response_) 146 if (delete_on_receive_response_)
165 loader_.reset(); 147 loader_.reset();
166 } 148 }
167 149
168 void didDownloadData(blink::WebURLLoader* loader, 150 void didDownloadData(blink::WebURLLoader* loader,
169 int dataLength, 151 int dataLength,
170 int encodedDataLength) override { 152 int encodedDataLength) override {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 200
219 if (delete_on_fail_) 201 if (delete_on_fail_)
220 loader_.reset(); 202 loader_.reset();
221 } 203 }
222 204
223 WebURLLoaderImpl* loader() { return loader_.get(); } 205 WebURLLoaderImpl* loader() { return loader_.get(); }
224 void DeleteLoader() { 206 void DeleteLoader() {
225 loader_.reset(); 207 loader_.reset();
226 } 208 }
227 209
228 void set_expect_multipart_response() { expect_multipart_response_ = true; }
229
230 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; } 210 void set_delete_on_receive_redirect() { delete_on_receive_redirect_ = true; }
231 void set_delete_on_receive_response() { delete_on_receive_response_ = true; } 211 void set_delete_on_receive_response() { delete_on_receive_response_ = true; }
232 void set_delete_on_receive_data() { delete_on_receive_data_ = true; } 212 void set_delete_on_receive_data() { delete_on_receive_data_ = true; }
233 void set_delete_on_finish() { delete_on_finish_ = true; } 213 void set_delete_on_finish() { delete_on_finish_ = true; }
234 void set_delete_on_fail() { delete_on_fail_ = true; } 214 void set_delete_on_fail() { delete_on_fail_ = true; }
235 215
236 bool did_receive_redirect() const { return did_receive_redirect_; } 216 bool did_receive_redirect() const { return did_receive_redirect_; }
237 bool did_receive_response() const { return did_receive_response_; } 217 bool did_receive_response() const { return did_receive_response_; }
238 const std::string& received_data() const { return received_data_; } 218 const std::string& received_data() const { return received_data_; }
239 bool did_finish() const { return did_finish_; } 219 bool did_finish() const { return did_finish_; }
240 const blink::WebURLError& error() const { return error_; } 220 const blink::WebURLError& error() const { return error_; }
241 const blink::WebURLResponse& response() const { return response_; } 221 const blink::WebURLResponse& response() const { return response_; }
242 222
243 private: 223 private:
244 scoped_ptr<WebURLLoaderImpl> loader_; 224 scoped_ptr<WebURLLoaderImpl> loader_;
245 225
246 bool expect_multipart_response_;
247
248 bool delete_on_receive_redirect_; 226 bool delete_on_receive_redirect_;
249 bool delete_on_receive_response_; 227 bool delete_on_receive_response_;
250 bool delete_on_receive_data_; 228 bool delete_on_receive_data_;
251 bool delete_on_finish_; 229 bool delete_on_finish_;
252 bool delete_on_fail_; 230 bool delete_on_fail_;
253 231
254 bool did_receive_redirect_; 232 bool did_receive_redirect_;
255 bool did_receive_response_; 233 bool did_receive_response_;
256 std::string received_data_; 234 std::string received_data_;
257 bool did_finish_; 235 bool did_finish_;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
336 EXPECT_TRUE(client()->did_receive_response()); 314 EXPECT_TRUE(client()->did_receive_response());
337 } 315 }
338 316
339 void DoReceiveDataFtp() { 317 void DoReceiveDataFtp() {
340 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData( 318 peer()->OnReceivedData(make_scoped_ptr(new FixedReceivedData(
341 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing)))); 319 kFtpDirListing, strlen(kFtpDirListing), strlen(kFtpDirListing))));
342 // The FTP delegate should modify the data the client sees. 320 // The FTP delegate should modify the data the client sees.
343 EXPECT_NE(kFtpDirListing, client()->received_data()); 321 EXPECT_NE(kFtpDirListing, client()->received_data());
344 } 322 }
345 323
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(); } 324 TestWebURLLoaderClient* client() { return client_.get(); }
366 TestResourceDispatcher* dispatcher() { return &dispatcher_; } 325 TestResourceDispatcher* dispatcher() { return &dispatcher_; }
367 RequestPeer* peer() { return dispatcher()->peer(); } 326 RequestPeer* peer() { return dispatcher()->peer(); }
368 base::MessageLoop* message_loop() { return &message_loop_; } 327 base::MessageLoop* message_loop() { return &message_loop_; }
369 328
370 private: 329 private:
371 base::MessageLoop message_loop_; 330 base::MessageLoop message_loop_;
372 // WorkerScheduler is needed because WebURLLoaderImpl needs a 331 // WorkerScheduler is needed because WebURLLoaderImpl needs a
373 // scheduler::TaskQueue. 332 // scheduler::TaskQueue.
374 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_; 333 scoped_ptr<scheduler::WorkerScheduler> worker_scheduler_;
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 } 547 }
589 548
590 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) { 549 TEST_F(WebURLLoaderImplTest, FtpDeleteOnFail) {
591 client()->set_delete_on_fail(); 550 client()->set_delete_on_fail();
592 DoStartAsyncRequest(); 551 DoStartAsyncRequest();
593 DoReceiveResponseFtp(); 552 DoReceiveResponseFtp();
594 DoReceiveDataFtp(); 553 DoReceiveDataFtp();
595 DoFailRequest(); 554 DoFailRequest();
596 } 555 }
597 556
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 557 // PlzNavigate: checks that the stream override parameters provided on
671 // navigation commit are properly applied. 558 // navigation commit are properly applied.
672 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) { 559 TEST_F(WebURLLoaderImplTest, BrowserSideNavigationCommit) {
673 // Initialize the request and the stream override. 560 // Initialize the request and the stream override.
674 const GURL kNavigationURL = GURL(kTestURL); 561 const GURL kNavigationURL = GURL(kTestURL);
675 const GURL kStreamURL = GURL("http://bar"); 562 const GURL kStreamURL = GURL("http://bar");
676 const std::string kMimeType = "text/html"; 563 const std::string kMimeType = "text/html";
677 blink::WebURLRequest request; 564 blink::WebURLRequest request;
678 request.initialize(); 565 request.initialize();
679 request.setURL(kNavigationURL); 566 request.setURL(kNavigationURL);
(...skipping 25 matching lines...) Expand all
705 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1()); 592 EXPECT_EQ(kMimeType, client()->response().mimeType().latin1());
706 593
707 DoReceiveData(); 594 DoReceiveData();
708 DoCompleteRequest(); 595 DoCompleteRequest();
709 EXPECT_FALSE(dispatcher()->canceled()); 596 EXPECT_FALSE(dispatcher()->canceled());
710 EXPECT_EQ(kTestData, client()->received_data()); 597 EXPECT_EQ(kTestData, client()->received_data());
711 } 598 }
712 599
713 } // namespace 600 } // namespace
714 } // namespace content 601 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698