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

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: Fixed compilation error on Mac Created 4 years, 4 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 explicit TestResourceHandler(net::URLRequestStatus* request_status,
36 size_t* final_bytes_read)
mmenke 2016/08/22 20:39:04 Think these should be documented.
clamy 2016/09/01 23:19:41 Done.
37 : TestResourceHandler(request_status,
38 final_bytes_read,
39 true,
40 true,
41 true) {}
42
43 TestResourceHandler(net::URLRequestStatus* request_status,
44 size_t* final_bytes_read,
45 bool on_response_started,
46 bool on_will_read,
47 bool on_read_completed)
mmenke 2016/08/22 20:39:04 Maybe add _result to the last 3 values (And update
clamy 2016/09/01 23:19:41 Done.
48 : ResourceHandler(nullptr),
49 buffer_(new net::IOBuffer(2048)),
50 request_status_(request_status),
51 final_bytes_read_(final_bytes_read),
52 on_response_started_(on_response_started),
53 on_will_read_(on_will_read),
54 on_read_completed_(on_read_completed),
55 bytes_read_(0),
56 is_completed_(false) {
57 memset(buffer_->data(), '\0', 2048);
58 }
59
60 ~TestResourceHandler() override {}
61
62 void SetController(ResourceController* controller) override {}
63
64 bool OnRequestRedirected(const net::RedirectInfo& redirect_info,
65 ResourceResponse* response,
66 bool* defer) override {
67 NOTREACHED();
68 return false;
69 }
70
71 bool OnResponseStarted(ResourceResponse* response, bool* defer) override {
72 EXPECT_FALSE(is_completed_);
73 return on_response_started_;
74 }
75
76 bool OnWillStart(const GURL& url, bool* defer) override {
77 EXPECT_FALSE(is_completed_);
78 return false;
79 }
80
81 bool OnWillRead(scoped_refptr<net::IOBuffer>* buf,
82 int* buf_size,
83 int min_size) override {
84 EXPECT_FALSE(is_completed_);
85 *buf = buffer_;
86 *buf_size = 2048;
87 return on_will_read_;
88 }
89
90 bool OnReadCompleted(int bytes_read, bool* defer) override {
91 EXPECT_FALSE(is_completed_);
92 DCHECK_LT(bytes_read, 2048);
93 bytes_read_ += bytes_read;
94 return on_read_completed_;
95 }
96
97 void OnResponseCompleted(const net::URLRequestStatus& status,
98 const std::string& security_info,
99 bool* defer) override {
100 EXPECT_FALSE(is_completed_);
101 is_completed_ = true;
102 *request_status_ = status;
103 *final_bytes_read_ = bytes_read_;
104 }
105
106 void OnDataDownloaded(int bytes_downloaded) override { NOTREACHED(); }
107
108 scoped_refptr<net::IOBuffer> buffer() const { return buffer_; }
109
110 size_t bytes_read() const { return bytes_read_; }
111
112 private:
113 scoped_refptr<net::IOBuffer> buffer_;
114 net::URLRequestStatus* request_status_;
115 size_t* final_bytes_read_;
116 bool on_response_started_;
117 bool on_will_read_;
118 bool on_read_completed_;
119 size_t bytes_read_;
120 bool is_completed_;
121
122 DISALLOW_COPY_AND_ASSIGN(TestResourceHandler);
123 };
124
125 class InterceptingResourceHandlerTest : public testing::Test {
126 public:
127 InterceptingResourceHandlerTest() {}
128
129 private:
130 TestBrowserThreadBundle thread_bundle_;
131 };
132
133 // Tests that the data received is transmitted to the newly created
134 // ResourceHandler.
135 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchNoPayload) {
136 net::URLRequestContext context;
137 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
138 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
139 ResourceRequestInfo::AllocateForTesting(request.get(),
140 RESOURCE_TYPE_MAIN_FRAME,
141 nullptr, // context
142 0, // render_process_id
143 0, // render_view_id
144 0, // render_frame_id
145 true, // is_main_frame
146 false, // parent_is_main_frame
147 true, // allow_download
148 true, // is_async
149 false); // is_using_lofi
150
151 net::URLRequestStatus old_handler_status;
152 size_t old_handler_final_bytes_read = 0;
153 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
154 &old_handler_status, &old_handler_final_bytes_read));
155 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
156 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
157 new InterceptingResourceHandler(std::move(old_handler), request.get()));
158
159 scoped_refptr<ResourceResponse> response(new ResourceResponse);
160
161 // Simulate the MimeSniffingResourceHandler buffering the data.
162 scoped_refptr<net::IOBuffer> read_buffer;
163 int buf_size = 0;
164 bool defer = false;
165 intercepting_handler->OnWillStart(GURL(), &defer);
mmenke 2016/08/22 20:39:04 EXPECT_TRUE(intercepting_handler->OnWillStart(GURL
clamy 2016/09/01 23:19:40 Done.
166 intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1);
mmenke 2016/08/22 20:39:04 EXPECT_TRUE(intercepting_handler->OnWillRead(&read
clamy 2016/09/01 23:19:41 Done.
167
168 const char kData[] = "The data";
169 CHECK_EQ(read_buffer.get(), old_buffer.get());
mmenke 2016/08/22 20:39:04 ASSERT_EQ? (Same goes for other lines like this,
mmenke 2016/08/22 20:39:04 check buf_size as well?
clamy 2016/09/01 23:19:41 Done.
170 memcpy(read_buffer->data(), kData, sizeof(kData));
171
172 // Simulate the MimeSniffingResourceHandler asking the
173 // InterceptingResourceHandler to switch to a new handler.
174 net::URLRequestStatus new_handler_status;
175 size_t new_handler_final_bytes_read = 0;
176 std::unique_ptr<TestResourceHandler> new_handler_scoped(
177 new TestResourceHandler(&new_handler_status,
178 &new_handler_final_bytes_read));
179 TestResourceHandler* new_test_handler = new_handler_scoped.get();
180 intercepting_handler->UseNewHandler(std::move(new_handler_scoped),
181 std::string());
182
183 // The response is received. The new ResourceHandler should be used handle
184 // the download.
185 intercepting_handler->OnResponseStarted(response.get(), &defer);
186 EXPECT_FALSE(defer);
187
188 EXPECT_FALSE(old_handler_status.is_success());
189 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
190 EXPECT_EQ(0ul, old_handler_final_bytes_read);
191
192 // It should not have received the download data yet.
193 EXPECT_FALSE(
194 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData)));
mmenke 2016/08/22 20:39:04 Check that the new handler hasn't read any bytes y
clamy 2016/09/01 23:19:41 Done.
195
196 // The read is replayed by the MimeSniffingResourceHandler. The data should
197 // have been received by the new handler.
198 intercepting_handler->OnReadCompleted(sizeof(kData), &defer);
mmenke 2016/08/22 20:39:04 EXPECT_TRUE
clamy 2016/09/01 23:19:41 Done.
199 EXPECT_FALSE(defer);
200 EXPECT_EQ(sizeof(kData), new_test_handler->bytes_read());
201 EXPECT_TRUE(
202 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData)));
mmenke 2016/08/22 20:39:04 Suggest "EXPECT_EQ(kData, std::string(new_test_han
clamy 2016/09/01 23:19:41 This method doesn't work if we do more than one re
203
204 // Make sure another read behave as expected.
mmenke 2016/08/22 20:39:04 nit: behaves.
clamy 2016/09/01 23:19:41 Done.
205 memset(new_test_handler->buffer()->data(), '\0', 2048);
mmenke 2016/08/22 20:39:04 Should this be done in TestHandler::OnWillRead ins
clamy 2016/09/01 23:19:41 Done.
206 buf_size = 0;
207 intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1);
208 CHECK_EQ(read_buffer.get(), new_test_handler->buffer());
mmenke 2016/08/22 20:39:04 ASSERT_EQ
clamy 2016/09/01 23:19:41 Done.
209
210 const char kData2[] = "Data 2";
211 EXPECT_FALSE(
212 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2)));
213 memcpy(read_buffer->data(), kData2, sizeof(kData2));
214
215 intercepting_handler->OnReadCompleted(sizeof(kData2), &defer);
216 EXPECT_FALSE(defer);
217 EXPECT_TRUE(
218 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2)));
219 EXPECT_EQ(sizeof(kData) + sizeof(kData2), new_test_handler->bytes_read());
220 }
221
222 // Tests that the data received is transmitted to the newly created
223 // ResourceHandler and the specified payload to the old ResourceHandler.
224 TEST_F(InterceptingResourceHandlerTest, HandlerSwitchWithPayload) {
225 net::URLRequestContext context;
226 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
227 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
228 ResourceRequestInfo::AllocateForTesting(request.get(),
229 RESOURCE_TYPE_MAIN_FRAME,
230 nullptr, // context
231 0, // render_process_id
232 0, // render_view_id
233 0, // render_frame_id
234 true, // is_main_frame
235 false, // parent_is_main_frame
236 true, // allow_download
237 true, // is_async
238 false); // is_using_lofi
239
240 net::URLRequestStatus old_handler_status;
241 size_t old_handler_final_bytes_read = 0;
242 std::unique_ptr<TestResourceHandler> old_handler_scoped(
243 new TestResourceHandler(&old_handler_status,
244 &old_handler_final_bytes_read));
245 TestResourceHandler* old_handler = old_handler_scoped.get();
246 scoped_refptr<net::IOBuffer> old_buffer = old_handler->buffer();
247 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
248 new InterceptingResourceHandler(std::move(old_handler_scoped),
249 request.get()));
250
251 scoped_refptr<ResourceResponse> response(new ResourceResponse);
252
253 // Simulate the MimeSniffingResourceHandler buffering the data.
254 scoped_refptr<net::IOBuffer> read_buffer;
255 int buf_size = 0;
256 bool defer = false;
257 intercepting_handler->OnWillStart(GURL(), &defer);
258 intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1);
259
260 const char kData[] = "The data";
261 CHECK_EQ(read_buffer.get(), old_buffer.get());
262 memcpy(read_buffer->data(), kData, sizeof(kData));
263
264 // Simulate the MimeSniffingResourceHandler asking the
265 // InterceptingResourceHandler to switch to a new handler.
266 const std::string kPayload = "The payload";
267 net::URLRequestStatus new_handler_status;
268 size_t new_handler_final_bytes_read = 0;
269 std::unique_ptr<TestResourceHandler> new_handler_scoped(
270 new TestResourceHandler(&new_handler_status,
271 &new_handler_final_bytes_read));
272 TestResourceHandler* new_test_handler = new_handler_scoped.get();
273 intercepting_handler->UseNewHandler(std::move(new_handler_scoped), kPayload);
274
275 // The old handler should not have received the payload yet.
276 ASSERT_FALSE(old_handler->bytes_read());
277 EXPECT_FALSE(!memcmp(kPayload.c_str(), old_buffer->data(), kPayload.size()));
278
279 // The response is received. The new ResourceHandler should be used to handle
280 // the download.
281 intercepting_handler->OnResponseStarted(response.get(), &defer);
282 EXPECT_FALSE(defer);
283
284 // The old handler should have received the payload.
285 ASSERT_TRUE(old_handler_final_bytes_read == kPayload.size());
286 EXPECT_TRUE(!memcmp(kPayload.c_str(), old_buffer->data(), kPayload.size()));
287
288 EXPECT_TRUE(old_handler_status.is_success());
289 EXPECT_EQ(net::OK, old_handler_status.error());
290
291 // It should not have received the download data yet.
292 EXPECT_FALSE(
293 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData)));
294
295 // The read is replayed by the MimeSniffingResourceHandler. The data should
296 // have been received by the new handler.
297 intercepting_handler->OnReadCompleted(sizeof(kData), &defer);
298 EXPECT_FALSE(defer);
299 EXPECT_TRUE(
300 !memcmp(kData, new_test_handler->buffer()->data(), sizeof(kData)));
301 EXPECT_EQ(sizeof(kData), new_test_handler->bytes_read());
302
303 // Make sure another read behave as expected.
304 memset(new_test_handler->buffer()->data(), '\0', 2048);
305 buf_size = 0;
306 intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1);
307 CHECK_EQ(read_buffer.get(), new_test_handler->buffer());
308
309 const char kData2[] = "Data 2";
310 EXPECT_FALSE(
311 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2)));
312 memcpy(read_buffer->data(), kData2, sizeof(kData2));
313
314 intercepting_handler->OnReadCompleted(sizeof(kData2), &defer);
315 EXPECT_FALSE(defer);
316 EXPECT_TRUE(
317 !memcmp(kData2, new_test_handler->buffer()->data(), sizeof(kData2)));
318 EXPECT_EQ(sizeof(kData) + sizeof(kData2), new_test_handler->bytes_read());
319 }
320
321 // Tests that the handler behaves properly when it doesn't have to use an
322 // alternate next handler.
323 TEST_F(InterceptingResourceHandlerTest, NoSwitching) {
mmenke 2016/08/22 20:39:04 nit: Suggest this test first, as the base / simpl
clamy 2016/09/01 23:19:41 Done.
324 net::URLRequestContext context;
325 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
326 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
327 ResourceRequestInfo::AllocateForTesting(request.get(),
328 RESOURCE_TYPE_MAIN_FRAME,
329 nullptr, // context
330 0, // render_process_id
331 0, // render_view_id
332 0, // render_frame_id
333 true, // is_main_frame
334 false, // parent_is_main_frame
335 true, // allow_download
336 true, // is_async
337 false); // is_using_lofi
338
339 net::URLRequestStatus old_handler_status;
340 size_t old_handler_final_bytes_read = 0;
341 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
342 &old_handler_status, &old_handler_final_bytes_read));
343 TestResourceHandler* old_test_handler = old_handler.get();
344 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
345 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
346 new InterceptingResourceHandler(std::move(old_handler), request.get()));
347
348 scoped_refptr<ResourceResponse> response(new ResourceResponse);
349
350 // Simulate the MimeSniffingResourceHandler buffering the data.
351 scoped_refptr<net::IOBuffer> read_buffer;
352 int buf_size = 0;
353 bool defer = false;
354 intercepting_handler->OnWillStart(GURL(), &defer);
355 intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1);
356
357 const char kData[] = "The data";
358 EXPECT_FALSE(
359 !memcmp(kData, old_test_handler->buffer()->data(), sizeof(kData)));
360
361 CHECK_EQ(read_buffer.get(), old_test_handler->buffer());
362 memcpy(read_buffer->data(), kData, sizeof(kData));
363
364 // The response is received. The handler should not change.
365 intercepting_handler->OnResponseStarted(response.get(), &defer);
366 EXPECT_FALSE(defer);
367
368 // The read is replayed by the MimeSniffingResourceHandler. The data should
369 // have been received by the old intercepting_handler.
370 intercepting_handler->OnReadCompleted(sizeof(kData), &defer);
371 EXPECT_FALSE(defer);
372 EXPECT_TRUE(
373 !memcmp(kData, old_test_handler->buffer()->data(), sizeof(kData)));
374 EXPECT_EQ(sizeof(kData), old_test_handler->bytes_read());
375
376 // Make sure another read behave as expected.
377 memset(old_test_handler->buffer()->data(), '\0', 2048);
378 buf_size = 0;
379 intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1);
380 CHECK_EQ(read_buffer.get(), old_test_handler->buffer());
381
382 const char kData2[] = "Data 2";
383 EXPECT_FALSE(
384 !memcmp(kData2, old_test_handler->buffer()->data(), sizeof(kData2)));
385 memcpy(read_buffer->data(), kData2, sizeof(kData2));
386
387 intercepting_handler->OnReadCompleted(sizeof(kData2), &defer);
388 EXPECT_FALSE(defer);
389 EXPECT_TRUE(
390 !memcmp(kData2, old_test_handler->buffer()->data(), sizeof(kData2)));
391 EXPECT_EQ(sizeof(kData) + sizeof(kData2), old_test_handler->bytes_read());
392 }
393
394 // Tests that the handler behaves properly if the old handler fails will read.
395 TEST_F(InterceptingResourceHandlerTest, OldHandlerFailsWillRead) {
396 net::URLRequestContext context;
397 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
398 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
399 ResourceRequestInfo::AllocateForTesting(request.get(),
400 RESOURCE_TYPE_MAIN_FRAME,
401 nullptr, // context
402 0, // render_process_id
403 0, // render_view_id
404 0, // render_frame_id
405 true, // is_main_frame
406 false, // parent_is_main_frame
407 true, // allow_download
408 true, // is_async
409 false); // is_using_lofi
410
411 net::URLRequestStatus old_handler_status;
412 size_t old_handler_final_bytes_read = 0;
413 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
414 &old_handler_status, &old_handler_final_bytes_read,
415 true, // on_response_started
416 false, // on_will_read
417 true)); // on_read_completed
418 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
419 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
420 new InterceptingResourceHandler(std::move(old_handler), request.get()));
421
422 scoped_refptr<ResourceResponse> response(new ResourceResponse);
423
424 // Simulate the MimeSniffingResourceHandler buffering the data. The old
425 // handler should tell the caller to fail.
426 scoped_refptr<net::IOBuffer> read_buffer;
427 int buf_size = 0;
428 bool defer = false;
429 intercepting_handler->OnWillStart(GURL(), &defer);
430 EXPECT_FALSE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
431 }
432
433 // Tests that the handler behaves properly if the new handler fails response
434 // started.
435 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsResponseStarted) {
436 net::URLRequestContext context;
437 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
438 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
439 ResourceRequestInfo::AllocateForTesting(request.get(),
440 RESOURCE_TYPE_MAIN_FRAME,
441 nullptr, // context
442 0, // render_process_id
443 0, // render_view_id
444 0, // render_frame_id
445 true, // is_main_frame
446 false, // parent_is_main_frame
447 true, // allow_download
448 true, // is_async
449 false); // is_using_lofi
450
451 net::URLRequestStatus old_handler_status;
452 size_t old_handler_final_bytes_read = 0;
453 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
454 &old_handler_status, &old_handler_final_bytes_read));
455 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
456 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
457 new InterceptingResourceHandler(std::move(old_handler), request.get()));
458
459 scoped_refptr<ResourceResponse> response(new ResourceResponse);
460
461 // Simulate the MimeSniffingResourceHandler buffering the data.
462 scoped_refptr<net::IOBuffer> read_buffer;
463 int buf_size = 0;
464 bool defer = false;
465 intercepting_handler->OnWillStart(GURL(), &defer);
466 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
467
468 const char kData[] = "The data";
469 CHECK_EQ(read_buffer.get(), old_buffer.get());
470 memcpy(read_buffer->data(), kData, sizeof(kData));
471
472 // Simulate the MimeSniffingResourceHandler asking the
473 // InterceptingResourceHandler to switch to a new handler.
474 net::URLRequestStatus new_handler_status;
475 size_t new_handler_final_bytes_read = 0;
476 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler(
477 &new_handler_status, &new_handler_final_bytes_read,
478 false, // on_response_started
479 true, // on_will_read
480 true)); // on_read_completed
481 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
482
483 // The response is received. The new ResourceHandler should tell us to fail.
484 EXPECT_FALSE(intercepting_handler->OnResponseStarted(response.get(), &defer));
485 EXPECT_FALSE(defer);
486 }
487
488 // Tests that the handler behaves properly if the new handler fails will read.
489 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsWillRead) {
490 net::URLRequestContext context;
491 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
492 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
493 ResourceRequestInfo::AllocateForTesting(request.get(),
494 RESOURCE_TYPE_MAIN_FRAME,
495 nullptr, // context
496 0, // render_process_id
497 0, // render_view_id
498 0, // render_frame_id
499 true, // is_main_frame
500 false, // parent_is_main_frame
501 true, // allow_download
502 true, // is_async
503 false); // is_using_lofi
504
505 net::URLRequestStatus old_handler_status;
506 size_t old_handler_final_bytes_read = 0;
507 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
508 &old_handler_status, &old_handler_final_bytes_read));
509 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
510 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
511 new InterceptingResourceHandler(std::move(old_handler), request.get()));
512
513 scoped_refptr<ResourceResponse> response(new ResourceResponse);
514
515 // Simulate the MimeSniffingResourceHandler buffering the data.
516 scoped_refptr<net::IOBuffer> read_buffer;
517 int buf_size = 0;
518 bool defer = false;
519 intercepting_handler->OnWillStart(GURL(), &defer);
520 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
521
522 const char kData[] = "The data";
523 CHECK_EQ(read_buffer.get(), old_buffer.get());
524 memcpy(read_buffer->data(), kData, sizeof(kData));
525
526 // Simulate the MimeSniffingResourceHandler asking the
527 // InterceptingResourceHandler to switch to a new handler.
528 net::URLRequestStatus new_handler_status;
529 size_t new_handler_final_bytes_read = 0;
530 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler(
531 &new_handler_status, &new_handler_final_bytes_read,
532 true, // on_response_started
533 false, // on_will_read
534 true)); // on_read_completed
535 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
536
537 // The response is received. The new handler should not have been asked to
538 // read yet.
539 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
540 EXPECT_FALSE(defer);
541 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
542 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
543
544 // The read is replayed by the MimeSniffingResourceHandler. The new
545 // handler should tell the caller to fail.
546 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer));
547 EXPECT_FALSE(defer);
548 }
549
550 // Tests that the handler behaves properly if the new handler fails read
551 // completed.
552 TEST_F(InterceptingResourceHandlerTest, NewHandlerFailsReadCompleted) {
553 net::URLRequestContext context;
554 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
555 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
556 ResourceRequestInfo::AllocateForTesting(request.get(),
557 RESOURCE_TYPE_MAIN_FRAME,
558 nullptr, // context
559 0, // render_process_id
560 0, // render_view_id
561 0, // render_frame_id
562 true, // is_main_frame
563 false, // parent_is_main_frame
564 true, // allow_download
565 true, // is_async
566 false); // is_using_lofi
567
568 net::URLRequestStatus old_handler_status;
569 size_t old_handler_final_bytes_read = 0;
570 std::unique_ptr<TestResourceHandler> old_handler(new TestResourceHandler(
571 &old_handler_status, &old_handler_final_bytes_read));
572 scoped_refptr<net::IOBuffer> old_buffer = old_handler.get()->buffer();
573 std::unique_ptr<InterceptingResourceHandler> intercepting_handler(
574 new InterceptingResourceHandler(std::move(old_handler), request.get()));
575
576 scoped_refptr<ResourceResponse> response(new ResourceResponse);
577
578 // Simulate the MimeSniffingResourceHandler buffering the data.
579 scoped_refptr<net::IOBuffer> read_buffer;
580 int buf_size = 0;
581 bool defer = false;
582 intercepting_handler->OnWillStart(GURL(), &defer);
583 EXPECT_TRUE(intercepting_handler->OnWillRead(&read_buffer, &buf_size, -1));
584
585 const char kData[] = "The data";
586 CHECK_EQ(read_buffer.get(), old_buffer.get());
587 memcpy(read_buffer->data(), kData, sizeof(kData));
588
589 // Simulate the MimeSniffingResourceHandler asking the
590 // InterceptingResourceHandler to switch to a new handler.
591 net::URLRequestStatus new_handler_status;
592 size_t new_handler_final_bytes_read = 0;
593 std::unique_ptr<TestResourceHandler> new_handler(new TestResourceHandler(
594 &new_handler_status, &new_handler_final_bytes_read,
595 true, // on_response_started
596 true, // on_will_read
597 false)); // on_read_completed
598 intercepting_handler->UseNewHandler(std::move(new_handler), std::string());
599
600 // The response is received.
601 EXPECT_TRUE(intercepting_handler->OnResponseStarted(response.get(), &defer));
602 EXPECT_FALSE(defer);
603 EXPECT_EQ(net::URLRequestStatus::CANCELED, old_handler_status.status());
604 EXPECT_EQ(net::ERR_ABORTED, old_handler_status.error());
605
606 // The read is replayed by the MimeSniffingResourceHandler. The new handler
607 // should tell the caller to fail.
608 EXPECT_FALSE(intercepting_handler->OnReadCompleted(sizeof(kData), &defer));
609 EXPECT_FALSE(defer);
610 }
611
612 } // namespace
613
614 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698