You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
4.0 KiB
112 lines
4.0 KiB
// 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/core/test/mojo_test_base.h"
|
|
#include "mojo/core/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::core::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::core::test::MultiprocessTestHelper::ChildSetup) { \
|
|
client_name##_MainFixture test; \
|
|
test.Init( \
|
|
std::move(mojo::core::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_
|