| Index: third_party/mojo/src/mojo/edk/embedder/embedder_unittest.cc
|
| diff --git a/third_party/mojo/src/mojo/edk/embedder/embedder_unittest.cc b/third_party/mojo/src/mojo/edk/embedder/embedder_unittest.cc
|
| index 48a59c13618427698c990f8054665b6ed757db72..5dc34b1e0998f4cf71da278b9ea70f23e276d70e 100644
|
| --- a/third_party/mojo/src/mojo/edk/embedder/embedder_unittest.cc
|
| +++ b/third_party/mojo/src/mojo/edk/embedder/embedder_unittest.cc
|
| @@ -7,6 +7,7 @@
|
| #include <string.h>
|
|
|
| #include "base/bind.h"
|
| +#include "base/command_line.h"
|
| #include "base/location.h"
|
| #include "base/logging.h"
|
| #include "base/macros.h"
|
| @@ -19,6 +20,7 @@
|
| #include "mojo/edk/system/test_utils.h"
|
| #include "mojo/edk/test/multiprocess_test_helper.h"
|
| #include "mojo/edk/test/scoped_ipc_support.h"
|
| +#include "mojo/edk/test/test_utils.h"
|
| #include "mojo/public/c/system/core.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -33,6 +35,8 @@ const MojoHandleSignals kSignalAll = MOJO_HANDLE_SIGNAL_READABLE |
|
| MOJO_HANDLE_SIGNAL_WRITABLE |
|
| MOJO_HANDLE_SIGNAL_PEER_CLOSED;
|
|
|
| +const char kConnectionIdFlag[] = "test-connection-id";
|
| +
|
| class ScopedTestChannel {
|
| public:
|
| // Creates a channel that lives on a given I/O thread (determined by the given
|
| @@ -215,8 +219,7 @@ void CloseScopedHandle(ScopedMessagePipeHandle handle) {
|
| TEST_F(EmbedderTest, AsyncWait) {
|
| ScopedMessagePipeHandle client_mp;
|
| ScopedMessagePipeHandle server_mp;
|
| - EXPECT_EQ(MOJO_RESULT_OK,
|
| - mojo::CreateMessagePipe(nullptr, &client_mp, &server_mp));
|
| + EXPECT_EQ(MOJO_RESULT_OK, CreateMessagePipe(nullptr, &client_mp, &server_mp));
|
|
|
| TestAsyncWaiter waiter;
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| @@ -380,6 +383,83 @@ TEST_F(EmbedderTest, ChannelsHandlePassing) {
|
| EXPECT_TRUE(client_channel.channel_info());
|
| }
|
|
|
| +#if defined(OS_ANDROID) || defined(OS_WIN)
|
| +// Android multi-process tests are not executing the new process. This is flaky.
|
| +// TODO(vtl): I'm guessing this is true of this test too?
|
| +#define MAYBE_MultiprocessMasterSlave DISABLED_MultiprocessMasterSlave
|
| +#else
|
| +#define MAYBE_MultiprocessMasterSlave MultiprocessMasterSlave
|
| +#endif // defined(OS_ANDROID)
|
| +TEST_F(EmbedderTest, MAYBE_MultiprocessMasterSlave) {
|
| + mojo::test::ScopedMasterIPCSupport ipc_support(test_io_task_runner());
|
| +
|
| + mojo::test::MultiprocessTestHelper multiprocess_test_helper;
|
| + ScopedPlatformHandle second_platform_handle;
|
| + std::string connection_id;
|
| + ConnectToSlave(nullptr,
|
| + multiprocess_test_helper.server_platform_handle.Pass(),
|
| + &second_platform_handle, &connection_id);
|
| + ASSERT_TRUE(second_platform_handle.is_valid());
|
| + ASSERT_FALSE(connection_id.empty());
|
| +
|
| + multiprocess_test_helper.StartChildWithExtraSwitch(
|
| + "MultiprocessMasterSlave", kConnectionIdFlag, connection_id);
|
| +
|
| + // We write a '?'. The slave should write a '!' in response.
|
| + size_t n = 0;
|
| + EXPECT_TRUE(
|
| + mojo::test::BlockingWrite(second_platform_handle.get(), "?", 1, &n));
|
| + EXPECT_EQ(1u, n);
|
| +
|
| + char c = '\0';
|
| + n = 0;
|
| + EXPECT_TRUE(
|
| + mojo::test::BlockingRead(second_platform_handle.get(), &c, 1, &n));
|
| + EXPECT_EQ(1u, n);
|
| + EXPECT_EQ('!', c);
|
| +
|
| + EXPECT_TRUE(multiprocess_test_helper.WaitForChildTestShutdown());
|
| +}
|
| +
|
| +MOJO_MULTIPROCESS_TEST_CHILD_TEST(MultiprocessMasterSlave) {
|
| + ScopedPlatformHandle client_platform_handle =
|
| + mojo::test::MultiprocessTestHelper::client_platform_handle.Pass();
|
| + EXPECT_TRUE(client_platform_handle.is_valid());
|
| +
|
| + base::TestIOThread test_io_thread(base::TestIOThread::kAutoStart);
|
| + test::InitWithSimplePlatformSupport();
|
| +
|
| + {
|
| + mojo::test::ScopedSlaveIPCSupport ipc_support(
|
| + test_io_thread.task_runner(), client_platform_handle.Pass());
|
| +
|
| + const base::CommandLine& command_line =
|
| + *base::CommandLine::ForCurrentProcess();
|
| + ASSERT_TRUE(command_line.HasSwitch(kConnectionIdFlag));
|
| + std::string connection_id =
|
| + command_line.GetSwitchValueASCII(kConnectionIdFlag);
|
| + ASSERT_FALSE(connection_id.empty());
|
| + ScopedPlatformHandle second_platform_handle;
|
| + ConnectToMaster(connection_id, &second_platform_handle);
|
| + ASSERT_TRUE(second_platform_handle.is_valid());
|
| +
|
| + // The master should write a '?'. We'll write a '!' in response.
|
| + char c = '\0';
|
| + size_t n = 0;
|
| + EXPECT_TRUE(
|
| + mojo::test::BlockingRead(second_platform_handle.get(), &c, 1, &n));
|
| + EXPECT_EQ(1u, n);
|
| + EXPECT_EQ('?', c);
|
| +
|
| + n = 0;
|
| + EXPECT_TRUE(
|
| + mojo::test::BlockingWrite(second_platform_handle.get(), "!", 1, &n));
|
| + EXPECT_EQ(1u, n);
|
| + }
|
| +
|
| + EXPECT_TRUE(test::Shutdown());
|
| +}
|
| +
|
| // The sequence of messages sent is:
|
| // server_mp client_mp mp0 mp1 mp2 mp3
|
| // 1. "hello"
|
|
|