| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |