Chromium Code Reviews| 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; |
| 41 using ::testing::MockFunction; | 42 using ::testing::MockFunction; |
| 42 using ::testing::Return; | 43 using ::testing::Return; |
| 43 using ::testing::StrictMock; | 44 using ::testing::StrictMock; |
| 44 | 45 |
| 45 using Checkpoint = StrictMock<MockFunction<void(int)>>; | 46 using Checkpoint = StrictMock<MockFunction<void(int)>>; |
| 46 using ReceivedData = RequestPeer::ReceivedData; | 47 using ReceivedData = RequestPeer::ReceivedData; |
| 47 | 48 |
| (...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 613 EXPECT_EQ(nullptr, buffer); | 614 EXPECT_EQ(nullptr, buffer); |
| 614 | 615 |
| 615 writer_->Close(); | 616 writer_->Close(); |
| 616 | 617 |
| 617 result = reader->beginRead(&buffer, kNone, &size); | 618 result = reader->beginRead(&buffer, kNone, &size); |
| 618 EXPECT_EQ(kDone, result); | 619 EXPECT_EQ(kDone, result); |
| 619 EXPECT_EQ(0u, size); | 620 EXPECT_EQ(0u, size); |
| 620 EXPECT_EQ(nullptr, buffer); | 621 EXPECT_EQ(nullptr, buffer); |
| 621 } | 622 } |
| 622 | 623 |
| 624 TEST_P(SharedMemoryDataConsumerHandleTest, ErrorRead) { | |
| 625 Checkpoint checkpoint; | |
| 626 Result result; | |
| 627 char buffer[20] = {}; | |
| 628 size_t read = 99; | |
| 629 auto reader = handle_->obtainReader(nullptr); | |
| 630 | |
| 631 writer_->Error(); | |
| 632 result = reader->read(buffer, sizeof(buffer), kNone, &read); | |
| 633 | |
| 634 EXPECT_EQ(kUnexpectedError, result); | |
| 635 EXPECT_EQ(0u, read); | |
| 636 } | |
| 637 | |
| 638 TEST_P(SharedMemoryDataConsumerHandleTest, ErrorTwoPhaseRead) { | |
| 639 Result result; | |
| 640 const void* pointer = &result; | |
| 641 size_t size = 99; | |
| 642 auto reader = handle_->obtainReader(nullptr); | |
| 643 | |
| 644 writer_->Error(); | |
| 645 result = reader->beginRead(&pointer, kNone, &size); | |
| 646 | |
| 647 EXPECT_EQ(kUnexpectedError, result); | |
| 648 EXPECT_EQ(nullptr, pointer); | |
| 649 EXPECT_EQ(0u, size); | |
| 650 } | |
| 651 | |
| 652 TEST_P(SharedMemoryDataConsumerHandleTest, ErrorWhileTwoPhaseReadIsInProgress) { | |
| 653 Result result; | |
| 654 const void* pointer = nullptr; | |
| 655 size_t size = 0; | |
| 656 auto reader = handle_->obtainReader(nullptr); | |
| 657 | |
| 658 writer_->AddData(NewFixedData("Once ")); | |
| 659 result = reader->beginRead(&pointer, kNone, &size); | |
| 660 auto buffer = static_cast<const char*>(pointer); | |
| 661 | |
| 662 ASSERT_EQ(kOk, result); | |
| 663 ASSERT_NE(nullptr, pointer); | |
| 664 ASSERT_EQ(size, 5u); | |
| 665 | |
| 666 writer_->Error(); | |
| 667 | |
| 668 // We can access the buffer after calling |Error|. I hope ASAN will detect | |
| 669 // an error if the region is already freed. | |
| 670 EXPECT_EQ('O', buffer[0]); | |
| 671 EXPECT_EQ('n', buffer[1]); | |
| 672 EXPECT_EQ('c', buffer[2]); | |
| 673 EXPECT_EQ('e', buffer[3]); | |
| 674 EXPECT_EQ(' ', buffer[4]); | |
| 675 | |
| 676 reader->endRead(size); | |
|
hiroshige
2015/06/18 07:01:21
Should we add EXPECT_EQ(kUnexpectedError) for the
yhirano
2015/06/18 08:13:33
Currently it returns Ok and I'm fine with it. I do
hiroshige
2015/06/18 08:35:11
OK; endRead() returns OK because we can read 'Once
yhirano
2015/06/18 08:40:55
Done.
| |
| 677 } | |
| 678 | |
| 679 TEST_P(SharedMemoryDataConsumerHandleTest, ErrorWithClient) { | |
| 680 Checkpoint checkpoint; | |
| 681 | |
| 682 InSequence s; | |
| 683 EXPECT_CALL(checkpoint, Call(0)); | |
| 684 EXPECT_CALL(checkpoint, Call(1)); | |
| 685 EXPECT_CALL(client_, didGetReadable()); | |
| 686 EXPECT_CALL(checkpoint, Call(2)); | |
| 687 | |
| 688 checkpoint.Call(0); | |
| 689 auto reader = handle_->obtainReader(&client_); | |
| 690 checkpoint.Call(1); | |
| 691 writer_->Error(); | |
| 692 checkpoint.Call(2); | |
| 693 } | |
| 694 | |
| 695 TEST_P(SharedMemoryDataConsumerHandleTest, ErrorWithClientAndData) { | |
| 696 Checkpoint checkpoint; | |
| 697 | |
| 698 InSequence s; | |
| 699 EXPECT_CALL(checkpoint, Call(0)); | |
| 700 EXPECT_CALL(checkpoint, Call(1)); | |
| 701 EXPECT_CALL(client_, didGetReadable()); | |
| 702 EXPECT_CALL(checkpoint, Call(2)); | |
| 703 EXPECT_CALL(client_, didGetReadable()); | |
| 704 EXPECT_CALL(checkpoint, Call(3)); | |
| 705 | |
| 706 checkpoint.Call(0); | |
| 707 auto reader = handle_->obtainReader(&client_); | |
| 708 checkpoint.Call(1); | |
| 709 writer_->AddData(NewFixedData("Once ")); | |
| 710 checkpoint.Call(2); | |
| 711 writer_->Error(); | |
| 712 checkpoint.Call(3); | |
| 713 } | |
| 714 | |
| 623 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { | 715 TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) { |
| 624 base::MessageLoop loop; | 716 base::MessageLoop loop; |
| 625 char buffer[20]; | 717 char buffer[20]; |
| 626 Result result; | 718 Result result; |
| 627 size_t size; | 719 size_t size; |
| 628 | 720 |
| 629 scoped_ptr<Writer> writer; | 721 scoped_ptr<Writer> writer; |
| 630 auto handle = make_scoped_ptr( | 722 auto handle = make_scoped_ptr( |
| 631 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); | 723 new SharedMemoryDataConsumerHandle(kApplyBackpressure, &writer)); |
| 632 scoped_refptr<Logger> logger(new Logger); | 724 scoped_refptr<Logger> logger(new Logger); |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 768 logger->log()); | 860 logger->log()); |
| 769 } | 861 } |
| 770 | 862 |
| 771 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, | 863 INSTANTIATE_TEST_CASE_P(SharedMemoryDataConsumerHandleTest, |
| 772 SharedMemoryDataConsumerHandleTest, | 864 SharedMemoryDataConsumerHandleTest, |
| 773 ::testing::Values(kApplyBackpressure, | 865 ::testing::Values(kApplyBackpressure, |
| 774 kDoNotApplyBackpressure)); | 866 kDoNotApplyBackpressure)); |
| 775 } // namespace | 867 } // namespace |
| 776 | 868 |
| 777 } // namespace content | 869 } // namespace content |
| OLD | NEW |