| Index: ipc/ipc_channel_mojo_unittest.cc
|
| diff --git a/ipc/ipc_channel_mojo_unittest.cc b/ipc/ipc_channel_mojo_unittest.cc
|
| index eec011b77044926bf51dec26a6b7876144a4fade..e846c132bedc211ddea92863e47718753bafa938 100644
|
| --- a/ipc/ipc_channel_mojo_unittest.cc
|
| +++ b/ipc/ipc_channel_mojo_unittest.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include <stddef.h>
|
| #include <stdint.h>
|
| +
|
| #include <memory>
|
| #include <utility>
|
|
|
| @@ -17,6 +18,7 @@
|
| #include "base/pickle.h"
|
| #include "base/run_loop.h"
|
| #include "base/single_thread_task_runner.h"
|
| +#include "base/strings/stringprintf.h"
|
| #include "base/test/test_io_thread.h"
|
| #include "base/test/test_timeouts.h"
|
| #include "base/threading/thread.h"
|
| @@ -26,6 +28,7 @@
|
| #include "ipc/ipc_mojo_handle_attachment.h"
|
| #include "ipc/ipc_mojo_message_helper.h"
|
| #include "ipc/ipc_mojo_param_traits.h"
|
| +#include "ipc/ipc_test.mojom.h"
|
| #include "ipc/ipc_test_base.h"
|
| #include "ipc/ipc_test_channel_listener.h"
|
| #include "mojo/edk/test/mojo_test_base.h"
|
| @@ -60,6 +63,12 @@
|
|
|
| namespace {
|
|
|
| +void SendString(IPC::Sender* sender, const std::string& str) {
|
| + IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| + message->WriteString(str);
|
| + ASSERT_TRUE(sender->Send(message));
|
| +}
|
| +
|
| class ListenerThatExpectsOK : public IPC::Listener {
|
| public:
|
| ListenerThatExpectsOK() : received_ok_(false) {}
|
| @@ -83,12 +92,7 @@ class ListenerThatExpectsOK : public IPC::Listener {
|
| DCHECK(received_ok_);
|
| }
|
|
|
| - static void SendOK(IPC::Sender* sender) {
|
| - IPC::Message* message =
|
| - new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| - message->WriteString(std::string("OK"));
|
| - ASSERT_TRUE(sender->Send(message));
|
| - }
|
| + static void SendOK(IPC::Sender* sender) { SendString(sender, "OK"); }
|
|
|
| private:
|
| bool received_ok_;
|
| @@ -124,7 +128,7 @@ class ChannelClient {
|
|
|
| class IPCChannelMojoTest : public testing::Test {
|
| public:
|
| - IPCChannelMojoTest() : io_thread_(base::TestIOThread::Mode::kAutoStart) {}
|
| + IPCChannelMojoTest() {}
|
|
|
| void TearDown() override { base::RunLoop().RunUntilIdle(); }
|
|
|
| @@ -148,7 +152,6 @@ class IPCChannelMojoTest : public testing::Test {
|
|
|
| private:
|
| base::MessageLoop message_loop_;
|
| - base::TestIOThread io_thread_;
|
| mojo::edk::test::MultiprocessTestHelper helper_;
|
| mojo::ScopedMessagePipeHandle handle_;
|
| std::unique_ptr<IPC::Channel> channel_;
|
| @@ -582,6 +585,120 @@ DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendOkClient,
|
| Close();
|
| }
|
|
|
| +class ListenerWithSimpleAssociatedInterface
|
| + : public IPC::Listener,
|
| + public IPC::mojom::SimpleTestDriver {
|
| + public:
|
| + static const int kNumMessages;
|
| +
|
| + ListenerWithSimpleAssociatedInterface() : binding_(this) {}
|
| +
|
| + ~ListenerWithSimpleAssociatedInterface() override {}
|
| +
|
| + bool OnMessageReceived(const IPC::Message& message) override {
|
| + base::PickleIterator iter(message);
|
| + std::string should_be_expected;
|
| + EXPECT_TRUE(iter.ReadString(&should_be_expected));
|
| + EXPECT_EQ(should_be_expected, next_expected_string_);
|
| + num_messages_received_++;
|
| + return true;
|
| + }
|
| +
|
| + void OnChannelError() override {
|
| + DCHECK(received_quit_);
|
| + }
|
| +
|
| + void RegisterInterfaceFactory(IPC::Channel* channel) {
|
| + channel->GetAssociatedInterfaceSupport()->AddAssociatedInterface(
|
| + base::Bind(&ListenerWithSimpleAssociatedInterface::BindRequest,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + private:
|
| + // IPC::mojom::SimpleTestDriver:
|
| + void ExpectString(const mojo::String& str) override {
|
| + next_expected_string_ = str;
|
| + }
|
| +
|
| + void RequestQuit(const RequestQuitCallback& callback) override {
|
| + EXPECT_EQ(kNumMessages, num_messages_received_);
|
| + received_quit_ = true;
|
| + callback.Run();
|
| + base::MessageLoop::current()->QuitWhenIdle();
|
| + }
|
| +
|
| + void BindRequest(IPC::mojom::SimpleTestDriverAssociatedRequest request) {
|
| + DCHECK(!binding_.is_bound());
|
| + binding_.Bind(std::move(request));
|
| + }
|
| +
|
| + std::string next_expected_string_;
|
| + int num_messages_received_ = 0;
|
| + bool received_quit_ = false;
|
| +
|
| + mojo::AssociatedBinding<IPC::mojom::SimpleTestDriver> binding_;
|
| +};
|
| +
|
| +const int ListenerWithSimpleAssociatedInterface::kNumMessages = 1000;
|
| +
|
| +class ListenerSendingAssociatedMessages : public IPC::Listener {
|
| + public:
|
| + ListenerSendingAssociatedMessages() {}
|
| +
|
| + bool OnMessageReceived(const IPC::Message& message) override { return true; }
|
| +
|
| + void OnChannelConnected(int32_t peer_pid) override {
|
| + DCHECK(channel_);
|
| + channel_->GetAssociatedInterfaceSupport()->GetRemoteAssociatedInterface(
|
| + &driver_);
|
| +
|
| + // Send a bunch of interleaved messages, alternating between the associated
|
| + // interface and a legacy IPC::Message.
|
| + for (int i = 0; i < ListenerWithSimpleAssociatedInterface::kNumMessages;
|
| + ++i) {
|
| + std::string str = base::StringPrintf("Hello! %d", i);
|
| + driver_->ExpectString(str);
|
| + SendString(channel_, str);
|
| + }
|
| + driver_->RequestQuit(base::Bind(&OnQuitAck));
|
| + }
|
| +
|
| + void set_channel(IPC::Channel* channel) { channel_ = channel; }
|
| +
|
| + private:
|
| + static void OnQuitAck() { base::MessageLoop::current()->QuitWhenIdle(); }
|
| +
|
| + IPC::Channel* channel_ = nullptr;
|
| + IPC::mojom::SimpleTestDriverAssociatedPtr driver_;
|
| +};
|
| +
|
| +TEST_F(IPCChannelMojoTest, SimpleAssociatedInterface) {
|
| + InitWithMojo("SimpleAssociatedInterfaceClient");
|
| +
|
| + ListenerWithSimpleAssociatedInterface listener;
|
| + CreateChannel(&listener);
|
| + ASSERT_TRUE(ConnectChannel());
|
| +
|
| + listener.RegisterInterfaceFactory(channel());
|
| +
|
| + base::RunLoop().Run();
|
| + channel()->Close();
|
| +
|
| + EXPECT_TRUE(WaitForClientShutdown());
|
| + DestroyChannel();
|
| +}
|
| +
|
| +DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(SimpleAssociatedInterfaceClient,
|
| + ChannelClient) {
|
| + ListenerSendingAssociatedMessages listener;
|
| + Connect(&listener);
|
| + listener.set_channel(channel());
|
| +
|
| + base::RunLoop().Run();
|
| +
|
| + Close();
|
| +}
|
| +
|
| #if defined(OS_POSIX)
|
| class ListenerThatExpectsFile : public IPC::Listener {
|
| public:
|
| @@ -696,7 +813,7 @@ DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(
|
| Close();
|
| }
|
|
|
| -#endif
|
| +#endif // defined(OS_POSIX)
|
|
|
| #if defined(OS_LINUX)
|
|
|
|
|