diff options
Diffstat (limited to 'mojo/edk/system/shared_buffer_unittest.cc')
-rw-r--r-- | mojo/edk/system/shared_buffer_unittest.cc | 318 |
1 files changed, 0 insertions, 318 deletions
diff --git a/mojo/edk/system/shared_buffer_unittest.cc b/mojo/edk/system/shared_buffer_unittest.cc deleted file mode 100644 index 3a728728a5..0000000000 --- a/mojo/edk/system/shared_buffer_unittest.cc +++ /dev/null @@ -1,318 +0,0 @@ -// 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/memory/shared_memory.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, false); - 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, false); - MojoHandle p0, p1; - CreateMessagePipe(&p0, &p1); - - WriteMessageWithHandles(p0, "...", &dupe, 1); - EXPECT_EQ("...", ReadMessageWithHandles(p1, &dupe, 1)); - - ExpectBufferContents(dupe, 0, message); -} - -#if !defined(OS_IOS) - -// 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, false); - 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, false); - 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(MOJO_RESULT_OK, MojoClose(b)); - 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"); - END_CHILD() - WriteMessage(h0, "quit"); - END_CHILD() - - // The second child should have written this message. - ExpectBufferContents(b, 0, message); -} - -DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassBufferParent, SharedBufferTest, - parent) { - RUN_CHILD_ON_PIPE(CreateAndPassBuffer, child) - // Read a pipe from the parent and forward it to our child. - MojoHandle pipe; - std::string message = ReadMessageWithHandles(parent, &pipe, 1); - - WriteMessageWithHandles(child, message, &pipe, 1); - - // Read a buffer handle from the child and pass it back to the parent. - MojoHandle buffer; - EXPECT_EQ("", ReadMessageWithHandles(child, &buffer, 1)); - WriteMessageWithHandles(parent, "", &buffer, 1); - - EXPECT_EQ("quit", ReadMessage(parent)); - WriteMessage(child, "quit"); - END_CHILD() -} - -DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReceiveAndEditBufferParent, SharedBufferTest, - parent) { - RUN_CHILD_ON_PIPE(ReceiveAndEditBuffer, child) - // Read a pipe from the parent and forward it to our child. - MojoHandle pipe; - std::string message = ReadMessageWithHandles(parent, &pipe, 1); - WriteMessageWithHandles(child, message, &pipe, 1); - - EXPECT_EQ("quit", ReadMessage(parent)); - WriteMessage(child, "quit"); - END_CHILD() -} - -#if defined(OS_ANDROID) || defined(OS_MACOSX) -// Android multi-process tests are not executing the new process. This is flaky. -// Passing shared memory handles between cousins is not currently supported on -// OSX. -#define MAYBE_PassHandleBetweenCousins DISABLED_PassHandleBetweenCousins -#else -#define MAYBE_PassHandleBetweenCousins PassHandleBetweenCousins -#endif -TEST_F(SharedBufferTest, MAYBE_PassHandleBetweenCousins) { - const std::string message = "hello"; - MojoHandle p0, p1; - CreateMessagePipe(&p0, &p1); - - // Spawn two children who will each spawn their own child. Make sure the - // grandchildren (cousins to each other) can pass platform handles. - MojoHandle b; - RUN_CHILD_ON_PIPE(CreateAndPassBufferParent, child1) - RUN_CHILD_ON_PIPE(ReceiveAndEditBufferParent, child2) - MojoHandle pipe[2]; - CreateMessagePipe(&pipe[0], &pipe[1]); - - WriteMessageWithHandles(child1, message, &pipe[0], 1); - WriteMessageWithHandles(child2, message, &pipe[1], 1); - - // Receive the buffer back from the first child. - ReadMessageWithHandles(child1, &b, 1); - - WriteMessage(child2, "quit"); - END_CHILD() - WriteMessage(child1, "quit"); - END_CHILD() - - // The second grandchild should have written this message. - ExpectBufferContents(b, 0, message); -} - -DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ReadAndMapWriteSharedBuffer, - SharedBufferTest, h) { - // Receive the shared buffer. - MojoHandle b; - EXPECT_EQ("hello", ReadMessageWithHandles(h, &b, 1)); - - // Read from the bufer. - ExpectBufferContents(b, 0, "hello"); - - // Extract the shared memory handle and try to map it writable. - base::SharedMemoryHandle shm_handle; - bool read_only = false; - ASSERT_EQ(MOJO_RESULT_OK, - PassSharedMemoryHandle(b, &shm_handle, nullptr, &read_only)); - base::SharedMemory shared_memory(shm_handle, false); - EXPECT_TRUE(read_only); - EXPECT_FALSE(shared_memory.Map(1234)); - - EXPECT_EQ("quit", ReadMessage(h)); - WriteMessage(h, "ok"); -} - -#if defined(OS_ANDROID) -// Android multi-process tests are not executing the new process. This is flaky. -#define MAYBE_CreateAndPassReadOnlyBuffer DISABLED_CreateAndPassReadOnlyBuffer -#else -#define MAYBE_CreateAndPassReadOnlyBuffer CreateAndPassReadOnlyBuffer -#endif -TEST_F(SharedBufferTest, MAYBE_CreateAndPassReadOnlyBuffer) { - RUN_CHILD_ON_PIPE(ReadAndMapWriteSharedBuffer, h) - // Create a new shared buffer. - MojoHandle b = CreateBuffer(1234); - WriteToBuffer(b, 0, "hello"); - - // Send a read-only copy of the buffer to the child. - MojoHandle dupe = DuplicateBuffer(b, true /* read_only */); - WriteMessageWithHandles(h, "hello", &dupe, 1); - - WriteMessage(h, "quit"); - EXPECT_EQ("ok", ReadMessage(h)); - END_CHILD() -} - -DEFINE_TEST_CLIENT_TEST_WITH_PIPE(CreateAndPassReadOnlyBuffer, - SharedBufferTest, h) { - // Create a new shared buffer. - MojoHandle b = CreateBuffer(1234); - WriteToBuffer(b, 0, "hello"); - - // Send a read-only copy of the buffer to the parent. - MojoHandle dupe = DuplicateBuffer(b, true /* read_only */); - WriteMessageWithHandles(h, "", &dupe, 1); - - EXPECT_EQ("quit", ReadMessage(h)); - WriteMessage(h, "ok"); -} - -#if defined(OS_ANDROID) -// Android multi-process tests are not executing the new process. This is flaky. -#define MAYBE_CreateAndPassFromChildReadOnlyBuffer \ - DISABLED_CreateAndPassFromChildReadOnlyBuffer -#else -#define MAYBE_CreateAndPassFromChildReadOnlyBuffer \ - CreateAndPassFromChildReadOnlyBuffer -#endif -TEST_F(SharedBufferTest, MAYBE_CreateAndPassFromChildReadOnlyBuffer) { - RUN_CHILD_ON_PIPE(CreateAndPassReadOnlyBuffer, h) - MojoHandle b; - EXPECT_EQ("", ReadMessageWithHandles(h, &b, 1)); - ExpectBufferContents(b, 0, "hello"); - - // Extract the shared memory handle and try to map it writable. - base::SharedMemoryHandle shm_handle; - bool read_only = false; - ASSERT_EQ(MOJO_RESULT_OK, - PassSharedMemoryHandle(b, &shm_handle, nullptr, &read_only)); - base::SharedMemory shared_memory(shm_handle, false); - EXPECT_TRUE(read_only); - EXPECT_FALSE(shared_memory.Map(1234)); - - WriteMessage(h, "quit"); - EXPECT_EQ("ok", ReadMessage(h)); - END_CHILD() -} - -#endif // !defined(OS_IOS) - -} // namespace -} // namespace edk -} // namespace mojo |