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