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

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

Powered by Google App Engine
This is Rietveld 408576698