Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(565)

Side by Side Diff: ipc/ipc_sync_channel_unittest.cc

Issue 8417054: Allow proxy channels to be created without initializing the underlying channel. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ipc/ipc_sync_channel.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 // Unit test for SyncChannel. 5 // Unit test for SyncChannel.
6 6
7 #include "ipc/ipc_sync_channel.h" 7 #include "ipc/ipc_sync_channel.h"
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 bool SendDouble(bool pump, bool succeed) { 113 bool SendDouble(bool pump, bool succeed) {
114 int answer = 0; 114 int answer = 0;
115 SyncMessage* msg = new SyncChannelTestMsg_Double(5, &answer); 115 SyncMessage* msg = new SyncChannelTestMsg_Double(5, &answer);
116 if (pump) 116 if (pump)
117 msg->EnableMessagePumping(); 117 msg->EnableMessagePumping();
118 bool result = Send(msg); 118 bool result = Send(msg);
119 DCHECK_EQ(result, succeed); 119 DCHECK_EQ(result, succeed);
120 DCHECK_EQ(answer, (succeed ? 10 : 0)); 120 DCHECK_EQ(answer, (succeed ? 10 : 0));
121 return result; 121 return result;
122 } 122 }
123 const std::string& channel_name() { return channel_name_; }
123 Channel::Mode mode() { return mode_; } 124 Channel::Mode mode() { return mode_; }
124 WaitableEvent* done_event() { return done_.get(); } 125 WaitableEvent* done_event() { return done_.get(); }
125 WaitableEvent* shutdown_event() { return &shutdown_event_; } 126 WaitableEvent* shutdown_event() { return &shutdown_event_; }
126 void ResetChannel() { channel_.reset(); } 127 void ResetChannel() { channel_.reset(); }
127 // Derived classes need to call this when they've completed their part of 128 // Derived classes need to call this when they've completed their part of
128 // the test. 129 // the test.
129 void Done() { done_->Signal(); } 130 void Done() { done_->Signal(); }
130 131
131 protected: 132 protected:
132 SyncChannel* channel() { return channel_.get(); } 133 SyncChannel* channel() { return channel_.get(); }
(...skipping 16 matching lines...) Expand all
149 int result; 150 int result;
150 OnDouble(in, &result); 151 OnDouble(in, &result);
151 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, result); 152 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, result);
152 Send(reply_msg); 153 Send(reply_msg);
153 } 154 }
154 155
155 virtual void OnNestedTestMsg(Message* reply_msg) { 156 virtual void OnNestedTestMsg(Message* reply_msg) {
156 NOTREACHED(); 157 NOTREACHED();
157 } 158 }
158 159
160 virtual SyncChannel* CreateChannel() {
161 return new SyncChannel(
162 channel_name_, mode_, this, ipc_thread_.message_loop_proxy(), true,
163 &shutdown_event_);
164 }
165
159 base::Thread* ListenerThread() { 166 base::Thread* ListenerThread() {
160 return overrided_thread_ ? overrided_thread_ : &listener_thread_; 167 return overrided_thread_ ? overrided_thread_ : &listener_thread_;
161 } 168 }
162 169
163 const base::Thread& ipc_thread() const { return ipc_thread_; } 170 const base::Thread& ipc_thread() const { return ipc_thread_; }
164 171
165 private: 172 private:
166 // Called on the listener thread to create the sync channel. 173 // Called on the listener thread to create the sync channel.
167 void OnStart() { 174 void OnStart() {
168 // Link ipc_thread_, listener_thread_ and channel_ altogether. 175 // Link ipc_thread_, listener_thread_ and channel_ altogether.
169 StartThread(&ipc_thread_, MessageLoop::TYPE_IO); 176 StartThread(&ipc_thread_, MessageLoop::TYPE_IO);
170 channel_.reset(new SyncChannel( 177 channel_.reset(CreateChannel());
171 channel_name_, mode_, this, ipc_thread_.message_loop_proxy(), true,
172 &shutdown_event_));
173 channel_created_->Signal(); 178 channel_created_->Signal();
174 Run(); 179 Run();
175 } 180 }
176 181
177 void OnListenerThreadShutdown1(WaitableEvent* listener_event, 182 void OnListenerThreadShutdown1(WaitableEvent* listener_event,
178 WaitableEvent* ipc_event) { 183 WaitableEvent* ipc_event) {
179 // SyncChannel needs to be destructed on the thread that it was created on. 184 // SyncChannel needs to be destructed on the thread that it was created on.
180 channel_.reset(); 185 channel_.reset();
181 186
182 MessageLoop::current()->RunAllPending(); 187 MessageLoop::current()->RunAllPending();
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 // Tests basic synchronous call 309 // Tests basic synchronous call
305 TEST_F(IPCSyncChannelTest, Simple) { 310 TEST_F(IPCSyncChannelTest, Simple) {
306 Simple(false); 311 Simple(false);
307 Simple(true); 312 Simple(true);
308 } 313 }
309 314
310 //----------------------------------------------------------------------------- 315 //-----------------------------------------------------------------------------
311 316
312 namespace { 317 namespace {
313 318
319 // Worker classes which override how the sync channel is created to use the
320 // two-step initialization (calling the lightweight constructor and then
321 // ChannelProxy::Init separately) process.
322 class TwoStepServer : public Worker {
323 public:
324 explicit TwoStepServer(bool create_pipe_now)
325 : Worker(Channel::MODE_SERVER, "simpler_server"),
326 create_pipe_now_(create_pipe_now) { }
327
328 void Run() {
329 SendAnswerToLife(false, base::kNoTimeout, true);
330 Done();
331 }
332
333 virtual SyncChannel* CreateChannel() {
334 SyncChannel* channel = new SyncChannel(
335 this, ipc_thread().message_loop_proxy(), shutdown_event());
336 channel->Init(channel_name(), mode(), create_pipe_now_);
337 return channel;
338 }
339
340 bool create_pipe_now_;
341 };
342
343 class TwoStepClient : public Worker {
344 public:
345 TwoStepClient(bool create_pipe_now)
346 : Worker(Channel::MODE_CLIENT, "simple_client"),
347 create_pipe_now_(create_pipe_now) { }
348
349 void OnAnswer(int* answer) {
350 *answer = 42;
351 Done();
352 }
353
354 virtual SyncChannel* CreateChannel() {
355 SyncChannel* channel = new SyncChannel(
356 this, ipc_thread().message_loop_proxy(), shutdown_event());
357 channel->Init(channel_name(), mode(), create_pipe_now_);
358 return channel;
359 }
360
361 bool create_pipe_now_;
362 };
363
364 void TwoStep(bool create_server_pipe_now, bool create_client_pipe_now) {
365 std::vector<Worker*> workers;
366 workers.push_back(new TwoStepServer(create_server_pipe_now));
367 workers.push_back(new TwoStepClient(create_client_pipe_now));
368 RunTest(workers);
369 }
370
371 } // namespace
372
373 // Tests basic two-step initialization, where you call the lightweight
374 // constructor then Init.
375 TEST_F(IPCSyncChannelTest, TwoStepInitialization) {
376 TwoStep(false, false);
377 TwoStep(false, true);
378 TwoStep(true, false);
379 TwoStep(true, true);
380 }
381
382
383 //-----------------------------------------------------------------------------
384
385 namespace {
386
314 class DelayClient : public Worker { 387 class DelayClient : public Worker {
315 public: 388 public:
316 DelayClient() : Worker(Channel::MODE_CLIENT, "delay_client") { } 389 DelayClient() : Worker(Channel::MODE_CLIENT, "delay_client") { }
317 390
318 void OnAnswerDelay(Message* reply_msg) { 391 void OnAnswerDelay(Message* reply_msg) {
319 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42); 392 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42);
320 Send(reply_msg); 393 Send(reply_msg);
321 Done(); 394 Done();
322 } 395 }
323 }; 396 };
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after
1263 std::vector<Worker*> workers; 1336 std::vector<Worker*> workers;
1264 workers.push_back(new NonRestrictedDispatchServer); 1337 workers.push_back(new NonRestrictedDispatchServer);
1265 workers.push_back(server); 1338 workers.push_back(server);
1266 workers.push_back( 1339 workers.push_back(
1267 new RestrictedDispatchClient(&sent_ping_event, server, &success)); 1340 new RestrictedDispatchClient(&sent_ping_event, server, &success));
1268 RunTest(workers); 1341 RunTest(workers);
1269 EXPECT_EQ(3, success); 1342 EXPECT_EQ(3, success);
1270 } 1343 }
1271 1344
1272 } // namespace IPC 1345 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/ipc_sync_channel.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698