diff options
Diffstat (limited to 'ipc/mojo/ipc_channel_mojo_unittest.cc')
-rw-r--r-- | ipc/mojo/ipc_channel_mojo_unittest.cc | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/ipc/mojo/ipc_channel_mojo_unittest.cc b/ipc/mojo/ipc_channel_mojo_unittest.cc index 662e758..356d3b3 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: |