| Index: mojo/public/cpp/bindings/tests/connector_unittest.cc
|
| diff --git a/mojo/public/cpp/bindings/tests/connector_unittest.cc b/mojo/public/cpp/bindings/tests/connector_unittest.cc
|
| index 96bb89fde55f9c21a0fa76e583f9791bde176a4c..6669764d0cd3dca165e65bec3f8e03e9b9176af8 100644
|
| --- a/mojo/public/cpp/bindings/tests/connector_unittest.cc
|
| +++ b/mojo/public/cpp/bindings/tests/connector_unittest.cc
|
| @@ -10,6 +10,7 @@
|
| #include <utility>
|
|
|
| #include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| #include "mojo/message_pump/message_pump_mojo.h"
|
| #include "mojo/public/cpp/bindings/lib/message_builder.h"
|
| #include "mojo/public/cpp/bindings/tests/message_queue.h"
|
| @@ -23,9 +24,14 @@ namespace {
|
| class MessageAccumulator : public MessageReceiver {
|
| public:
|
| MessageAccumulator() {}
|
| + explicit MessageAccumulator(const base::Closure& closure)
|
| + : closure_(closure) {}
|
|
|
| bool Accept(Message* message) override {
|
| queue_.Push(message);
|
| + if (!closure_.is_null())
|
| + closure_.Run();
|
| + closure_.Reset();
|
| return true;
|
| }
|
|
|
| @@ -33,8 +39,13 @@ class MessageAccumulator : public MessageReceiver {
|
|
|
| void Pop(Message* message) { queue_.Pop(message); }
|
|
|
| + void set_closure(const base::Closure& closure) {
|
| + closure_ = closure;
|
| + }
|
| +
|
| private:
|
| MessageQueue queue_;
|
| + base::Closure closure_;
|
| };
|
|
|
| class ConnectorDeletingMessageAccumulator : public MessageAccumulator {
|
| @@ -92,8 +103,6 @@ class ConnectorTest : public testing::Test {
|
| builder.message()->MoveTo(message);
|
| }
|
|
|
| - void PumpMessages() { loop_.RunUntilIdle(); }
|
| -
|
| protected:
|
| ScopedMessagePipeHandle handle0_;
|
| ScopedMessagePipeHandle handle1_;
|
| @@ -115,10 +124,11 @@ TEST_F(ConnectorTest, Basic) {
|
|
|
| connector0.Accept(&message);
|
|
|
| - MessageAccumulator accumulator;
|
| + base::RunLoop run_loop;
|
| + MessageAccumulator accumulator(run_loop.QuitClosure());
|
| connector1.set_incoming_receiver(&accumulator);
|
|
|
| - PumpMessages();
|
| + run_loop.Run();
|
|
|
| ASSERT_FALSE(accumulator.IsEmpty());
|
|
|
| @@ -164,7 +174,8 @@ TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) {
|
| internal::Connector connector1(std::move(handle1_),
|
| internal::Connector::SINGLE_THREADED_SEND);
|
|
|
| - MessageAccumulator accumulator;
|
| + base::RunLoop run_loop;
|
| + MessageAccumulator accumulator(run_loop.QuitClosure());
|
| connector1.set_incoming_receiver(&accumulator);
|
|
|
| const char kText[] = "hello world";
|
| @@ -174,7 +185,7 @@ TEST_F(ConnectorTest, Basic_EarlyIncomingReceiver) {
|
|
|
| connector0.Accept(&message);
|
|
|
| - PumpMessages();
|
| + run_loop.Run();
|
|
|
| ASSERT_FALSE(accumulator.IsEmpty());
|
|
|
| @@ -204,9 +215,12 @@ TEST_F(ConnectorTest, Basic_TwoMessages) {
|
| MessageAccumulator accumulator;
|
| connector1.set_incoming_receiver(&accumulator);
|
|
|
| - PumpMessages();
|
| -
|
| for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) {
|
| + if (accumulator.IsEmpty()) {
|
| + base::RunLoop run_loop;
|
| + accumulator.set_closure(run_loop.QuitClosure());
|
| + run_loop.Run();
|
| + }
|
| ASSERT_FALSE(accumulator.IsEmpty());
|
|
|
| Message message_received;
|
| @@ -273,7 +287,9 @@ TEST_F(ConnectorTest, WriteToClosedPipe) {
|
| EXPECT_FALSE(connector0.encountered_error());
|
|
|
| // Spin the message loop, and then we should start observing the closed pipe.
|
| - PumpMessages();
|
| + base::RunLoop run_loop;
|
| + connector0.set_connection_error_handler(run_loop.QuitClosure());
|
| + run_loop.Run();
|
|
|
| EXPECT_TRUE(connector0.encountered_error());
|
| }
|
| @@ -297,10 +313,11 @@ TEST_F(ConnectorTest, MessageWithHandles) {
|
| // The message should have been transferred, releasing the handles.
|
| EXPECT_TRUE(message1.handles()->empty());
|
|
|
| - MessageAccumulator accumulator;
|
| + base::RunLoop run_loop;
|
| + MessageAccumulator accumulator(run_loop.QuitClosure());
|
| connector1.set_incoming_receiver(&accumulator);
|
|
|
| - PumpMessages();
|
| + run_loop.Run();
|
|
|
| ASSERT_FALSE(accumulator.IsEmpty());
|
|
|
| @@ -329,12 +346,14 @@ TEST_F(ConnectorTest, MessageWithHandles) {
|
| AllocMessage(kText, &message2);
|
|
|
| connector_received.Accept(&message2);
|
| - connector_original.set_incoming_receiver(&accumulator);
|
| - PumpMessages();
|
| + base::RunLoop run_loop2;
|
| + MessageAccumulator accumulator2(run_loop2.QuitClosure());
|
| + connector_original.set_incoming_receiver(&accumulator2);
|
| + run_loop2.Run();
|
|
|
| - ASSERT_FALSE(accumulator.IsEmpty());
|
| + ASSERT_FALSE(accumulator2.IsEmpty());
|
|
|
| - accumulator.Pop(&message_received);
|
| + accumulator2.Pop(&message_received);
|
|
|
| EXPECT_EQ(
|
| std::string(kText),
|
| @@ -396,9 +415,12 @@ TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) {
|
| ReentrantMessageAccumulator accumulator(&connector1);
|
| connector1.set_incoming_receiver(&accumulator);
|
|
|
| - PumpMessages();
|
| -
|
| for (size_t i = 0; i < MOJO_ARRAYSIZE(kText); ++i) {
|
| + if (accumulator.IsEmpty()) {
|
| + base::RunLoop run_loop;
|
| + accumulator.set_closure(run_loop.QuitClosure());
|
| + run_loop.Run();
|
| + }
|
| ASSERT_FALSE(accumulator.IsEmpty());
|
|
|
| Message message_received;
|
| @@ -413,17 +435,24 @@ TEST_F(ConnectorTest, WaitForIncomingMessageWithReentrancy) {
|
| }
|
|
|
| TEST_F(ConnectorTest, RaiseError) {
|
| + base::RunLoop run_loop, run_loop2;
|
| internal::Connector connector0(std::move(handle0_),
|
| internal::Connector::SINGLE_THREADED_SEND);
|
| bool error_handler_called0 = false;
|
| connector0.set_connection_error_handler(
|
| - [&error_handler_called0]() { error_handler_called0 = true; });
|
| + [&error_handler_called0, &run_loop]() {
|
| + error_handler_called0 = true;
|
| + run_loop.Quit();
|
| + });
|
|
|
| internal::Connector connector1(std::move(handle1_),
|
| internal::Connector::SINGLE_THREADED_SEND);
|
| bool error_handler_called1 = false;
|
| connector1.set_connection_error_handler(
|
| - [&error_handler_called1]() { error_handler_called1 = true; });
|
| + [&error_handler_called1, &run_loop2]() {
|
| + error_handler_called1 = true;
|
| + run_loop2.Quit();
|
| + });
|
|
|
| const char kText[] = "hello world";
|
|
|
| @@ -433,10 +462,11 @@ TEST_F(ConnectorTest, RaiseError) {
|
| connector0.Accept(&message);
|
| connector0.RaiseError();
|
|
|
| - MessageAccumulator accumulator;
|
| + base::RunLoop run_loop3;
|
| + MessageAccumulator accumulator(run_loop3.QuitClosure());
|
| connector1.set_incoming_receiver(&accumulator);
|
|
|
| - PumpMessages();
|
| + run_loop3.Run();
|
|
|
| // Messages sent prior to RaiseError() still arrive at the other end.
|
| ASSERT_FALSE(accumulator.IsEmpty());
|
| @@ -448,7 +478,8 @@ TEST_F(ConnectorTest, RaiseError) {
|
| std::string(kText),
|
| std::string(reinterpret_cast<const char*>(message_received.payload())));
|
|
|
| - PumpMessages();
|
| + run_loop.Run();
|
| + run_loop2.Run();
|
|
|
| // Connection error handler is called at both sides.
|
| EXPECT_TRUE(error_handler_called0);
|
|
|