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

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

Issue 2005273002: Move MimeTypeResourceHandler before ThrottlingResourceHandler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 4 years, 3 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "content/browser/loader/intercepting_resource_handler.h"
6
7 #include <stdint.h>
8
9 #include <memory>
10
11 #include "base/files/file_path.h"
12 #include "base/location.h"
13 #include "base/logging.h"
14 #include "base/macros.h"
15 #include "base/single_thread_task_runner.h"
16 #include "base/threading/thread_task_runner_handle.h"
17 #include "content/public/browser/resource_controller.h"
18 #include "content/public/browser/resource_request_info.h"
19 #include "content/public/common/resource_response.h"
20 #include "content/public/common/webplugininfo.h"
21 #include "content/public/test/test_browser_thread_bundle.h"
22 #include "content/public/test/test_utils.h"
23 #include "net/base/net_errors.h"
24 #include "net/url_request/url_request_context.h"
25 #include "net/url_request/url_request_status.h"
26 #include "testing/gtest/include/gtest/gtest.h"
27 #include "url/gurl.h"
28
29 namespace content {
30
31 namespace {
32
33 class TestResourceHandler : public ResourceHandler {
34 public:
35 // A test version of a ResourceHandler. |request_status| and
36 // |final_bytes_read| will be updated when the response is complete with the
37 // final status of the request received by the handler, and the total bytes
38 // the handler saw.
39 explicit TestResourceHandler(net::URLRequestStatus* request_status,
40 size_t* final_bytes_read)
41 : TestResourceHandler(request_status,
42 final_bytes_read,
43 true /* on_response_started_result */,
44 true /* on_will_read_result */,
45 true /* on_read_completed_result */) {}
46
47 // This constructor allows to specify return values for OnResponseStarted,
48 // OnWillRead and OnReadCompleted.
49 TestResourceHandler(net::URLRequestStatus* request_status,
50 size_t* final_bytes_read,
51 bool on_response_started_result,
52 bool on_will_read_result,
53 bool on_read_completed_result)
54 : ResourceHandler(nullptr),
55 buffer_(new net::IOBuffer(2048)),
56 request_status_(request_status),
57 final_bytes_read_(final_bytes_read),
58 on_response_started_result_(on_response_started_result),
59 on_will_read_result_(on_will_read_result),
60 on_read_completed_result_(on_read_completed_result),
61 bytes_read_(0),
62 is_completed_(false) {
63 memset(buffer_->data(), '\0', 2048);
64 }
65
66 ~TestResourceHandler() override {}
67
68 void SetController(ResourceController* controller) override {}
69
70 bool OnRequestRedirected(const net::RedirectInfo& redirect_info,
71 ResourceResponse* response,
72 bool* defer) override {
73 NOTREACHED();
74 return false;
75 }
76
77 bool OnResponseStarted(ResourceResponse* response, bool* defer) override {
78 EXPECT_FALSE(is_completed_);
79 return on_response_started_result_;
80 }
81
82 bool OnWillStart(const GURL& url, bool* defer) override {
83 EXPECT_FALSE(is_completed_);
84 return true;
85 }
86
87 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
88 int* buf_size,
89 int min_size) override {
90 EXPECT_FALSE(is_completed_);
91 *buf = buffer_;
92 *buf_size = 2048;
93 memset(buffer_->data(), '\0', 2048);
94 return on_will_read_result_;
95 }
96
97 bool OnReadCompleted(int bytes_read, bool* defer) override {
98 EXPECT_FALSE(is_completed_);
99 EXPECT_LT(bytes_read, 2048);
100 bytes_read_ += bytes_read;
101 return on_read_completed_result_;
102 }
103
104 void OnResponseCompleted(const net::URLRequestStatus& status,
105 const std::string& security_info,
106 bool* defer) override {
107 EXPECT_FALSE(is_completed_);
108 is_completed_ = true;
109 *request_status_ = status;
110 *final_bytes_read_ = bytes_read_;
111 }
112
113 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); }
114
115 scoped_refptr<net::IOBuffer> buffer() const { return buffer_; }
116
117 size_t bytes_read() const { return bytes_read_; }
118
119 private:
120 scoped_refptr<net::IOBuffer> buffer_;
121 net::URLRequestStatus* request_status_;
122 size_t* final_bytes_read_;
123 bool on_response_started_result_;
124 bool on_will_read_result_;
125 bool on_read_completed_result_;
126 size_t bytes_read_;
127 bool is_completed_;
128
129 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler);
130 };
131
132 class InterceptingResourceHandlerTest : public testing::Test {
133 public:
134 InterceptingResourceHandlerTest() {}
135
136 private:
137 TestBrowserThreadBundle thread_bundle_;
138 };
139
140 // Tests that the handler behaves properly when it doesn't have to use an
141 // alternate next handler.
142 TEST_F(InterceptingResourceHandlerTest, NoSwitching) {
143 net::URLRequestContext context;
144 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
145 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
146 ResourceRequestInfo::AllocateForTesting(request.get(),
147 RESOURCE_TYPE_MAIN_FRAME,
148 nullptr, // context
149 0, // render_process_id
150 0, // render_view_id
151 0, // render_frame_id
152 true, // is_main_frame
153 false, // parent_is_main_frame
154 true, // allow_download
155 true, // is_async
156 false); // is_using_lofi
157
158 net::URLRequestStatus old_handler_status;
159 size_t old_handler_final_bytes_read = 0;
160 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
161 &old_handler_status, &old_handler_final_bytes_read));
162 TestResourceHandler* old_test_handler = old_handler.get();
163 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
164 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
165 new InterceptingResourceHandler(std::move(old_handler), request.get()));
166
167 scoped_refptr<ResourceResponse> response(new ResourceResponse);
168
169 // Simulate the MimeSniffingResourceHandler buffering the data.
170 scoped_refptr<net::IOBuffer> read_buffer;
171 int buf_size = 0;
172 bool defer = false;
173 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
174 EXPECT_FALSE(defer);
175 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
176
177 const std::string kData = "The data";
178 EXPECT_NE(kData, std::string(old_test_handler->buffer()->data()));
179
180 ASSERT_EQ(read_buffer.get(), old_test_handler->buffer());
181 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
182 memcpy(read_buffer->data(), kData.c_str(), kData.length());
183
184 // The response is received. The handler should not change.
185 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
186 EXPECT_FALSE(defer);
187
188 // The read is replayed by the MimeSniffingResourceHandler. The data should
189 // have been received by the old intercepting_handler.
190 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
191 EXPECT_FALSE(defer);
192 EXPECT_EQ(kData, std::string(old_test_handler->buffer()->data()));
193
194 // Make sure another read behave as expected.
195 buf_size = 0;
196 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
197 ASSERT_EQ(read_buffer.get(), old_test_handler->buffer());
198
199 const std::string kData2 = "Data 2";
200 EXPECT_NE(kData, std::string(old_test_handler->buffer()->data()));
201 ASSERT_GT(static_cast<size_t>(buf_size), kData2.length());
202 memcpy(read_buffer->data(), kData2.c_str(), kData2.length());
203
204 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer));
205 EXPECT_FALSE(defer);
206 EXPECT_EQ(kData2, std::string(old_test_handler->buffer()->data()));
207 EXPECT_EQ(kData.length() + kData2.length(), old_test_handler->bytes_read());
208 }
209
210 // Tests that the data received is transmitted to the newly created
211 // ResourceHandler.
212 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) {
213 net::URLRequestContext context;
214 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
215 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
216 ResourceRequestInfo::AllocateForTesting(request.get(),
217 RESOURCE_TYPE_MAIN_FRAME,
218 nullptr, // context
219 0, // render_process_id
220 0, // render_view_id
221 0, // render_frame_id
222 true, // is_main_frame
223 false, // parent_is_main_frame
224 true, // allow_download
225 true, // is_async
226 false); // is_using_lofi
227
228 net::URLRequestStatus old_handler_status;
229 size_t old_handler_final_bytes_read = 0;
230 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
231 &old_handler_status, &old_handler_final_bytes_read));
232 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
233 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
234 new InterceptingResourceHandler(std::move(old_handler), request.get()));
235
236 scoped_refptr<ResourceResponse> response(new ResourceResponse);
237
238 // Simulate the MimeSniffingResourceHandler buffering the data.
239 scoped_refptr<net::IOBuffer> read_buffer;
240 int buf_size = 0;
241 bool defer = false;
242 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
243 EXPECT_FALSE(defer);
244 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
245
246 const std::string kData = "The data";
247 ASSERT_EQ(read_buffer.get(), old_buffer.get());
248 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
249 memcpy(read_buffer->data(), kData.c_str(), kData.length());
250
251 // Simulate the MimeSniffingResourceHandler asking the
252 // InterceptingResourceHandler to switch to a new handler.
253 net::URLRequestStatus new_handler_status;
254 size_t new_handler_final_bytes_read = 0;
255 std::unique_ptr<TestResourceHandler> new_handler_scoped(
256 new TestResourceHandler(&new_handler_status,
257 &new_handler_final_bytes_read));
258 TestResourceHandler* new_test_handler = new_handler_scoped.get();
259 intercepting_handler->UseNewHandler(std::move(new_handler_scoped),
260 std::string());
261
262 // The response is received. The new ResourceHandler should be used handle
263 // the download.
264 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
265 EXPECT_FALSE(defer);
266
267 EXPECT_FALSE(old_handler_status.is_success());
268 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
269 EXPECT_EQ(0ul, old_handler_final_bytes_read);
270
271 // It should not have received the download data yet.
272 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data()));
273
274 // The read is replayed by the MimeSniffingResourceHandler. The data should
275 // have been received by the new handler.
276 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
277 EXPECT_FALSE(defer);
278 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data()));
279
280 // Make sure another read behaves as expected.
281 buf_size = 0;
282 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
283 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer());
284 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
285
286 const std::string kData2 = "Data 2";
287 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data()));
288 memcpy(read_buffer->data(), kData2.c_str(), kData2.length());
289
290 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer));
291 EXPECT_FALSE(defer);
292 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data()));
293 EXPECT_EQ(kData.length() + kData2.length(), new_test_handler->bytes_read());
294 }
295
296 // Tests that the data received is transmitted to the newly created
297 // ResourceHandler and the specified payload to the old ResourceHandler.
298 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchWithPayload) {
299 net::URLRequestContext context;
300 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
301 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
302 ResourceRequestInfo::AllocateForTesting(request.get(),
303 RESOURCE_TYPE_MAIN_FRAME,
304 nullptr, // context
305 0, // render_process_id
306 0, // render_view_id
307 0, // render_frame_id
308 true, // is_main_frame
309 false, // parent_is_main_frame
310 true, // allow_download
311 true, // is_async
312 false); // is_using_lofi
313
314 net::URLRequestStatus old_handler_status;
315 size_t old_handler_final_bytes_read = 0;
316 std::unique_ptr<TestResourceHandler> old_handler_scoped(
317 new TestResourceHandler(&old_handler_status,
318 &old_handler_final_bytes_read));
319 TestResourceHandler* old_handler = old_handler_scoped.get();
320 scoped_refptr<net::IOBuffer> old_buffer = old_handler->buffer();
321 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
322 new InterceptingResourceHandler(std::move(old_handler_scoped),
323 request.get()));
324
325 scoped_refptr<ResourceResponse> response(new ResourceResponse);
326
327 // Simulate the MimeSniffingResourceHandler buffering the data.
328 scoped_refptr<net::IOBuffer> read_buffer;
329 int buf_size = 0;
330 bool defer = false;
331 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
332 EXPECT_FALSE(defer);
333 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
334
335 const std::string kData = "The data";
336 ASSERT_EQ(read_buffer.get(), old_buffer.get());
337 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
338 memcpy(read_buffer->data(), kData.c_str(), kData.length());
339
340 // Simulate the MimeSniffingResourceHandler asking the
341 // InterceptingResourceHandler to switch to a new handler.
342 const std::string kPayload = "The payload";
343 net::URLRequestStatus new_handler_status;
344 size_t new_handler_final_bytes_read = 0;
345 std::unique_ptr<TestResourceHandler> new_handler_scoped(
346 new TestResourceHandler(&new_handler_status,
347 &new_handler_final_bytes_read));
348 TestResourceHandler* new_test_handler = new_handler_scoped.get();
349 intercepting_handler->UseNewHandler(std::move(new_handler_scoped), kPayload);
350
351 // The old handler should not have received the payload yet.
352 ASSERT_FALSE(old_handler->bytes_read());
353 EXPECT_NE(kPayload, std::string(old_buffer->data()));
354
355 // The response is received. The new ResourceHandler should be used to handle
356 // the download.
357 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
358 EXPECT_FALSE(defer);
359
360 // The old handler should have received the payload.
361 ASSERT_TRUE(old_handler_final_bytes_read == kPayload.size());
362 EXPECT_EQ(kPayload, std::string(old_buffer->data()));
363
364 EXPECT_TRUE(old_handler_status.is_success());
365 EXPECT_EQ(net::OK, old_handler_status.error());
366
367 // It should not have received the download data yet.
368 EXPECT_NE(kData, std::string(new_test_handler->buffer()->data()));
369
370 // The read is replayed by the MimeSniffingResourceHandler. The data should
371 // have been received by the new handler.
372 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData.length(), &defer));
373 EXPECT_FALSE(defer);
374 EXPECT_EQ(kData, std::string(new_test_handler->buffer()->data()));
375
376 // Make sure another read behave as expected.
377 buf_size = 0;
378 const std::string kData2 = "Data 2";
379 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
380 ASSERT_EQ(read_buffer.get(), new_test_handler->buffer());
381 ASSERT_GT(static_cast<size_t>(buf_size), kData.length());
382
383 EXPECT_NE(kData2, std::string(new_test_handler->buffer()->data()));
384 memcpy(read_buffer->data(), kData2.c_str(), kData2.length());
385
386 EXPECT_TRUE(intercepting_handler->OnReadCompleted(kData2.length(), &defer));
387 EXPECT_FALSE(defer);
388 EXPECT_EQ(kData2, std::string(new_test_handler->buffer()->data()));
389 EXPECT_EQ(kData.length() + kData2.length(), new_test_handler->bytes_read());
390 }
391
392 // Tests that the handler behaves properly if the old handler fails will read.
393 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) {
394 net::URLRequestContext context;
395 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
396 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
397 ResourceRequestInfo::AllocateForTesting(request.get(),
398 RESOURCE_TYPE_MAIN_FRAME,
399 nullptr, // context
400 0, // render_process_id
401 0, // render_view_id
402 0, // render_frame_id
403 true, // is_main_frame
404 false, // parent_is_main_frame
405 true, // allow_download
406 true, // is_async
407 false); // is_using_lofi
408
409 net::URLRequestStatus old_handler_status;
410 size_t old_handler_final_bytes_read = 0;
411 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
412 &old_handler_status, &old_handler_final_bytes_read,
413 true, // on_response_started
414 false, // on_will_read
415 true)); // on_read_completed
416 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
417 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
418 new InterceptingResourceHandler(std::move(old_handler), request.get()));
419
420 scoped_refptr<ResourceResponse> response(new ResourceResponse);
421
422 // Simulate the MimeSniffingResourceHandler buffering the data. The old
423 // handler should tell the caller to fail.
424 scoped_refptr<net::IOBuffer> read_buffer;
425 int buf_size = 0;
426 bool defer = false;
427 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
428 EXPECT_FALSE(defer);
429 EXPECT_FALSE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
430 }
431
432 // Tests that the handler behaves properly if the new handler fails response
433 // started.
434 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) {
435 net::URLRequestContext context;
436 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
437 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
438 ResourceRequestInfo::AllocateForTesting(request.get(),
439 RESOURCE_TYPE_MAIN_FRAME,
440 nullptr, // context
441 0, // render_process_id
442 0, // render_view_id
443 0, // render_frame_id
444 true, // is_main_frame
445 false, // parent_is_main_frame
446 true, // allow_download
447 true, // is_async
448 false); // is_using_lofi
449
450 net::URLRequestStatus old_handler_status;
451 size_t old_handler_final_bytes_read = 0;
452 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
453 &old_handler_status, &old_handler_final_bytes_read));
454 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
455 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
456 new InterceptingResourceHandler(std::move(old_handler), request.get()));
457
458 scoped_refptr<ResourceResponse> response(new ResourceResponse);
459
460 // Simulate the MimeSniffingResourceHandler buffering the data.
461 scoped_refptr<net::IOBuffer> read_buffer;
462 int buf_size = 0;
463 bool defer = false;
464 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
465 EXPECT_FALSE(defer);
466 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
467
468 const char kData[] = "The data";
469 ASSERT_EQ(read_buffer.get(), old_buffer.get());
470 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
471 memcpy(read_buffer->data(), kData, sizeof(kData));
472
473 // Simulate the MimeSniffingResourceHandler asking the
474 // InterceptingResourceHandler to switch to a new handler.
475 net::URLRequestStatus new_handler_status;
476 size_t new_handler_final_bytes_read = 0;
477 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler(
478 &new_handler_status, &new_handler_final_bytes_read,
479 false, // on_response_started
480 true, // on_will_read
481 true)); // on_read_completed
482 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
483
484 // The response is received. The new ResourceHandler should tell us to fail.
485 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
486 EXPECT_FALSE(defer);
487 }
488
489 // Tests that the handler behaves properly if the new handler fails will read.
490 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) {
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 size_t old_handler_final_bytes_read = 0;
508 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
509 &old_handler_status, &old_handler_final_bytes_read));
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_EQ(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 size_t new_handler_final_bytes_read = 0;
533 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler(
534 &new_handler_status, &new_handler_final_bytes_read,
535 true, // on_response_started
536 false, // on_will_read
537 true)); // on_read_completed
538 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
539
540 // The response is received. The new handler should not have been asked to
541 // read yet.
542 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
543 EXPECT_FALSE(defer);
544 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
545 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
546
547 // The read is replayed by the MimeSniffingResourceHandler. The new
548 // handler should tell the caller to fail.
549 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer));
550 EXPECT_FALSE(defer);
551 }
552
553 // Tests that the handler behaves properly if the new handler fails read
554 // completed.
555 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) {
556 net::URLRequestContext context;
557 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
558 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
559 ResourceRequestInfo::AllocateForTesting(request.get(),
560 RESOURCE_TYPE_MAIN_FRAME,
561 nullptr, // context
562 0, // render_process_id
563 0, // render_view_id
564 0, // render_frame_id
565 true, // is_main_frame
566 false, // parent_is_main_frame
567 true, // allow_download
568 true, // is_async
569 false); // is_using_lofi
570
571 net::URLRequestStatus old_handler_status;
572 size_t old_handler_final_bytes_read = 0;
573 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
574 &old_handler_status, &old_handler_final_bytes_read));
575 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
576 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
577 new InterceptingResourceHandler(std::move(old_handler), request.get()));
578
579 scoped_refptr<ResourceResponse> response(new ResourceResponse);
580
581 // Simulate the MimeSniffingResourceHandler buffering the data.
582 scoped_refptr<net::IOBuffer> read_buffer;
583 int buf_size = 0;
584 bool defer = false;
585 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL(), &defer));
586 EXPECT_FALSE(defer);
587 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
588
589 const char kData[] = "The data";
590 ASSERT_EQ(read_buffer.get(), old_buffer.get());
591 ASSERT_GT(static_cast<size_t>(buf_size), sizeof(kData));
592 memcpy(read_buffer->data(), kData, sizeof(kData));
593
594 // Simulate the MimeSniffingResourceHandler asking the
595 // InterceptingResourceHandler to switch to a new handler.
596 net::URLRequestStatus new_handler_status;
597 size_t new_handler_final_bytes_read = 0;
598 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler(
599 &new_handler_status, &new_handler_final_bytes_read,
600 true, // on_response_started
601 true, // on_will_read
602 false)); // on_read_completed
603 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
604
605 // The response is received.
606 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
607 EXPECT_FALSE(defer);
608 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
609 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
610
611 // The read is replayed by the MimeSniffingResourceHandler. The new handler
612 // should tell the caller to fail.
613 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer));
614 EXPECT_FALSE(defer);
615 }
616
617 } // namespace
618
619 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/intercepting_resource_handler.cc ('k') | content/browser/loader/mime_sniffing_resource_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698