xref: /aosp_15_r20/external/cronet/ipc/ipc_test_base.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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