| Index: ipc/ipc_perftest_support.cc
|
| diff --git a/ipc/ipc_perftests.cc b/ipc/ipc_perftest_support.cc
|
| similarity index 76%
|
| copy from ipc/ipc_perftests.cc
|
| copy to ipc/ipc_perftest_support.cc
|
| index 08a8d701eb61d2769de476bd0995370fd7f981c2..b82642044524f26811ffe6cff4cea92b74fba048 100644
|
| --- a/ipc/ipc_perftests.cc
|
| +++ b/ipc/ipc_perftest_support.cc
|
| @@ -2,7 +2,7 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "build/build_config.h"
|
| +#include "ipc/ipc_perftest_support.h"
|
|
|
| #include <algorithm>
|
| #include <string>
|
| @@ -16,21 +16,15 @@
|
| #include "base/test/test_io_thread.h"
|
| #include "base/threading/thread.h"
|
| #include "base/time/time.h"
|
| +#include "build/build_config.h"
|
| #include "ipc/ipc_channel.h"
|
| #include "ipc/ipc_channel_proxy.h"
|
| #include "ipc/ipc_descriptors.h"
|
| #include "ipc/ipc_message_utils.h"
|
| #include "ipc/ipc_sender.h"
|
| -#include "ipc/ipc_test_base.h"
|
| -
|
| -namespace {
|
|
|
| -// This test times the roundtrip IPC message cycle.
|
| -//
|
| -// TODO(brettw): Make this test run by default.
|
| -
|
| -class IPCChannelPerfTest : public IPCTestBase {
|
| -};
|
| +namespace IPC {
|
| +namespace test {
|
|
|
| // This class simply collects stats about abstract "events" (each of which has a
|
| // start time and an end time).
|
| @@ -79,7 +73,7 @@ class EventTimeTracker {
|
| // This channel listener just replies to all messages with the exact same
|
| // message. It assumes each message has one string parameter. When the string
|
| // "quit" is sent, it will exit.
|
| -class ChannelReflectorListener : public IPC::Listener {
|
| +class ChannelReflectorListener : public Listener {
|
| public:
|
| ChannelReflectorListener()
|
| : channel_(NULL),
|
| @@ -92,12 +86,12 @@ class ChannelReflectorListener : public IPC::Listener {
|
| latency_tracker_.ShowResults();
|
| }
|
|
|
| - void Init(IPC::Channel* channel) {
|
| + void Init(Channel* channel) {
|
| DCHECK(!channel_);
|
| channel_ = channel;
|
| }
|
|
|
| - virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
|
| + virtual bool OnMessageReceived(const Message& message) OVERRIDE {
|
| CHECK(channel_);
|
|
|
| PickleIterator iter(message);
|
| @@ -123,7 +117,7 @@ class ChannelReflectorListener : public IPC::Listener {
|
| base::TimeTicks::FromInternalValue(time_internal), now);
|
| }
|
|
|
| - IPC::Message* msg = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| + Message* msg = new Message(0, 2, Message::PRIORITY_NORMAL);
|
| msg->WriteInt64(base::TimeTicks::Now().ToInternalValue());
|
| msg->WriteInt(msgid);
|
| msg->WriteString(payload);
|
| @@ -132,11 +126,11 @@ class ChannelReflectorListener : public IPC::Listener {
|
| }
|
|
|
| private:
|
| - IPC::Channel* channel_;
|
| + Channel* channel_;
|
| EventTimeTracker latency_tracker_;
|
| };
|
|
|
| -class PerformanceChannelListener : public IPC::Listener {
|
| +class PerformanceChannelListener : public Listener {
|
| public:
|
| explicit PerformanceChannelListener(const std::string& label)
|
| : label_(label),
|
| @@ -152,7 +146,7 @@ class PerformanceChannelListener : public IPC::Listener {
|
| VLOG(1) << "Server listener down";
|
| }
|
|
|
| - void Init(IPC::Sender* sender) {
|
| + void Init(Sender* sender) {
|
| DCHECK(!sender_);
|
| sender_ = sender;
|
| }
|
| @@ -166,7 +160,7 @@ class PerformanceChannelListener : public IPC::Listener {
|
| payload_ = std::string(msg_size_, 'a');
|
| }
|
|
|
| - virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
|
| + virtual bool OnMessageReceived(const Message& message) OVERRIDE {
|
| CHECK(sender_);
|
|
|
| PickleIterator iter(message);
|
| @@ -206,7 +200,7 @@ class PerformanceChannelListener : public IPC::Listener {
|
| }
|
| }
|
|
|
| - IPC::Message* msg = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| + Message* msg = new Message(0, 2, Message::PRIORITY_NORMAL);
|
| msg->WriteInt64(base::TimeTicks::Now().ToInternalValue());
|
| msg->WriteInt(count_down_);
|
| msg->WriteString(payload_);
|
| @@ -216,7 +210,7 @@ class PerformanceChannelListener : public IPC::Listener {
|
|
|
| private:
|
| std::string label_;
|
| - IPC::Sender* sender_;
|
| + Sender* sender_;
|
| int msg_count_;
|
| size_t msg_size_;
|
|
|
| @@ -226,7 +220,21 @@ class PerformanceChannelListener : public IPC::Listener {
|
| scoped_ptr<base::PerfTimeLogger> perf_logger_;
|
| };
|
|
|
| -TEST_F(IPCChannelPerfTest, ChannelPingPong) {
|
| +std::vector<PingPongTestParams>
|
| +IPCChannelPerfTestBase::GetDefaultTestParams() {
|
| + // Test several sizes. We use 12^N for message size, and limit the message
|
| + // count to keep the test duration reasonable.
|
| + std::vector<PingPongTestParams> list;
|
| + list.push_back(PingPongTestParams(12, 50000));
|
| + list.push_back(PingPongTestParams(144, 50000));
|
| + list.push_back(PingPongTestParams(1728, 50000));
|
| + list.push_back(PingPongTestParams(20736, 12000));
|
| + list.push_back(PingPongTestParams(248832, 100));
|
| + return list;
|
| +}
|
| +
|
| +void IPCChannelPerfTestBase::RunTestChannelPingPong(
|
| + const std::vector<PingPongTestParams>& params) {
|
| Init("PerformanceClient");
|
|
|
| // Set up IPC channel and start client.
|
| @@ -236,17 +244,13 @@ TEST_F(IPCChannelPerfTest, ChannelPingPong) {
|
| ASSERT_TRUE(ConnectChannel());
|
| ASSERT_TRUE(StartClient());
|
|
|
| - // Test several sizes. We use 12^N for message size, and limit the message
|
| - // count to keep the test duration reasonable.
|
| - const size_t kMsgSize[5] = {12, 144, 1728, 20736, 248832};
|
| - const int kMessageCount[5] = {50000, 50000, 50000, 12000, 1000};
|
| -
|
| - for (size_t i = 0; i < 5; i++) {
|
| - listener.SetTestParams(kMessageCount[i], kMsgSize[i]);
|
| + for (size_t i = 0; i < params.size(); i++) {
|
| + listener.SetTestParams(params[i].message_count(),
|
| + params[i].message_size());
|
|
|
| // This initial message will kick-start the ping-pong of messages.
|
| - IPC::Message* message =
|
| - new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| + Message* message =
|
| + new Message(0, 2, Message::PRIORITY_NORMAL);
|
| message->WriteInt64(base::TimeTicks::Now().ToInternalValue());
|
| message->WriteInt(-1);
|
| message->WriteString("hello");
|
| @@ -257,7 +261,7 @@ TEST_F(IPCChannelPerfTest, ChannelPingPong) {
|
| }
|
|
|
| // Send quit message.
|
| - IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| + Message* message = new Message(0, 2, Message::PRIORITY_NORMAL);
|
| message->WriteInt64(base::TimeTicks::Now().ToInternalValue());
|
| message->WriteInt(-1);
|
| message->WriteString("quit");
|
| @@ -267,20 +271,8 @@ TEST_F(IPCChannelPerfTest, ChannelPingPong) {
|
| DestroyChannel();
|
| }
|
|
|
| -// This message loop bounces all messages back to the sender.
|
| -MULTIPROCESS_IPC_TEST_CLIENT_MAIN(PerformanceClient) {
|
| - base::MessageLoopForIO main_message_loop;
|
| - ChannelReflectorListener listener;
|
| - scoped_ptr<IPC::Channel> channel(IPC::Channel::CreateClient(
|
| - IPCTestBase::GetChannelName("PerformanceClient"), &listener));
|
| - listener.Init(channel.get());
|
| - CHECK(channel->Connect());
|
| -
|
| - base::MessageLoop::current()->Run();
|
| - return 0;
|
| -}
|
| -
|
| -TEST_F(IPCChannelPerfTest, ChannelProxyPingPong) {
|
| +void IPCChannelPerfTestBase::RunTestChannelProxyPingPong(
|
| + const std::vector<PingPongTestParams>& params) {
|
| InitWithCustomMessageLoop("PerformanceClient",
|
| make_scoped_ptr(new base::MessageLoop()));
|
|
|
| @@ -292,17 +284,13 @@ TEST_F(IPCChannelPerfTest, ChannelProxyPingPong) {
|
| listener.Init(channel_proxy());
|
| ASSERT_TRUE(StartClient());
|
|
|
| - // Test several sizes. We use 12^N for message size, and limit the message
|
| - // count to keep the test duration reasonable.
|
| - const size_t kMsgSize[5] = {12, 144, 1728, 20736, 248832};
|
| - const int kMessageCount[5] = {50000, 50000, 50000, 12000, 1000};
|
| -
|
| - for (size_t i = 0; i < 5; i++) {
|
| - listener.SetTestParams(kMessageCount[i], kMsgSize[i]);
|
| + for (size_t i = 0; i < params.size(); i++) {
|
| + listener.SetTestParams(params[i].message_count(),
|
| + params[i].message_size());
|
|
|
| // This initial message will kick-start the ping-pong of messages.
|
| - IPC::Message* message =
|
| - new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| + Message* message =
|
| + new Message(0, 2, Message::PRIORITY_NORMAL);
|
| message->WriteInt64(base::TimeTicks::Now().ToInternalValue());
|
| message->WriteInt(-1);
|
| message->WriteString("hello");
|
| @@ -313,7 +301,7 @@ TEST_F(IPCChannelPerfTest, ChannelProxyPingPong) {
|
| }
|
|
|
| // Send quit message.
|
| - IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
|
| + Message* message = new Message(0, 2, Message::PRIORITY_NORMAL);
|
| message->WriteInt64(base::TimeTicks::Now().ToInternalValue());
|
| message->WriteInt(-1);
|
| message->WriteString("quit");
|
| @@ -323,4 +311,32 @@ TEST_F(IPCChannelPerfTest, ChannelProxyPingPong) {
|
| DestroyChannelProxy();
|
| }
|
|
|
| -} // namespace
|
| +
|
| +PingPongTestClient::PingPongTestClient()
|
| + : listener_(new ChannelReflectorListener()) {
|
| +}
|
| +
|
| +PingPongTestClient::~PingPongTestClient() {
|
| +}
|
| +
|
| +scoped_ptr<Channel> PingPongTestClient::CreateChannel(
|
| + Listener* listener) {
|
| + return Channel::CreateClient(
|
| + IPCTestBase::GetChannelName("PerformanceClient"), listener);
|
| +}
|
| +
|
| +int PingPongTestClient::RunMain() {
|
| + scoped_ptr<Channel> channel = CreateChannel(listener_.get());
|
| + listener_->Init(channel.get());
|
| + CHECK(channel->Connect());
|
| +
|
| + base::MessageLoop::current()->Run();
|
| + return 0;
|
| +}
|
| +
|
| +scoped_refptr<base::TaskRunner> PingPongTestClient::task_runner() {
|
| + return main_message_loop_.message_loop_proxy();
|
| +}
|
| +
|
| +} // namespace test
|
| +} // namespace IPC
|
|
|