Index: ipc/ipc_perftests.cc |
diff --git a/ipc/ipc_perftests.cc b/ipc/ipc_perftests.cc |
index 3feabda9d106382a2774714a49c492ce7d54c8a3..dd08cf7b0e1625a16470287502a34c6fff91b788 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" |
@@ -137,8 +138,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 +152,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 +167,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 +184,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 +210,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 +226,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 +280,47 @@ MULTIPROCESS_IPC_TEST_CLIENT_MAIN(PerformanceClient) { |
return 0; |
} |
+TEST_F(IPCChannelPerfTest, ChannelProxyPingPong) { |
+ set_message_loop(make_scoped_ptr(new base::MessageLoop())); |
+ Init("PerformanceClient"); |
+ |
+ base::TestIOThread io_thread(base::TestIOThread::kAutoStart); |
+ |
+ // 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 |