Home | History | Annotate | Download | only in ipc
      1 // Copyright (c) 2012 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 #include "ipc/ipc_test_base.h"
      6 
      7 #include <utility>
      8 
      9 #include "base/memory/ptr_util.h"
     10 #include "base/run_loop.h"
     11 #include "base/single_thread_task_runner.h"
     12 #include "base/threading/thread_task_runner_handle.h"
     13 #include "build/build_config.h"
     14 #include "ipc/ipc_channel_mojo.h"
     15 
     16 IPCChannelMojoTestBase::IPCChannelMojoTestBase() = default;
     17 IPCChannelMojoTestBase::~IPCChannelMojoTestBase() = default;
     18 
     19 void IPCChannelMojoTestBase::Init(const std::string& test_client_name) {
     20   InitWithCustomMessageLoop(test_client_name,
     21                             std::make_unique<base::MessageLoop>());
     22 }
     23 
     24 void IPCChannelMojoTestBase::InitWithCustomMessageLoop(
     25     const std::string& test_client_name,
     26     std::unique_ptr<base::MessageLoop> message_loop) {
     27   handle_ = helper_.StartChild(test_client_name);
     28   message_loop_ = std::move(message_loop);
     29 }
     30 
     31 bool IPCChannelMojoTestBase::WaitForClientShutdown() {
     32   return helper_.WaitForChildTestShutdown();
     33 }
     34 
     35 void IPCChannelMojoTestBase::TearDown() {
     36   if (message_loop_)
     37     base::RunLoop().RunUntilIdle();
     38 }
     39 
     40 void IPCChannelMojoTestBase::CreateChannel(IPC::Listener* listener) {
     41   channel_ = IPC::ChannelMojo::Create(
     42       TakeHandle(), IPC::Channel::MODE_SERVER, listener,
     43       base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get());
     44 }
     45 
     46 bool IPCChannelMojoTestBase::ConnectChannel() {
     47   return channel_->Connect();
     48 }
     49 
     50 void IPCChannelMojoTestBase::DestroyChannel() {
     51   channel_.reset();
     52 }
     53 
     54 mojo::ScopedMessagePipeHandle IPCChannelMojoTestBase::TakeHandle() {
     55   return std::move(handle_);
     56 }
     57 
     58 IpcChannelMojoTestClient::IpcChannelMojoTestClient() = default;
     59 
     60 IpcChannelMojoTestClient::~IpcChannelMojoTestClient() = default;
     61 
     62 void IpcChannelMojoTestClient::Init(mojo::ScopedMessagePipeHandle handle) {
     63   handle_ = std::move(handle);
     64 }
     65 
     66 void IpcChannelMojoTestClient::Connect(IPC::Listener* listener) {
     67   channel_ = IPC::ChannelMojo::Create(
     68       std::move(handle_), IPC::Channel::MODE_CLIENT, listener,
     69       base::ThreadTaskRunnerHandle::Get(), base::ThreadTaskRunnerHandle::Get());
     70   CHECK(channel_->Connect());
     71 }
     72 
     73 void IpcChannelMojoTestClient::Close() {
     74   channel_->Close();
     75 
     76   base::RunLoop run_loop;
     77   base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
     78                                                 run_loop.QuitClosure());
     79   run_loop.Run();
     80 }
     81