diff options
author | jamesr <jamesr@chromium.org> | 2014-11-06 17:24:51 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-07 01:25:12 +0000 |
commit | 60a7dbf7faabe2a3b8caf306d8d2a01bfdcd5b59 (patch) | |
tree | 6af5c96c653a4f201ef8810fc092bcc59bdb5dc5 /mojo/edk/system | |
parent | a204dfe24afa7e007833b996605f818e3e319e08 (diff) | |
download | chromium_src-60a7dbf7faabe2a3b8caf306d8d2a01bfdcd5b59.zip chromium_src-60a7dbf7faabe2a3b8caf306d8d2a01bfdcd5b59.tar.gz chromium_src-60a7dbf7faabe2a3b8caf306d8d2a01bfdcd5b59.tar.bz2 |
Update mojo sdk to rev 04a510fb37db10642e156957f9b2c11c2f6442ac
This updates the mojo sdk and updates chromium code to match. The most
significant change is updating references to the mojo JS bindings code,
which reshuffled. This part was reviewed separately by hansmuller@ in
https://codereview.chromium.org/693343003/. This also updates ipc/mojo
to reflect changes in ChannelInfo.
R=morrita@chromium.org for ipc/mojo
R=jam@chromium.org for top-level approval of the rest
Review URL: https://codereview.chromium.org/703273002
Cr-Commit-Position: refs/heads/master@{#303149}
Diffstat (limited to 'mojo/edk/system')
-rw-r--r-- | mojo/edk/system/BUILD.gn | 2 | ||||
-rw-r--r-- | mojo/edk/system/channel_info.cc | 23 | ||||
-rw-r--r-- | mojo/edk/system/channel_info.h | 31 | ||||
-rw-r--r-- | mojo/edk/system/core_unittest.cc | 42 | ||||
-rw-r--r-- | mojo/edk/system/data_pipe.cc | 5 | ||||
-rw-r--r-- | mojo/edk/system/data_pipe.h | 6 | ||||
-rw-r--r-- | mojo/edk/system/data_pipe_consumer_dispatcher.cc | 13 | ||||
-rw-r--r-- | mojo/edk/system/local_data_pipe.cc | 6 | ||||
-rw-r--r-- | mojo/edk/system/local_data_pipe.h | 3 | ||||
-rw-r--r-- | mojo/edk/system/local_data_pipe_unittest.cc | 232 |
10 files changed, 301 insertions, 62 deletions
diff --git a/mojo/edk/system/BUILD.gn b/mojo/edk/system/BUILD.gn index 250bcaf..791a192 100644 --- a/mojo/edk/system/BUILD.gn +++ b/mojo/edk/system/BUILD.gn @@ -32,6 +32,8 @@ component("system") { "channel_endpoint.h", "channel_endpoint_id.cc", "channel_endpoint_id.h", + "channel_info.cc", + "channel_info.h", "constants.h", "core.cc", "core.h", diff --git a/mojo/edk/system/channel_info.cc b/mojo/edk/system/channel_info.cc new file mode 100644 index 0000000..efc5f04 --- /dev/null +++ b/mojo/edk/system/channel_info.cc @@ -0,0 +1,23 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mojo/edk/system/channel_info.h" + +namespace mojo { +namespace system { + +ChannelInfo::ChannelInfo() { +} + +ChannelInfo::ChannelInfo( + scoped_refptr<Channel> channel, + scoped_refptr<base::TaskRunner> channel_thread_task_runner) + : channel(channel), channel_thread_task_runner(channel_thread_task_runner) { +} + +ChannelInfo::~ChannelInfo() { +} + +} // namespace system +} // namespace mojo diff --git a/mojo/edk/system/channel_info.h b/mojo/edk/system/channel_info.h new file mode 100644 index 0000000..bd84e16 --- /dev/null +++ b/mojo/edk/system/channel_info.h @@ -0,0 +1,31 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MOJO_EDK_SYSTEM_CHANNEL_INFO_H_ +#define MOJO_EDK_SYSTEM_CHANNEL_INFO_H_ + +#include "base/memory/ref_counted.h" +#include "base/task_runner.h" +#include "mojo/edk/system/channel.h" +#include "mojo/edk/system/system_impl_export.h" + +namespace mojo { +namespace system { + +struct MOJO_SYSTEM_IMPL_EXPORT ChannelInfo { + ChannelInfo(); + ChannelInfo(scoped_refptr<Channel> channel, + scoped_refptr<base::TaskRunner> channel_thread_task_runner); + ~ChannelInfo(); + + scoped_refptr<Channel> channel; + // The task runner for |channel|'s creation thread (a.k.a. its I/O thread), on + // which it must, e.g., be shut down. + scoped_refptr<base::TaskRunner> channel_thread_task_runner; +}; + +} // namespace system +} // namespace mojo + +#endif // MOJO_EDK_SYSTEM_CHANNEL_INFO_H_ diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc index 9adde19..e6607df 100644 --- a/mojo/edk/system/core_unittest.cc +++ b/mojo/edk/system/core_unittest.cc @@ -1084,6 +1084,19 @@ TEST_F(CoreTest, DataPipe) { EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); + // Peek one character. + elements[0] = -1; + elements[1] = -1; + num_bytes = 1u; + EXPECT_EQ(MOJO_RESULT_OK, + core()->ReadData( + ch, + UserPointer<void>(elements), + MakeUserPointer(&num_bytes), + MOJO_READ_DATA_FLAG_NONE | MOJO_READ_DATA_FLAG_PEEK)); + EXPECT_EQ('A', elements[0]); + EXPECT_EQ(-1, elements[1]); + // Read one character. elements[0] = -1; elements[1] = -1; @@ -1131,6 +1144,16 @@ TEST_F(CoreTest, DataPipe) { MOJO_READ_DATA_FLAG_QUERY)); EXPECT_EQ(4u, num_bytes); + // Try to query with peek. Should fail. + num_bytes = 0; + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + core()->ReadData( + ch, + NullUserPointer(), + MakeUserPointer(&num_bytes), + MOJO_READ_DATA_FLAG_QUERY | MOJO_READ_DATA_FLAG_PEEK)); + EXPECT_EQ(0u, num_bytes); + // Try to discard ten characters, in all-or-none mode. Should fail. num_bytes = 10; EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, @@ -1140,6 +1163,15 @@ TEST_F(CoreTest, DataPipe) { MakeUserPointer(&num_bytes), MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); + // Try to discard two characters, in peek mode. Should fail. + num_bytes = 2; + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + core()->ReadData( + ch, + NullUserPointer(), + MakeUserPointer(&num_bytes), + MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_PEEK)); + // Discard two characters. num_bytes = 2; EXPECT_EQ(MOJO_RESULT_OK, @@ -1149,9 +1181,17 @@ TEST_F(CoreTest, DataPipe) { MakeUserPointer(&num_bytes), MOJO_READ_DATA_FLAG_DISCARD | MOJO_READ_DATA_FLAG_ALL_OR_NONE)); - // Read the remaining two characters, in two-phase mode (all-or-none). + // Try a two-phase read of the remaining two bytes with peek. Should fail. const void* read_ptr = nullptr; num_bytes = 2; + ASSERT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + core()->BeginReadData(ch, + MakeUserPointer(&read_ptr), + MakeUserPointer(&num_bytes), + MOJO_READ_DATA_FLAG_PEEK)); + + // Read the remaining two characters, in two-phase mode (all-or-none). + num_bytes = 2; ASSERT_EQ(MOJO_RESULT_OK, core()->BeginReadData(ch, MakeUserPointer(&read_ptr), diff --git a/mojo/edk/system/data_pipe.cc b/mojo/edk/system/data_pipe.cc index e9c4903..e9525bc 100644 --- a/mojo/edk/system/data_pipe.cc +++ b/mojo/edk/system/data_pipe.cc @@ -260,7 +260,8 @@ void DataPipe::ConsumerClose() { MojoResult DataPipe::ConsumerReadData(UserPointer<void> elements, UserPointer<uint32_t> num_bytes, - bool all_or_none) { + bool all_or_none, + bool peek) { base::AutoLock locker(lock_); DCHECK(has_local_consumer_no_lock()); @@ -279,7 +280,7 @@ MojoResult DataPipe::ConsumerReadData(UserPointer<void> elements, HandleSignalsState old_producer_state = ProducerGetHandleSignalsStateImplNoLock(); MojoResult rv = ConsumerReadDataImplNoLock( - elements, num_bytes, max_num_bytes_to_read, min_num_bytes_to_read); + elements, num_bytes, max_num_bytes_to_read, min_num_bytes_to_read, peek); HandleSignalsState new_producer_state = ProducerGetHandleSignalsStateImplNoLock(); if (!new_producer_state.equals(old_producer_state)) diff --git a/mojo/edk/system/data_pipe.h b/mojo/edk/system/data_pipe.h index 64b18e2..d4afdda 100644 --- a/mojo/edk/system/data_pipe.h +++ b/mojo/edk/system/data_pipe.h @@ -73,7 +73,8 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipe // a multiple of |element_num_bytes_|. MojoResult ConsumerReadData(UserPointer<void> elements, UserPointer<uint32_t> num_bytes, - bool all_or_none); + bool all_or_none, + bool peek); MojoResult ConsumerDiscardData(UserPointer<uint32_t> num_bytes, bool all_or_none); MojoResult ConsumerQueryData(UserPointer<uint32_t> num_bytes); @@ -120,7 +121,8 @@ class MOJO_SYSTEM_IMPL_EXPORT DataPipe UserPointer<void> elements, UserPointer<uint32_t> num_bytes, uint32_t max_num_bytes_to_read, - uint32_t min_num_bytes_to_read) = 0; + uint32_t min_num_bytes_to_read, + bool peek) = 0; virtual MojoResult ConsumerDiscardDataImplNoLock( UserPointer<uint32_t> num_bytes, uint32_t max_num_bytes_to_discard, diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/edk/system/data_pipe_consumer_dispatcher.cc index 2b3f514..fa103c3 100644 --- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc +++ b/mojo/edk/system/data_pipe_consumer_dispatcher.cc @@ -58,7 +58,8 @@ MojoResult DataPipeConsumerDispatcher::ReadDataImplNoLock( if ((flags & MOJO_READ_DATA_FLAG_DISCARD)) { // These flags are mutally exclusive. - if ((flags & MOJO_READ_DATA_FLAG_QUERY)) + if ((flags & MOJO_READ_DATA_FLAG_QUERY) || + (flags & MOJO_READ_DATA_FLAG_PEEK)) return MOJO_RESULT_INVALID_ARGUMENT; DVLOG_IF(2, !elements.IsNull()) << "Discard mode: ignoring non-null |elements|"; @@ -67,6 +68,8 @@ MojoResult DataPipeConsumerDispatcher::ReadDataImplNoLock( } if ((flags & MOJO_READ_DATA_FLAG_QUERY)) { + if ((flags & MOJO_READ_DATA_FLAG_PEEK)) + return MOJO_RESULT_INVALID_ARGUMENT; DCHECK(!(flags & MOJO_READ_DATA_FLAG_DISCARD)); // Handled above. DVLOG_IF(2, !elements.IsNull()) << "Query mode: ignoring non-null |elements|"; @@ -74,7 +77,10 @@ MojoResult DataPipeConsumerDispatcher::ReadDataImplNoLock( } return data_pipe_->ConsumerReadData( - elements, num_bytes, (flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE)); + elements, + num_bytes, + !!(flags & MOJO_READ_DATA_FLAG_ALL_OR_NONE), + !!(flags & MOJO_READ_DATA_FLAG_PEEK)); } MojoResult DataPipeConsumerDispatcher::BeginReadDataImplNoLock( @@ -85,7 +91,8 @@ MojoResult DataPipeConsumerDispatcher::BeginReadDataImplNoLock( // These flags may not be used in two-phase mode. if ((flags & MOJO_READ_DATA_FLAG_DISCARD) || - (flags & MOJO_READ_DATA_FLAG_QUERY)) + (flags & MOJO_READ_DATA_FLAG_QUERY) || + (flags & MOJO_READ_DATA_FLAG_PEEK)) return MOJO_RESULT_INVALID_ARGUMENT; return data_pipe_->ConsumerBeginReadData( diff --git a/mojo/edk/system/local_data_pipe.cc b/mojo/edk/system/local_data_pipe.cc index 8ee696c..fdfaf28 100644 --- a/mojo/edk/system/local_data_pipe.cc +++ b/mojo/edk/system/local_data_pipe.cc @@ -177,7 +177,8 @@ MojoResult LocalDataPipe::ConsumerReadDataImplNoLock( UserPointer<void> elements, UserPointer<uint32_t> num_bytes, uint32_t max_num_bytes_to_read, - uint32_t min_num_bytes_to_read) { + uint32_t min_num_bytes_to_read, + bool peek) { DCHECK_EQ(max_num_bytes_to_read % element_num_bytes(), 0u); DCHECK_EQ(min_num_bytes_to_read % element_num_bytes(), 0u); DCHECK_GT(max_num_bytes_to_read, 0u); @@ -207,7 +208,8 @@ MojoResult LocalDataPipe::ConsumerReadDataImplNoLock( .PutArray(buffer_.get(), num_bytes_to_read - num_bytes_to_read_first); } - MarkDataAsConsumedNoLock(num_bytes_to_read); + if (!peek) + MarkDataAsConsumedNoLock(num_bytes_to_read); num_bytes.Put(static_cast<uint32_t>(num_bytes_to_read)); return MOJO_RESULT_OK; } diff --git a/mojo/edk/system/local_data_pipe.h b/mojo/edk/system/local_data_pipe.h index 8a46c52..c98cb7e 100644 --- a/mojo/edk/system/local_data_pipe.h +++ b/mojo/edk/system/local_data_pipe.h @@ -48,7 +48,8 @@ class MOJO_SYSTEM_IMPL_EXPORT LocalDataPipe : public DataPipe { UserPointer<void> elements, UserPointer<uint32_t> num_bytes, uint32_t max_num_bytes_to_read, - uint32_t min_num_bytes_to_read) override; + uint32_t min_num_bytes_to_read, + bool peek) override; MojoResult ConsumerDiscardDataImplNoLock( UserPointer<uint32_t> num_bytes, uint32_t max_num_bytes_to_discard, diff --git a/mojo/edk/system/local_data_pipe_unittest.cc b/mojo/edk/system/local_data_pipe_unittest.cc index 979b4d2..e8bc716 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; |