Index: mojo/edk/system/local_data_pipe_unittest.cc |
diff --git a/mojo/edk/system/local_data_pipe_unittest.cc b/mojo/edk/system/local_data_pipe_unittest.cc |
index 979b4d2ce799eb215fb3db3363b1b3214e273d9a..e8bc7160250a50567ce2894e2def354b6986f2e9 100644 |
--- a/mojo/edk/system/local_data_pipe_unittest.cc |
+++ b/mojo/edk/system/local_data_pipe_unittest.cc |
@@ -118,8 +118,10 @@ TEST(LocalDataPipeTest, SimpleReadWrite) { |
num_bytes = static_cast<uint32_t>(arraysize(elements) * sizeof(elements[0])); |
EXPECT_EQ( |
MOJO_RESULT_SHOULD_WAIT, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
// Query; nothing there yet. |
num_bytes = 0; |
@@ -135,8 +137,10 @@ TEST(LocalDataPipeTest, SimpleReadWrite) { |
num_bytes = sizeof(elements[0]) + 1; |
EXPECT_EQ( |
MOJO_RESULT_INVALID_ARGUMENT, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
// Write two elements. |
elements[0] = 123; |
@@ -160,8 +164,10 @@ TEST(LocalDataPipeTest, SimpleReadWrite) { |
num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
EXPECT_EQ(123, elements[0]); |
EXPECT_EQ(-1, elements[1]); |
@@ -171,14 +177,35 @@ TEST(LocalDataPipeTest, SimpleReadWrite) { |
EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); |
+ // Peek one element. |
+ elements[0] = -1; |
+ elements[1] = -1; |
+ num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
+ EXPECT_EQ( |
+ MOJO_RESULT_OK, |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ true)); |
+ EXPECT_EQ(1u * sizeof(elements[0]), num_bytes); |
+ EXPECT_EQ(456, elements[0]); |
+ EXPECT_EQ(-1, elements[1]); |
+ |
+ // Query. Still has 1 element remaining. |
+ num_bytes = 0; |
+ EXPECT_EQ(MOJO_RESULT_OK, dp->ConsumerQueryData(MakeUserPointer(&num_bytes))); |
+ EXPECT_EQ(1 * sizeof(elements[0]), num_bytes); |
+ |
// Try to read two elements, with "all or none". |
elements[0] = -1; |
elements[1] = -1; |
num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
EXPECT_EQ( |
MOJO_RESULT_OUT_OF_RANGE, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
EXPECT_EQ(-1, elements[0]); |
EXPECT_EQ(-1, elements[1]); |
@@ -188,8 +215,10 @@ TEST(LocalDataPipeTest, SimpleReadWrite) { |
num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0])); |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(456, elements[0]); |
EXPECT_EQ(-1, elements[1]); |
@@ -262,6 +291,32 @@ TEST(LocalDataPipeTest, BasicProducerWaiting) { |
EXPECT_EQ(0u, hss.satisfied_signals); |
EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
+ // Peek one element. |
+ elements[0] = -1; |
+ elements[1] = -1; |
+ num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
+ EXPECT_EQ( |
+ MOJO_RESULT_OK, |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ true)); |
+ EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
+ EXPECT_EQ(123, elements[0]); |
+ EXPECT_EQ(-1, elements[1]); |
+ |
+ // Add a waiter. |
+ waiter.Init(); |
+ ASSERT_EQ( |
+ MOJO_RESULT_OK, |
+ dp->ProducerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_WRITABLE, 56, nullptr)); |
+ // And it still shouldn't be writable yet. |
+ EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, waiter.Wait(0, nullptr)); |
+ hss = HandleSignalsState(); |
+ dp->ProducerRemoveWaiter(&waiter, &hss); |
+ EXPECT_EQ(0u, hss.satisfied_signals); |
+ EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfiable_signals); |
+ |
// Do it again. |
waiter.Init(); |
ASSERT_EQ( |
@@ -274,8 +329,10 @@ TEST(LocalDataPipeTest, BasicProducerWaiting) { |
num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
EXPECT_EQ(123, elements[0]); |
EXPECT_EQ(-1, elements[1]); |
@@ -432,14 +489,39 @@ TEST(LocalDataPipeTest, BasicConsumerWaiting) { |
EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
+ // Peek one element. |
+ elements[0] = -1; |
+ elements[1] = -1; |
+ num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
+ EXPECT_EQ( |
+ MOJO_RESULT_OK, |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ true)); |
+ EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
+ EXPECT_EQ(456, elements[0]); |
+ EXPECT_EQ(-1, elements[1]); |
+ |
+ // Should still be readable. |
+ waiter.Init(); |
+ hss = HandleSignalsState(); |
+ EXPECT_EQ( |
+ MOJO_RESULT_ALREADY_EXISTS, |
+ dp->ConsumerAddWaiter(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 78, &hss)); |
+ EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
+ EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
+ |
// Read one element. |
elements[0] = -1; |
elements[1] = -1; |
num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
EXPECT_EQ(456, elements[0]); |
EXPECT_EQ(-1, elements[1]); |
@@ -485,8 +567,10 @@ TEST(LocalDataPipeTest, BasicConsumerWaiting) { |
num_bytes = static_cast<uint32_t>(1u * sizeof(elements[0])); |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(elements), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(elements), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes); |
EXPECT_EQ(789, elements[0]); |
EXPECT_EQ(-1, elements[1]); |
@@ -843,8 +927,10 @@ TEST(LocalDataPipeTest, BasicMayDiscardWaiting) { |
element = 0; |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(&element), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(&element), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(static_cast<uint32_t>(sizeof(int32_t)), num_bytes); |
EXPECT_EQ(456, element); |
@@ -908,8 +994,10 @@ TEST(LocalDataPipeTest, MayDiscard) { |
num_bytes = 5u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
int32_t expected_buffer[100]; |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
@@ -933,8 +1021,10 @@ TEST(LocalDataPipeTest, MayDiscard) { |
num_bytes = 5u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
expected_buffer[0] = 8; |
@@ -972,8 +1062,10 @@ TEST(LocalDataPipeTest, MayDiscard) { |
num_bytes = sizeof(buffer); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
expected_buffer[0] = 104; |
@@ -1062,8 +1154,10 @@ TEST(LocalDataPipeTest, MayDiscard) { |
num_bytes = sizeof(buffer); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(8u * sizeof(int32_t), num_bytes); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
expected_buffer[0] = 500; |
@@ -1134,8 +1228,10 @@ TEST(LocalDataPipeTest, AllOrNone) { |
num_bytes = 11u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
int32_t expected_buffer[100]; |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
@@ -1172,8 +1268,10 @@ TEST(LocalDataPipeTest, AllOrNone) { |
num_bytes = 5u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
EXPECT_EQ(5u * sizeof(int32_t), num_bytes); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
Seq(100, 5, expected_buffer); |
@@ -1183,8 +1281,10 @@ TEST(LocalDataPipeTest, AllOrNone) { |
num_bytes = 6u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
@@ -1211,8 +1311,10 @@ TEST(LocalDataPipeTest, AllOrNone) { |
num_bytes = 4u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
@@ -1225,8 +1327,10 @@ TEST(LocalDataPipeTest, AllOrNone) { |
num_bytes = 2u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
EXPECT_EQ(2u * sizeof(int32_t), num_bytes); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
Seq(400, 2, expected_buffer); |
@@ -1291,8 +1395,10 @@ TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { |
num_bytes = 1u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
EXPECT_EQ(1u * sizeof(int32_t), num_bytes); |
int32_t expected_buffer[100]; |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
@@ -1303,8 +1409,10 @@ TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { |
num_bytes = 10u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
EXPECT_EQ(0, memcmp(buffer, expected_buffer, sizeof(buffer))); |
@@ -1336,8 +1444,10 @@ TEST(LocalDataPipeTest, AllOrNoneMayDiscard) { |
num_bytes = 10u * sizeof(int32_t); |
memset(buffer, 0xab, sizeof(buffer)); |
EXPECT_EQ(MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), true)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ true, |
+ false)); |
memset(expected_buffer, 0xab, sizeof(expected_buffer)); |
EXPECT_EQ(10u * sizeof(int32_t), num_bytes); |
Seq(300, 10, expected_buffer); |
@@ -1525,8 +1635,10 @@ TEST(LocalDataPipeTest, WrapAround) { |
num_bytes = 10u; |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(read_buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(read_buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(10u, num_bytes); |
EXPECT_EQ(0, memcmp(read_buffer, &test_data[0], 10u)); |
@@ -1572,8 +1684,10 @@ TEST(LocalDataPipeTest, WrapAround) { |
memset(read_buffer, 0, num_bytes); |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(read_buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(read_buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(100u, num_bytes); |
EXPECT_EQ(0, memcmp(read_buffer, &test_data[10], 100u)); |
@@ -1753,13 +1867,27 @@ TEST(LocalDataPipeTest, CloseWriteRead) { |
// Close the producer. |
dp->ProducerClose(); |
- // Read that data. |
+ // Peek that data. |
char buffer[1000]; |
num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
EXPECT_EQ( |
MOJO_RESULT_OK, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ true)); |
+ EXPECT_EQ(kTestDataSize, num_bytes); |
+ EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); |
+ |
+ // Read that data. |
+ memset(buffer, 0, 1000); |
+ num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
+ EXPECT_EQ( |
+ MOJO_RESULT_OK, |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
EXPECT_EQ(kTestDataSize, num_bytes); |
EXPECT_EQ(0, memcmp(buffer, kTestData, kTestDataSize)); |
@@ -1767,8 +1895,10 @@ TEST(LocalDataPipeTest, CloseWriteRead) { |
num_bytes = static_cast<uint32_t>(sizeof(buffer)); |
EXPECT_EQ( |
MOJO_RESULT_FAILED_PRECONDITION, |
- dp->ConsumerReadData( |
- UserPointer<void>(buffer), MakeUserPointer(&num_bytes), false)); |
+ dp->ConsumerReadData(UserPointer<void>(buffer), |
+ MakeUserPointer(&num_bytes), |
+ false, |
+ false)); |
// A two-phase read should also fail. |
const void* read_buffer_ptr = nullptr; |