1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef IPC_IPC_TEST_BASE_H_ 6*6777b538SAndroid Build Coastguard Worker #define IPC_IPC_TEST_BASE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <memory> 9*6777b538SAndroid Build Coastguard Worker #include <string> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/process/process.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/test/multiprocess_test.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h" 14*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 15*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel.h" 16*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel_factory.h" 17*6777b538SAndroid Build Coastguard Worker #include "ipc/ipc_channel_proxy.h" 18*6777b538SAndroid Build Coastguard Worker #include "mojo/core/test/mojo_test_base.h" 19*6777b538SAndroid Build Coastguard Worker #include "mojo/core/test/multiprocess_test_helper.h" 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker class IPCChannelMojoTestBase : public testing::Test { 22*6777b538SAndroid Build Coastguard Worker public: 23*6777b538SAndroid Build Coastguard Worker IPCChannelMojoTestBase(); 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker IPCChannelMojoTestBase(const IPCChannelMojoTestBase&) = delete; 26*6777b538SAndroid Build Coastguard Worker IPCChannelMojoTestBase& operator=(const IPCChannelMojoTestBase&) = delete; 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker ~IPCChannelMojoTestBase() override; 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker void Init(const std::string& test_client_name); 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker bool WaitForClientShutdown(); 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker void TearDown() override; 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker void CreateChannel(IPC::Listener* listener); 37*6777b538SAndroid Build Coastguard Worker 38*6777b538SAndroid Build Coastguard Worker bool ConnectChannel(); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker void DestroyChannel(); 41*6777b538SAndroid Build Coastguard Worker sender()42*6777b538SAndroid Build Coastguard Worker IPC::Sender* sender() { return channel(); } channel()43*6777b538SAndroid Build Coastguard Worker IPC::Channel* channel() { return channel_.get(); } client_process()44*6777b538SAndroid Build Coastguard Worker const base::Process& client_process() const { return helper_.test_child(); } 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker protected: 47*6777b538SAndroid Build Coastguard Worker mojo::ScopedMessagePipeHandle TakeHandle(); 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker private: 50*6777b538SAndroid Build Coastguard Worker base::test::SingleThreadTaskEnvironment task_environment_; 51*6777b538SAndroid Build Coastguard Worker 52*6777b538SAndroid Build Coastguard Worker mojo::ScopedMessagePipeHandle handle_; 53*6777b538SAndroid Build Coastguard Worker mojo::core::test::MultiprocessTestHelper helper_; 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker std::unique_ptr<IPC::Channel> channel_; 56*6777b538SAndroid Build Coastguard Worker }; 57*6777b538SAndroid Build Coastguard Worker 58*6777b538SAndroid Build Coastguard Worker class IpcChannelMojoTestClient { 59*6777b538SAndroid Build Coastguard Worker public: 60*6777b538SAndroid Build Coastguard Worker IpcChannelMojoTestClient(); 61*6777b538SAndroid Build Coastguard Worker ~IpcChannelMojoTestClient(); 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker void Init(mojo::ScopedMessagePipeHandle handle); 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker void Connect(IPC::Listener* listener); 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker void Close(); 68*6777b538SAndroid Build Coastguard Worker channel()69*6777b538SAndroid Build Coastguard Worker IPC::Channel* channel() const { return channel_.get(); } 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker private: 72*6777b538SAndroid Build Coastguard Worker base::test::SingleThreadTaskEnvironment task_environment_{ 73*6777b538SAndroid Build Coastguard Worker base::test::SingleThreadTaskEnvironment::MainThreadType::IO}; 74*6777b538SAndroid Build Coastguard Worker mojo::ScopedMessagePipeHandle handle_; 75*6777b538SAndroid Build Coastguard Worker std::unique_ptr<IPC::Channel> channel_; 76*6777b538SAndroid Build Coastguard Worker }; 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker // Use this to declare the client side for tests using IPCChannelMojoTestBase 79*6777b538SAndroid Build Coastguard Worker // when a custom test fixture class is required in the client. |test_base| must 80*6777b538SAndroid Build Coastguard Worker // be derived from IpcChannelMojoTestClient. 81*6777b538SAndroid Build Coastguard Worker #define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE(client_name, \ 82*6777b538SAndroid Build Coastguard Worker test_base) \ 83*6777b538SAndroid Build Coastguard Worker class client_name##_MainFixture : public test_base { \ 84*6777b538SAndroid Build Coastguard Worker public: \ 85*6777b538SAndroid Build Coastguard Worker void Main(); \ 86*6777b538SAndroid Build Coastguard Worker }; \ 87*6777b538SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN_WITH_SETUP( \ 88*6777b538SAndroid Build Coastguard Worker client_name##TestChildMain, \ 89*6777b538SAndroid Build Coastguard Worker ::mojo::core::test::MultiprocessTestHelper::ChildSetup) { \ 90*6777b538SAndroid Build Coastguard Worker client_name##_MainFixture test; \ 91*6777b538SAndroid Build Coastguard Worker test.Init( \ 92*6777b538SAndroid Build Coastguard Worker std::move(mojo::core::test::MultiprocessTestHelper::primordial_pipe)); \ 93*6777b538SAndroid Build Coastguard Worker test.Main(); \ 94*6777b538SAndroid Build Coastguard Worker return (::testing::Test::HasFatalFailure() || \ 95*6777b538SAndroid Build Coastguard Worker ::testing::Test::HasNonfatalFailure()) \ 96*6777b538SAndroid Build Coastguard Worker ? 1 \ 97*6777b538SAndroid Build Coastguard Worker : 0; \ 98*6777b538SAndroid Build Coastguard Worker } \ 99*6777b538SAndroid Build Coastguard Worker void client_name##_MainFixture::Main() 100*6777b538SAndroid Build Coastguard Worker 101*6777b538SAndroid Build Coastguard Worker // Use this to declare the client side for tests using IPCChannelMojoTestBase. 102*6777b538SAndroid Build Coastguard Worker #define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(client_name) \ 103*6777b538SAndroid Build Coastguard Worker DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE( \ 104*6777b538SAndroid Build Coastguard Worker client_name, IpcChannelMojoTestClient) 105*6777b538SAndroid Build Coastguard Worker 106*6777b538SAndroid Build Coastguard Worker #endif // IPC_IPC_TEST_BASE_H_ 107