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

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

Issue 2743723003: Add buffering to MimeSniffingResourceHandler.
Patch Set: Remove unused 'first_call' variable. Created 3 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/browser/loader/mime_sniffing_resource_handler.h" 5 #include "content/browser/loader/mime_sniffing_resource_handler.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm>
9 #include <memory> 10 #include <memory>
10 11
11 #include "base/files/file_path.h" 12 #include "base/files/file_path.h"
12 #include "base/location.h" 13 #include "base/location.h"
13 #include "base/logging.h" 14 #include "base/logging.h"
14 #include "base/macros.h" 15 #include "base/macros.h"
15 #include "base/memory/ptr_util.h" 16 #include "base/memory/ptr_util.h"
16 #include "base/single_thread_task_runner.h" 17 #include "base/single_thread_task_runner.h"
17 #include "base/threading/thread_task_runner_handle.h" 18 #include "base/threading/thread_task_runner_handle.h"
18 #include "content/browser/loader/intercepting_resource_handler.h" 19 #include "content/browser/loader/intercepting_resource_handler.h"
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 bool must_download, 185 bool must_download,
185 ResourceType request_resource_type); 186 ResourceType request_resource_type);
186 187
187 // Tests the operation of the MimeSniffingHandler when it needs to buffer 188 // Tests the operation of the MimeSniffingHandler when it needs to buffer
188 // data (example case: the response is text/plain). 189 // data (example case: the response is text/plain).
189 void TestHandlerSniffing(bool response_started, 190 void TestHandlerSniffing(bool response_started,
190 bool defer_response_started, 191 bool defer_response_started,
191 bool will_read, 192 bool will_read,
192 bool defer_will_read, 193 bool defer_will_read,
193 bool read_completed, 194 bool read_completed,
194 bool defer_read_completed); 195 bool defer_read_completed,
196 int read_chunk_size,
197 int downstream_handler_buffer_size);
195 198
196 // Tests the operation of the MimeSniffingHandler when it doesn't buffer 199 // Tests the operation of the MimeSniffingHandler when it doesn't buffer
197 // data (example case: the response is text/html). 200 // data (example case: the response is text/html).
198 void TestHandlerNoSniffing(bool response_started, 201 void TestHandlerNoSniffing(bool response_started,
199 bool defer_response_started, 202 bool defer_response_started,
200 bool will_read, 203 bool will_read,
201 bool defer_will_read, 204 bool defer_will_read,
202 bool read_completed, 205 bool read_completed,
203 bool defer_read_completed); 206 bool defer_read_completed,
207 int read_chunk_size,
208 int downstream_handler_buffer_size);
204 209
205 private: 210 private:
206 // Whether the URL request should be intercepted as a stream. 211 // Whether the URL request should be intercepted as a stream.
207 bool stream_has_handler_; 212 bool stream_has_handler_;
208 bool plugin_available_; 213 bool plugin_available_;
209 bool plugin_stale_; 214 bool plugin_stale_;
210 215
211 TestBrowserThreadBundle thread_bundle_; 216 TestBrowserThreadBundle thread_bundle_;
212 }; 217 };
213 218
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 EXPECT_TRUE(intercepting_handler->new_handler_for_testing()); 314 EXPECT_TRUE(intercepting_handler->new_handler_for_testing());
310 return host.intercepted_as_stream(); 315 return host.intercepted_as_stream();
311 } 316 }
312 317
313 void MimeSniffingResourceHandlerTest::TestHandlerSniffing( 318 void MimeSniffingResourceHandlerTest::TestHandlerSniffing(
314 bool response_started, 319 bool response_started,
315 bool defer_response_started, 320 bool defer_response_started,
316 bool will_read, 321 bool will_read,
317 bool defer_will_read, 322 bool defer_will_read,
318 bool read_completed, 323 bool read_completed,
319 bool defer_read_completed) { 324 bool defer_read_completed,
325 int read_chunk_size,
326 int downstream_handler_buffer_size) {
320 net::URLRequestContext context; 327 net::URLRequestContext context;
321 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 328 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
322 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 329 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
323 ResourceRequestInfo::AllocateForTesting(request.get(), 330 ResourceRequestInfo::AllocateForTesting(request.get(),
324 RESOURCE_TYPE_MAIN_FRAME, 331 RESOURCE_TYPE_MAIN_FRAME,
325 nullptr, // context 332 nullptr, // context
326 0, // render_process_id 333 0, // render_process_id
327 0, // render_view_id 334 0, // render_view_id
328 0, // render_frame_id 335 0, // render_frame_id
329 true, // is_main_frame 336 true, // is_main_frame
(...skipping 12 matching lines...) Expand all
342 nullptr)); 349 nullptr));
343 350
344 std::unique_ptr<TestResourceHandler> scoped_test_handler( 351 std::unique_ptr<TestResourceHandler> scoped_test_handler(
345 new TestResourceHandler()); 352 new TestResourceHandler());
346 scoped_test_handler->set_on_response_started_result(response_started); 353 scoped_test_handler->set_on_response_started_result(response_started);
347 scoped_test_handler->set_defer_on_response_started(defer_response_started); 354 scoped_test_handler->set_defer_on_response_started(defer_response_started);
348 scoped_test_handler->set_on_will_read_result(will_read); 355 scoped_test_handler->set_on_will_read_result(will_read);
349 scoped_test_handler->set_defer_on_will_read(defer_will_read); 356 scoped_test_handler->set_defer_on_will_read(defer_will_read);
350 scoped_test_handler->set_on_read_completed_result(read_completed); 357 scoped_test_handler->set_on_read_completed_result(read_completed);
351 scoped_test_handler->set_defer_on_read_completed(defer_read_completed); 358 scoped_test_handler->set_defer_on_read_completed(defer_read_completed);
359 scoped_test_handler->SetBufferSize(downstream_handler_buffer_size);
352 TestResourceHandler* test_handler = scoped_test_handler.get(); 360 TestResourceHandler* test_handler = scoped_test_handler.get();
353 MimeSniffingResourceHandler mime_sniffing_handler( 361 MimeSniffingResourceHandler mime_sniffing_handler(
354 std::move(scoped_test_handler), &host, &plugin_service, 362 std::move(scoped_test_handler), &host, &plugin_service,
355 intercepting_handler.get(), request.get(), 363 intercepting_handler.get(), request.get(),
356 REQUEST_CONTEXT_TYPE_UNSPECIFIED); 364 REQUEST_CONTEXT_TYPE_UNSPECIFIED);
357 365
358 MockResourceLoader mock_loader(&mime_sniffing_handler); 366 MockResourceLoader mock_loader(&mime_sniffing_handler);
359 367
360 ASSERT_EQ(MockResourceLoader::Status::IDLE, 368 ASSERT_EQ(MockResourceLoader::Status::IDLE,
361 mock_loader.OnWillStart(request->url())); 369 mock_loader.OnWillStart(request->url()));
362 370
363 // The response should be sniffed. 371 // The response should be sniffed.
364 scoped_refptr<ResourceResponse> response(new ResourceResponse); 372 scoped_refptr<ResourceResponse> response(new ResourceResponse);
365 response->head.mime_type.assign("text/plain"); 373 response->head.mime_type.assign("text/plain");
366 374
367 // Simulate the response starting. The MimeSniffingHandler should start 375 // Simulate the response starting. The MimeSniffingHandler should start
368 // buffering, so the return value should always be true. 376 // buffering, so the return value should always be true.
369 ASSERT_EQ(MockResourceLoader::Status::IDLE, 377 ASSERT_EQ(MockResourceLoader::Status::IDLE,
370 mock_loader.OnResponseStarted(std::move(response))); 378 mock_loader.OnResponseStarted(std::move(response)));
371 379
372 // Read some data to sniff the mime type. This will ask the next 380 // Read some data to sniff the mime type.
373 // ResourceHandler for a buffer. 381 // Simulate an HTML page. The mime sniffer will identify the MimeType and
374 mock_loader.OnWillRead(); 382 // proceed with replay.
383 const char kData[] = "!DOCTYPE html\n<head>\n<title>Foo</title>\n</head>";
384 size_t string_pos = 0u;
385 do {
386 mock_loader.OnWillRead();
375 387
376 if (!will_read) { 388 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status());
389
390 size_t amount_to_write = std::min(sizeof(kData) - string_pos,
391 static_cast<size_t>(read_chunk_size));
392
393 // Construct StringPiece manually, as the terminal null needs to be
394 // included, so it's sniffed as binary (Not important that it's sniffed
395 // as binary, but this gaurantees it's sniffed as something, without
396 // waiting for more data).
397 mock_loader.OnReadCompleted(
398 base::StringPiece(kData + string_pos, amount_to_write));
399 string_pos += amount_to_write;
400 } while (string_pos != sizeof(kData));
401
402 // If the next handler cancels the response start, the caller of
403 // MimeSniffingHandler::OnReadCompleted should be notified immediately.
404 if (!response_started) {
377 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); 405 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status());
378 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); 406 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
379 407
380 EXPECT_EQ(1, test_handler->on_will_start_called()); 408 EXPECT_EQ(1, test_handler->on_will_start_called());
381 EXPECT_EQ(0, test_handler->on_request_redirected_called()); 409 EXPECT_EQ(0, test_handler->on_request_redirected_called());
382 EXPECT_EQ(0, test_handler->on_response_started_called()); 410 EXPECT_EQ(1, test_handler->on_response_started_called());
383 EXPECT_EQ(1, test_handler->on_will_read_called()); 411 EXPECT_EQ(0, test_handler->on_will_read_called());
384 EXPECT_EQ(0, test_handler->on_read_completed_called()); 412 EXPECT_EQ(0, test_handler->on_read_completed_called());
385 413
386 // Process all messages to ensure proper test teardown. 414 // Process all messages to ensure proper test teardown.
387 content::RunAllPendingInMessageLoop(); 415 content::RunAllPendingInMessageLoop();
388 return; 416 return;
389 } 417 }
390 418
391 if (defer_will_read) { 419 if (defer_response_started) {
392 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 420 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
393 mock_loader.status()); 421 mock_loader.status());
394 EXPECT_EQ(MimeSniffingResourceHandler::STATE_WAITING_FOR_BUFFER, 422 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED,
395 mime_sniffing_handler.state_); 423 mime_sniffing_handler.state_);
396 test_handler->Resume(); 424 test_handler->Resume();
397 // MimeSniffingResourceHandler may not synchronously resume the request. 425 // MimeSniffingResourceHandler may not synchronously resume the request.
398 base::RunLoop().RunUntilIdle(); 426 base::RunLoop().RunUntilIdle();
399 } 427 }
400 428
401 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); 429 // This is the point at which the replay will happen, which will allocate
402 430 // a buffer and give the downstream handler a chance to cancel.
403 // Simulate an HTML page. The mime sniffer will identify the MimeType and 431 if (!will_read) {
404 // proceed with replay.
405 const char kData[] = "!DOCTYPE html\n<head>\n<title>Foo</title>\n</head>";
406 // Construct StringPiece manually, as the terminal null needs to be included,
407 // so it's sniffed as binary (Not important that it's sniffed as binary, but
408 // this gaurantees it's sniffed as something, without waiting for more data).
409 mock_loader.OnReadCompleted(base::StringPiece(kData, sizeof(kData)));
410
411 // If the next handler cancels the response start, the caller of
412 // MimeSniffingHandler::OnReadCompleted should be notified immediately.
413 if (!response_started) {
414 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); 432 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status());
415 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); 433 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
416 434
417 EXPECT_EQ(1, test_handler->on_will_start_called()); 435 EXPECT_EQ(1, test_handler->on_will_start_called());
418 EXPECT_EQ(0, test_handler->on_request_redirected_called()); 436 EXPECT_EQ(0, test_handler->on_request_redirected_called());
419 EXPECT_EQ(1, test_handler->on_response_started_called()); 437 EXPECT_EQ(1, test_handler->on_response_started_called());
420 EXPECT_EQ(1, test_handler->on_will_read_called()); 438 EXPECT_EQ(1, test_handler->on_will_read_called());
421 EXPECT_EQ(0, test_handler->on_read_completed_called()); 439 EXPECT_EQ(0, test_handler->on_read_completed_called());
422 440
423 // Process all messages to ensure proper test teardown. 441 // Process all messages to ensure proper test teardown.
424 content::RunAllPendingInMessageLoop(); 442 content::RunAllPendingInMessageLoop();
425 return; 443 return;
426 } 444 }
427 445
428 if (defer_response_started) { 446 if (defer_will_read) {
429 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 447 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
430 mock_loader.status()); 448 mock_loader.status());
431 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, 449 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_WAIT_FOR_WILL_READ,
432 mime_sniffing_handler.state_); 450 mime_sniffing_handler.state_);
433 test_handler->Resume(); 451 test_handler->Resume();
434 // MimeSniffingResourceHandler may not synchronously resume the request. 452 // MimeSniffingResourceHandler may not synchronously resume the request.
435 base::RunLoop().RunUntilIdle(); 453 base::RunLoop().RunUntilIdle();
436 } 454 }
437 455
438 // The body that was sniffed should be transmitted to the next handler. This 456 // The body that was sniffed should be transmitted to the next handler. This
439 // may cancel the request. 457 // may cancel the request.
440 if (!read_completed) { 458 if (!read_completed) {
441 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); 459 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status());
442 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); 460 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
443 461
444 // Process all messages to ensure proper test teardown. 462 // Process all messages to ensure proper test teardown.
445 content::RunAllPendingInMessageLoop(); 463 content::RunAllPendingInMessageLoop();
446 return; 464 return;
447 } 465 }
448 466
449 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING,
450 mime_sniffing_handler.state_);
451
452 // The request may be deferred by the next handler once the read is done. 467 // The request may be deferred by the next handler once the read is done.
453 if (defer_read_completed) { 468 if (defer_read_completed) {
469 // The replay isn't considered complete until the downstream handler
470 // finishes the read completed....
471 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED,
472 mime_sniffing_handler.state_);
454 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 473 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
455 mock_loader.status()); 474 mock_loader.status());
456 test_handler->Resume(); 475 test_handler->Resume();
457 // MimeSniffingResourceHandler may not synchronously resume the request. 476
477 // (MimeSniffingResourceHandler may not synchronously resume the request.)
458 base::RunLoop().RunUntilIdle(); 478 base::RunLoop().RunUntilIdle();
479
480 // ... which should be now.
481 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING,
482 mime_sniffing_handler.state_);
483 } else {
484 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING,
485 mime_sniffing_handler.state_);
459 } 486 }
460 487
461 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); 488 EXPECT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status());
462 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, 489 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING,
463 mime_sniffing_handler.state_); 490 mime_sniffing_handler.state_);
464 491
465 EXPECT_EQ(1, test_handler->on_will_start_called()); 492 EXPECT_EQ(1, test_handler->on_will_start_called());
466 EXPECT_EQ(0, test_handler->on_request_redirected_called()); 493 EXPECT_EQ(0, test_handler->on_request_redirected_called());
467 EXPECT_EQ(1, test_handler->on_response_started_called()); 494 EXPECT_EQ(1, test_handler->on_response_started_called());
468 EXPECT_EQ(1, test_handler->on_will_read_called()); 495 EXPECT_LE(1, test_handler->on_will_read_called());
469 EXPECT_EQ(1, test_handler->on_read_completed_called()); 496 EXPECT_LE(1, test_handler->on_read_completed_called());
497 // Include trailing null in expected value.
498 EXPECT_EQ(std::string(kData, strlen(kData) + 1), test_handler->body());
470 499
471 // Process all messages to ensure proper test teardown. 500 // Process all messages to ensure proper test teardown.
472 content::RunAllPendingInMessageLoop(); 501 content::RunAllPendingInMessageLoop();
473 } 502 }
474 503
475 void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing( 504 void MimeSniffingResourceHandlerTest::TestHandlerNoSniffing(
476 bool response_started, 505 bool response_started,
477 bool defer_response_started, 506 bool defer_response_started,
478 bool will_read, 507 bool will_read,
479 bool defer_will_read, 508 bool defer_will_read,
480 bool read_completed, 509 bool read_completed,
481 bool defer_read_completed) { 510 bool defer_read_completed,
511 int read_chunk_size,
512 int downstream_handler_buffer_size) {
482 net::URLRequestContext context; 513 net::URLRequestContext context;
483 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 514 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
484 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 515 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
485 ResourceRequestInfo::AllocateForTesting(request.get(), 516 ResourceRequestInfo::AllocateForTesting(request.get(),
486 RESOURCE_TYPE_MAIN_FRAME, 517 RESOURCE_TYPE_MAIN_FRAME,
487 nullptr, // context 518 nullptr, // context
488 0, // render_process_id 519 0, // render_process_id
489 0, // render_view_id 520 0, // render_view_id
490 0, // render_frame_id 521 0, // render_frame_id
491 true, // is_main_frame 522 true, // is_main_frame
(...skipping 12 matching lines...) Expand all
504 nullptr)); 535 nullptr));
505 536
506 std::unique_ptr<TestResourceHandler> scoped_test_handler( 537 std::unique_ptr<TestResourceHandler> scoped_test_handler(
507 new TestResourceHandler()); 538 new TestResourceHandler());
508 scoped_test_handler->set_on_response_started_result(response_started); 539 scoped_test_handler->set_on_response_started_result(response_started);
509 scoped_test_handler->set_defer_on_response_started(defer_response_started); 540 scoped_test_handler->set_defer_on_response_started(defer_response_started);
510 scoped_test_handler->set_on_will_read_result(will_read); 541 scoped_test_handler->set_on_will_read_result(will_read);
511 scoped_test_handler->set_defer_on_will_read(defer_will_read); 542 scoped_test_handler->set_defer_on_will_read(defer_will_read);
512 scoped_test_handler->set_on_read_completed_result(read_completed); 543 scoped_test_handler->set_on_read_completed_result(read_completed);
513 scoped_test_handler->set_defer_on_read_completed(defer_read_completed); 544 scoped_test_handler->set_defer_on_read_completed(defer_read_completed);
545 scoped_test_handler->SetBufferSize(downstream_handler_buffer_size);
514 TestResourceHandler* test_handler = scoped_test_handler.get(); 546 TestResourceHandler* test_handler = scoped_test_handler.get();
515 MimeSniffingResourceHandler mime_sniffing_handler( 547 MimeSniffingResourceHandler mime_sniffing_handler(
516 std::move(scoped_test_handler), &host, &plugin_service, 548 std::move(scoped_test_handler), &host, &plugin_service,
517 intercepting_handler.get(), request.get(), 549 intercepting_handler.get(), request.get(),
518 REQUEST_CONTEXT_TYPE_UNSPECIFIED); 550 REQUEST_CONTEXT_TYPE_UNSPECIFIED);
519 551
520 MockResourceLoader mock_loader(&mime_sniffing_handler); 552 MockResourceLoader mock_loader(&mime_sniffing_handler);
521 553
522 ASSERT_EQ(MockResourceLoader::Status::IDLE, 554 ASSERT_EQ(MockResourceLoader::Status::IDLE,
523 mock_loader.OnWillStart(request->url())); 555 mock_loader.OnWillStart(request->url()));
(...skipping 24 matching lines...) Expand all
548 if (defer_response_started) { 580 if (defer_response_started) {
549 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 581 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
550 mock_loader.status()); 582 mock_loader.status());
551 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED, 583 EXPECT_EQ(MimeSniffingResourceHandler::STATE_REPLAYING_RESPONSE_RECEIVED,
552 mime_sniffing_handler.state_); 584 mime_sniffing_handler.state_);
553 test_handler->Resume(); 585 test_handler->Resume();
554 // MimeSniffingResourceHandler may not synchronously resume the request. 586 // MimeSniffingResourceHandler may not synchronously resume the request.
555 base::RunLoop().RunUntilIdle(); 587 base::RunLoop().RunUntilIdle();
556 } 588 }
557 589
558 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); 590 const std::string input(std::string(2000, 'a'));
591 const char* to_read = input.c_str();
592 int read_cycles = 1;
593 do {
594 // The MimeSniffingResourceHandler should be acting as a pass-through
595 // ResourceHandler.
596 mock_loader.OnWillRead();
559 597
560 // The MimeSniffingResourceHandler should be acting as a pass-through 598 // Only relevant the first time through the loop.
561 // ResourceHandler. 599 if (!will_read) {
562 mock_loader.OnWillRead(); 600 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status());
601 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
563 602
564 if (!will_read) { 603 EXPECT_EQ(1, test_handler->on_will_start_called());
565 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status()); 604 EXPECT_EQ(0, test_handler->on_request_redirected_called());
566 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); 605 EXPECT_EQ(1, test_handler->on_response_started_called());
606 EXPECT_EQ(1, test_handler->on_will_read_called());
607 EXPECT_EQ(0, test_handler->on_read_completed_called());
608
609 // Process all messages to ensure proper test teardown.
610 content::RunAllPendingInMessageLoop();
611 return;
612 }
613
614 if (defer_will_read) {
615 defer_will_read = false; // Only a single will read is deferred.
616 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING,
617 mock_loader.status());
618 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING,
619 mime_sniffing_handler.state_);
620 test_handler->Resume();
621 // MimeSniffingResourceHandler may not synchronously resume the request.
622 base::RunLoop().RunUntilIdle();
623 }
624
625 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status());
626
627 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status());
628 int amount_to_read =
629 std::min(static_cast<int>(strlen(to_read)),
630 std::min(mock_loader.io_buffer_size(), read_chunk_size));
631
632 mock_loader.OnReadCompleted(std::string(to_read, amount_to_read));
633 to_read += amount_to_read;
567 634
568 EXPECT_EQ(1, test_handler->on_will_start_called()); 635 EXPECT_EQ(1, test_handler->on_will_start_called());
569 EXPECT_EQ(0, test_handler->on_request_redirected_called()); 636 EXPECT_EQ(0, test_handler->on_request_redirected_called());
570 EXPECT_EQ(1, test_handler->on_response_started_called()); 637 EXPECT_EQ(1, test_handler->on_response_started_called());
571 EXPECT_EQ(1, test_handler->on_will_read_called()); 638 EXPECT_EQ(read_cycles, test_handler->on_will_read_called());
572 EXPECT_EQ(0, test_handler->on_read_completed_called()); 639 EXPECT_EQ(read_cycles, test_handler->on_read_completed_called());
573 640
574 // Process all messages to ensure proper test teardown. 641 // Only relevant first time through.
575 content::RunAllPendingInMessageLoop(); 642 if (!read_completed) {
576 return; 643 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status());
577 } 644 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
578 645
579 if (defer_will_read) { 646 // Process all messages to ensure proper test teardown.
580 ASSERT_EQ(MockResourceLoader::Status::CALLBACK_PENDING, 647 content::RunAllPendingInMessageLoop();
581 mock_loader.status()); 648 return;
582 EXPECT_EQ(MimeSniffingResourceHandler::STATE_STREAMING, 649 }
583 mime_sniffing_handler.state_);
584 test_handler->Resume();
585 // MimeSniffingResourceHandler may not synchronously resume the request.
586 base::RunLoop().RunUntilIdle();
587 }
588 650
589 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); 651 if (mock_loader.status() == MockResourceLoader::Status::CALLBACK_PENDING) {
652 test_handler->Resume();
653 // MimeSniffingResourceHandler may not synchronously resume the request.
654 base::RunLoop().RunUntilIdle();
655 }
590 656
591 mock_loader.OnReadCompleted(std::string(2000, 'a')); 657 ++read_cycles;
592 658 } while (strlen(to_read) > 0);
593 EXPECT_EQ(1, test_handler->on_will_start_called());
594 EXPECT_EQ(0, test_handler->on_request_redirected_called());
595 EXPECT_EQ(1, test_handler->on_response_started_called());
596 EXPECT_EQ(1, test_handler->on_will_read_called());
597 EXPECT_EQ(1, test_handler->on_read_completed_called());
598
599 if (!read_completed) {
600 EXPECT_EQ(MockResourceLoader::Status::CANCELED, mock_loader.status());
601 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
602
603 // Process all messages to ensure proper test teardown.
604 content::RunAllPendingInMessageLoop();
605 return;
606 }
607 659
608 if (mock_loader.status() == MockResourceLoader::Status::CALLBACK_PENDING) { 660 if (mock_loader.status() == MockResourceLoader::Status::CALLBACK_PENDING) {
609 test_handler->Resume(); 661 test_handler->Resume();
610 // MimeSniffingResourceHandler may not synchronously resume the request. 662 // MimeSniffingResourceHandler may not synchronously resume the request.
611 base::RunLoop().RunUntilIdle(); 663 base::RunLoop().RunUntilIdle();
612 } 664 }
613 665
614 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status()); 666 ASSERT_EQ(MockResourceLoader::Status::IDLE, mock_loader.status());
615 667
616 // Process all messages to ensure proper test teardown. 668 // Process all messages to ensure proper test teardown.
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
747 #endif 799 #endif
748 800
749 // Test that the MimeSniffingHandler operates properly when it doesn't sniff 801 // Test that the MimeSniffingHandler operates properly when it doesn't sniff
750 // resources. 802 // resources.
751 // TODO(mmenke): None of these test async cancellation. Should they? 803 // TODO(mmenke): None of these test async cancellation. Should they?
752 TEST_F(MimeSniffingResourceHandlerTest, NoSniffing) { 804 TEST_F(MimeSniffingResourceHandlerTest, NoSniffing) {
753 // Test simple case. 805 // Test simple case.
754 TestHandlerNoSniffing( 806 TestHandlerNoSniffing(
755 true /* response_started_succeeds */, false /* defer_response_started */, 807 true /* response_started_succeeds */, false /* defer_response_started */,
756 true /* will_read_succeeds */, false /* defer_will_read */, 808 true /* will_read_succeeds */, false /* defer_will_read */,
757 true /* read_completed_succeeds */, false /* defer_read_completed */); 809 true /* read_completed_succeeds */, false /* defer_read_completed */,
810 2048, 2048);
758 811
759 // Test deferral. 812 // Test deferral.
760 TestHandlerNoSniffing( 813 TestHandlerNoSniffing(
761 true /* response_started_succeeds */, true /* defer_response_started */, 814 true /* response_started_succeeds */, true /* defer_response_started */,
762 true /* will_read_succeeds */, false /* defer_will_read */, 815 true /* will_read_succeeds */, false /* defer_will_read */,
763 true /* read_completed_succeeds */, false /* defer_read_completed */); 816 true /* read_completed_succeeds */, false /* defer_read_completed */,
817 2048, 2048);
764 TestHandlerNoSniffing( 818 TestHandlerNoSniffing(
765 true /* response_started_succeeds */, false /* defer_response_started */, 819 true /* response_started_succeeds */, false /* defer_response_started */,
766 true /* will_read_succeeds */, true /* defer_will_read */, 820 true /* will_read_succeeds */, true /* defer_will_read */,
767 true /* read_completed_succeeds */, false /* defer_read_completed */); 821 true /* read_completed_succeeds */, false /* defer_read_completed */,
822 2048, 2048);
768 TestHandlerNoSniffing( 823 TestHandlerNoSniffing(
769 true /* response_started_succeeds */, false /* defer_response_started */, 824 true /* response_started_succeeds */, false /* defer_response_started */,
770 true /* will_read_succeeds */, false /* defer_will_read */, 825 true /* will_read_succeeds */, false /* defer_will_read */,
771 true /* read_completed_succeeds */, true /* defer_read_completed */); 826 true /* read_completed_succeeds */, true /* defer_read_completed */, 2048,
827 2048);
772 TestHandlerNoSniffing( 828 TestHandlerNoSniffing(
773 true /* response_started_succeeds */, true /* defer_response_started */, 829 true /* response_started_succeeds */, true /* defer_response_started */,
774 true /* will_read_succeeds */, true /* defer_will_read */, 830 true /* will_read_succeeds */, true /* defer_will_read */,
775 true /* read_completed_succeeds */, true /* defer_read_completed */); 831 true /* read_completed_succeeds */, true /* defer_read_completed */, 2048,
832 2048);
776 833
777 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted. 834 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted.
778 TestHandlerNoSniffing( 835 TestHandlerNoSniffing(
779 false /* response_started_succeeds */, false /* defer_response_started */, 836 false /* response_started_succeeds */, false /* defer_response_started */,
780 false /* will_read_succeeds */, false /* defer_will_read */, 837 false /* will_read_succeeds */, false /* defer_will_read */,
781 false /* read_completed_succeeds */, false /* defer_read_completed */); 838 false /* read_completed_succeeds */, false /* defer_read_completed */,
839 2048, 2048);
782 TestHandlerNoSniffing( 840 TestHandlerNoSniffing(
783 true /* response_started_succeeds */, false /* defer_response_started */, 841 true /* response_started_succeeds */, false /* defer_response_started */,
784 false /* will_read_succeeds */, false /* defer_will_read */, 842 false /* will_read_succeeds */, false /* defer_will_read */,
785 false /* read_completed_succeeds */, false /* defer_read_completed */); 843 false /* read_completed_succeeds */, false /* defer_read_completed */,
844 2048, 2048);
786 TestHandlerNoSniffing( 845 TestHandlerNoSniffing(
787 true /* response_started_succeeds */, false /* defer_response_started */, 846 true /* response_started_succeeds */, false /* defer_response_started */,
788 true /* will_read_succeeds */, false /* defer_will_read */, 847 true /* will_read_succeeds */, false /* defer_will_read */,
789 false /* read_completed_succeeds */, false /* defer_read_completed */); 848 false /* read_completed_succeeds */, false /* defer_read_completed */,
849 2048, 2048);
790 850
791 // Test cancel after deferral. 851 // Test cancel after deferral.
792 TestHandlerNoSniffing( 852 TestHandlerNoSniffing(
793 true /* response_started_succeeds */, true /* defer_response_started */, 853 true /* response_started_succeeds */, true /* defer_response_started */,
794 false /* will_read_succeeds */, false /* defer_will_read */, 854 false /* will_read_succeeds */, false /* defer_will_read */,
795 false /* read_completed_succeeds */, false /* defer_read_completed */); 855 false /* read_completed_succeeds */, false /* defer_read_completed */,
856 2048, 2048);
796 TestHandlerNoSniffing( 857 TestHandlerNoSniffing(
797 true /* response_started_succeeds */, true /* defer_response_started */, 858 true /* response_started_succeeds */, true /* defer_response_started */,
798 true /* defer_will_read */, true /* will_read_succeeds */, 859 true /* defer_will_read */, true /* will_read_succeeds */,
799 false /* read_completed_succeeds */, false /* defer_read_completed */); 860 false /* read_completed_succeeds */, false /* defer_read_completed */,
861 2048, 2048);
800 862
801 content::RunAllPendingInMessageLoop(); 863 content::RunAllPendingInMessageLoop();
802 } 864 }
803 865
804 // Test that the MimeSniffingHandler operates properly when it sniffs 866 // Test that the MimeSniffingHandler operates properly when it sniffs
805 // resources. 867 // resources.
806 // TODO(mmenke): None of these test async cancellation. Should they? 868 // TODO(mmenke): None of these test async cancellation. Should they?
807 TEST_F(MimeSniffingResourceHandlerTest, Sniffing) { 869 TEST_F(MimeSniffingResourceHandlerTest, Sniffing) {
808 // Test simple case. 870 // Test simple case.
809 TestHandlerSniffing( 871 TestHandlerSniffing(
810 true /* response_started_succeeds */, false /* defer_response_started */, 872 true /* response_started_succeeds */, false /* defer_response_started */,
811 true /* will_read_succeeds */, false /* defer_will_read */, 873 true /* will_read_succeeds */, false /* defer_will_read */,
812 true /* read_completed_succeeds */, false /* defer_read_completed */); 874 true /* read_completed_succeeds */, false /* defer_read_completed */,
875 2048, 2048);
813 876
814 // Test deferral. 877 // Test deferral.
815 TestHandlerSniffing( 878 TestHandlerSniffing(
816 true /* response_started_succeeds */, true /* defer_response_started */, 879 true /* response_started_succeeds */, true /* defer_response_started */,
817 true /* will_read_succeeds */, false /* defer_will_read */, 880 true /* will_read_succeeds */, false /* defer_will_read */,
818 true /* read_completed_succeeds */, false /* defer_read_completed */); 881 true /* read_completed_succeeds */, false /* defer_read_completed */,
819 TestHandlerSniffing( 882 2048, 2048);
820 true /* response_started_succeeds */, false /* defer_response_started */, 883 TestHandlerSniffing(true /* response_started_succeeds */,
821 true /* will_read_succeeds */, true /* defer_will_read */, 884 false /* defer_response_started */,
822 true /* read_completed_succeeds */, false /* defer_read_completed */); 885 true /* will_read_succeeds */, true /* defer_will_read */,
886 true /* read_completed_succeeds */,
887 false /* defer_read_completed */, 2048, 2048);
823 TestHandlerSniffing( 888 TestHandlerSniffing(
824 true /* response_started_succeeds */, false /* defer_response_started */, 889 true /* response_started_succeeds */, false /* defer_response_started */,
825 true /* will_read_succeeds */, false /* defer_will_read */, 890 true /* will_read_succeeds */, false /* defer_will_read */,
826 true /* read_completed_succeeds */, true /* defer_read_completed */); 891 true /* read_completed_succeeds */, true /* defer_read_completed */, 2048,
827 TestHandlerSniffing( 892 2048);
828 true /* response_started_succeeds */, true /* defer_response_started */, 893 TestHandlerSniffing(true /* response_started_succeeds */,
829 true /* will_read_succeeds */, true /* defer_will_read */, 894 true /* defer_response_started */,
830 true /* read_completed_succeeds */, true /* defer_read_completed */); 895 true /* will_read_succeeds */, true /* defer_will_read */,
896 true /* read_completed_succeeds */,
897 true /* defer_read_completed */, 2048, 2048);
831 898
832 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted. 899 // Test cancel in OnResponseStarted, OnWillRead, OnReadCompleted.
833 TestHandlerSniffing( 900 TestHandlerSniffing(
834 false /* response_started_succeeds */, false /* defer_response_started */, 901 false /* response_started_succeeds */, false /* defer_response_started */,
835 false /* will_read_succeeds */, false /* defer_will_read */, 902 false /* will_read_succeeds */, false /* defer_will_read */,
836 false /* read_completed_succeeds */, false /* defer_read_completed */); 903 false /* read_completed_succeeds */, false /* defer_read_completed */,
904 2048, 2048);
837 TestHandlerSniffing( 905 TestHandlerSniffing(
838 true /* response_started_succeeds */, false /* defer_response_started */, 906 true /* response_started_succeeds */, false /* defer_response_started */,
839 false /* will_read_succeeds */, false /* defer_will_read */, 907 false /* will_read_succeeds */, false /* defer_will_read */,
840 false /* read_completed_succeeds */, false /* defer_read_completed */); 908 false /* read_completed_succeeds */, false /* defer_read_completed */,
909 2048, 2048);
841 TestHandlerSniffing( 910 TestHandlerSniffing(
842 true /* response_started_succeeds */, false /* defer_response_started */, 911 true /* response_started_succeeds */, false /* defer_response_started */,
843 true /* will_read_succeeds */, false /* defer_will_read */, 912 true /* will_read_succeeds */, false /* defer_will_read */,
844 false /* read_completed_succeeds */, false /* defer_read_completed */); 913 false /* read_completed_succeeds */, false /* defer_read_completed */,
914 2048, 2048);
845 915
846 // Test cancel after deferral. 916 // Test cancel after deferral.
847 TestHandlerSniffing( 917 TestHandlerSniffing(
848 true /* response_started_succeeds */, true /* defer_response_started */, 918 true /* response_started_succeeds */, true /* defer_response_started */,
849 false /* will_read_succeeds */, false /* defer_will_read */, 919 false /* will_read_succeeds */, false /* defer_will_read */,
850 false /* read_completed_succeeds */, false /* defer_read_completed */); 920 false /* read_completed_succeeds */, false /* defer_read_completed */,
851 TestHandlerSniffing( 921 2048, 2048);
852 true /* response_started_succeeds */, true /* defer_response_started */, 922 TestHandlerSniffing(true /* response_started_succeeds */,
853 true /* will_read_succeeds */, true /* defer_will_read */, 923 true /* defer_response_started */,
854 false /* read_completed_succeeds */, false /* defer_read_completed */); 924 true /* will_read_succeeds */, true /* defer_will_read */,
925 false /* read_completed_succeeds */,
926 false /* defer_read_completed */, 2048, 2048);
855 927
856 content::RunAllPendingInMessageLoop(); 928 content::RunAllPendingInMessageLoop();
857 } 929 }
858 930
859 // Tests that 304s do not trigger a change in handlers. 931 // Tests that 304s do not trigger a change in handlers.
860 TEST_F(MimeSniffingResourceHandlerTest, 304Handling) { 932 TEST_F(MimeSniffingResourceHandlerTest, 304Handling) {
861 net::URLRequestContext context; 933 net::URLRequestContext context;
862 std::unique_ptr<net::URLRequest> request(context.CreateRequest( 934 std::unique_ptr<net::URLRequest> request(context.CreateRequest(
863 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr)); 935 GURL("http://www.google.com"), net::DEFAULT_PRIORITY, nullptr));
864 ResourceRequestInfo::AllocateForTesting(request.get(), 936 ResourceRequestInfo::AllocateForTesting(request.get(),
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
951 // mime sniffing is disabled and the wrapped resource handler returns false 1023 // mime sniffing is disabled and the wrapped resource handler returns false
952 // on OnResponseStarted. 1024 // on OnResponseStarted.
953 EXPECT_EQ(MockResourceLoader::Status::CANCELED, 1025 EXPECT_EQ(MockResourceLoader::Status::CANCELED,
954 mock_loader.OnResponseStarted(std::move(response))); 1026 mock_loader.OnResponseStarted(std::move(response)));
955 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code()); 1027 EXPECT_EQ(net::ERR_ABORTED, mock_loader.error_code());
956 1028
957 // Process all messages to ensure proper test teardown. 1029 // Process all messages to ensure proper test teardown.
958 content::RunAllPendingInMessageLoop(); 1030 content::RunAllPendingInMessageLoop();
959 } 1031 }
960 1032
1033 TEST_F(MimeSniffingResourceHandlerTest, SmallReturnedBuffer) {
1034 TestHandlerSniffing(true /* response_started_succeeds */,
1035 true /* defer_response_started */,
1036 true /* will_read_succeeds */, true /* defer_will_read */,
1037 true /* read_completed_succeeds */,
1038 true /* defer_read_completed */, 1, 1);
1039
1040 TestHandlerNoSniffing(
1041 true /* response_started_succeeds */, true /* defer_response_started */,
1042 true /* will_read_succeeds */, true /* defer_will_read */,
1043 true /* read_completed_succeeds */, true /* defer_read_completed */, 1,
1044 1);
1045 }
1046
961 } // namespace content 1047 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/mime_sniffing_resource_handler.cc ('k') | content/browser/loader/mojo_async_resource_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698