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

Side by Side Diff: content/child/shared_memory_data_consumer_handle_unittest.cc

Issue 1181573003: Set error on WebDataConsumerHandle while loading body. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@use-ipc-data-consumer
Patch Set: Created 5 years, 6 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/shared_memory_data_consumer_handle.h" 5 #include "content/child/shared_memory_data_consumer_handle.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 17 matching lines...) Expand all
28 using BackpressureMode = SharedMemoryDataConsumerHandle::BackpressureMode; 28 using BackpressureMode = SharedMemoryDataConsumerHandle::BackpressureMode;
29 const BackpressureMode kApplyBackpressure = 29 const BackpressureMode kApplyBackpressure =
30 SharedMemoryDataConsumerHandle::kApplyBackpressure; 30 SharedMemoryDataConsumerHandle::kApplyBackpressure;
31 const BackpressureMode kDoNotApplyBackpressure = 31 const BackpressureMode kDoNotApplyBackpressure =
32 SharedMemoryDataConsumerHandle::kDoNotApplyBackpressure; 32 SharedMemoryDataConsumerHandle::kDoNotApplyBackpressure;
33 33
34 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone; 34 const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
35 const Result kOk = WebDataConsumerHandle::Ok; 35 const Result kOk = WebDataConsumerHandle::Ok;
36 const Result kDone = WebDataConsumerHandle::Done; 36 const Result kDone = WebDataConsumerHandle::Done;
37 const Result kShouldWait = WebDataConsumerHandle::ShouldWait; 37 const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
38 const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
38 39
39 using ::testing::_; 40 using ::testing::_;
40 using ::testing::InSequence; 41 using ::testing::InSequence;
42 using ::testing::Invoke;
41 using ::testing::MockFunction; 43 using ::testing::MockFunction;
42 using ::testing::Return; 44 using ::testing::Return;
43 using ::testing::StrictMock; 45 using ::testing::StrictMock;
44 46
45 using Checkpoint = StrictMock<MockFunction<void(int)>>; 47 using Checkpoint = StrictMock<MockFunction<void(int)>>;
46 using ReceivedData = RequestPeer::ReceivedData; 48 using ReceivedData = RequestPeer::ReceivedData;
47 49
48 class Logger final : public base::RefCounted<Logger> { 50 class Logger final : public base::RefCounted<Logger> {
49 public: 51 public:
50 Logger() {} 52 Logger() {}
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 EXPECT_EQ(0u, read); 428 EXPECT_EQ(0u, read);
427 } 429 }
428 430
429 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) { 431 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClient) {
430 Checkpoint checkpoint; 432 Checkpoint checkpoint;
431 433
432 InSequence s; 434 InSequence s;
433 EXPECT_CALL(checkpoint, Call(0)); 435 EXPECT_CALL(checkpoint, Call(0));
434 EXPECT_CALL(checkpoint, Call(1)); 436 EXPECT_CALL(checkpoint, Call(1));
435 EXPECT_CALL(checkpoint, Call(2)); 437 EXPECT_CALL(checkpoint, Call(2));
438 EXPECT_CALL(checkpoint, Call(3));
436 EXPECT_CALL(client_, didGetReadable()); 439 EXPECT_CALL(client_, didGetReadable());
437 EXPECT_CALL(checkpoint, Call(3)); 440 EXPECT_CALL(checkpoint, Call(4));
438 441
439 checkpoint.Call(0); 442 checkpoint.Call(0);
440 auto reader = handle_->ObtainReader(&client_); 443 auto reader = handle_->ObtainReader(&client_);
441 checkpoint.Call(1); 444 checkpoint.Call(1);
442 RunPostedTasks(); 445 RunPostedTasks();
443 checkpoint.Call(2); 446 checkpoint.Call(2);
444 writer_->Close(); 447 writer_->Close();
445 checkpoint.Call(3); 448 checkpoint.Call(3);
449 RunPostedTasks();
450 checkpoint.Call(4);
446 } 451 }
447 452
448 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) { 453 TEST_P(SharedMemoryDataConsumerHandleTest, RegisterClientWhenDataExists) {
449 Checkpoint checkpoint; 454 Checkpoint checkpoint;
450 455
451 InSequence s; 456 InSequence s;
452 EXPECT_CALL(checkpoint, Call(0)); 457 EXPECT_CALL(checkpoint, Call(0));
453 EXPECT_CALL(checkpoint, Call(1)); 458 EXPECT_CALL(checkpoint, Call(1));
454 EXPECT_CALL(checkpoint, Call(2)); 459 EXPECT_CALL(checkpoint, Call(2));
455 EXPECT_CALL(client_, didGetReadable()); 460 EXPECT_CALL(client_, didGetReadable());
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 EXPECT_EQ(nullptr, buffer); 618 EXPECT_EQ(nullptr, buffer);
614 619
615 writer_->Close(); 620 writer_->Close();
616 621
617 result = reader->beginRead(&buffer, kNone, &size); 622 result = reader->beginRead(&buffer, kNone, &size);
618 EXPECT_EQ(kDone, result); 623 EXPECT_EQ(kDone, result);
619 EXPECT_EQ(0u, size); 624 EXPECT_EQ(0u, size);
620 EXPECT_EQ(nullptr, buffer); 625 EXPECT_EQ(nullptr, buffer);
621 } 626 }
622 627
628 TEST_P(SharedMemoryDataConsumerHandleTest, ErrorRead) {
629 Checkpoint checkpoint;
630 Result result;
631 char buffer[20] = {};
632 size_t read = 99;
633 auto reader = handle_->ObtainReader(nullptr);
634
635 writer_->Fail();
636 result = reader->read(buffer, sizeof(buffer), kNone, &read);
637
638 EXPECT_EQ(kUnexpectedError, result);
639 EXPECT_EQ(0u, read);
640 }
641
642 TEST_P(SharedMemoryDataConsumerHandleTest, ErrorTwoPhaseRead) {
643 Result result;
644 const void* pointer = &result;
645 size_t size = 99;
646 auto reader = handle_->ObtainReader(nullptr);
647
648 writer_->Fail();
649 result = reader->beginRead(&pointer, kNone, &size);
650
651 EXPECT_EQ(kUnexpectedError, result);
652 EXPECT_EQ(nullptr, pointer);
653 EXPECT_EQ(0u, size);
654 }
655
656 TEST_P(SharedMemoryDataConsumerHandleTest, FailWhileTwoPhaseReadIsInProgress) {
657 Result result;
658 const void* pointer = nullptr;
659 size_t size = 0;
660 auto reader = handle_->ObtainReader(nullptr);
661
662 writer_->AddData(NewFixedData("Once "));
663 result = reader->beginRead(&pointer, kNone, &size);
664 auto buffer = static_cast<const char*>(pointer);
665
666 ASSERT_EQ(kOk, result);
667 ASSERT_NE(nullptr, pointer);
668 ASSERT_EQ(size, 5u);
669
670 writer_->Fail();
671
672 // We can access the buffer after calling |Fail|. I hope ASAN will detect
673 // an error if the region is already freed.
674 EXPECT_EQ('O', buffer[0]);
675 EXPECT_EQ('n', buffer[1]);
676 EXPECT_EQ('c', buffer[2]);
677 EXPECT_EQ('e', buffer[3]);
678 EXPECT_EQ(' ', buffer[4]);
679
680 EXPECT_EQ(kOk, reader->endRead(size));
681
682 EXPECT_EQ(kUnexpectedError, reader->beginRead(&pointer, kNone, &size));
683 }
684
685 TEST_P(SharedMemoryDataConsumerHandleTest, FailWithClient) {
686 Checkpoint checkpoint;
687
688 InSequence s;
689 EXPECT_CALL(checkpoint, Call(0));
690 EXPECT_CALL(checkpoint, Call(1));
691 EXPECT_CALL(checkpoint, Call(2));
692 EXPECT_CALL(client_, didGetReadable());
693 EXPECT_CALL(checkpoint, Call(3));
694
695 checkpoint.Call(0);
696 auto reader = handle_->ObtainReader(&client_);
697 checkpoint.Call(1);
698 writer_->Fail();
699 checkpoint.Call(2);
700 RunPostedTasks();
701 checkpoint.Call(3);
702 }
703
704 TEST_P(SharedMemoryDataConsumerHandleTest, FailWithClientAndData) {
705 Checkpoint checkpoint;
706
707 InSequence s;
708 EXPECT_CALL(checkpoint, Call(0));
709 EXPECT_CALL(checkpoint, Call(1));
710 EXPECT_CALL(client_, didGetReadable());
711 EXPECT_CALL(checkpoint, Call(2));
712 EXPECT_CALL(checkpoint, Call(3));
713 EXPECT_CALL(client_, didGetReadable());
714 EXPECT_CALL(checkpoint, Call(4));
715
716 checkpoint.Call(0);
717 auto reader = handle_->ObtainReader(&client_);
718 checkpoint.Call(1);
719 writer_->AddData(NewFixedData("Once "));
720 checkpoint.Call(2);
721 writer_->Fail();
722 checkpoint.Call(3);
723 RunPostedTasks();
724 checkpoint.Call(4);
725 }
726
727 TEST_P(SharedMemoryDataConsumerHandleTest, RecursiveErrorNotification) {
728 Checkpoint checkpoint;
729
730 InSequence s;
731 EXPECT_CALL(checkpoint, Call(0));
732 EXPECT_CALL(checkpoint, Call(1));
733 EXPECT_CALL(client_, didGetReadable())
734 .WillOnce(Invoke(writer_.get(), &Writer::Fail));
735 EXPECT_CALL(checkpoint, Call(2));
736 EXPECT_CALL(client_, didGetReadable());
737 EXPECT_CALL(checkpoint, Call(3));
738
739 checkpoint.Call(0);
740 auto reader = handle_->ObtainReader(&client_);
741 checkpoint.Call(1);
742 writer_->AddData(NewFixedData("Once "));
743 checkpoint.Call(2);
744 RunPostedTasks();
745 checkpoint.Call(3);
746 }
747
623 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { 748 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) {
624 base::MessageLoop loop; 749 base::MessageLoop loop;
625 char buffer[20]; 750 char buffer[20];
626 Result result; 751 Result result;
627 size_t size; 752 size_t size;
628 753
629 scoped_ptr<Writer> writer; 754 scoped_ptr<Writer> writer;
630 auto handle = make_scoped_ptr( 755 auto handle = make_scoped_ptr(
631 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); 756 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer));
632 scoped_refptr<Logger> logger(new Logger); 757 scoped_refptr<Logger> logger(new Logger);
633 writer->AddData( 758 writer->AddData(
634 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); 759 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
635 writer->AddData( 760 writer->AddData(
636 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger))); 761 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger)));
637 writer->AddData( 762 writer->AddData(
638 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger))); 763 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger)));
639 writer->AddData( 764 writer->AddData(
640 make_scoped_ptr(new LoggingFixedReceivedData("data4", "time ", logger))); 765 make_scoped_ptr(new LoggingFixedReceivedData("data4", "time ", logger)));
641 766
767 auto reader = handle->ObtainReader(nullptr);
642 logger->Add("1"); 768 logger->Add("1");
643 result = handle->read(buffer, 2, kNone, &size); 769 result = reader->read(buffer, 2, kNone, &size);
644 EXPECT_EQ(kOk, result); 770 EXPECT_EQ(kOk, result);
645 EXPECT_EQ(2u, size); 771 EXPECT_EQ(2u, size);
646 logger->Add("2"); 772 logger->Add("2");
647 result = handle->read(buffer, 5, kNone, &size); 773 result = reader->read(buffer, 5, kNone, &size);
648 EXPECT_EQ(kOk, result); 774 EXPECT_EQ(kOk, result);
649 EXPECT_EQ(5u, size); 775 EXPECT_EQ(5u, size);
650 logger->Add("3"); 776 logger->Add("3");
651 result = handle->read(buffer, 6, kNone, &size); 777 result = reader->read(buffer, 6, kNone, &size);
652 EXPECT_EQ(kOk, result); 778 EXPECT_EQ(kOk, result);
653 EXPECT_EQ(6u, size); 779 EXPECT_EQ(6u, size);
654 logger->Add("4"); 780 logger->Add("4");
655 781
656 EXPECT_EQ( 782 EXPECT_EQ(
657 "1\n" 783 "1\n"
658 "2\n" 784 "2\n"
659 "data1 is destructed.\n" 785 "data1 is destructed.\n"
660 "3\n" 786 "3\n"
661 "data2 is destructed.\n" 787 "data2 is destructed.\n"
(...skipping 12 matching lines...) Expand all
674 auto handle = make_scoped_ptr( 800 auto handle = make_scoped_ptr(
675 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); 801 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer));
676 scoped_refptr<Logger> logger(new Logger); 802 scoped_refptr<Logger> logger(new Logger);
677 writer->AddData( 803 writer->AddData(
678 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger))); 804 make_scoped_ptr(new LoggingFixedReceivedData("data1", "Once ", logger)));
679 writer->AddData( 805 writer->AddData(
680 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger))); 806 make_scoped_ptr(new LoggingFixedReceivedData("data2", "upon ", logger)));
681 writer->AddData( 807 writer->AddData(
682 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger))); 808 make_scoped_ptr(new LoggingFixedReceivedData("data3", "a ", logger)));
683 809
810 auto reader = handle->ObtainReader(nullptr);
684 logger->Add("1"); 811 logger->Add("1");
685 result = handle->read(buffer, 2, kNone, &size); 812 result = reader->read(buffer, 2, kNone, &size);
686 EXPECT_EQ(kOk, result); 813 EXPECT_EQ(kOk, result);
687 EXPECT_EQ(2u, size); 814 EXPECT_EQ(2u, size);
688 logger->Add("2"); 815 logger->Add("2");
689 writer->Close(); 816 writer->Close();
690 logger->Add("3"); 817 logger->Add("3");
691 handle.reset(); 818 handle.reset();
819 reader.reset();
692 logger->Add("4"); 820 logger->Add("4");
693 821
694 EXPECT_EQ( 822 EXPECT_EQ(
695 "1\n" 823 "1\n"
696 "2\n" 824 "2\n"
697 "3\n" 825 "3\n"
698 "data1 is destructed.\n" 826 "data1 is destructed.\n"
699 "data2 is destructed.\n" 827 "data2 is destructed.\n"
700 "data3 is destructed.\n" 828 "data3 is destructed.\n"
701 "4\n", 829 "4\n",
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 logger->log()); 896 logger->log());
769 } 897 }
770 898
771 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, 899 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest,
772 SharedMemoryDataConsumerHandleTest, 900 SharedMemoryDataConsumerHandleTest,
773 ::testing::Values(kApplyBackpressure, 901 ::testing::Values(kApplyBackpressure,
774 kDoNotApplyBackpressure)); 902 kDoNotApplyBackpressure));
775 } // namespace 903 } // namespace
776 904
777 } // namespace content 905 } // namespace content
OLDNEW
« no previous file with comments | « content/child/shared_memory_data_consumer_handle.cc ('k') | content/child/web_url_loader_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698