Chromium Code Reviews| Index: mojo/edk/embedder/embedder_unittest.cc |
| diff --git a/mojo/edk/embedder/embedder_unittest.cc b/mojo/edk/embedder/embedder_unittest.cc |
| index 127a74f09571b6cac49a3f34cc89300508be4882..38809f5286c9db1ff8f181947d2624f405f09e1d 100644 |
| --- a/mojo/edk/embedder/embedder_unittest.cc |
| +++ b/mojo/edk/embedder/embedder_unittest.cc |
| @@ -10,6 +10,7 @@ |
| #include <utility> |
| +#include "base/base_paths.h" |
| #include "base/bind.h" |
| #include "base/command_line.h" |
| #include "base/files/file.h" |
| @@ -17,13 +18,18 @@ |
| #include "base/macros.h" |
| #include "base/memory/shared_memory.h" |
| #include "base/message_loop/message_loop.h" |
| +#include "base/path_service.h" |
| #include "base/process/process_handle.h" |
| +#include "base/run_loop.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/test/test_timeouts.h" |
| +#include "mojo/edk/embedder/named_platform_handle.h" |
| +#include "mojo/edk/embedder/named_platform_handle_utils.h" |
| #include "mojo/edk/embedder/platform_channel_pair.h" |
| #include "mojo/edk/embedder/test_embedder.h" |
| #include "mojo/edk/system/test_utils.h" |
| #include "mojo/edk/test/mojo_test_base.h" |
| +#include "mojo/edk/test/scoped_ipc_support.h" |
| #include "mojo/public/c/system/core.h" |
| #include "mojo/public/cpp/system/handle.h" |
| #include "mojo/public/cpp/system/message_pipe.h" |
| @@ -557,6 +563,92 @@ DEFINE_TEST_CLIENT_TEST_WITH_PIPE(MultiprocessMixMachAndFdsClient, EmbedderTest, |
| #endif // !defined(OS_IOS) |
| +NamedPlatformHandle GenerateChannelName() { |
| +#if defined(OS_POSIX) |
| + base::FilePath temp_dir; |
| + CHECK(base::PathService::Get(base::DIR_TEMP, &temp_dir)); |
| + return NamedPlatformHandle( |
| + temp_dir.AppendASCII(GenerateRandomToken()).value()); |
| +#else |
| + return NamedPlatformHandle(GenerateRandomToken()); |
| +#endif |
| +} |
| + |
| +TEST_F(EmbedderTest, ClosePendingPeerConnection) { |
| + NamedPlatformHandle named_handle = GenerateChannelName(); |
| + std::string peer_token = GenerateRandomToken(); |
| + ScopedMessagePipeHandle server_pipe = |
| + ConnectToPeerProcess(CreateServerHandle(named_handle), peer_token); |
| + ClosePeerConnection(peer_token); |
| + EXPECT_EQ(MOJO_RESULT_OK, |
| + Wait(server_pipe.get(), MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| + MOJO_DEADLINE_INDEFINITE, nullptr)); |
| + // Closing the physical pipe may take some time so ping-pong between the main |
| + // thread and the IO thread a few times. |
| + base::MessageLoop message_loop; |
| + for (size_t i = 0; i < 10; i++) { |
|
Ken Rockot(use gerrit already)
2016/11/03 05:02:52
This seems destined to be flaky. Can we not do thi
Sam McNally
2016/11/03 07:13:36
Done.
|
| + base::RunLoop run_loop; |
| + test::GetIoTaskRunner()->PostTaskAndReply( |
| + FROM_HERE, base::Bind(&base::DoNothing), run_loop.QuitClosure()); |
| + run_loop.Run(); |
| + } |
| + EXPECT_FALSE(CreateClientHandle(named_handle).is_valid()); |
| +} |
| + |
| +#if !defined(OS_IOS) |
| + |
| +TEST_F(EmbedderTest, ClosePipeToConnectedPeer) { |
| + set_launch_type(LaunchType::PEER); |
| + auto& controller = StartClient("ClosePipeToConnectedPeerClient"); |
| + MojoHandle server_mp = controller.pipe(); |
| + // 1. Write a message to |server_mp| (attaching nothing). |
| + WriteMessage(server_mp, "hello"); |
| + |
| + // 2. Read a message from |server_mp|. |
| + EXPECT_EQ("world!", ReadMessage(server_mp)); |
| + |
| + controller.ClosePeerConnection(); |
| + |
| + EXPECT_EQ(MOJO_RESULT_OK, MojoWait(server_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| + MOJO_DEADLINE_INDEFINITE, nullptr)); |
| + |
| + EXPECT_EQ(0, controller.WaitForShutdown()); |
| +} |
| + |
| +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ClosePipeToConnectedPeerClient, EmbedderTest, |
| + client_mp) { |
| + // 1. Read the first message from |client_mp|. |
| + EXPECT_EQ("hello", ReadMessage(client_mp)); |
| + |
| + // 2. Write a message to |client_mp| (attaching nothing). |
| + WriteMessage(client_mp, "world!"); |
| + |
| + ASSERT_EQ(MOJO_RESULT_OK, |
| + MojoWait(client_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| + MOJO_DEADLINE_INDEFINITE, nullptr)); |
| +} |
| + |
| +TEST_F(EmbedderTest, ClosePipeToConnectingPeer) { |
| + set_launch_type(LaunchType::PEER); |
| + auto& controller = StartClient("ClosePipeToConnectingPeerClient"); |
| + controller.ClosePeerConnection(); |
| + |
| + MojoHandle server_mp = controller.pipe(); |
| + |
| + EXPECT_EQ(MOJO_RESULT_OK, MojoWait(server_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| + MOJO_DEADLINE_INDEFINITE, nullptr)); |
| + |
| + EXPECT_EQ(0, controller.WaitForShutdown()); |
| +} |
| + |
| +DEFINE_TEST_CLIENT_TEST_WITH_PIPE(ClosePipeToConnectingPeerClient, EmbedderTest, |
| + client_mp) { |
| + ASSERT_EQ(MOJO_RESULT_OK, MojoWait(client_mp, MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| + MOJO_DEADLINE_INDEFINITE, nullptr)); |
| +} |
| + |
| +#endif // !defined(OS_IOS) |
| + |
| } // namespace |
| } // namespace edk |
| } // namespace mojo |