|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef IPC_IPC_TEST_BASE_H_ | 
|  | #define IPC_IPC_TEST_BASE_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/macros.h" | 
|  | #include "base/message_loop/message_loop.h" | 
|  | #include "base/process/process.h" | 
|  | #include "base/test/multiprocess_test.h" | 
|  | #include "build/build_config.h" | 
|  | #include "ipc/ipc_channel.h" | 
|  | #include "ipc/ipc_channel_factory.h" | 
|  | #include "ipc/ipc_channel_proxy.h" | 
|  | #include "mojo/edk/test/mojo_test_base.h" | 
|  | #include "mojo/edk/test/multiprocess_test_helper.h" | 
|  |  | 
|  | namespace base { | 
|  | class MessageLoop; | 
|  | } | 
|  |  | 
|  | class IPCChannelMojoTestBase : public testing::Test { | 
|  | public: | 
|  | IPCChannelMojoTestBase(); | 
|  | ~IPCChannelMojoTestBase() override; | 
|  |  | 
|  | void Init(const std::string& test_client_name); | 
|  | void InitWithCustomMessageLoop( | 
|  | const std::string& test_client_name, | 
|  | std::unique_ptr<base::MessageLoop> message_loop); | 
|  |  | 
|  | bool WaitForClientShutdown(); | 
|  |  | 
|  | void TearDown() override; | 
|  |  | 
|  | void CreateChannel(IPC::Listener* listener); | 
|  |  | 
|  | bool ConnectChannel(); | 
|  |  | 
|  | void DestroyChannel(); | 
|  |  | 
|  | IPC::Sender* sender() { return channel(); } | 
|  | IPC::Channel* channel() { return channel_.get(); } | 
|  | const base::Process& client_process() const { return helper_.test_child(); } | 
|  |  | 
|  | protected: | 
|  | mojo::ScopedMessagePipeHandle TakeHandle(); | 
|  |  | 
|  | private: | 
|  | std::unique_ptr<base::MessageLoop> message_loop_; | 
|  |  | 
|  | mojo::ScopedMessagePipeHandle handle_; | 
|  | mojo::edk::test::MultiprocessTestHelper helper_; | 
|  |  | 
|  | std::unique_ptr<IPC::Channel> channel_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(IPCChannelMojoTestBase); | 
|  | }; | 
|  |  | 
|  | class IpcChannelMojoTestClient { | 
|  | public: | 
|  | IpcChannelMojoTestClient(); | 
|  | ~IpcChannelMojoTestClient(); | 
|  |  | 
|  | void Init(mojo::ScopedMessagePipeHandle handle); | 
|  |  | 
|  | void Connect(IPC::Listener* listener); | 
|  |  | 
|  | void Close(); | 
|  |  | 
|  | IPC::Channel* channel() const { return channel_.get(); } | 
|  |  | 
|  | private: | 
|  | base::MessageLoopForIO main_message_loop_; | 
|  | mojo::ScopedMessagePipeHandle handle_; | 
|  | std::unique_ptr<IPC::Channel> channel_; | 
|  | }; | 
|  |  | 
|  | // Use this to declare the client side for tests using IPCChannelMojoTestBase | 
|  | // when a custom test fixture class is required in the client. |test_base| must | 
|  | // be derived from IpcChannelMojoTestClient. | 
|  | #define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE(client_name,  \ | 
|  | test_base)    \ | 
|  | class client_name##_MainFixture : public test_base {                        \ | 
|  | public:                                                                    \ | 
|  | void Main();                                                              \ | 
|  | };                                                                          \ | 
|  | MULTIPROCESS_TEST_MAIN_WITH_SETUP(                                          \ | 
|  | client_name##TestChildMain,                                             \ | 
|  | ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) {                \ | 
|  | client_name##_MainFixture test;                                           \ | 
|  | test.Init(                                                                \ | 
|  | std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe)); \ | 
|  | test.Main();                                                              \ | 
|  | return (::testing::Test::HasFatalFailure() ||                             \ | 
|  | ::testing::Test::HasNonfatalFailure())                            \ | 
|  | ? 1                                                            \ | 
|  | : 0;                                                           \ | 
|  | }                                                                           \ | 
|  | void client_name##_MainFixture::Main() | 
|  |  | 
|  | // Use this to declare the client side for tests using IPCChannelMojoTestBase. | 
|  | #define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(client_name)   \ | 
|  | DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE( \ | 
|  | client_name, IpcChannelMojoTestClient) | 
|  |  | 
|  | #endif  // IPC_IPC_TEST_BASE_H_ |