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

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: ... 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
« ipc/ipc_sync_channel.cc ('K') | « 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 bool SendDouble(bool pump, bool succeed) { 112 bool SendDouble(bool pump, bool succeed) {
113 int answer = 0; 113 int answer = 0;
114 SyncMessage* msg = new SyncChannelTestMsg_Double(5, &answer); 114 SyncMessage* msg = new SyncChannelTestMsg_Double(5, &answer);
115 if (pump) 115 if (pump)
116 msg->EnableMessagePumping(); 116 msg->EnableMessagePumping();
117 bool result = Send(msg); 117 bool result = Send(msg);
118 DCHECK_EQ(result, succeed); 118 DCHECK_EQ(result, succeed);
119 DCHECK_EQ(answer, (succeed ? 10 : 0)); 119 DCHECK_EQ(answer, (succeed ? 10 : 0));
120 return result; 120 return result;
121 } 121 }
122 const std::string& channel_name() { return channel_name_; }
122 Channel::Mode mode() { return mode_; } 123 Channel::Mode mode() { return mode_; }
123 WaitableEvent* done_event() { return done_.get(); } 124 WaitableEvent* done_event() { return done_.get(); }
124 WaitableEvent* shutdown_event() { return &shutdown_event_; } 125 WaitableEvent* shutdown_event() { return &shutdown_event_; }
125 void ResetChannel() { channel_.reset(); } 126 void ResetChannel() { channel_.reset(); }
126 // Derived classes need to call this when they've completed their part of 127 // Derived classes need to call this when they've completed their part of
127 // the test. 128 // the test.
128 void Done() { done_->Signal(); } 129 void Done() { done_->Signal(); }
129 130
130 protected: 131 protected:
131 SyncChannel* channel() { return channel_.get(); } 132 SyncChannel* channel() { return channel_.get(); }
(...skipping 16 matching lines...) Expand all
148 int result; 149 int result;
149 OnDouble(in, &result); 150 OnDouble(in, &result);
150 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, result); 151 SyncChannelTestMsg_Double::WriteReplyParams(reply_msg, result);
151 Send(reply_msg); 152 Send(reply_msg);
152 } 153 }
153 154
154 virtual void OnNestedTestMsg(Message* reply_msg) { 155 virtual void OnNestedTestMsg(Message* reply_msg) {
155 NOTREACHED(); 156 NOTREACHED();
156 } 157 }
157 158
159 virtual SyncChannel* CreateChannel() {
160 return new SyncChannel(
161 channel_name_, mode_, this, ipc_thread_.message_loop_proxy(), true,
162 &shutdown_event_);
163 }
164
158 base::Thread* ListenerThread() { 165 base::Thread* ListenerThread() {
159 return overrided_thread_ ? overrided_thread_ : &listener_thread_; 166 return overrided_thread_ ? overrided_thread_ : &listener_thread_;
160 } 167 }
161 168
162 const base::Thread& ipc_thread() const { return ipc_thread_; } 169 const base::Thread& ipc_thread() const { return ipc_thread_; }
163 170
164 private: 171 private:
165 // Called on the listener thread to create the sync channel. 172 // Called on the listener thread to create the sync channel.
166 void OnStart() { 173 void OnStart() {
167 // Link ipc_thread_, listener_thread_ and channel_ altogether. 174 // Link ipc_thread_, listener_thread_ and channel_ altogether.
168 StartThread(&ipc_thread_, MessageLoop::TYPE_IO); 175 StartThread(&ipc_thread_, MessageLoop::TYPE_IO);
169 channel_.reset(new SyncChannel( 176 channel_.reset(CreateChannel());
170 channel_name_, mode_, this, ipc_thread_.message_loop_proxy(), true,
171 &shutdown_event_));
172 channel_created_->Signal(); 177 channel_created_->Signal();
173 Run(); 178 Run();
174 } 179 }
175 180
176 void OnListenerThreadShutdown1(WaitableEvent* listener_event, 181 void OnListenerThreadShutdown1(WaitableEvent* listener_event,
177 WaitableEvent* ipc_event) { 182 WaitableEvent* ipc_event) {
178 // SyncChannel needs to be destructed on the thread that it was created on. 183 // SyncChannel needs to be destructed on the thread that it was created on.
179 channel_.reset(); 184 channel_.reset();
180 185
181 MessageLoop::current()->RunAllPending(); 186 MessageLoop::current()->RunAllPending();
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 305
301 // Tests basic synchronous call 306 // Tests basic synchronous call
302 TEST_F(IPCSyncChannelTest, Simple) { 307 TEST_F(IPCSyncChannelTest, Simple) {
303 Simple(false); 308 Simple(false);
304 Simple(true); 309 Simple(true);
305 } 310 }
306 311
307 //----------------------------------------------------------------------------- 312 //-----------------------------------------------------------------------------
308 313
309 namespace { 314 namespace {
310 315
dmac 2011/11/04 22:30:44 could you add a more detailed comment for this set
kkania 2011/11/07 20:25:16 Done.
316 class TwoStepServer : public Worker {
317 public:
318 explicit TwoStepServer(bool create_pipe_now)
319 : Worker(Channel::MODE_SERVER, "simpler_server"),
320 create_pipe_now_(create_pipe_now) { }
321
322 void Run() {
323 SendAnswerToLife(false, base::kNoTimeout, true);
324 Done();
325 }
326
327 virtual SyncChannel* CreateChannel() {
328 SyncChannel* channel = new SyncChannel(
329 this, ipc_thread().message_loop_proxy(), shutdown_event());
330 channel->Init(channel_name(), mode(), create_pipe_now_);
331 return channel;
332 }
333
334 bool create_pipe_now_;
335 };
336
337 class TwoStepClient : public Worker {
338 public:
339 TwoStepClient(bool create_pipe_now)
340 : Worker(Channel::MODE_CLIENT, "simple_client"),
341 create_pipe_now_(create_pipe_now) { }
342
343 void OnAnswer(int* answer) {
344 *answer = 42;
345 Done();
346 }
347
348 virtual SyncChannel* CreateChannel() {
349 SyncChannel* channel = new SyncChannel(
350 this, ipc_thread().message_loop_proxy(), shutdown_event());
351 channel->Init(channel_name(), mode(), create_pipe_now_);
352 return channel;
353 }
354
355 bool create_pipe_now_;
356 };
357
358 void TwoStep(bool create_server_pipe_now, bool create_client_pipe_now) {
359 std::vector<Worker*> workers;
360 workers.push_back(new TwoStepServer(create_server_pipe_now));
361 workers.push_back(new TwoStepClient(create_client_pipe_now));
362 RunTest(workers);
363 }
364
365 } // namespace
366
367 // Tests basic two-step initialization, where you call constructor then Init.
368 TEST_F(IPCSyncChannelTest, TwoStepInitialization) {
369 TwoStep(false, false);
370 TwoStep(false, true);
371 TwoStep(true, false);
372 TwoStep(true, true);
373 }
374
375
376 //-----------------------------------------------------------------------------
377
378 namespace {
379
311 class DelayClient : public Worker { 380 class DelayClient : public Worker {
312 public: 381 public:
313 DelayClient() : Worker(Channel::MODE_CLIENT, "delay_client") { } 382 DelayClient() : Worker(Channel::MODE_CLIENT, "delay_client") { }
314 383
315 void OnAnswerDelay(Message* reply_msg) { 384 void OnAnswerDelay(Message* reply_msg) {
316 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42); 385 SyncChannelTestMsg_AnswerToLife::WriteReplyParams(reply_msg, 42);
317 Send(reply_msg); 386 Send(reply_msg);
318 Done(); 387 Done();
319 } 388 }
320 }; 389 };
(...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after
1257 std::vector<Worker*> workers; 1326 std::vector<Worker*> workers;
1258 workers.push_back(new NonRestrictedDispatchServer); 1327 workers.push_back(new NonRestrictedDispatchServer);
1259 workers.push_back(server); 1328 workers.push_back(server);
1260 workers.push_back( 1329 workers.push_back(
1261 new RestrictedDispatchClient(&sent_ping_event, server, &success)); 1330 new RestrictedDispatchClient(&sent_ping_event, server, &success));
1262 RunTest(workers); 1331 RunTest(workers);
1263 EXPECT_EQ(3, success); 1332 EXPECT_EQ(3, success);
1264 } 1333 }
1265 1334
1266 } // namespace IPC 1335 } // namespace IPC
OLDNEW
« ipc/ipc_sync_channel.cc ('K') | « ipc/ipc_sync_channel.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698