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