Home | History | Annotate | Download | only in mojo
      1 // Copyright 2014 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 "base/lazy_instance.h"
      6 #include "ipc/ipc_perftest_support.h"
      7 #include "ipc/mojo/ipc_channel_mojo.h"
      8 #include "ipc/mojo/ipc_channel_mojo_host.h"
      9 #include "mojo/embedder/test_embedder.h"
     10 
     11 namespace {
     12 
     13 // This is needed because we rely on //base/test:test_support_perf and
     14 // it provides main() which doesn't have Mojo initialization.  We need
     15 // some way to call InitWithSimplePlatformSupport() only once before
     16 // using Mojo.
     17 struct MojoInitialier {
     18   MojoInitialier() {
     19     mojo::embedder::test::InitWithSimplePlatformSupport();
     20   }
     21 };
     22 
     23 base::LazyInstance<MojoInitialier> g_mojo_initializer
     24     = LAZY_INSTANCE_INITIALIZER;
     25 
     26 class MojoChannelPerfTest : public IPC::test::IPCChannelPerfTestBase {
     27 public:
     28   typedef IPC::test::IPCChannelPerfTestBase Super;
     29 
     30   MojoChannelPerfTest();
     31 
     32   virtual scoped_ptr<IPC::ChannelFactory> CreateChannelFactory(
     33       const IPC::ChannelHandle& handle,
     34       base::TaskRunner* runner) OVERRIDE {
     35     host_.reset(new IPC::ChannelMojoHost(task_runner()));
     36     return IPC::ChannelMojo::CreateServerFactory(host_->channel_delegate(),
     37                                                  handle);
     38   }
     39 
     40   virtual bool DidStartClient() OVERRIDE {
     41     bool ok = IPCTestBase::DidStartClient();
     42     DCHECK(ok);
     43     host_->OnClientLaunched(client_process());
     44     return ok;
     45   }
     46 
     47   void set_io_thread_task_runner(base::TaskRunner* runner) {
     48     io_thread_task_runner_ = runner;
     49   }
     50 
     51  private:
     52   base::TaskRunner* io_thread_task_runner_;
     53   scoped_ptr<IPC::ChannelMojoHost> host_;
     54 };
     55 
     56 MojoChannelPerfTest::MojoChannelPerfTest()
     57     : io_thread_task_runner_() {
     58   g_mojo_initializer.Get();
     59 }
     60 
     61 
     62 TEST_F(MojoChannelPerfTest, ChannelPingPong) {
     63   RunTestChannelPingPong(GetDefaultTestParams());
     64 }
     65 
     66 TEST_F(MojoChannelPerfTest, ChannelProxyPingPong) {
     67   RunTestChannelProxyPingPong(GetDefaultTestParams());
     68 }
     69 
     70 class MojoTestClient : public IPC::test::PingPongTestClient {
     71  public:
     72   typedef IPC::test::PingPongTestClient SuperType;
     73 
     74   MojoTestClient();
     75 
     76   virtual scoped_ptr<IPC::Channel> CreateChannel(
     77       IPC::Listener* listener) OVERRIDE;
     78 };
     79 
     80 MojoTestClient::MojoTestClient() {
     81   g_mojo_initializer.Get();
     82 }
     83 
     84 scoped_ptr<IPC::Channel> MojoTestClient::CreateChannel(
     85     IPC::Listener* listener) {
     86   return scoped_ptr<IPC::Channel>(
     87       IPC::ChannelMojo::Create(NULL,
     88                                IPCTestBase::GetChannelName("PerformanceClient"),
     89                                IPC::Channel::MODE_CLIENT,
     90                                listener));
     91 }
     92 
     93 MULTIPROCESS_IPC_TEST_CLIENT_MAIN(PerformanceClient) {
     94   MojoTestClient client;
     95   return client.RunMain();
     96 }
     97 
     98 }  // namespace
     99