OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "mojo/edk/system/ipc_support.h" | 5 #include "mojo/edk/system/ipc_support.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 26 matching lines...) Expand all Loading... |
37 using test::TestIOThread; | 37 using test::TestIOThread; |
38 | 38 |
39 namespace system { | 39 namespace system { |
40 namespace { | 40 namespace { |
41 | 41 |
42 const char kConnectionIdFlag[] = "test-connection-id"; | 42 const char kConnectionIdFlag[] = "test-connection-id"; |
43 | 43 |
44 // Tests writing a message (containing just data) to |write_mp| and then reading | 44 // Tests writing a message (containing just data) to |write_mp| and then reading |
45 // it from |read_mp| (it should be the next message, i.e., there should be no | 45 // it from |read_mp| (it should be the next message, i.e., there should be no |
46 // other messages already enqueued in that direction). | 46 // other messages already enqueued in that direction). |
47 void TestWriteReadMessage(scoped_refptr<MessagePipeDispatcher> write_mp, | 47 void TestWriteReadMessage(MessagePipeDispatcher* write_mp, |
48 scoped_refptr<MessagePipeDispatcher> read_mp) { | 48 MessagePipeDispatcher* read_mp) { |
49 // Set up waiting on the read end first (to avoid racing). | 49 // Set up waiting on the read end first (to avoid racing). |
50 Waiter waiter; | 50 Waiter waiter; |
51 waiter.Init(); | 51 waiter.Init(); |
52 ASSERT_EQ( | 52 ASSERT_EQ( |
53 MOJO_RESULT_OK, | 53 MOJO_RESULT_OK, |
54 read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr)); | 54 read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr)); |
55 | 55 |
56 // Write a message with just 'x' through the write end. | 56 // Write a message with just 'x' through the write end. |
57 EXPECT_EQ(MOJO_RESULT_OK, | 57 EXPECT_EQ(MOJO_RESULT_OK, |
58 write_mp->WriteMessage(UserPointer<const void>("x"), 1, nullptr, | 58 write_mp->WriteMessage(UserPointer<const void>("x"), 1, nullptr, |
(...skipping 10 matching lines...) Expand all Loading... |
69 read_mp->ReadMessage(UserPointer<void>(buffer), | 69 read_mp->ReadMessage(UserPointer<void>(buffer), |
70 MakeUserPointer(&buffer_size), 0, nullptr, | 70 MakeUserPointer(&buffer_size), 0, nullptr, |
71 MOJO_READ_MESSAGE_FLAG_NONE)); | 71 MOJO_READ_MESSAGE_FLAG_NONE)); |
72 EXPECT_EQ(1u, buffer_size); | 72 EXPECT_EQ(1u, buffer_size); |
73 EXPECT_EQ('x', buffer[0]); | 73 EXPECT_EQ('x', buffer[0]); |
74 } | 74 } |
75 | 75 |
76 // Writes a message pipe dispatcher (in a message) to |write_mp| and reads it | 76 // Writes a message pipe dispatcher (in a message) to |write_mp| and reads it |
77 // from |read_mp| (it should be the next message, i.e., there should be no other | 77 // from |read_mp| (it should be the next message, i.e., there should be no other |
78 // other messages already enqueued in that direction). | 78 // other messages already enqueued in that direction). |
79 scoped_refptr<MessagePipeDispatcher> SendMessagePipeDispatcher( | 79 RefPtr<MessagePipeDispatcher> SendMessagePipeDispatcher( |
80 scoped_refptr<MessagePipeDispatcher> write_mp, | 80 MessagePipeDispatcher* write_mp, |
81 scoped_refptr<MessagePipeDispatcher> read_mp, | 81 MessagePipeDispatcher* read_mp, |
82 scoped_refptr<MessagePipeDispatcher> mp_to_send) { | 82 RefPtr<MessagePipeDispatcher>&& mp_to_send) { |
83 CHECK_NE(mp_to_send, write_mp); | 83 CHECK_NE(mp_to_send.get(), write_mp); |
84 CHECK_NE(mp_to_send, read_mp); | 84 CHECK_NE(mp_to_send.get(), read_mp); |
85 | 85 |
86 // Set up waiting on the read end first (to avoid racing). | 86 // Set up waiting on the read end first (to avoid racing). |
87 Waiter waiter; | 87 Waiter waiter; |
88 waiter.Init(); | 88 waiter.Init(); |
89 CHECK_EQ( | 89 CHECK_EQ( |
90 read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr), | 90 read_mp->AddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr), |
91 MOJO_RESULT_OK); | 91 MOJO_RESULT_OK); |
92 | 92 |
93 // Write a message with just |mp_to_send| through the write end. | 93 // Write a message with just |mp_to_send| through the write end. |
94 DispatcherTransport transport( | 94 DispatcherTransport transport( |
95 test::DispatcherTryStartTransport(mp_to_send.get())); | 95 test::DispatcherTryStartTransport(mp_to_send.get())); |
96 CHECK(transport.is_valid()); | 96 CHECK(transport.is_valid()); |
97 std::vector<DispatcherTransport> transports; | 97 std::vector<DispatcherTransport> transports; |
98 transports.push_back(transport); | 98 transports.push_back(transport); |
99 CHECK_EQ(write_mp->WriteMessage(NullUserPointer(), 0, &transports, | 99 CHECK_EQ(write_mp->WriteMessage(NullUserPointer(), 0, &transports, |
100 MOJO_WRITE_MESSAGE_FLAG_NONE), | 100 MOJO_WRITE_MESSAGE_FLAG_NONE), |
101 MOJO_RESULT_OK); | 101 MOJO_RESULT_OK); |
102 transport.End(); | 102 transport.End(); |
| 103 mp_to_send = nullptr; |
103 | 104 |
104 // Wait for it to arrive. | 105 // Wait for it to arrive. |
105 CHECK_EQ(waiter.Wait(test::ActionDeadline(), nullptr), MOJO_RESULT_OK); | 106 CHECK_EQ(waiter.Wait(test::ActionDeadline(), nullptr), MOJO_RESULT_OK); |
106 read_mp->RemoveAwakable(&waiter, nullptr); | 107 read_mp->RemoveAwakable(&waiter, nullptr); |
107 | 108 |
108 // Read the message from the read end. | 109 // Read the message from the read end. |
109 DispatcherVector dispatchers; | 110 DispatcherVector dispatchers; |
110 uint32_t num_dispatchers = 10; | 111 uint32_t num_dispatchers = 10; |
111 CHECK_EQ( | 112 CHECK_EQ( |
112 read_mp->ReadMessage(NullUserPointer(), NullUserPointer(), &dispatchers, | 113 read_mp->ReadMessage(NullUserPointer(), NullUserPointer(), &dispatchers, |
113 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), | 114 &num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE), |
114 MOJO_RESULT_OK); | 115 MOJO_RESULT_OK); |
115 CHECK_EQ(dispatchers.size(), 1u); | 116 CHECK_EQ(dispatchers.size(), 1u); |
116 CHECK_EQ(num_dispatchers, 1u); | 117 CHECK_EQ(num_dispatchers, 1u); |
117 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::Type::MESSAGE_PIPE); | 118 CHECK_EQ(dispatchers[0]->GetType(), Dispatcher::Type::MESSAGE_PIPE); |
118 return scoped_refptr<MessagePipeDispatcher>( | 119 return RefPtr<MessagePipeDispatcher>( |
119 static_cast<MessagePipeDispatcher*>(dispatchers[0].get())); | 120 static_cast<MessagePipeDispatcher*>(dispatchers[0].get())); |
120 } | 121 } |
121 | 122 |
122 class TestMasterProcessDelegate : public embedder::MasterProcessDelegate { | 123 class TestMasterProcessDelegate : public embedder::MasterProcessDelegate { |
123 public: | 124 public: |
124 TestMasterProcessDelegate() | 125 TestMasterProcessDelegate() |
125 : on_slave_disconnect_event_(false, false) {} // Auto reset. | 126 : on_slave_disconnect_event_(false, false) {} // Auto reset. |
126 ~TestMasterProcessDelegate() override {} | 127 ~TestMasterProcessDelegate() override {} |
127 | 128 |
128 // Warning: There's only one slave disconnect event (which resets | 129 // Warning: There's only one slave disconnect event (which resets |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 IPCSupport* master_ipc_support) | 166 IPCSupport* master_ipc_support) |
166 : test_io_thread_(test_io_thread), | 167 : test_io_thread_(test_io_thread), |
167 master_ipc_support_(master_ipc_support), | 168 master_ipc_support_(master_ipc_support), |
168 connection_id_(master_ipc_support_->GenerateConnectionIdentifier()), | 169 connection_id_(master_ipc_support_->GenerateConnectionIdentifier()), |
169 slave_id_(kInvalidProcessIdentifier), | 170 slave_id_(kInvalidProcessIdentifier), |
170 event_(true, false) {} | 171 event_(true, false) {} |
171 ~TestSlaveConnection() {} | 172 ~TestSlaveConnection() {} |
172 | 173 |
173 // After this is called, |ShutdownChannelToSlave()| must be called (possibly | 174 // After this is called, |ShutdownChannelToSlave()| must be called (possibly |
174 // after |WaitForChannelToSlave()|) before destruction. | 175 // after |WaitForChannelToSlave()|) before destruction. |
175 scoped_refptr<MessagePipeDispatcher> ConnectToSlave() { | 176 RefPtr<MessagePipeDispatcher> ConnectToSlave() { |
176 embedder::PlatformChannelPair channel_pair; | 177 embedder::PlatformChannelPair channel_pair; |
177 // Note: |ChannelId|s and |ProcessIdentifier|s are interchangeable. | 178 // Note: |ChannelId|s and |ProcessIdentifier|s are interchangeable. |
178 scoped_refptr<MessagePipeDispatcher> mp = | 179 RefPtr<MessagePipeDispatcher> mp = master_ipc_support_->ConnectToSlave( |
179 master_ipc_support_->ConnectToSlave( | 180 connection_id_, nullptr, channel_pair.PassServerHandle(), |
180 connection_id_, nullptr, channel_pair.PassServerHandle(), | 181 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event_)), |
181 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event_)), | 182 nullptr, &slave_id_); |
182 nullptr, &slave_id_); | |
183 EXPECT_TRUE(mp); | 183 EXPECT_TRUE(mp); |
184 EXPECT_NE(slave_id_, kInvalidProcessIdentifier); | 184 EXPECT_NE(slave_id_, kInvalidProcessIdentifier); |
185 EXPECT_NE(slave_id_, kMasterProcessIdentifier); | 185 EXPECT_NE(slave_id_, kMasterProcessIdentifier); |
186 slave_platform_handle_ = channel_pair.PassClientHandle(); | 186 slave_platform_handle_ = channel_pair.PassClientHandle(); |
187 return mp; | 187 return mp; |
188 } | 188 } |
189 | 189 |
190 void WaitForChannelToSlave() { | 190 void WaitForChannelToSlave() { |
191 EXPECT_TRUE(event_.TimedWait(TestTimeouts::action_timeout())); | 191 EXPECT_TRUE(event_.TimedWait(TestTimeouts::action_timeout())); |
192 } | 192 } |
(...skipping 13 matching lines...) Expand all Loading... |
206 return slave_platform_handle_.Pass(); | 206 return slave_platform_handle_.Pass(); |
207 } | 207 } |
208 | 208 |
209 const ConnectionIdentifier& connection_id() const { return connection_id_; } | 209 const ConnectionIdentifier& connection_id() const { return connection_id_; } |
210 | 210 |
211 private: | 211 private: |
212 TestIOThread* const test_io_thread_; | 212 TestIOThread* const test_io_thread_; |
213 IPCSupport* const master_ipc_support_; | 213 IPCSupport* const master_ipc_support_; |
214 const ConnectionIdentifier connection_id_; | 214 const ConnectionIdentifier connection_id_; |
215 // The master's message pipe dispatcher. | 215 // The master's message pipe dispatcher. |
216 scoped_refptr<MessagePipeDispatcher> message_pipe_; | 216 RefPtr<MessagePipeDispatcher> message_pipe_; |
217 ProcessIdentifier slave_id_; | 217 ProcessIdentifier slave_id_; |
218 base::WaitableEvent event_; | 218 base::WaitableEvent event_; |
219 embedder::ScopedPlatformHandle slave_platform_handle_; | 219 embedder::ScopedPlatformHandle slave_platform_handle_; |
220 | 220 |
221 MOJO_DISALLOW_COPY_AND_ASSIGN(TestSlaveConnection); | 221 MOJO_DISALLOW_COPY_AND_ASSIGN(TestSlaveConnection); |
222 }; | 222 }; |
223 | 223 |
224 // Encapsulates the state of a slave. (Note, however, that we share a | 224 // Encapsulates the state of a slave. (Note, however, that we share a |
225 // |PlatformSupport| and an I/O thread.) | 225 // |PlatformSupport| and an I/O thread.) |
226 class TestSlave { | 226 class TestSlave { |
227 public: | 227 public: |
228 // Note: Before destruction, |ShutdownIPCSupport()| must be called. | 228 // Note: Before destruction, |ShutdownIPCSupport()| must be called. |
229 TestSlave(embedder::PlatformSupport* platform_support, | 229 TestSlave(embedder::PlatformSupport* platform_support, |
230 TestIOThread* test_io_thread, | 230 TestIOThread* test_io_thread, |
231 embedder::ScopedPlatformHandle platform_handle) | 231 embedder::ScopedPlatformHandle platform_handle) |
232 : test_io_thread_(test_io_thread), | 232 : test_io_thread_(test_io_thread), |
233 slave_ipc_support_(platform_support, | 233 slave_ipc_support_(platform_support, |
234 embedder::ProcessType::SLAVE, | 234 embedder::ProcessType::SLAVE, |
235 test_io_thread->task_runner(), | 235 test_io_thread->task_runner(), |
236 &slave_process_delegate_, | 236 &slave_process_delegate_, |
237 test_io_thread->task_runner(), | 237 test_io_thread->task_runner(), |
238 platform_handle.Pass()), | 238 platform_handle.Pass()), |
239 event_(true, false) {} | 239 event_(true, false) {} |
240 ~TestSlave() {} | 240 ~TestSlave() {} |
241 | 241 |
242 // After this is called, |ShutdownChannelToMaster()| must be called (possibly | 242 // After this is called, |ShutdownChannelToMaster()| must be called (possibly |
243 // after |WaitForChannelToMaster()|) before destruction. | 243 // after |WaitForChannelToMaster()|) before destruction. |
244 scoped_refptr<MessagePipeDispatcher> ConnectToMaster( | 244 RefPtr<MessagePipeDispatcher> ConnectToMaster( |
245 const ConnectionIdentifier& connection_id) { | 245 const ConnectionIdentifier& connection_id) { |
246 ProcessIdentifier master_id = kInvalidProcessIdentifier; | 246 ProcessIdentifier master_id = kInvalidProcessIdentifier; |
247 scoped_refptr<MessagePipeDispatcher> mp = | 247 RefPtr<MessagePipeDispatcher> mp = slave_ipc_support_.ConnectToMaster( |
248 slave_ipc_support_.ConnectToMaster( | 248 connection_id, |
249 connection_id, | 249 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event_)), |
250 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event_)), | 250 nullptr, &master_id); |
251 nullptr, &master_id); | |
252 EXPECT_TRUE(mp); | 251 EXPECT_TRUE(mp); |
253 EXPECT_EQ(kMasterProcessIdentifier, master_id); | 252 EXPECT_EQ(kMasterProcessIdentifier, master_id); |
254 return mp; | 253 return mp; |
255 } | 254 } |
256 | 255 |
257 void WaitForChannelToMaster() { | 256 void WaitForChannelToMaster() { |
258 EXPECT_TRUE(event_.TimedWait(TestTimeouts::action_timeout())); | 257 EXPECT_TRUE(event_.TimedWait(TestTimeouts::action_timeout())); |
259 } | 258 } |
260 | 259 |
261 void ShutdownChannelToMaster() { | 260 void ShutdownChannelToMaster() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
307 slave_connection_.reset( | 306 slave_connection_.reset( |
308 new TestSlaveConnection(test_io_thread_, master_ipc_support_)); | 307 new TestSlaveConnection(test_io_thread_, master_ipc_support_)); |
309 master_mp_ = slave_connection_->ConnectToSlave(); | 308 master_mp_ = slave_connection_->ConnectToSlave(); |
310 | 309 |
311 slave_.reset(new TestSlave(platform_support_, test_io_thread_, | 310 slave_.reset(new TestSlave(platform_support_, test_io_thread_, |
312 slave_connection_->PassSlavePlatformHandle())); | 311 slave_connection_->PassSlavePlatformHandle())); |
313 slave_mp_ = slave_->ConnectToMaster(slave_connection_->connection_id()); | 312 slave_mp_ = slave_->ConnectToMaster(slave_connection_->connection_id()); |
314 } | 313 } |
315 | 314 |
316 void TestConnection() { | 315 void TestConnection() { |
317 TestWriteReadMessage(master_mp_, slave_mp_); | 316 TestWriteReadMessage(master_mp_.get(), slave_mp_.get()); |
318 TestWriteReadMessage(slave_mp_, master_mp_); | 317 TestWriteReadMessage(slave_mp_.get(), master_mp_.get()); |
319 } | 318 } |
320 | 319 |
321 scoped_refptr<MessagePipeDispatcher> PassMasterMessagePipe() { | 320 RefPtr<MessagePipeDispatcher> PassMasterMessagePipe() { |
322 return master_mp_.Pass(); | 321 return master_mp_.Pass(); |
323 } | 322 } |
324 | 323 |
325 scoped_refptr<MessagePipeDispatcher> PassSlaveMessagePipe() { | 324 RefPtr<MessagePipeDispatcher> PassSlaveMessagePipe() { |
326 return slave_mp_.Pass(); | 325 return slave_mp_.Pass(); |
327 } | 326 } |
328 | 327 |
329 void Shutdown() { | 328 void Shutdown() { |
330 if (master_mp_) { | 329 if (master_mp_) { |
331 master_mp_->Close(); | 330 master_mp_->Close(); |
332 master_mp_ = nullptr; | 331 master_mp_ = nullptr; |
333 } | 332 } |
334 if (slave_mp_) { | 333 if (slave_mp_) { |
335 slave_mp_->Close(); | 334 slave_mp_->Close(); |
(...skipping 17 matching lines...) Expand all Loading... |
353 // Note: To close the slave message pipe, use |PassSlaveMessagePipe()|. | 352 // Note: To close the slave message pipe, use |PassSlaveMessagePipe()|. |
354 MessagePipeDispatcher* slave_mp() { return slave_mp_.get(); } | 353 MessagePipeDispatcher* slave_mp() { return slave_mp_.get(); } |
355 | 354 |
356 private: | 355 private: |
357 embedder::SimplePlatformSupport* const platform_support_; | 356 embedder::SimplePlatformSupport* const platform_support_; |
358 TestIOThread* const test_io_thread_; | 357 TestIOThread* const test_io_thread_; |
359 TestMasterProcessDelegate* const master_process_delegate_; | 358 TestMasterProcessDelegate* const master_process_delegate_; |
360 IPCSupport* const master_ipc_support_; | 359 IPCSupport* const master_ipc_support_; |
361 | 360 |
362 std::unique_ptr<TestSlaveConnection> slave_connection_; | 361 std::unique_ptr<TestSlaveConnection> slave_connection_; |
363 scoped_refptr<MessagePipeDispatcher> master_mp_; | 362 RefPtr<MessagePipeDispatcher> master_mp_; |
364 | 363 |
365 std::unique_ptr<TestSlave> slave_; | 364 std::unique_ptr<TestSlave> slave_; |
366 scoped_refptr<MessagePipeDispatcher> slave_mp_; | 365 RefPtr<MessagePipeDispatcher> slave_mp_; |
367 | 366 |
368 MOJO_DISALLOW_COPY_AND_ASSIGN(TestSlaveSetup); | 367 MOJO_DISALLOW_COPY_AND_ASSIGN(TestSlaveSetup); |
369 }; | 368 }; |
370 | 369 |
371 class IPCSupportTest : public testing::Test { | 370 class IPCSupportTest : public testing::Test { |
372 public: | 371 public: |
373 // Note: Run master process delegate methods on the I/O thread. | 372 // Note: Run master process delegate methods on the I/O thread. |
374 IPCSupportTest() | 373 IPCSupportTest() |
375 : test_io_thread_(TestIOThread::StartMode::AUTO), | 374 : test_io_thread_(TestIOThread::StartMode::AUTO), |
376 master_ipc_support_(&platform_support_, | 375 master_ipc_support_(&platform_support_, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 TestIOThread test_io_thread_; | 408 TestIOThread test_io_thread_; |
410 | 409 |
411 // All tests require a master. | 410 // All tests require a master. |
412 TestMasterProcessDelegate master_process_delegate_; | 411 TestMasterProcessDelegate master_process_delegate_; |
413 IPCSupport master_ipc_support_; | 412 IPCSupport master_ipc_support_; |
414 | 413 |
415 MOJO_DISALLOW_COPY_AND_ASSIGN(IPCSupportTest); | 414 MOJO_DISALLOW_COPY_AND_ASSIGN(IPCSupportTest); |
416 }; | 415 }; |
417 | 416 |
418 using MessagePipeDispatcherPair = | 417 using MessagePipeDispatcherPair = |
419 std::pair<scoped_refptr<MessagePipeDispatcher>, | 418 std::pair<RefPtr<MessagePipeDispatcher>, RefPtr<MessagePipeDispatcher>>; |
420 scoped_refptr<MessagePipeDispatcher>>; | |
421 MessagePipeDispatcherPair CreateMessagePipe() { | 419 MessagePipeDispatcherPair CreateMessagePipe() { |
422 MessagePipeDispatcherPair rv; | 420 MessagePipeDispatcherPair rv; |
423 rv.first = MessagePipeDispatcher::Create( | 421 rv.first = MessagePipeDispatcher::Create( |
424 MessagePipeDispatcher::kDefaultCreateOptions); | 422 MessagePipeDispatcher::kDefaultCreateOptions); |
425 rv.second = MessagePipeDispatcher::Create( | 423 rv.second = MessagePipeDispatcher::Create( |
426 MessagePipeDispatcher::kDefaultCreateOptions); | 424 MessagePipeDispatcher::kDefaultCreateOptions); |
427 auto mp = MessagePipe::CreateLocalLocal(); | 425 auto mp = MessagePipe::CreateLocalLocal(); |
428 rv.first->Init(mp.Clone(), 0); | 426 rv.first->Init(mp.Clone(), 0); |
429 rv.second->Init(std::move(mp), 1); | 427 rv.second->Init(std::move(mp), 1); |
430 return rv; | 428 return rv; |
(...skipping 29 matching lines...) Expand all Loading... |
460 // going away. | 458 // going away. |
461 TEST_F(IPCSupportTest, ConnectTwoSlaves) { | 459 TEST_F(IPCSupportTest, ConnectTwoSlaves) { |
462 std::unique_ptr<TestSlaveSetup> s1(SetupSlave()); | 460 std::unique_ptr<TestSlaveSetup> s1(SetupSlave()); |
463 std::unique_ptr<TestSlaveSetup> s2(SetupSlave()); | 461 std::unique_ptr<TestSlaveSetup> s2(SetupSlave()); |
464 s1->TestConnection(); | 462 s1->TestConnection(); |
465 s2->TestConnection(); | 463 s2->TestConnection(); |
466 | 464 |
467 // Make a message pipe (logically "in" the master) and send one end to each | 465 // Make a message pipe (logically "in" the master) and send one end to each |
468 // slave. | 466 // slave. |
469 MessagePipeDispatcherPair send_mp = CreateMessagePipe(); | 467 MessagePipeDispatcherPair send_mp = CreateMessagePipe(); |
470 scoped_refptr<MessagePipeDispatcher> slave1_received_mp = | 468 RefPtr<MessagePipeDispatcher> slave1_received_mp = SendMessagePipeDispatcher( |
471 SendMessagePipeDispatcher(s1->master_mp(), s1->slave_mp(), send_mp.first); | 469 s1->master_mp(), s1->slave_mp(), std::move(send_mp.first)); |
472 scoped_refptr<MessagePipeDispatcher> slave2_received_mp = | 470 RefPtr<MessagePipeDispatcher> slave2_received_mp = SendMessagePipeDispatcher( |
473 SendMessagePipeDispatcher(s2->master_mp(), s2->slave_mp(), | 471 s2->master_mp(), s2->slave_mp(), std::move(send_mp.second)); |
474 send_mp.second); | |
475 | 472 |
476 // These should be connected. | 473 // These should be connected. |
477 TestWriteReadMessage(slave1_received_mp, slave2_received_mp); | 474 TestWriteReadMessage(slave1_received_mp.get(), slave2_received_mp.get()); |
478 TestWriteReadMessage(slave2_received_mp, slave1_received_mp); | 475 TestWriteReadMessage(slave2_received_mp.get(), slave1_received_mp.get()); |
479 | 476 |
480 s1->PassMasterMessagePipe()->Close(); | 477 s1->PassMasterMessagePipe()->Close(); |
481 s2->PassMasterMessagePipe()->Close(); | 478 s2->PassMasterMessagePipe()->Close(); |
482 s1->PassSlaveMessagePipe()->Close(); | 479 s1->PassSlaveMessagePipe()->Close(); |
483 s2->PassSlaveMessagePipe()->Close(); | 480 s2->PassSlaveMessagePipe()->Close(); |
484 | 481 |
485 // They should still be connected. | 482 // They should still be connected. |
486 TestWriteReadMessage(slave1_received_mp, slave2_received_mp); | 483 TestWriteReadMessage(slave1_received_mp.get(), slave2_received_mp.get()); |
487 TestWriteReadMessage(slave2_received_mp, slave1_received_mp); | 484 TestWriteReadMessage(slave2_received_mp.get(), slave1_received_mp.get()); |
488 | 485 |
489 slave1_received_mp->Close(); | 486 slave1_received_mp->Close(); |
490 slave2_received_mp->Close(); | 487 slave2_received_mp->Close(); |
491 | 488 |
492 s1->Shutdown(); | 489 s1->Shutdown(); |
493 s2->Shutdown(); | 490 s2->Shutdown(); |
494 | 491 |
495 ShutdownMasterIPCSupport(); | 492 ShutdownMasterIPCSupport(); |
496 } | 493 } |
497 | 494 |
498 // Like |ConnectTwoSlaves|, but does it twice, to test reusing a connection. | 495 // Like |ConnectTwoSlaves|, but does it twice, to test reusing a connection. |
499 TEST_F(IPCSupportTest, ConnectTwoSlavesTwice) { | 496 TEST_F(IPCSupportTest, ConnectTwoSlavesTwice) { |
500 std::unique_ptr<TestSlaveSetup> s1(SetupSlave()); | 497 std::unique_ptr<TestSlaveSetup> s1(SetupSlave()); |
501 std::unique_ptr<TestSlaveSetup> s2(SetupSlave()); | 498 std::unique_ptr<TestSlaveSetup> s2(SetupSlave()); |
502 s1->TestConnection(); | 499 s1->TestConnection(); |
503 s2->TestConnection(); | 500 s2->TestConnection(); |
504 | 501 |
505 MessagePipeDispatcherPair send_mp1 = CreateMessagePipe(); | 502 MessagePipeDispatcherPair send_mp1 = CreateMessagePipe(); |
506 scoped_refptr<MessagePipeDispatcher> slave1_received_mp1 = | 503 RefPtr<MessagePipeDispatcher> slave1_received_mp1 = SendMessagePipeDispatcher( |
507 SendMessagePipeDispatcher(s1->master_mp(), s1->slave_mp(), | 504 s1->master_mp(), s1->slave_mp(), std::move(send_mp1.first)); |
508 send_mp1.first); | 505 RefPtr<MessagePipeDispatcher> slave2_received_mp1 = SendMessagePipeDispatcher( |
509 scoped_refptr<MessagePipeDispatcher> slave2_received_mp1 = | 506 s2->master_mp(), s2->slave_mp(), std::move(send_mp1.second)); |
510 SendMessagePipeDispatcher(s2->master_mp(), s2->slave_mp(), | |
511 send_mp1.second); | |
512 | 507 |
513 MessagePipeDispatcherPair send_mp2 = CreateMessagePipe(); | 508 MessagePipeDispatcherPair send_mp2 = CreateMessagePipe(); |
514 scoped_refptr<MessagePipeDispatcher> slave1_received_mp2 = | 509 RefPtr<MessagePipeDispatcher> slave1_received_mp2 = SendMessagePipeDispatcher( |
515 SendMessagePipeDispatcher(s1->master_mp(), s1->slave_mp(), | 510 s1->master_mp(), s1->slave_mp(), std::move(send_mp2.first)); |
516 send_mp2.first); | 511 RefPtr<MessagePipeDispatcher> slave2_received_mp2 = SendMessagePipeDispatcher( |
517 scoped_refptr<MessagePipeDispatcher> slave2_received_mp2 = | 512 s2->master_mp(), s2->slave_mp(), std::move(send_mp2.second)); |
518 SendMessagePipeDispatcher(s2->master_mp(), s2->slave_mp(), | |
519 send_mp2.second); | |
520 | 513 |
521 s1->PassMasterMessagePipe()->Close(); | 514 s1->PassMasterMessagePipe()->Close(); |
522 s2->PassMasterMessagePipe()->Close(); | 515 s2->PassMasterMessagePipe()->Close(); |
523 s1->PassSlaveMessagePipe()->Close(); | 516 s1->PassSlaveMessagePipe()->Close(); |
524 s2->PassSlaveMessagePipe()->Close(); | 517 s2->PassSlaveMessagePipe()->Close(); |
525 | 518 |
526 TestWriteReadMessage(slave1_received_mp1, slave2_received_mp1); | 519 TestWriteReadMessage(slave1_received_mp1.get(), slave2_received_mp1.get()); |
527 TestWriteReadMessage(slave2_received_mp1, slave1_received_mp1); | 520 TestWriteReadMessage(slave2_received_mp1.get(), slave1_received_mp1.get()); |
528 | 521 |
529 TestWriteReadMessage(slave1_received_mp2, slave2_received_mp2); | 522 TestWriteReadMessage(slave1_received_mp2.get(), slave2_received_mp2.get()); |
530 TestWriteReadMessage(slave2_received_mp2, slave1_received_mp2); | 523 TestWriteReadMessage(slave2_received_mp2.get(), slave1_received_mp2.get()); |
531 | 524 |
532 slave1_received_mp1->Close(); | 525 slave1_received_mp1->Close(); |
533 slave2_received_mp1->Close(); | 526 slave2_received_mp1->Close(); |
534 | 527 |
535 TestWriteReadMessage(slave1_received_mp2, slave2_received_mp2); | 528 TestWriteReadMessage(slave1_received_mp2.get(), slave2_received_mp2.get()); |
536 TestWriteReadMessage(slave2_received_mp2, slave1_received_mp2); | 529 TestWriteReadMessage(slave2_received_mp2.get(), slave1_received_mp2.get()); |
537 | 530 |
538 slave1_received_mp2->Close(); | 531 slave1_received_mp2->Close(); |
539 slave2_received_mp2->Close(); | 532 slave2_received_mp2->Close(); |
540 | 533 |
541 s1->Shutdown(); | 534 s1->Shutdown(); |
542 s2->Shutdown(); | 535 s2->Shutdown(); |
543 | 536 |
544 ShutdownMasterIPCSupport(); | 537 ShutdownMasterIPCSupport(); |
545 } | 538 } |
546 | 539 |
547 // Creates a message pipe in the slave, which sends both ends (in separate | 540 // Creates a message pipe in the slave, which sends both ends (in separate |
548 // messages) to the master. | 541 // messages) to the master. |
549 TEST_F(IPCSupportTest, SlavePassBackToMaster) { | 542 TEST_F(IPCSupportTest, SlavePassBackToMaster) { |
550 std::unique_ptr<TestSlaveSetup> s(SetupSlave()); | 543 std::unique_ptr<TestSlaveSetup> s(SetupSlave()); |
551 | 544 |
552 s->TestConnection(); | 545 s->TestConnection(); |
553 | 546 |
554 // Make a message pipe (logically "in" the slave) and send both ends | 547 // Make a message pipe (logically "in" the slave) and send both ends |
555 // (separately) to the master. | 548 // (separately) to the master. |
556 MessagePipeDispatcherPair send_mp = CreateMessagePipe(); | 549 MessagePipeDispatcherPair send_mp = CreateMessagePipe(); |
557 scoped_refptr<MessagePipeDispatcher> received_mp1 = | 550 RefPtr<MessagePipeDispatcher> received_mp1 = SendMessagePipeDispatcher( |
558 SendMessagePipeDispatcher(s->slave_mp(), s->master_mp(), send_mp.first); | 551 s->slave_mp(), s->master_mp(), std::move(send_mp.first)); |
559 | 552 |
560 TestWriteReadMessage(received_mp1, send_mp.second); | 553 TestWriteReadMessage(received_mp1.get(), send_mp.second.get()); |
561 TestWriteReadMessage(send_mp.second, received_mp1); | 554 TestWriteReadMessage(send_mp.second.get(), received_mp1.get()); |
562 | 555 |
563 scoped_refptr<MessagePipeDispatcher> received_mp2 = | 556 RefPtr<MessagePipeDispatcher> received_mp2 = SendMessagePipeDispatcher( |
564 SendMessagePipeDispatcher(s->slave_mp(), s->master_mp(), send_mp.second); | 557 s->slave_mp(), s->master_mp(), std::move(send_mp.second)); |
565 | 558 |
566 s->PassMasterMessagePipe()->Close(); | 559 s->PassMasterMessagePipe()->Close(); |
567 s->PassSlaveMessagePipe()->Close(); | 560 s->PassSlaveMessagePipe()->Close(); |
568 | 561 |
569 TestWriteReadMessage(received_mp1, received_mp2); | 562 TestWriteReadMessage(received_mp1.get(), received_mp2.get()); |
570 TestWriteReadMessage(received_mp2, received_mp1); | 563 TestWriteReadMessage(received_mp2.get(), received_mp1.get()); |
571 | 564 |
572 s->Shutdown(); | 565 s->Shutdown(); |
573 | 566 |
574 // These should still be connected. | 567 // These should still be connected. |
575 // TODO(vtl): This is not yet implemented, thus will fail here! | 568 // TODO(vtl): This is not yet implemented, thus will fail here! |
576 // TestWriteReadMessage(received_mp1, received_mp2); | 569 // TestWriteReadMessage(received_mp1.get(), received_mp2.get()); |
577 // TestWriteReadMessage(received_mp2, received_mp1); | 570 // TestWriteReadMessage(received_mp2.get(), received_mp1.get()); |
578 | 571 |
579 received_mp1->Close(); | 572 received_mp1->Close(); |
580 received_mp2->Close(); | 573 received_mp2->Close(); |
581 | 574 |
582 ShutdownMasterIPCSupport(); | 575 ShutdownMasterIPCSupport(); |
583 } | 576 } |
584 | 577 |
585 } // namespace | 578 } // namespace |
586 | 579 |
587 // Note: This test isn't in an anonymous namespace, since it needs to be | 580 // Note: This test isn't in an anonymous namespace, since it needs to be |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 test_io_thread.PostTaskAndWait(FROM_HERE, | 715 test_io_thread.PostTaskAndWait(FROM_HERE, |
723 base::Bind(&IPCSupport::ShutdownOnIOThread, | 716 base::Bind(&IPCSupport::ShutdownOnIOThread, |
724 base::Unretained(&ipc_support))); | 717 base::Unretained(&ipc_support))); |
725 } | 718 } |
726 | 719 |
727 // TODO(vtl): Also test the case of the master "dying" before the slave. (The | 720 // TODO(vtl): Also test the case of the master "dying" before the slave. (The |
728 // slave should get OnMasterDisconnect(), which we currently don't test.) | 721 // slave should get OnMasterDisconnect(), which we currently don't test.) |
729 | 722 |
730 } // namespace system | 723 } // namespace system |
731 } // namespace mojo | 724 } // namespace mojo |
OLD | NEW |