OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "build/build_config.h" | 5 #include "build/build_config.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <windows.h> | 8 #include <windows.h> |
9 #elif defined(OS_POSIX) | 9 #elif defined(OS_POSIX) |
10 #include <sys/types.h> | 10 #include <sys/types.h> |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 base::TimeDelta max_duration_; | 81 base::TimeDelta max_duration_; |
82 | 82 |
83 DISALLOW_COPY_AND_ASSIGN(EventTimeTracker); | 83 DISALLOW_COPY_AND_ASSIGN(EventTimeTracker); |
84 }; | 84 }; |
85 | 85 |
86 // This channel listener just replies to all messages with the exact same | 86 // This channel listener just replies to all messages with the exact same |
87 // message. It assumes each message has one string parameter. When the string | 87 // message. It assumes each message has one string parameter. When the string |
88 // "quit" is sent, it will exit. | 88 // "quit" is sent, it will exit. |
89 class ChannelReflectorListener : public IPC::Listener { | 89 class ChannelReflectorListener : public IPC::Listener { |
90 public: | 90 public: |
91 explicit ChannelReflectorListener(IPC::Channel* channel) | 91 ChannelReflectorListener() |
92 : channel_(channel), | 92 : channel_(NULL), |
93 latency_tracker_("Client messages") { | 93 latency_tracker_("Client messages") { |
94 VLOG(1) << "Client listener up"; | 94 VLOG(1) << "Client listener up"; |
95 } | 95 } |
96 | 96 |
97 ~ChannelReflectorListener() { | 97 ~ChannelReflectorListener() { |
98 VLOG(1) << "Client listener down"; | 98 VLOG(1) << "Client listener down"; |
99 latency_tracker_.ShowResults(); | 99 latency_tracker_.ShowResults(); |
100 } | 100 } |
101 | 101 |
| 102 void Init(IPC::Channel* channel) { |
| 103 DCHECK(!channel_); |
| 104 channel_ = channel; |
| 105 } |
| 106 |
102 virtual bool OnMessageReceived(const IPC::Message& message) { | 107 virtual bool OnMessageReceived(const IPC::Message& message) { |
| 108 CHECK(channel_); |
| 109 |
103 PickleIterator iter(message); | 110 PickleIterator iter(message); |
104 int64 time_internal; | 111 int64 time_internal; |
105 EXPECT_TRUE(iter.ReadInt64(&time_internal)); | 112 EXPECT_TRUE(iter.ReadInt64(&time_internal)); |
106 int msgid; | 113 int msgid; |
107 EXPECT_TRUE(iter.ReadInt(&msgid)); | 114 EXPECT_TRUE(iter.ReadInt(&msgid)); |
108 std::string payload; | 115 std::string payload; |
109 EXPECT_TRUE(iter.ReadString(&payload)); | 116 EXPECT_TRUE(iter.ReadString(&payload)); |
110 | 117 |
111 // Include message deserialization in latency. | 118 // Include message deserialization in latency. |
112 base::TimeTicks now = base::TimeTicks::Now(); | 119 base::TimeTicks now = base::TimeTicks::Now(); |
(...skipping 18 matching lines...) Expand all Loading... |
131 return true; | 138 return true; |
132 } | 139 } |
133 | 140 |
134 private: | 141 private: |
135 IPC::Channel* channel_; | 142 IPC::Channel* channel_; |
136 EventTimeTracker latency_tracker_; | 143 EventTimeTracker latency_tracker_; |
137 }; | 144 }; |
138 | 145 |
139 class ChannelPerfListener : public IPC::Listener { | 146 class ChannelPerfListener : public IPC::Listener { |
140 public: | 147 public: |
141 ChannelPerfListener(IPC::Channel* channel) | 148 ChannelPerfListener() |
142 : channel_(channel), | 149 : channel_(NULL), |
143 msg_count_(0), | 150 msg_count_(0), |
144 msg_size_(0), | 151 msg_size_(0), |
145 count_down_(0), | 152 count_down_(0), |
146 latency_tracker_("Server messages") { | 153 latency_tracker_("Server messages") { |
147 VLOG(1) << "Server listener up"; | 154 VLOG(1) << "Server listener up"; |
148 } | 155 } |
149 | 156 |
150 ~ChannelPerfListener() { | 157 ~ChannelPerfListener() { |
151 VLOG(1) << "Server listener down"; | 158 VLOG(1) << "Server listener down"; |
152 } | 159 } |
153 | 160 |
| 161 void Init(IPC::Channel* channel) { |
| 162 DCHECK(!channel_); |
| 163 channel_ = channel; |
| 164 } |
| 165 |
154 // Call this before running the message loop. | 166 // Call this before running the message loop. |
155 void SetTestParams(int msg_count, size_t msg_size) { | 167 void SetTestParams(int msg_count, size_t msg_size) { |
156 DCHECK_EQ(0, count_down_); | 168 DCHECK_EQ(0, count_down_); |
157 msg_count_ = msg_count; | 169 msg_count_ = msg_count; |
158 msg_size_ = msg_size; | 170 msg_size_ = msg_size; |
159 count_down_ = msg_count_; | 171 count_down_ = msg_count_; |
160 payload_ = std::string(msg_size_, 'a'); | 172 payload_ = std::string(msg_size_, 'a'); |
161 } | 173 } |
162 | 174 |
163 virtual bool OnMessageReceived(const IPC::Message& message) { | 175 virtual bool OnMessageReceived(const IPC::Message& message) { |
| 176 CHECK(channel_); |
| 177 |
164 PickleIterator iter(message); | 178 PickleIterator iter(message); |
165 int64 time_internal; | 179 int64 time_internal; |
166 EXPECT_TRUE(iter.ReadInt64(&time_internal)); | 180 EXPECT_TRUE(iter.ReadInt64(&time_internal)); |
167 int msgid; | 181 int msgid; |
168 EXPECT_TRUE(iter.ReadInt(&msgid)); | 182 EXPECT_TRUE(iter.ReadInt(&msgid)); |
169 std::string reflected_payload; | 183 std::string reflected_payload; |
170 EXPECT_TRUE(iter.ReadString(&reflected_payload)); | 184 EXPECT_TRUE(iter.ReadString(&reflected_payload)); |
171 | 185 |
172 // Include message deserialization in latency. | 186 // Include message deserialization in latency. |
173 base::TimeTicks now = base::TimeTicks::Now(); | 187 base::TimeTicks now = base::TimeTicks::Now(); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 size_t msg_size_; | 223 size_t msg_size_; |
210 | 224 |
211 int count_down_; | 225 int count_down_; |
212 std::string payload_; | 226 std::string payload_; |
213 EventTimeTracker latency_tracker_; | 227 EventTimeTracker latency_tracker_; |
214 scoped_ptr<PerfTimeLogger> perf_logger_; | 228 scoped_ptr<PerfTimeLogger> perf_logger_; |
215 }; | 229 }; |
216 | 230 |
217 TEST_F(IPCChannelPerfTest, Performance) { | 231 TEST_F(IPCChannelPerfTest, Performance) { |
218 // Setup IPC channel. | 232 // Setup IPC channel. |
219 IPC::Channel chan(kReflectorChannel, IPC::Channel::MODE_SERVER, NULL); | 233 ChannelPerfListener perf_listener; |
220 ChannelPerfListener perf_listener(&chan); | 234 IPC::Channel chan(kReflectorChannel, IPC::Channel::MODE_SERVER, |
221 chan.set_listener(&perf_listener); | 235 &perf_listener); |
| 236 perf_listener.Init(&chan); |
222 ASSERT_TRUE(chan.Connect()); | 237 ASSERT_TRUE(chan.Connect()); |
223 | 238 |
224 base::ProcessHandle process_handle = SpawnChild(TEST_REFLECTOR, &chan); | 239 base::ProcessHandle process_handle = SpawnChild(TEST_REFLECTOR, &chan); |
225 ASSERT_TRUE(process_handle); | 240 ASSERT_TRUE(process_handle); |
226 | 241 |
227 const size_t kMsgSizeBase = 12; | 242 const size_t kMsgSizeBase = 12; |
228 const int kMsgSizeMaxExp = 5; | 243 const int kMsgSizeMaxExp = 5; |
229 int msg_count = 100000; | 244 int msg_count = 100000; |
230 size_t msg_size = kMsgSizeBase; | 245 size_t msg_size = kMsgSizeBase; |
231 for (int i = 1; i <= kMsgSizeMaxExp; i++) { | 246 for (int i = 1; i <= kMsgSizeMaxExp; i++) { |
(...skipping 22 matching lines...) Expand all Loading... |
254 | 269 |
255 // Clean up child process. | 270 // Clean up child process. |
256 EXPECT_TRUE(base::WaitForSingleProcess(process_handle, | 271 EXPECT_TRUE(base::WaitForSingleProcess(process_handle, |
257 base::TimeDelta::FromSeconds(5))); | 272 base::TimeDelta::FromSeconds(5))); |
258 base::CloseProcessHandle(process_handle); | 273 base::CloseProcessHandle(process_handle); |
259 } | 274 } |
260 | 275 |
261 // This message loop bounces all messages back to the sender. | 276 // This message loop bounces all messages back to the sender. |
262 MULTIPROCESS_IPC_TEST_MAIN(RunReflector) { | 277 MULTIPROCESS_IPC_TEST_MAIN(RunReflector) { |
263 MessageLoopForIO main_message_loop; | 278 MessageLoopForIO main_message_loop; |
264 IPC::Channel chan(kReflectorChannel, IPC::Channel::MODE_CLIENT, NULL); | 279 ChannelReflectorListener channel_reflector_listener; |
265 ChannelReflectorListener channel_reflector_listener(&chan); | 280 IPC::Channel chan(kReflectorChannel, IPC::Channel::MODE_CLIENT, |
266 chan.set_listener(&channel_reflector_listener); | 281 &channel_reflector_listener); |
| 282 channel_reflector_listener.Init(&chan); |
267 CHECK(chan.Connect()); | 283 CHECK(chan.Connect()); |
268 | 284 |
269 MessageLoop::current()->Run(); | 285 MessageLoop::current()->Run(); |
270 return 0; | 286 return 0; |
271 } | 287 } |
272 | 288 |
273 } // namespace | 289 } // namespace |
OLD | NEW |