Commit 146d089c authored by Ken Rockot's avatar Ken Rockot Committed by Commit Bot

Fix and re-enable IPCMojoBootstrapTest.ReceiveEmptyMessage

Lets the test run longer (i.e. until the child actually closes its
Channel) before asserting that we receive a message from the child.

Bug: 821254
Change-Id: I629d994baf5655899dbd95177b997b97fd112e32
Reviewed-on: https://chromium-review.googlesource.com/981445
Commit-Queue: Ken Rockot <rockot@chromium.org>
Reviewed-by: default avatarWez <wez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#545972}
parent 6f013bd0
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/files/file.h" #include "base/files/file.h"
#include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/test/bind_test_util.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h" #include "build/build_config.h"
#include "ipc/ipc.mojom.h" #include "ipc/ipc.mojom.h"
...@@ -96,6 +97,12 @@ class PeerPidReceiver : public IPC::mojom::Channel { ...@@ -96,6 +97,12 @@ class PeerPidReceiver : public IPC::mojom::Channel {
int32_t peer_pid() const { return peer_pid_; } int32_t peer_pid() const { return peer_pid_; }
void RunUntilDisconnect() {
base::RunLoop run_loop;
binding_.set_connection_error_handler(run_loop.QuitClosure());
run_loop.Run();
}
private: private:
mojo::AssociatedBinding<IPC::mojom::Channel> binding_; mojo::AssociatedBinding<IPC::mojom::Channel> binding_;
const base::Closure on_peer_pid_set_; const base::Closure on_peer_pid_set_;
...@@ -130,52 +137,56 @@ TEST_F(IPCMojoBootstrapTest, Connect) { ...@@ -130,52 +137,56 @@ TEST_F(IPCMojoBootstrapTest, Connect) {
EXPECT_EQ(kTestClientPid, impl.peer_pid()); EXPECT_EQ(kTestClientPid, impl.peer_pid());
impl.RunUntilDisconnect();
EXPECT_TRUE(helper_.WaitForChildTestShutdown()); EXPECT_TRUE(helper_.WaitForChildTestShutdown());
} }
// TODO(https://crbug.com/821254): Fix this test and re-enable it. // A long running process that connects to us.
TEST_F(IPCMojoBootstrapTest, DISABLED_ReceiveEmptyMessage) { MULTIPROCESS_TEST_MAIN_WITH_SETUP(
IPCMojoBootstrapTestClientTestChildMain,
::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {
base::MessageLoop message_loop; base::MessageLoop message_loop;
Connection connection( Connection connection(
IPC::MojoBootstrap::Create( IPC::MojoBootstrap::Create(
helper_.StartChild("IPCMojoBootstrapTestEmptyMessage"), std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe),
IPC::Channel::MODE_SERVER, base::ThreadTaskRunnerHandle::Get(), IPC::Channel::MODE_CLIENT, base::ThreadTaskRunnerHandle::Get(),
base::ThreadTaskRunnerHandle::Get()), base::ThreadTaskRunnerHandle::Get()),
kTestServerPid); kTestClientPid);
IPC::mojom::ChannelAssociatedRequest receiver; IPC::mojom::ChannelAssociatedRequest receiver;
connection.TakeReceiver(&receiver); connection.TakeReceiver(&receiver);
base::RunLoop run_loop; base::RunLoop run_loop;
PeerPidReceiver impl(std::move(receiver), run_loop.QuitClosure(), PeerPidReceiver impl(std::move(receiver), run_loop.QuitClosure());
PeerPidReceiver::MessageExpectation::kExpectedInvalid);
run_loop.Run(); run_loop.Run();
EXPECT_TRUE(helper_.WaitForChildTestShutdown()); EXPECT_EQ(kTestServerPid, impl.peer_pid());
return 0;
} }
// A long running process that connects to us. TEST_F(IPCMojoBootstrapTest, ReceiveEmptyMessage) {
MULTIPROCESS_TEST_MAIN_WITH_SETUP(
IPCMojoBootstrapTestClientTestChildMain,
::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {
base::MessageLoop message_loop; base::MessageLoop message_loop;
Connection connection( Connection connection(
IPC::MojoBootstrap::Create( IPC::MojoBootstrap::Create(
std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe), helper_.StartChild("IPCMojoBootstrapTestEmptyMessage"),
IPC::Channel::MODE_CLIENT, base::ThreadTaskRunnerHandle::Get(), IPC::Channel::MODE_SERVER, base::ThreadTaskRunnerHandle::Get(),
base::ThreadTaskRunnerHandle::Get()), base::ThreadTaskRunnerHandle::Get()),
kTestClientPid); kTestServerPid);
IPC::mojom::ChannelAssociatedRequest receiver; IPC::mojom::ChannelAssociatedRequest receiver;
connection.TakeReceiver(&receiver); connection.TakeReceiver(&receiver);
base::RunLoop run_loop; base::RunLoop run_loop;
PeerPidReceiver impl(std::move(receiver), run_loop.QuitClosure()); PeerPidReceiver impl(std::move(receiver), run_loop.QuitClosure(),
PeerPidReceiver::MessageExpectation::kExpectedInvalid);
run_loop.Run(); run_loop.Run();
EXPECT_EQ(kTestServerPid, impl.peer_pid()); // Wait for the Channel to be disconnected so we can reasonably assert that
// the child's empty message must have been received before we pass the test.
impl.RunUntilDisconnect();
return 0; EXPECT_TRUE(helper_.WaitForChildTestShutdown());
} }
// A long running process that connects to us. // A long running process that connects to us.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment