| Index: mojo/edk/embedder/embedder_unittest.cc
 | 
| diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/embedder/embedder_unittest.cc
 | 
| index 60a2b80124bb4a767ebc5805b9200c5aaef1d189..4f6493f74f1d582a6c6e7dcbe1ec4bf1f815a883 100644
 | 
| --- a/mojo/edk/embedder/embedder_unittest.cc
 | 
| +++ b/mojo/edk/embedder/embedder_unittest.cc
 | 
| @@ -34,14 +34,7 @@ const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE |
 | 
|                                       MOJO_HANDLE_SIGNAL_WRITABLE |
 | 
|                                       MOJO_HANDLE_SIGNAL_PEER_CLOSED;
 | 
|  
 | 
| -class EmbedderTest : public test::MojoSystemTest {
 | 
| - public:
 | 
| -  EmbedderTest() {}
 | 
| -  ~EmbedderTest() override {}
 | 
| -
 | 
| - private:
 | 
| -  MOJO_DISALLOW_COPY_AND_ASSIGN(EmbedderTest);
 | 
| -};
 | 
| +typedef testing::Test EmbedderTest;
 | 
|  
 | 
|  TEST_F(EmbedderTest, ChannelBasic) {
 | 
|    MojoHandle server_mp, client_mp;
 | 
| @@ -85,8 +78,11 @@ TEST_F(EmbedderTest, SendReadableMessagePipe) {
 | 
|              MojoCreateMessagePipe(nullptr, &server_mp, &client_mp));
 | 
|  
 | 
|    MojoHandle server_mp2, client_mp2;
 | 
| +  MojoCreateMessagePipeOptions options;
 | 
| +  options.struct_size = sizeof(MojoCreateMessagePipeOptions);
 | 
| +  options.flags = MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_TRANSFERABLE;
 | 
|    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -            MojoCreateMessagePipe(nullptr, &server_mp2, &client_mp2));
 | 
| +            MojoCreateMessagePipe(&options, &server_mp2, &client_mp2));
 | 
|  
 | 
|    // Write to server2 and wait for client2 to be readable before sending it.
 | 
|    // client2's MessagePipeDispatcher will have the message below in its
 | 
| @@ -165,9 +161,12 @@ TEST_F(EmbedderTest, SendMessagePipeWithWriteQueue) {
 | 
|    ASSERT_EQ(MOJO_RESULT_OK,
 | 
|              MojoCreateMessagePipe(nullptr, &server_mp, &client_mp));
 | 
|  
 | 
| +  MojoCreateMessagePipeOptions options;
 | 
| +  options.struct_size = sizeof(MojoCreateMessagePipeOptions);
 | 
| +  options.flags = MOJO_CREATE_MESSAGE_PIPE_OPTIONS_FLAG_TRANSFERABLE;
 | 
|    MojoHandle server_mp2, client_mp2;
 | 
|    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -            MojoCreateMessagePipe(nullptr, &server_mp2, &client_mp2));
 | 
| +            MojoCreateMessagePipe(&options, &server_mp2, &client_mp2));
 | 
|  
 | 
|    static const size_t kNumMessages = 1001;
 | 
|    for (size_t i = 0; i < kNumMessages; i++) {
 | 
| @@ -465,114 +464,108 @@ TEST_F(EmbedderTest, MAYBE_MultiprocessChannels) {
 | 
|  }
 | 
|  
 | 
|  MOJO_MULTIPROCESS_TEST_CHILD_TEST(MultiprocessChannelsClient) {
 | 
| -  base::MessageLoop message_loop;
 | 
|    ScopedPlatformHandle client_platform_handle =
 | 
|        test::MultiprocessTestHelper::client_platform_handle.Pass();
 | 
|    EXPECT_TRUE(client_platform_handle.is_valid());
 | 
|  
 | 
| -  base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
 | 
| -
 | 
| -  {
 | 
| -    test::ScopedIPCSupport ipc_support(test_io_thread.task_runner());
 | 
| -    MojoHandle client_mp = CreateMessagePipe(
 | 
| -        client_platform_handle.Pass()).release().value();
 | 
| +  MojoHandle client_mp = CreateMessagePipe(
 | 
| +      client_platform_handle.Pass()).release().value();
 | 
|  
 | 
| -    // 1. Read the first message from |client_mp|.
 | 
| -    MojoHandleSignalsState state;
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| -                                       MOJO_DEADLINE_INDEFINITE, &state));
 | 
| -    ASSERT_EQ(kSignalReadadableWritable, state.satisfied_signals);
 | 
| -    ASSERT_EQ(kSignalAll, state.satisfiable_signals);
 | 
| +  // 1. Read the first message from |client_mp|.
 | 
| +  MojoHandleSignalsState state;
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| +                                      MOJO_DEADLINE_INDEFINITE, &state));
 | 
| +  ASSERT_EQ(kSignalReadadableWritable, state.satisfied_signals);
 | 
| +  ASSERT_EQ(kSignalAll, state.satisfiable_signals);
 | 
|  
 | 
| -    char buffer[1000] = {};
 | 
| -    uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer));
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -              MojoReadMessage(client_mp, buffer, &num_bytes, nullptr, nullptr,
 | 
| -                              MOJO_READ_MESSAGE_FLAG_NONE));
 | 
| -    const char kHello[] = "hello";
 | 
| -    ASSERT_EQ(sizeof(kHello), num_bytes);
 | 
| -    EXPECT_STREQ(kHello, buffer);
 | 
| +  char buffer[1000] = {};
 | 
| +  uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer));
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK,
 | 
| +            MojoReadMessage(client_mp, buffer, &num_bytes, nullptr, nullptr,
 | 
| +                            MOJO_READ_MESSAGE_FLAG_NONE));
 | 
| +  const char kHello[] = "hello";
 | 
| +  ASSERT_EQ(sizeof(kHello), num_bytes);
 | 
| +  EXPECT_STREQ(kHello, buffer);
 | 
|  
 | 
| -    // 2. Write a message to |client_mp| (attaching nothing).
 | 
| -    const char kWorld[] = "world!";
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -              MojoWriteMessage(client_mp, kWorld,
 | 
| -                               static_cast<uint32_t>(sizeof(kWorld)), nullptr,
 | 
| -                               0, MOJO_WRITE_MESSAGE_FLAG_NONE));
 | 
| +  // 2. Write a message to |client_mp| (attaching nothing).
 | 
| +  const char kWorld[] = "world!";
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK,
 | 
| +            MojoWriteMessage(client_mp, kWorld,
 | 
| +                              static_cast<uint32_t>(sizeof(kWorld)), nullptr,
 | 
| +                              0, MOJO_WRITE_MESSAGE_FLAG_NONE));
 | 
|  
 | 
| -    // 4. Read a message from |client_mp|, which should have |mp1| attached.
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| -                                       MOJO_DEADLINE_INDEFINITE, &state));
 | 
| -    // The other end of the handle may or may not be closed at this point, so we
 | 
| -    // can't test MOJO_HANDLE_SIGNAL_WRITABLE or MOJO_HANDLE_SIGNAL_PEER_CLOSED.
 | 
| -    ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE,
 | 
| -              state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE);
 | 
| -    ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE,
 | 
| -              state.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE);
 | 
| -    // TODO(vtl): If the scope were to end here (and |client_mp| closed), we'd
 | 
| -    // die (again due to |Channel::HandleLocalError()|).
 | 
| -    memset(buffer, 0, sizeof(buffer));
 | 
| -    num_bytes = static_cast<uint32_t>(sizeof(buffer));
 | 
| -    MojoHandle mp1 = MOJO_HANDLE_INVALID;
 | 
| -    uint32_t num_handles = 1;
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -              MojoReadMessage(client_mp, buffer, &num_bytes, &mp1, &num_handles,
 | 
| -                              MOJO_READ_MESSAGE_FLAG_NONE));
 | 
| -    const char kBar[] = "Bar";
 | 
| -    ASSERT_EQ(sizeof(kBar), num_bytes);
 | 
| -    EXPECT_STREQ(kBar, buffer);
 | 
| -    ASSERT_EQ(1u, num_handles);
 | 
| -    EXPECT_NE(mp1, MOJO_HANDLE_INVALID);
 | 
| -    // TODO(vtl): If the scope were to end here (and the two handles closed),
 | 
| -    // we'd die due to |Channel::RunRemoteMessagePipeEndpoint()| not handling
 | 
| -    // write errors (assuming the parent had closed the pipe).
 | 
| +  // 4. Read a message from |client_mp|, which should have |mp1| attached.
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| +                                      MOJO_DEADLINE_INDEFINITE, &state));
 | 
| +  // The other end of the handle may or may not be closed at this point, so we
 | 
| +  // can't test MOJO_HANDLE_SIGNAL_WRITABLE or MOJO_HANDLE_SIGNAL_PEER_CLOSED.
 | 
| +  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE,
 | 
| +            state.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE);
 | 
| +  ASSERT_EQ(MOJO_HANDLE_SIGNAL_READABLE,
 | 
| +            state.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE);
 | 
| +  // TODO(vtl): If the scope were to end here (and |client_mp| closed), we'd
 | 
| +  // die (again due to |Channel::HandleLocalError()|).
 | 
| +  memset(buffer, 0, sizeof(buffer));
 | 
| +  num_bytes = static_cast<uint32_t>(sizeof(buffer));
 | 
| +  MojoHandle mp1 = MOJO_HANDLE_INVALID;
 | 
| +  uint32_t num_handles = 1;
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK,
 | 
| +            MojoReadMessage(client_mp, buffer, &num_bytes, &mp1, &num_handles,
 | 
| +                            MOJO_READ_MESSAGE_FLAG_NONE));
 | 
| +  const char kBar[] = "Bar";
 | 
| +  ASSERT_EQ(sizeof(kBar), num_bytes);
 | 
| +  EXPECT_STREQ(kBar, buffer);
 | 
| +  ASSERT_EQ(1u, num_handles);
 | 
| +  EXPECT_NE(mp1, MOJO_HANDLE_INVALID);
 | 
| +  // TODO(vtl): If the scope were to end here (and the two handles closed),
 | 
| +  // we'd die due to |Channel::RunRemoteMessagePipeEndpoint()| not handling
 | 
| +  // write errors (assuming the parent had closed the pipe).
 | 
|  
 | 
| -    // 6. Close |client_mp|.
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
 | 
| +  // 6. Close |client_mp|.
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(client_mp));
 | 
|  
 | 
| -    // Create a new message pipe (endpoints |mp2| and |mp3|).
 | 
| -    MojoHandle mp2, mp3;
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mp2, &mp3));
 | 
| +  // Create a new message pipe (endpoints |mp2| and |mp3|).
 | 
| +  MojoHandle mp2, mp3;
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &mp2, &mp3));
 | 
|  
 | 
| -    // 7. Write a message to |mp3|.
 | 
| -    const char kBaz[] = "baz";
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -              MojoWriteMessage(mp3, kBaz, static_cast<uint32_t>(sizeof(kBaz)),
 | 
| -                               nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
 | 
| +  // 7. Write a message to |mp3|.
 | 
| +  const char kBaz[] = "baz";
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK,
 | 
| +            MojoWriteMessage(mp3, kBaz, static_cast<uint32_t>(sizeof(kBaz)),
 | 
| +                              nullptr, 0, MOJO_WRITE_MESSAGE_FLAG_NONE));
 | 
|  
 | 
| -    // 8. Close |mp3|.
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp3));
 | 
| +  // 8. Close |mp3|.
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp3));
 | 
|  
 | 
| -    // 9. Write a message to |mp1|, attaching |mp2|.
 | 
| -    const char kQuux[] = "quux";
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -              MojoWriteMessage(mp1, kQuux, static_cast<uint32_t>(sizeof(kQuux)),
 | 
| -                               &mp2, 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
 | 
| -    mp2 = MOJO_HANDLE_INVALID;
 | 
| +  // 9. Write a message to |mp1|, attaching |mp2|.
 | 
| +  const char kQuux[] = "quux";
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK,
 | 
| +            MojoWriteMessage(mp1, kQuux, static_cast<uint32_t>(sizeof(kQuux)),
 | 
| +                              &mp2, 1, MOJO_WRITE_MESSAGE_FLAG_NONE));
 | 
| +  mp2 = MOJO_HANDLE_INVALID;
 | 
|  
 | 
| -    // 3. Read a message from |mp1|.
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK, MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| -                                       MOJO_DEADLINE_INDEFINITE, &state));
 | 
| -    ASSERT_EQ(kSignalReadadableWritable, state.satisfied_signals);
 | 
| -    ASSERT_EQ(kSignalAll, state.satisfiable_signals);
 | 
| +  // 3. Read a message from |mp1|.
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK, MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| +                                      MOJO_DEADLINE_INDEFINITE, &state));
 | 
| +  ASSERT_EQ(kSignalReadadableWritable, state.satisfied_signals);
 | 
| +  ASSERT_EQ(kSignalAll, state.satisfiable_signals);
 | 
|  
 | 
| -    memset(buffer, 0, sizeof(buffer));
 | 
| -    num_bytes = static_cast<uint32_t>(sizeof(buffer));
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK,
 | 
| -              MojoReadMessage(mp1, buffer, &num_bytes, nullptr, nullptr,
 | 
| -                              MOJO_READ_MESSAGE_FLAG_NONE));
 | 
| -    const char kFoo[] = "FOO";
 | 
| -    ASSERT_EQ(sizeof(kFoo), num_bytes);
 | 
| -    EXPECT_STREQ(kFoo, buffer);
 | 
| +  memset(buffer, 0, sizeof(buffer));
 | 
| +  num_bytes = static_cast<uint32_t>(sizeof(buffer));
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK,
 | 
| +            MojoReadMessage(mp1, buffer, &num_bytes, nullptr, nullptr,
 | 
| +                            MOJO_READ_MESSAGE_FLAG_NONE));
 | 
| +  const char kFoo[] = "FOO";
 | 
| +  ASSERT_EQ(sizeof(kFoo), num_bytes);
 | 
| +  EXPECT_STREQ(kFoo, buffer);
 | 
|  
 | 
| -    // 11. Wait on |mp1| (which should eventually fail) and then close it.
 | 
| -    ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
 | 
| -              MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| -                       MOJO_DEADLINE_INDEFINITE, &state));
 | 
| -    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
 | 
| -    ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
 | 
| -    ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp1));
 | 
| -  }
 | 
| +  // 11. Wait on |mp1| (which should eventually fail) and then close it.
 | 
| +  ASSERT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
 | 
| +            MojoWait(mp1, MOJO_HANDLE_SIGNAL_READABLE,
 | 
| +                      MOJO_DEADLINE_INDEFINITE, &state));
 | 
| +  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfied_signals);
 | 
| +  ASSERT_EQ(MOJO_HANDLE_SIGNAL_PEER_CLOSED, state.satisfiable_signals);
 | 
| +  ASSERT_EQ(MOJO_RESULT_OK, MojoClose(mp1));
 | 
|  }
 | 
|  
 | 
|  // TODO(vtl): Test immediate write & close.
 | 
| 
 |