| Index: mojo/edk/system/shared_buffer_unittest.cc
|
| diff --git a/mojo/edk/system/shared_buffer_unittest.cc b/mojo/edk/system/shared_buffer_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..9cb9a33c401dc915590edea401771738369a5415
|
| --- /dev/null
|
| +++ b/mojo/edk/system/shared_buffer_unittest.cc
|
| @@ -0,0 +1,160 @@
|
| +// Copyright 2015 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 <string.h>
|
| +
|
| +#include <string>
|
| +#include <utility>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/strings/string_piece.h"
|
| +#include "mojo/edk/test/mojo_test_base.h"
|
| +#include "mojo/public/c/system/types.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace mojo {
|
| +namespace edk {
|
| +namespace {
|
| +
|
| +using SharedBufferTest = test::MojoTestBase;
|
| +
|
| +TEST_F(SharedBufferTest, CreateSharedBuffer) {
|
| + const std::string message = "hello";
|
| + MojoHandle h = CreateBuffer(message.size());
|
| + WriteToBuffer(h, 0, message);
|
| + ExpectBufferContents(h, 0, message);
|
| +}
|
| +
|
| +TEST_F(SharedBufferTest, DuplicateSharedBuffer) {
|
| + const std::string message = "hello";
|
| + MojoHandle h = CreateBuffer(message.size());
|
| + WriteToBuffer(h, 0, message);
|
| +
|
| + MojoHandle dupe = DuplicateBuffer(h);
|
| + ExpectBufferContents(dupe, 0, message);
|
| +}
|
| +
|
| +TEST_F(SharedBufferTest, PassSharedBufferLocal) {
|
| + const std::string message = "hello";
|
| + MojoHandle h = CreateBuffer(message.size());
|
| + WriteToBuffer(h, 0, message);
|
| +
|
| + MojoHandle dupe = DuplicateBuffer(h);
|
| + MojoHandle p0, p1;
|
| + CreateMessagePipe(&p0, &p1);
|
| +
|
| + WriteMessageWithHandles(p0, "...", &dupe, 1);
|
| + EXPECT_EQ("...", ReadMessageWithHandles(p1, &dupe, 1));
|
| +
|
| + ExpectBufferContents(dupe, 0, message);
|
| +}
|
| +
|
| +// Reads a single message with a shared buffer handle, maps the buffer, copies
|
| +// the message contents into it, then exits.
|
| +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CopyToBufferClient, SharedBufferTest, h) {
|
| + MojoHandle b;
|
| + std::string message = ReadMessageWithHandles(h, &b, 1);
|
| + WriteToBuffer(b, 0, message);
|
| +
|
| + EXPECT_EQ("quit", ReadMessage(h));
|
| +}
|
| +
|
| +TEST_F(SharedBufferTest, PassSharedBufferCrossProcess) {
|
| + const std::string message = "hello";
|
| + MojoHandle b = CreateBuffer(message.size());
|
| +
|
| + RUN_CHILD_ON_PIPE(CopyToBufferClient, h)
|
| + MojoHandle dupe = DuplicateBuffer(b);
|
| + WriteMessageWithHandles(h, message, &dupe, 1);
|
| + WriteMessage(h, "quit");
|
| + END_CHILD()
|
| +
|
| + ExpectBufferContents(b, 0, message);
|
| +}
|
| +
|
| +// Creates a new buffer, maps it, writes a message contents to it, unmaps it,
|
| +// and finally passes it back to the parent.
|
| +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateBufferClient, SharedBufferTest, h) {
|
| + std::string message = ReadMessage(h);
|
| + MojoHandle b = CreateBuffer(message.size());
|
| + WriteToBuffer(b, 0, message);
|
| + WriteMessageWithHandles(h, "have a buffer", &b, 1);
|
| +
|
| + EXPECT_EQ("quit", ReadMessage(h));
|
| +}
|
| +
|
| +TEST_F(SharedBufferTest, PassSharedBufferFromChild) {
|
| + const std::string message = "hello";
|
| + MojoHandle b;
|
| + RUN_CHILD_ON_PIPE(CreateBufferClient, h)
|
| + WriteMessage(h, message);
|
| + ReadMessageWithHandles(h, &b, 1);
|
| + WriteMessage(h, "quit");
|
| + END_CHILD()
|
| +
|
| + ExpectBufferContents(b, 0, message);
|
| +}
|
| +
|
| +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassBuffer, SharedBufferTest, h) {
|
| + // Receive a pipe handle over the primordial pipe. This will be connected to
|
| + // another child process.
|
| + MojoHandle other_child;
|
| + std::string message = ReadMessageWithHandles(h, &other_child, 1);
|
| +
|
| + // Create a new shared buffer.
|
| + MojoHandle b = CreateBuffer(message.size());
|
| +
|
| + // Send a copy of the buffer to the parent and the other child.
|
| + MojoHandle dupe = DuplicateBuffer(b);
|
| + WriteMessageWithHandles(h, "", &b, 1);
|
| + WriteMessageWithHandles(other_child, "", &dupe, 1);
|
| +
|
| + EXPECT_EQ("quit", ReadMessage(h));
|
| +}
|
| +
|
| +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceiveAndEditBuffer, SharedBufferTest, h) {
|
| + // Receive a pipe handle over the primordial pipe. This will be connected to
|
| + // another child process (running CreateAndPassBuffer).
|
| + MojoHandle other_child;
|
| + std::string message = ReadMessageWithHandles(h, &other_child, 1);
|
| +
|
| + // Receive a shared buffer from the other child.
|
| + MojoHandle b;
|
| + ReadMessageWithHandles(other_child, &b, 1);
|
| +
|
| + // Write the message from the parent into the buffer and exit.
|
| + WriteToBuffer(b, 0, message);
|
| +
|
| + EXPECT_EQ("quit", ReadMessage(h));
|
| +}
|
| +
|
| +TEST_F(SharedBufferTest, PassSharedBufferFromChildToChild) {
|
| + const std::string message = "hello";
|
| + MojoHandle p0, p1;
|
| + CreateMessagePipe(&p0, &p1);
|
| +
|
| + MojoHandle b;
|
| + RUN_CHILD_ON_PIPE(CreateAndPassBuffer, h0)
|
| + RUN_CHILD_ON_PIPE(ReceiveAndEditBuffer, h1)
|
| + // Send one end of the pipe to each child. The first child will create
|
| + // and pass a buffer to the second child and back to us. The second child
|
| + // will write our message into the buffer.
|
| + WriteMessageWithHandles(h0, message, &p0, 1);
|
| + WriteMessageWithHandles(h1, message, &p1, 1);
|
| +
|
| + // Receive the buffer back from the first child.
|
| + ReadMessageWithHandles(h0, &b, 1);
|
| +
|
| + WriteMessage(h1, "quit");
|
| + WriteMessage(h0, "quit");
|
| + END_CHILD()
|
| + END_CHILD()
|
| +
|
| + // The second child should have written this message.
|
| + ExpectBufferContents(b, 0, message);
|
| +}
|
| +
|
| +} // namespace
|
| +} // namespace edk
|
| +} // namespace mojo
|
|
|