| Index: mojo/edk/system/multiprocess_message_pipe_unittest.cc
|
| diff --git a/mojo/edk/system/multiprocess_message_pipe_unittest.cc b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
|
| index 4d8380b2ea9c1a21eaa2c8a6949288f6868ea573..05309b03b58cef940f88a3ae45e8f6253005f39f 100644
|
| --- a/mojo/edk/system/multiprocess_message_pipe_unittest.cc
|
| +++ b/mojo/edk/system/multiprocess_message_pipe_unittest.cc
|
| @@ -409,7 +409,7 @@ MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) {
|
| std::string read_buffer(100, '\0');
|
| uint32_t num_bytes = static_cast<uint32_t>(read_buffer.size());
|
| DispatcherVector dispatchers;
|
| - uint32_t num_dispatchers = 10; // Maximum number to receive.
|
| + uint32_t num_dispatchers = 30; // Maximum number to receive.
|
| CHECK_EQ(mp->ReadMessage(0, UserPointer<void>(&read_buffer[0]),
|
| MakeUserPointer(&num_bytes), &dispatchers,
|
| &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE),
|
| @@ -417,35 +417,38 @@ MOJO_MULTIPROCESS_TEST_CHILD_MAIN(CheckPlatformHandleFile) {
|
| mp->Close(0);
|
|
|
| read_buffer.resize(num_bytes);
|
| - CHECK_EQ(read_buffer, std::string("hello"));
|
| - CHECK_EQ(num_dispatchers, 1u);
|
| -
|
| - CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::kTypePlatformHandle);
|
| -
|
| - scoped_refptr<PlatformHandleDispatcher> dispatcher(
|
| - static_cast<PlatformHandleDispatcher*>(dispatchers[0].get()));
|
| - embedder::ScopedPlatformHandle h = dispatcher->PassPlatformHandle().Pass();
|
| - CHECK(h.is_valid());
|
| - dispatcher->Close();
|
| -
|
| - base::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h.Pass(), "r"));
|
| - CHECK(fp);
|
| - std::string fread_buffer(100, '\0');
|
| - size_t bytes_read = fread(&fread_buffer[0], 1, fread_buffer.size(), fp.get());
|
| - fread_buffer.resize(bytes_read);
|
| - CHECK_EQ(fread_buffer, "world");
|
| + char hello[32];
|
| + int num_handles = 0;
|
| + sscanf(read_buffer.c_str(), "%s %d", hello, &num_handles);
|
| + CHECK_EQ(std::string("hello"), std::string(hello));
|
| + CHECK_GT(num_handles, 0);
|
| +
|
| + for (int i = 0; i < num_handles; ++i) {
|
| + CHECK_EQ(dispatchers[i]->GetType(), Dispatcher::kTypePlatformHandle);
|
| +
|
| + scoped_refptr<PlatformHandleDispatcher> dispatcher(
|
| + static_cast<PlatformHandleDispatcher*>(dispatchers[i].get()));
|
| + embedder::ScopedPlatformHandle h = dispatcher->PassPlatformHandle().Pass();
|
| + CHECK(h.is_valid());
|
| + dispatcher->Close();
|
| +
|
| + base::ScopedFILE fp(mojo::test::FILEFromPlatformHandle(h.Pass(), "r"));
|
| + CHECK(fp);
|
| + std::string fread_buffer(100, '\0');
|
| + size_t bytes_read =
|
| + fread(&fread_buffer[0], 1, fread_buffer.size(), fp.get());
|
| + fread_buffer.resize(bytes_read);
|
| + CHECK_EQ(fread_buffer, "world");
|
| + }
|
|
|
| return 0;
|
| }
|
|
|
| -#if defined(OS_POSIX) && !defined(OS_ANDROID)
|
| -#define MAYBE_PlatformHandlePassing PlatformHandlePassing
|
| -#else
|
| -// Not yet implemented (on Windows).
|
| -// Android multi-process tests are not executing the new process. This is flaky.
|
| -#define MAYBE_PlatformHandlePassing DISABLED_PlatformHandlePassing
|
| -#endif
|
| -TEST_F(MultiprocessMessagePipeTest, MAYBE_PlatformHandlePassing) {
|
| +class MultiprocessMessagePipeTestWithPipeCount
|
| + : public test::MultiprocessMessagePipeTestBase,
|
| + public testing::WithParamInterface<size_t> {};
|
| +
|
| +TEST_P(MultiprocessMessagePipeTestWithPipeCount, PlatformHandlePassing) {
|
| base::ScopedTempDir temp_dir;
|
| ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
|
|
|
| @@ -455,34 +458,42 @@ TEST_F(MultiprocessMessagePipeTest, MAYBE_PlatformHandlePassing) {
|
| scoped_refptr<MessagePipe> mp(MessagePipe::CreateLocalProxy(&ep));
|
| Init(ep);
|
|
|
| - base::FilePath unused;
|
| - base::ScopedFILE fp(
|
| - CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
|
| - const std::string world("world");
|
| - ASSERT_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size());
|
| - fflush(fp.get());
|
| - rewind(fp.get());
|
| -
|
| - embedder::ScopedPlatformHandle h(
|
| - mojo::test::PlatformHandleFromFILE(fp.Pass()));
|
| - scoped_refptr<PlatformHandleDispatcher> dispatcher(
|
| - new PlatformHandleDispatcher(h.Pass()));
|
| + std::vector<scoped_refptr<PlatformHandleDispatcher>> dispatchers;
|
| + std::vector<DispatcherTransport> transports;
|
|
|
| - const std::string hello("hello");
|
| - DispatcherTransport transport(
|
| - test::DispatcherTryStartTransport(dispatcher.get()));
|
| - ASSERT_TRUE(transport.is_valid());
|
| + size_t pipe_count = GetParam();
|
| + for (size_t i = 0; i < pipe_count; ++i) {
|
| + base::FilePath unused;
|
| + base::ScopedFILE fp(
|
| + CreateAndOpenTemporaryFileInDir(temp_dir.path(), &unused));
|
| + const std::string world("world");
|
| + CHECK_EQ(fwrite(&world[0], 1, world.size(), fp.get()), world.size());
|
| + fflush(fp.get());
|
| + rewind(fp.get());
|
| +
|
| + scoped_refptr<PlatformHandleDispatcher> dispatcher(
|
| + new PlatformHandleDispatcher(embedder::ScopedPlatformHandle(
|
| + mojo::test::PlatformHandleFromFILE(fp.Pass()))));
|
| + dispatchers.push_back(dispatcher);
|
| + DispatcherTransport transport(
|
| + test::DispatcherTryStartTransport(dispatcher.get()));
|
| + ASSERT_TRUE(transport.is_valid());
|
| + transports.push_back(transport);
|
| + }
|
|
|
| - std::vector<DispatcherTransport> transports;
|
| - transports.push_back(transport);
|
| + char message[128];
|
| + sprintf(message, "hello %d", static_cast<int>(pipe_count));
|
| EXPECT_EQ(MOJO_RESULT_OK,
|
| - mp->WriteMessage(0, UserPointer<const void>(&hello[0]),
|
| - static_cast<uint32_t>(hello.size()), &transports,
|
| - MOJO_WRITE_MESSAGE_FLAG_NONE));
|
| - transport.End();
|
| + mp->WriteMessage(0, UserPointer<const void>(message),
|
| + static_cast<uint32_t>(strlen(message)),
|
| + &transports, MOJO_WRITE_MESSAGE_FLAG_NONE));
|
|
|
| - EXPECT_TRUE(dispatcher->HasOneRef());
|
| - dispatcher = nullptr;
|
| + for (size_t i = 0; i < pipe_count; ++i) {
|
| + transports[i].End();
|
| + EXPECT_TRUE(dispatchers[i]->HasOneRef());
|
| + }
|
| +
|
| + dispatchers.clear();
|
|
|
| // Wait for it to become readable, which should fail.
|
| HandleSignalsState hss;
|
| @@ -496,6 +507,14 @@ TEST_F(MultiprocessMessagePipeTest, MAYBE_PlatformHandlePassing) {
|
| EXPECT_EQ(0, helper()->WaitForChildShutdown());
|
| }
|
|
|
| +// Not yet implemented (on Windows).
|
| +// Android multi-process tests are not executing the new process. This is flaky.
|
| +#if defined(OS_POSIX) and !defined(OS_ANDROID)
|
| +INSTANTIATE_TEST_CASE_P(PipeCount,
|
| + MultiprocessMessagePipeTestWithPipeCount,
|
| + testing::Values(1u, 10u, 25u));
|
| +#endif
|
| +
|
| } // namespace
|
| } // namespace system
|
| } // namespace mojo
|
|
|