| Index: ipc/mojo/ipc_channel_mojo_unittest.cc
|
| diff --git a/ipc/mojo/ipc_channel_mojo_unittest.cc b/ipc/mojo/ipc_channel_mojo_unittest.cc
|
| index 662e75829694e0358e206cfaa01be2983c40321a..356d3b3acd110ab1835f89ca9849cd0ccdc8c4fa 100644
|
| --- a/ipc/mojo/ipc_channel_mojo_unittest.cc
|
| +++ b/ipc/mojo/ipc_channel_mojo_unittest.cc
|
| @@ -18,6 +18,7 @@
|
| #include "ipc/mojo/ipc_channel_mojo_host.h"
|
| #include "ipc/mojo/ipc_mojo_handle_attachment.h"
|
| #include "ipc/mojo/ipc_mojo_message_helper.h"
|
| +#include "ipc/mojo/ipc_mojo_param_traits.h"
|
| #include "ipc/mojo/scoped_ipc_support.h"
|
|
|
| #if defined(OS_POSIX)
|
| @@ -442,6 +443,120 @@ MULTIPROCESS_IPC_TEST_CLIENT_MAIN(IPCChannelMojoTestSendMessagePipeClient) {
|
| return 0;
|
| }
|
|
|
| +void ReadOK(mojo::MessagePipeHandle pipe) {
|
| + std::string should_be_ok("xx");
|
| + uint32_t num_bytes = static_cast<uint32_t>(should_be_ok.size());
|
| + CHECK_EQ(MOJO_RESULT_OK,
|
| + mojo::ReadMessageRaw(pipe, &should_be_ok[0], &num_bytes, nullptr,
|
| + nullptr, 0));
|
| + EXPECT_EQ(should_be_ok, std::string("OK"));
|
| +}
|
| +
|
| +void WriteOK(mojo::MessagePipeHandle pipe) {
|
| + std::string ok("OK");
|
| + CHECK_EQ(MOJO_RESULT_OK,
|
| + mojo::WriteMessageRaw(pipe, &ok[0], static_cast<uint32_t>(ok.size()),
|
| + nullptr, 0, 0));
|
| +}
|
| +
|
| +class ListenerThatExpectsMessagePipeUsingParamTrait : public IPC::Listener {
|
| + public:
|
| + explicit ListenerThatExpectsMessagePipeUsingParamTrait(bool receiving_valid)
|
| + : sender_(NULL), receiving_valid_(receiving_valid) {}
|
| +
|
| + ~ListenerThatExpectsMessagePipeUsingParamTrait() override {}
|
| +
|
| + bool OnMessageReceived(const IPC::Message& message) override {
|
| + PickleIterator iter(message);
|
| + mojo::MessagePipeHandle handle;
|
| + EXPECT_TRUE(IPC::ParamTraits<mojo::MessagePipeHandle>::Read(&message, &iter,
|
| + &handle));
|
| + EXPECT_EQ(handle.is_valid(), receiving_valid_);
|
| + if (receiving_valid_) {
|
| + ReadOK(handle);
|
| + MojoClose(handle.value());
|
| + }
|
| +
|
| + base::MessageLoop::current()->Quit();
|
| + ListenerThatExpectsOK::SendOK(sender_);
|
| + return true;
|
| + }
|
| +
|
| + void OnChannelError() override { NOTREACHED(); }
|
| + void set_sender(IPC::Sender* sender) { sender_ = sender; }
|
| +
|
| + private:
|
| + IPC::Sender* sender_;
|
| + bool receiving_valid_;
|
| +};
|
| +
|
| +void ParamTraitMessagePipeClient(bool receiving_valid_handle,
|
| + const char* channel_name) {
|
| + ListenerThatExpectsMessagePipeUsingParamTrait listener(
|
| + receiving_valid_handle);
|
| + ChannelClient client(&listener, channel_name);
|
| + client.Connect();
|
| + listener.set_sender(client.channel());
|
| +
|
| + base::MessageLoop::current()->Run();
|
| +
|
| + client.Close();
|
| +}
|
| +
|
| +TEST_F(IPCChannelMojoTest, ParamTraitValidMessagePipe) {
|
| + InitWithMojo("ParamTraitValidMessagePipeClient");
|
| +
|
| + ListenerThatExpectsOK listener;
|
| + CreateChannel(&listener);
|
| + ASSERT_TRUE(ConnectChannel());
|
| + ASSERT_TRUE(StartClient());
|
| +
|
| + TestingMessagePipe pipe;
|
| +
|
| + scoped_ptr<IPC::Message> message(new IPC::Message());
|
| + IPC::ParamTraits<mojo::MessagePipeHandle>::Write(message.get(),
|
| + pipe.peer.release());
|
| + WriteOK(pipe.self.get());
|
| +
|
| + this->channel()->Send(message.release());
|
| + base::MessageLoop::current()->Run();
|
| + this->channel()->Close();
|
| +
|
| + EXPECT_TRUE(WaitForClientShutdown());
|
| + DestroyChannel();
|
| +}
|
| +
|
| +MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ParamTraitValidMessagePipeClient) {
|
| + ParamTraitMessagePipeClient(true, "ParamTraitValidMessagePipeClient");
|
| + return 0;
|
| +}
|
| +
|
| +TEST_F(IPCChannelMojoTest, ParamTraitInvalidMessagePipe) {
|
| + InitWithMojo("ParamTraitInvalidMessagePipeClient");
|
| +
|
| + ListenerThatExpectsOK listener;
|
| + CreateChannel(&listener);
|
| + ASSERT_TRUE(ConnectChannel());
|
| + ASSERT_TRUE(StartClient());
|
| +
|
| + mojo::MessagePipeHandle invalid_handle;
|
| + scoped_ptr<IPC::Message> message(new IPC::Message());
|
| + IPC::ParamTraits<mojo::MessagePipeHandle>::Write(message.get(),
|
| + invalid_handle);
|
| +
|
| + this->channel()->Send(message.release());
|
| + base::MessageLoop::current()->Run();
|
| + this->channel()->Close();
|
| +
|
| + EXPECT_TRUE(WaitForClientShutdown());
|
| + DestroyChannel();
|
| +}
|
| +
|
| +MULTIPROCESS_IPC_TEST_CLIENT_MAIN(ParamTraitInvalidMessagePipeClient) {
|
| + ParamTraitMessagePipeClient(false, "ParamTraitInvalidMessagePipeClient");
|
| + return 0;
|
| +}
|
| +
|
| #if defined(OS_WIN)
|
| class IPCChannelMojoDeadHandleTest : public IPCChannelMojoTestBase {
|
| protected:
|
|
|