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

Unified 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: rebase 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 side-by-side diff with in-line comments
Download patch
Index: content/child/shared_memory_data_consumer_handle_unittest.cc
diff --git a/content/child/shared_memory_data_consumer_handle_unittest.cc b/content/child/shared_memory_data_consumer_handle_unittest.cc
index 2c9e4ba605b60de9b1e179ab766cb3dc08cefae7..5dfb1f5c2f7f12af5cb93575757421fa06708943 100644
--- a/content/child/shared_memory_data_consumer_handle_unittest.cc
+++ b/content/child/shared_memory_data_consumer_handle_unittest.cc
@@ -35,6 +35,7 @@ const WebDataConsumerHandle::Flags kNone = WebDataConsumerHandle::FlagNone;
const Result kOk = WebDataConsumerHandle::Ok;
const Result kDone = WebDataConsumerHandle::Done;
const Result kShouldWait = WebDataConsumerHandle::ShouldWait;
+const Result kUnexpectedError = WebDataConsumerHandle::UnexpectedError;
using ::testing::_;
using ::testing::InSequence;
@@ -620,6 +621,97 @@ TEST_P(SharedMemoryDataConsumerHandleTest, TwoPhaseReadWithMultipleData) {
EXPECT_EQ(nullptr, buffer);
}
+TEST_P(SharedMemoryDataConsumerHandleTest, ErrorRead) {
+ Checkpoint checkpoint;
+ Result result;
+ char buffer[20] = {};
+ size_t read = 99;
+ auto reader = handle_->obtainReader(nullptr);
+
+ writer_->Error();
+ result = reader->read(buffer, sizeof(buffer), kNone, &read);
+
+ EXPECT_EQ(kUnexpectedError, result);
+ EXPECT_EQ(0u, read);
+}
+
+TEST_P(SharedMemoryDataConsumerHandleTest, ErrorTwoPhaseRead) {
+ Result result;
+ const void* pointer = &result;
+ size_t size = 99;
+ auto reader = handle_->obtainReader(nullptr);
+
+ writer_->Error();
+ result = reader->beginRead(&pointer, kNone, &size);
+
+ EXPECT_EQ(kUnexpectedError, result);
+ EXPECT_EQ(nullptr, pointer);
+ EXPECT_EQ(0u, size);
+}
+
+TEST_P(SharedMemoryDataConsumerHandleTest, ErrorWhileTwoPhaseReadIsInProgress) {
+ Result result;
+ const void* pointer = nullptr;
+ size_t size = 0;
+ auto reader = handle_->obtainReader(nullptr);
+
+ writer_->AddData(NewFixedData("Once "));
+ result = reader->beginRead(&pointer, kNone, &size);
+ auto buffer = static_cast<const char*>(pointer);
+
+ ASSERT_EQ(kOk, result);
+ ASSERT_NE(nullptr, pointer);
+ ASSERT_EQ(size, 5u);
+
+ writer_->Error();
+
+ // We can access the buffer after calling |Error|. I hope ASAN will detect
+ // an error if the region is already freed.
+ EXPECT_EQ('O', buffer[0]);
+ EXPECT_EQ('n', buffer[1]);
+ EXPECT_EQ('c', buffer[2]);
+ EXPECT_EQ('e', buffer[3]);
+ EXPECT_EQ(' ', buffer[4]);
+
+ 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.
+}
+
+TEST_P(SharedMemoryDataConsumerHandleTest, ErrorWithClient) {
+ Checkpoint checkpoint;
+
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(0));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(client_, didGetReadable());
+ EXPECT_CALL(checkpoint, Call(2));
+
+ checkpoint.Call(0);
+ auto reader = handle_->obtainReader(&client_);
+ checkpoint.Call(1);
+ writer_->Error();
+ checkpoint.Call(2);
+}
+
+TEST_P(SharedMemoryDataConsumerHandleTest, ErrorWithClientAndData) {
+ Checkpoint checkpoint;
+
+ InSequence s;
+ EXPECT_CALL(checkpoint, Call(0));
+ EXPECT_CALL(checkpoint, Call(1));
+ EXPECT_CALL(client_, didGetReadable());
+ EXPECT_CALL(checkpoint, Call(2));
+ EXPECT_CALL(client_, didGetReadable());
+ EXPECT_CALL(checkpoint, Call(3));
+
+ checkpoint.Call(0);
+ auto reader = handle_->obtainReader(&client_);
+ checkpoint.Call(1);
+ writer_->AddData(NewFixedData("Once "));
+ checkpoint.Call(2);
+ writer_->Error();
+ checkpoint.Call(3);
+}
+
TEST(SharedMemoryDataConsumerHandleBackpressureTest, Read) {
base::MessageLoop loop;
char buffer[20];

Powered by Google App Engine
This is Rietveld 408576698