Chromium Code Reviews| Index: ipc/ipc_perftests.cc |
| diff --git a/ipc/ipc_perftests.cc b/ipc/ipc_perftests.cc |
| index 3feabda9d106382a2774714a49c492ce7d54c8a3..b51f29041bf75f5d358d6544bc03e16b49f56183 100644 |
| --- a/ipc/ipc_perftests.cc |
| +++ b/ipc/ipc_perftests.cc |
| @@ -13,6 +13,7 @@ |
| #include "base/pickle.h" |
| #include "base/strings/stringprintf.h" |
| #include "base/test/perf_time_logger.h" |
| +#include "base/test/test_io_thread.h" |
| #include "base/threading/thread.h" |
| #include "base/time/time.h" |
| #include "ipc/ipc_channel.h" |
| @@ -29,6 +30,10 @@ namespace { |
| // TODO(brettw): Make this test run by default. |
| class IPCChannelPerfTest : public IPCTestBase { |
| + public: |
| + virtual scoped_ptr<base::MessageLoop> CreateMessageLoop() OVERRIDE { |
| + return make_scoped_ptr(new base::MessageLoop()); |
|
viettrungluu
2014/08/27 16:47:18
nit: Same nit as below.
|
| + } |
| }; |
| // This class simply collects stats about abstract "events" (each of which has a |
| @@ -137,8 +142,9 @@ class ChannelReflectorListener : public IPC::Listener { |
| class PerformanceChannelListener : public IPC::Listener { |
| public: |
| - PerformanceChannelListener() |
| - : channel_(NULL), |
| + explicit PerformanceChannelListener(const std::string& label) |
| + : label_(label), |
| + sender_(NULL), |
| msg_count_(0), |
| msg_size_(0), |
| count_down_(0), |
| @@ -150,9 +156,9 @@ class PerformanceChannelListener : public IPC::Listener { |
| VLOG(1) << "Server listener down"; |
| } |
| - void Init(IPC::Channel* channel) { |
| - DCHECK(!channel_); |
| - channel_ = channel; |
| + void Init(IPC::Sender* sender) { |
| + DCHECK(!sender_); |
| + sender_ = sender; |
| } |
| // Call this before running the message loop. |
| @@ -165,7 +171,7 @@ class PerformanceChannelListener : public IPC::Listener { |
| } |
| virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { |
| - CHECK(channel_); |
| + CHECK(sender_); |
| PickleIterator iter(message); |
| int64 time_internal; |
| @@ -182,8 +188,11 @@ class PerformanceChannelListener : public IPC::Listener { |
| // Start timing on hello. |
| latency_tracker_.Reset(); |
| DCHECK(!perf_logger_.get()); |
| - std::string test_name = base::StringPrintf( |
| - "IPC_Perf_%dx_%u", msg_count_, static_cast<unsigned>(msg_size_)); |
| + std::string test_name = |
| + base::StringPrintf("IPC_%s_Perf_%dx_%u", |
| + label_.c_str(), |
| + msg_count_, |
| + static_cast<unsigned>(msg_size_)); |
| perf_logger_.reset(new base::PerfTimeLogger(test_name.c_str())); |
| } else { |
| DCHECK_EQ(payload_.size(), reflected_payload.size()); |
| @@ -205,12 +214,13 @@ class PerformanceChannelListener : public IPC::Listener { |
| msg->WriteInt64(base::TimeTicks::Now().ToInternalValue()); |
| msg->WriteInt(count_down_); |
| msg->WriteString(payload_); |
| - channel_->Send(msg); |
| + sender_->Send(msg); |
| return true; |
| } |
| private: |
| - IPC::Channel* channel_; |
| + std::string label_; |
| + IPC::Sender* sender_; |
| int msg_count_; |
| size_t msg_size_; |
| @@ -220,11 +230,11 @@ class PerformanceChannelListener : public IPC::Listener { |
| scoped_ptr<base::PerfTimeLogger> perf_logger_; |
| }; |
| -TEST_F(IPCChannelPerfTest, Performance) { |
| +TEST_F(IPCChannelPerfTest, ChannelPingPong) { |
| Init("PerformanceClient"); |
| // Set up IPC channel and start client. |
| - PerformanceChannelListener listener; |
| + PerformanceChannelListener listener("Channel"); |
| CreateChannel(&listener); |
| listener.Init(channel()); |
| ASSERT_TRUE(ConnectChannel()); |
| @@ -274,4 +284,46 @@ MULTIPROCESS_IPC_TEST_CLIENT_MAIN(PerformanceClient) { |
| return 0; |
| } |
| +TEST_F(IPCChannelPerfTest, ChannelProxyPingPong) { |
| + Init("PerformanceClient"); |
| + |
| + base::TestIOThread io_thread((base::TestIOThread::kAutoStart)); |
|
viettrungluu
2014/08/27 16:47:18
nit: I don't think there's any need for the extra
Hajime Morrita
2014/08/27 17:47:43
Done.
|
| + |
| + // Set up IPC channel and start client. |
| + PerformanceChannelListener listener("ChannelProxy"); |
| + CreateChannelProxy(&listener, io_thread.task_runner()); |
| + 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]); |
| + |
| + // This initial message will kick-start the ping-pong of messages. |
| + IPC::Message* message = |
| + new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); |
| + message->WriteInt64(base::TimeTicks::Now().ToInternalValue()); |
| + message->WriteInt(-1); |
| + message->WriteString("hello"); |
| + sender()->Send(message); |
| + |
| + // Run message loop. |
| + base::MessageLoop::current()->Run(); |
| + } |
| + |
| + // Send quit message. |
| + IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); |
| + message->WriteInt64(base::TimeTicks::Now().ToInternalValue()); |
| + message->WriteInt(-1); |
| + message->WriteString("quit"); |
| + sender()->Send(message); |
| + |
| + EXPECT_TRUE(WaitForClientShutdown()); |
| + DestroyChannelProxy(); |
| +} |
| + |
| } // namespace |