OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "ipc/ipc_channel_mojo.h" | 5 #include "ipc/ipc_channel_mojo.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <memory> | 10 #include <memory> |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "build/build_config.h" | 30 #include "build/build_config.h" |
31 #include "ipc/ipc_message.h" | 31 #include "ipc/ipc_message.h" |
32 #include "ipc/ipc_mojo_handle_attachment.h" | 32 #include "ipc/ipc_mojo_handle_attachment.h" |
33 #include "ipc/ipc_mojo_message_helper.h" | 33 #include "ipc/ipc_mojo_message_helper.h" |
34 #include "ipc/ipc_mojo_param_traits.h" | 34 #include "ipc/ipc_mojo_param_traits.h" |
35 #include "ipc/ipc_sync_channel.h" | 35 #include "ipc/ipc_sync_channel.h" |
36 #include "ipc/ipc_sync_message.h" | 36 #include "ipc/ipc_sync_message.h" |
37 #include "ipc/ipc_test.mojom.h" | 37 #include "ipc/ipc_test.mojom.h" |
38 #include "ipc/ipc_test_base.h" | 38 #include "ipc/ipc_test_base.h" |
39 #include "ipc/ipc_test_channel_listener.h" | 39 #include "ipc/ipc_test_channel_listener.h" |
| 40 #include "mojo/edk/test/mojo_test_base.h" |
| 41 #include "mojo/edk/test/multiprocess_test_helper.h" |
40 #include "testing/gtest/include/gtest/gtest.h" | 42 #include "testing/gtest/include/gtest/gtest.h" |
41 | 43 |
42 #if defined(OS_POSIX) | 44 #if defined(OS_POSIX) |
43 #include "base/file_descriptor_posix.h" | 45 #include "base/file_descriptor_posix.h" |
44 #include "ipc/ipc_platform_file_attachment_posix.h" | 46 #include "ipc/ipc_platform_file_attachment_posix.h" |
45 #endif | 47 #endif |
46 | 48 |
| 49 #define DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(client_name, test_base) \ |
| 50 class client_name##_MainFixture : public test_base { \ |
| 51 public: \ |
| 52 void Main(); \ |
| 53 }; \ |
| 54 MULTIPROCESS_TEST_MAIN_WITH_SETUP( \ |
| 55 client_name##TestChildMain, \ |
| 56 ::mojo::edk::test::MultiprocessTestHelper::ChildSetup) { \ |
| 57 client_name##_MainFixture test; \ |
| 58 test.Init( \ |
| 59 std::move(mojo::edk::test::MultiprocessTestHelper::primordial_pipe)); \ |
| 60 test.Main(); \ |
| 61 return (::testing::Test::HasFatalFailure() || \ |
| 62 ::testing::Test::HasNonfatalFailure()) \ |
| 63 ? 1 \ |
| 64 : 0; \ |
| 65 } \ |
| 66 void client_name##_MainFixture::Main() |
| 67 |
47 namespace { | 68 namespace { |
48 | 69 |
49 void SendString(IPC::Sender* sender, const std::string& str) { | 70 void SendString(IPC::Sender* sender, const std::string& str) { |
50 IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); | 71 IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); |
51 message->WriteString(str); | 72 message->WriteString(str); |
52 ASSERT_TRUE(sender->Send(message)); | 73 ASSERT_TRUE(sender->Send(message)); |
53 } | 74 } |
54 | 75 |
55 void SendValue(IPC::Sender* sender, int32_t value) { | 76 void SendValue(IPC::Sender* sender, int32_t value) { |
56 IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); | 77 IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); |
(...skipping 23 matching lines...) Expand all Loading... |
80 // process dies. | 101 // process dies. |
81 DCHECK(received_ok_); | 102 DCHECK(received_ok_); |
82 } | 103 } |
83 | 104 |
84 static void SendOK(IPC::Sender* sender) { SendString(sender, "OK"); } | 105 static void SendOK(IPC::Sender* sender) { SendString(sender, "OK"); } |
85 | 106 |
86 private: | 107 private: |
87 bool received_ok_; | 108 bool received_ok_; |
88 }; | 109 }; |
89 | 110 |
90 using IPCChannelMojoTest = IPCChannelMojoTestBase; | 111 class ChannelClient { |
| 112 public: |
| 113 void Init(mojo::ScopedMessagePipeHandle handle) { |
| 114 handle_ = std::move(handle); |
| 115 } |
| 116 |
| 117 void Connect(IPC::Listener* listener) { |
| 118 channel_ = IPC::ChannelMojo::Create( |
| 119 std::move(handle_), IPC::Channel::MODE_CLIENT, listener, |
| 120 base::ThreadTaskRunnerHandle::Get()); |
| 121 CHECK(channel_->Connect()); |
| 122 } |
| 123 |
| 124 void Close() { |
| 125 channel_->Close(); |
| 126 |
| 127 base::RunLoop run_loop; |
| 128 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 129 run_loop.QuitClosure()); |
| 130 run_loop.Run(); |
| 131 } |
| 132 |
| 133 IPC::ChannelMojo* channel() const { return channel_.get(); } |
| 134 |
| 135 private: |
| 136 base::MessageLoopForIO main_message_loop_; |
| 137 mojo::ScopedMessagePipeHandle handle_; |
| 138 std::unique_ptr<IPC::ChannelMojo> channel_; |
| 139 }; |
| 140 |
| 141 class IPCChannelMojoTestBase : public testing::Test { |
| 142 public: |
| 143 void InitWithMojo(const std::string& test_client_name) { |
| 144 handle_ = helper_.StartChild(test_client_name); |
| 145 } |
| 146 |
| 147 bool WaitForClientShutdown() { return helper_.WaitForChildTestShutdown(); } |
| 148 |
| 149 protected: |
| 150 mojo::ScopedMessagePipeHandle TakeHandle() { return std::move(handle_); } |
| 151 |
| 152 private: |
| 153 mojo::ScopedMessagePipeHandle handle_; |
| 154 mojo::edk::test::MultiprocessTestHelper helper_; |
| 155 }; |
| 156 |
| 157 class IPCChannelMojoTest : public IPCChannelMojoTestBase { |
| 158 public: |
| 159 void TearDown() override { base::RunLoop().RunUntilIdle(); } |
| 160 |
| 161 void CreateChannel(IPC::Listener* listener) { |
| 162 channel_ = IPC::ChannelMojo::Create( |
| 163 TakeHandle(), IPC::Channel::MODE_SERVER, listener, |
| 164 base::ThreadTaskRunnerHandle::Get()); |
| 165 } |
| 166 |
| 167 bool ConnectChannel() { return channel_->Connect(); } |
| 168 |
| 169 void DestroyChannel() { channel_.reset(); } |
| 170 |
| 171 IPC::Sender* sender() { return channel(); } |
| 172 IPC::Channel* channel() { return channel_.get(); } |
| 173 |
| 174 private: |
| 175 base::MessageLoop message_loop_; |
| 176 std::unique_ptr<IPC::Channel> channel_; |
| 177 }; |
91 | 178 |
92 class TestChannelListenerWithExtraExpectations | 179 class TestChannelListenerWithExtraExpectations |
93 : public IPC::TestChannelListener { | 180 : public IPC::TestChannelListener { |
94 public: | 181 public: |
95 TestChannelListenerWithExtraExpectations() : is_connected_called_(false) {} | 182 TestChannelListenerWithExtraExpectations() : is_connected_called_(false) {} |
96 | 183 |
97 void OnChannelConnected(int32_t peer_pid) override { | 184 void OnChannelConnected(int32_t peer_pid) override { |
98 IPC::TestChannelListener::OnChannelConnected(peer_pid); | 185 IPC::TestChannelListener::OnChannelConnected(peer_pid); |
99 EXPECT_TRUE(base::kNullProcessId != peer_pid); | 186 EXPECT_TRUE(base::kNullProcessId != peer_pid); |
100 is_connected_called_ = true; | 187 is_connected_called_ = true; |
101 } | 188 } |
102 | 189 |
103 bool is_connected_called() const { return is_connected_called_; } | 190 bool is_connected_called() const { return is_connected_called_; } |
104 | 191 |
105 private: | 192 private: |
106 bool is_connected_called_; | 193 bool is_connected_called_; |
107 }; | 194 }; |
108 | 195 |
109 TEST_F(IPCChannelMojoTest, ConnectedFromClient) { | 196 TEST_F(IPCChannelMojoTest, ConnectedFromClient) { |
110 Init("IPCChannelMojoTestClient"); | 197 InitWithMojo("IPCChannelMojoTestClient"); |
111 | 198 |
112 // Set up IPC channel and start client. | 199 // Set up IPC channel and start client. |
113 TestChannelListenerWithExtraExpectations listener; | 200 TestChannelListenerWithExtraExpectations listener; |
114 CreateChannel(&listener); | 201 CreateChannel(&listener); |
115 listener.Init(sender()); | 202 listener.Init(sender()); |
116 ASSERT_TRUE(ConnectChannel()); | 203 ASSERT_TRUE(ConnectChannel()); |
117 | 204 |
118 IPC::TestChannelListener::SendOneMessage(sender(), "hello from parent"); | 205 IPC::TestChannelListener::SendOneMessage(sender(), "hello from parent"); |
119 | 206 |
120 base::RunLoop().Run(); | 207 base::RunLoop().Run(); |
121 | 208 |
122 channel()->Close(); | 209 channel()->Close(); |
123 | 210 |
124 EXPECT_TRUE(WaitForClientShutdown()); | 211 EXPECT_TRUE(WaitForClientShutdown()); |
125 EXPECT_TRUE(listener.is_connected_called()); | 212 EXPECT_TRUE(listener.is_connected_called()); |
126 EXPECT_TRUE(listener.HasSentAll()); | 213 EXPECT_TRUE(listener.HasSentAll()); |
127 | 214 |
128 DestroyChannel(); | 215 DestroyChannel(); |
129 } | 216 } |
130 | 217 |
131 // A long running process that connects to us | 218 // A long running process that connects to us |
132 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestClient) { | 219 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestClient, ChannelClient) { |
133 TestChannelListenerWithExtraExpectations listener; | 220 TestChannelListenerWithExtraExpectations listener; |
134 Connect(&listener); | 221 Connect(&listener); |
135 listener.Init(channel()); | 222 listener.Init(channel()); |
136 | 223 |
137 IPC::TestChannelListener::SendOneMessage(channel(), "hello from child"); | 224 IPC::TestChannelListener::SendOneMessage(channel(), "hello from child"); |
138 base::RunLoop().Run(); | 225 base::RunLoop().Run(); |
139 EXPECT_TRUE(listener.is_connected_called()); | 226 EXPECT_TRUE(listener.is_connected_called()); |
140 EXPECT_TRUE(listener.HasSentAll()); | 227 EXPECT_TRUE(listener.HasSentAll()); |
141 | 228 |
142 Close(); | 229 Close(); |
(...skipping 21 matching lines...) Expand all Loading... |
164 ListenerThatQuits() {} | 251 ListenerThatQuits() {} |
165 | 252 |
166 bool OnMessageReceived(const IPC::Message& message) override { return true; } | 253 bool OnMessageReceived(const IPC::Message& message) override { return true; } |
167 | 254 |
168 void OnChannelConnected(int32_t peer_pid) override { | 255 void OnChannelConnected(int32_t peer_pid) override { |
169 base::MessageLoop::current()->QuitWhenIdle(); | 256 base::MessageLoop::current()->QuitWhenIdle(); |
170 } | 257 } |
171 }; | 258 }; |
172 | 259 |
173 // A long running process that connects to us. | 260 // A long running process that connects to us. |
174 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoErraticTestClient) { | 261 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoErraticTestClient, |
| 262 ChannelClient) { |
175 ListenerThatQuits listener; | 263 ListenerThatQuits listener; |
176 Connect(&listener); | 264 Connect(&listener); |
177 | 265 |
178 base::RunLoop().Run(); | 266 base::RunLoop().Run(); |
179 | 267 |
180 Close(); | 268 Close(); |
181 } | 269 } |
182 | 270 |
183 TEST_F(IPCChannelMojoTest, SendFailWithPendingMessages) { | 271 TEST_F(IPCChannelMojoTest, SendFailWithPendingMessages) { |
184 Init("IPCChannelMojoErraticTestClient"); | 272 InitWithMojo("IPCChannelMojoErraticTestClient"); |
185 | 273 |
186 // Set up IPC channel and start client. | 274 // Set up IPC channel and start client. |
187 ListenerExpectingErrors listener; | 275 ListenerExpectingErrors listener; |
188 CreateChannel(&listener); | 276 CreateChannel(&listener); |
189 ASSERT_TRUE(ConnectChannel()); | 277 ASSERT_TRUE(ConnectChannel()); |
190 | 278 |
191 // This matches a value in mojo/edk/system/constants.h | 279 // This matches a value in mojo/edk/system/constants.h |
192 const int kMaxMessageNumBytes = 4 * 1024 * 1024; | 280 const int kMaxMessageNumBytes = 4 * 1024 * 1024; |
193 std::string overly_large_data(kMaxMessageNumBytes, '*'); | 281 std::string overly_large_data(kMaxMessageNumBytes, '*'); |
194 // This messages are queued as pending. | 282 // This messages are queued as pending. |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 base::MessageLoop::current()->QuitWhenIdle(); | 406 base::MessageLoop::current()->QuitWhenIdle(); |
319 } | 407 } |
320 | 408 |
321 void set_sender(IPC::Sender* sender) { sender_ = sender; } | 409 void set_sender(IPC::Sender* sender) { sender_ = sender; } |
322 | 410 |
323 private: | 411 private: |
324 IPC::Sender* sender_; | 412 IPC::Sender* sender_; |
325 }; | 413 }; |
326 | 414 |
327 TEST_F(IPCChannelMojoTest, SendMessagePipe) { | 415 TEST_F(IPCChannelMojoTest, SendMessagePipe) { |
328 Init("IPCChannelMojoTestSendMessagePipeClient"); | 416 InitWithMojo("IPCChannelMojoTestSendMessagePipeClient"); |
329 | 417 |
330 ListenerThatExpectsOK listener; | 418 ListenerThatExpectsOK listener; |
331 CreateChannel(&listener); | 419 CreateChannel(&listener); |
332 ASSERT_TRUE(ConnectChannel()); | 420 ASSERT_TRUE(ConnectChannel()); |
333 | 421 |
334 TestingMessagePipe pipe; | 422 TestingMessagePipe pipe; |
335 HandleSendingHelper::WritePipeThenSend(channel(), &pipe); | 423 HandleSendingHelper::WritePipeThenSend(channel(), &pipe); |
336 | 424 |
337 base::RunLoop().Run(); | 425 base::RunLoop().Run(); |
338 channel()->Close(); | 426 channel()->Close(); |
339 | 427 |
340 EXPECT_TRUE(WaitForClientShutdown()); | 428 EXPECT_TRUE(WaitForClientShutdown()); |
341 DestroyChannel(); | 429 DestroyChannel(); |
342 } | 430 } |
343 | 431 |
344 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendMessagePipeClient) { | 432 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendMessagePipeClient, |
| 433 ChannelClient) { |
345 ListenerThatExpectsMessagePipe listener; | 434 ListenerThatExpectsMessagePipe listener; |
346 Connect(&listener); | 435 Connect(&listener); |
347 listener.set_sender(channel()); | 436 listener.set_sender(channel()); |
348 | 437 |
349 base::RunLoop().Run(); | 438 base::RunLoop().Run(); |
350 | 439 |
351 Close(); | 440 Close(); |
352 } | 441 } |
353 | 442 |
354 void ReadOK(mojo::MessagePipeHandle pipe) { | 443 void ReadOK(mojo::MessagePipeHandle pipe) { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 base::MessageLoop::current()->QuitWhenIdle(); | 484 base::MessageLoop::current()->QuitWhenIdle(); |
396 } | 485 } |
397 | 486 |
398 void set_sender(IPC::Sender* sender) { sender_ = sender; } | 487 void set_sender(IPC::Sender* sender) { sender_ = sender; } |
399 | 488 |
400 private: | 489 private: |
401 IPC::Sender* sender_; | 490 IPC::Sender* sender_; |
402 bool receiving_valid_; | 491 bool receiving_valid_; |
403 }; | 492 }; |
404 | 493 |
405 class ParamTraitMessagePipeClient : public IpcChannelMojoTestClient { | 494 class ParamTraitMessagePipeClient : public ChannelClient { |
406 public: | 495 public: |
407 void RunTest(bool receiving_valid_handle) { | 496 void RunTest(bool receiving_valid_handle) { |
408 ListenerThatExpectsMessagePipeUsingParamTrait listener( | 497 ListenerThatExpectsMessagePipeUsingParamTrait listener( |
409 receiving_valid_handle); | 498 receiving_valid_handle); |
410 Connect(&listener); | 499 Connect(&listener); |
411 listener.set_sender(channel()); | 500 listener.set_sender(channel()); |
412 | 501 |
413 base::RunLoop().Run(); | 502 base::RunLoop().Run(); |
414 | 503 |
415 Close(); | 504 Close(); |
416 } | 505 } |
417 }; | 506 }; |
418 | 507 |
419 TEST_F(IPCChannelMojoTest, ParamTraitValidMessagePipe) { | 508 TEST_F(IPCChannelMojoTest, ParamTraitValidMessagePipe) { |
420 Init("ParamTraitValidMessagePipeClient"); | 509 InitWithMojo("ParamTraitValidMessagePipeClient"); |
421 | 510 |
422 ListenerThatExpectsOK listener; | 511 ListenerThatExpectsOK listener; |
423 CreateChannel(&listener); | 512 CreateChannel(&listener); |
424 ASSERT_TRUE(ConnectChannel()); | 513 ASSERT_TRUE(ConnectChannel()); |
425 | 514 |
426 TestingMessagePipe pipe; | 515 TestingMessagePipe pipe; |
427 | 516 |
428 std::unique_ptr<IPC::Message> message(new IPC::Message()); | 517 std::unique_ptr<IPC::Message> message(new IPC::Message()); |
429 IPC::ParamTraits<mojo::MessagePipeHandle>::Write(message.get(), | 518 IPC::ParamTraits<mojo::MessagePipeHandle>::Write(message.get(), |
430 pipe.peer.release()); | 519 pipe.peer.release()); |
431 WriteOK(pipe.self.get()); | 520 WriteOK(pipe.self.get()); |
432 | 521 |
433 channel()->Send(message.release()); | 522 channel()->Send(message.release()); |
434 base::RunLoop().Run(); | 523 base::RunLoop().Run(); |
435 channel()->Close(); | 524 channel()->Close(); |
436 | 525 |
437 EXPECT_TRUE(WaitForClientShutdown()); | 526 EXPECT_TRUE(WaitForClientShutdown()); |
438 DestroyChannel(); | 527 DestroyChannel(); |
439 } | 528 } |
440 | 529 |
441 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE( | 530 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ParamTraitValidMessagePipeClient, |
442 ParamTraitValidMessagePipeClient, | 531 ParamTraitMessagePipeClient) { |
443 ParamTraitMessagePipeClient) { | |
444 RunTest(true); | 532 RunTest(true); |
445 } | 533 } |
446 | 534 |
447 TEST_F(IPCChannelMojoTest, ParamTraitInvalidMessagePipe) { | 535 TEST_F(IPCChannelMojoTest, ParamTraitInvalidMessagePipe) { |
448 Init("ParamTraitInvalidMessagePipeClient"); | 536 InitWithMojo("ParamTraitInvalidMessagePipeClient"); |
449 | 537 |
450 ListenerThatExpectsOK listener; | 538 ListenerThatExpectsOK listener; |
451 CreateChannel(&listener); | 539 CreateChannel(&listener); |
452 ASSERT_TRUE(ConnectChannel()); | 540 ASSERT_TRUE(ConnectChannel()); |
453 | 541 |
454 mojo::MessagePipeHandle invalid_handle; | 542 mojo::MessagePipeHandle invalid_handle; |
455 std::unique_ptr<IPC::Message> message(new IPC::Message()); | 543 std::unique_ptr<IPC::Message> message(new IPC::Message()); |
456 IPC::ParamTraits<mojo::MessagePipeHandle>::Write(message.get(), | 544 IPC::ParamTraits<mojo::MessagePipeHandle>::Write(message.get(), |
457 invalid_handle); | 545 invalid_handle); |
458 | 546 |
459 channel()->Send(message.release()); | 547 channel()->Send(message.release()); |
460 base::RunLoop().Run(); | 548 base::RunLoop().Run(); |
461 channel()->Close(); | 549 channel()->Close(); |
462 | 550 |
463 EXPECT_TRUE(WaitForClientShutdown()); | 551 EXPECT_TRUE(WaitForClientShutdown()); |
464 DestroyChannel(); | 552 DestroyChannel(); |
465 } | 553 } |
466 | 554 |
467 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE( | 555 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ParamTraitInvalidMessagePipeClient, |
468 ParamTraitInvalidMessagePipeClient, | 556 ParamTraitMessagePipeClient) { |
469 ParamTraitMessagePipeClient) { | |
470 RunTest(false); | 557 RunTest(false); |
471 } | 558 } |
472 | 559 |
473 TEST_F(IPCChannelMojoTest, SendFailAfterClose) { | 560 TEST_F(IPCChannelMojoTest, SendFailAfterClose) { |
474 Init("IPCChannelMojoTestSendOkClient"); | 561 InitWithMojo("IPCChannelMojoTestSendOkClient"); |
475 | 562 |
476 ListenerThatExpectsOK listener; | 563 ListenerThatExpectsOK listener; |
477 CreateChannel(&listener); | 564 CreateChannel(&listener); |
478 ASSERT_TRUE(ConnectChannel()); | 565 ASSERT_TRUE(ConnectChannel()); |
479 | 566 |
480 base::RunLoop().Run(); | 567 base::RunLoop().Run(); |
481 channel()->Close(); | 568 channel()->Close(); |
482 ASSERT_FALSE(channel()->Send(new IPC::Message())); | 569 ASSERT_FALSE(channel()->Send(new IPC::Message())); |
483 | 570 |
484 EXPECT_TRUE(WaitForClientShutdown()); | 571 EXPECT_TRUE(WaitForClientShutdown()); |
(...skipping 10 matching lines...) Expand all Loading... |
495 ListenerThatExpectsOK::SendOK(sender_); | 582 ListenerThatExpectsOK::SendOK(sender_); |
496 base::MessageLoop::current()->QuitWhenIdle(); | 583 base::MessageLoop::current()->QuitWhenIdle(); |
497 } | 584 } |
498 | 585 |
499 void set_sender(IPC::Sender* sender) { sender_ = sender; } | 586 void set_sender(IPC::Sender* sender) { sender_ = sender; } |
500 | 587 |
501 private: | 588 private: |
502 IPC::Sender* sender_; | 589 IPC::Sender* sender_; |
503 }; | 590 }; |
504 | 591 |
505 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendOkClient) { | 592 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendOkClient, |
| 593 ChannelClient) { |
506 ListenerSendingOneOk listener; | 594 ListenerSendingOneOk listener; |
507 Connect(&listener); | 595 Connect(&listener); |
508 listener.set_sender(channel()); | 596 listener.set_sender(channel()); |
509 | 597 |
510 base::RunLoop().Run(); | 598 base::RunLoop().Run(); |
511 | 599 |
512 Close(); | 600 Close(); |
513 } | 601 } |
514 | 602 |
515 class ListenerWithSimpleAssociatedInterface | 603 class ListenerWithSimpleAssociatedInterface |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 void set_channel(IPC::Channel* channel) { channel_ = channel; } | 688 void set_channel(IPC::Channel* channel) { channel_ = channel; } |
601 | 689 |
602 private: | 690 private: |
603 static void OnQuitAck() { base::MessageLoop::current()->QuitWhenIdle(); } | 691 static void OnQuitAck() { base::MessageLoop::current()->QuitWhenIdle(); } |
604 | 692 |
605 IPC::Channel* channel_ = nullptr; | 693 IPC::Channel* channel_ = nullptr; |
606 IPC::mojom::SimpleTestDriverAssociatedPtr driver_; | 694 IPC::mojom::SimpleTestDriverAssociatedPtr driver_; |
607 }; | 695 }; |
608 | 696 |
609 TEST_F(IPCChannelMojoTest, SimpleAssociatedInterface) { | 697 TEST_F(IPCChannelMojoTest, SimpleAssociatedInterface) { |
610 Init("SimpleAssociatedInterfaceClient"); | 698 InitWithMojo("SimpleAssociatedInterfaceClient"); |
611 | 699 |
612 ListenerWithSimpleAssociatedInterface listener; | 700 ListenerWithSimpleAssociatedInterface listener; |
613 CreateChannel(&listener); | 701 CreateChannel(&listener); |
614 ASSERT_TRUE(ConnectChannel()); | 702 ASSERT_TRUE(ConnectChannel()); |
615 | 703 |
616 listener.RegisterInterfaceFactory(channel()); | 704 listener.RegisterInterfaceFactory(channel()); |
617 | 705 |
618 base::RunLoop().Run(); | 706 base::RunLoop().Run(); |
619 channel()->Close(); | 707 channel()->Close(); |
620 | 708 |
621 EXPECT_TRUE(WaitForClientShutdown()); | 709 EXPECT_TRUE(WaitForClientShutdown()); |
622 DestroyChannel(); | 710 DestroyChannel(); |
623 } | 711 } |
624 | 712 |
625 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(SimpleAssociatedInterfaceClient) { | 713 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(SimpleAssociatedInterfaceClient, |
| 714 ChannelClient) { |
626 ListenerSendingAssociatedMessages listener; | 715 ListenerSendingAssociatedMessages listener; |
627 Connect(&listener); | 716 Connect(&listener); |
628 listener.set_channel(channel()); | 717 listener.set_channel(channel()); |
629 | 718 |
630 base::RunLoop().Run(); | 719 base::RunLoop().Run(); |
631 | 720 |
632 Close(); | 721 Close(); |
633 } | 722 } |
634 | 723 |
635 class ChannelProxyRunner { | 724 class ChannelProxyRunner { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
670 mojo::ScopedMessagePipeHandle handle_; | 759 mojo::ScopedMessagePipeHandle handle_; |
671 base::Thread io_thread_; | 760 base::Thread io_thread_; |
672 std::unique_ptr<IPC::ChannelProxy> proxy_; | 761 std::unique_ptr<IPC::ChannelProxy> proxy_; |
673 base::WaitableEvent never_signaled_; | 762 base::WaitableEvent never_signaled_; |
674 | 763 |
675 DISALLOW_COPY_AND_ASSIGN(ChannelProxyRunner); | 764 DISALLOW_COPY_AND_ASSIGN(ChannelProxyRunner); |
676 }; | 765 }; |
677 | 766 |
678 class IPCChannelProxyMojoTest : public IPCChannelMojoTestBase { | 767 class IPCChannelProxyMojoTest : public IPCChannelMojoTestBase { |
679 public: | 768 public: |
680 void Init(const std::string& client_name) { | 769 void InitWithMojo(const std::string& client_name) { |
681 IPCChannelMojoTestBase::Init(client_name); | 770 IPCChannelMojoTestBase::InitWithMojo(client_name); |
682 runner_.reset(new ChannelProxyRunner(TakeHandle(), true)); | 771 runner_.reset(new ChannelProxyRunner(TakeHandle(), true)); |
683 } | 772 } |
684 void CreateProxy(IPC::Listener* listener) { runner_->CreateProxy(listener); } | 773 void CreateProxy(IPC::Listener* listener) { runner_->CreateProxy(listener); } |
685 void RunProxy() { | 774 void RunProxy() { |
686 runner_->RunProxy(); | 775 runner_->RunProxy(); |
687 } | 776 } |
688 void DestroyProxy() { | 777 void DestroyProxy() { |
689 runner_.reset(); | 778 runner_.reset(); |
690 base::RunLoop().RunUntilIdle(); | 779 base::RunLoop().RunUntilIdle(); |
691 } | 780 } |
692 | 781 |
693 IPC::ChannelProxy* proxy() { return runner_->proxy(); } | 782 IPC::ChannelProxy* proxy() { return runner_->proxy(); } |
694 | 783 |
695 private: | 784 private: |
| 785 base::MessageLoop message_loop_; |
696 std::unique_ptr<ChannelProxyRunner> runner_; | 786 std::unique_ptr<ChannelProxyRunner> runner_; |
697 }; | 787 }; |
698 | 788 |
699 class ListenerWithSimpleProxyAssociatedInterface | 789 class ListenerWithSimpleProxyAssociatedInterface |
700 : public IPC::Listener, | 790 : public IPC::Listener, |
701 public IPC::mojom::SimpleTestDriver { | 791 public IPC::mojom::SimpleTestDriver { |
702 public: | 792 public: |
703 static const int kNumMessages; | 793 static const int kNumMessages; |
704 | 794 |
705 ListenerWithSimpleProxyAssociatedInterface() : binding_(this) {} | 795 ListenerWithSimpleProxyAssociatedInterface() : binding_(this) {} |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 int32_t next_expected_value_ = 0; | 851 int32_t next_expected_value_ = 0; |
762 int num_messages_received_ = 0; | 852 int num_messages_received_ = 0; |
763 bool received_quit_ = false; | 853 bool received_quit_ = false; |
764 | 854 |
765 mojo::AssociatedBinding<IPC::mojom::SimpleTestDriver> binding_; | 855 mojo::AssociatedBinding<IPC::mojom::SimpleTestDriver> binding_; |
766 }; | 856 }; |
767 | 857 |
768 const int ListenerWithSimpleProxyAssociatedInterface::kNumMessages = 1000; | 858 const int ListenerWithSimpleProxyAssociatedInterface::kNumMessages = 1000; |
769 | 859 |
770 TEST_F(IPCChannelProxyMojoTest, ProxyThreadAssociatedInterface) { | 860 TEST_F(IPCChannelProxyMojoTest, ProxyThreadAssociatedInterface) { |
771 Init("ProxyThreadAssociatedInterfaceClient"); | 861 InitWithMojo("ProxyThreadAssociatedInterfaceClient"); |
772 | 862 |
773 ListenerWithSimpleProxyAssociatedInterface listener; | 863 ListenerWithSimpleProxyAssociatedInterface listener; |
774 CreateProxy(&listener); | 864 CreateProxy(&listener); |
775 RunProxy(); | 865 RunProxy(); |
776 | 866 |
777 base::RunLoop().Run(); | 867 base::RunLoop().Run(); |
778 | 868 |
779 EXPECT_TRUE(WaitForClientShutdown()); | 869 EXPECT_TRUE(WaitForClientShutdown()); |
780 EXPECT_TRUE(listener.received_all_messages()); | 870 EXPECT_TRUE(listener.received_all_messages()); |
781 | 871 |
(...skipping 27 matching lines...) Expand all Loading... |
809 base::MessageLoop message_loop_; | 899 base::MessageLoop message_loop_; |
810 std::unique_ptr<ChannelProxyRunner> runner_; | 900 std::unique_ptr<ChannelProxyRunner> runner_; |
811 }; | 901 }; |
812 | 902 |
813 class DummyListener : public IPC::Listener { | 903 class DummyListener : public IPC::Listener { |
814 public: | 904 public: |
815 // IPC::Listener | 905 // IPC::Listener |
816 bool OnMessageReceived(const IPC::Message& message) override { return true; } | 906 bool OnMessageReceived(const IPC::Message& message) override { return true; } |
817 }; | 907 }; |
818 | 908 |
819 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE( | 909 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(ProxyThreadAssociatedInterfaceClient, |
820 ProxyThreadAssociatedInterfaceClient, | 910 ChannelProxyClient) { |
821 ChannelProxyClient) { | |
822 DummyListener listener; | 911 DummyListener listener; |
823 CreateProxy(&listener); | 912 CreateProxy(&listener); |
824 RunProxy(); | 913 RunProxy(); |
825 | 914 |
826 // Send a bunch of interleaved messages, alternating between the associated | 915 // Send a bunch of interleaved messages, alternating between the associated |
827 // interface and a legacy IPC::Message. | 916 // interface and a legacy IPC::Message. |
828 IPC::mojom::SimpleTestDriverAssociatedPtr driver; | 917 IPC::mojom::SimpleTestDriverAssociatedPtr driver; |
829 proxy()->GetRemoteAssociatedInterface(&driver); | 918 proxy()->GetRemoteAssociatedInterface(&driver); |
830 for (int i = 0; i < ListenerWithSimpleProxyAssociatedInterface::kNumMessages; | 919 for (int i = 0; i < ListenerWithSimpleProxyAssociatedInterface::kNumMessages; |
831 ++i) { | 920 ++i) { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
881 mojo::AssociatedBinding<IPC::mojom::PingReceiver> ping_receiver_binding_; | 970 mojo::AssociatedBinding<IPC::mojom::PingReceiver> ping_receiver_binding_; |
882 | 971 |
883 base::Closure ping_handler_; | 972 base::Closure ping_handler_; |
884 }; | 973 }; |
885 | 974 |
886 TEST_F(IPCChannelProxyMojoTest, ProxyThreadAssociatedInterfaceIndirect) { | 975 TEST_F(IPCChannelProxyMojoTest, ProxyThreadAssociatedInterfaceIndirect) { |
887 // Tests that we can pipeline interface requests and subsequent messages | 976 // Tests that we can pipeline interface requests and subsequent messages |
888 // targeting proxy thread bindings, and the channel will still dispatch | 977 // targeting proxy thread bindings, and the channel will still dispatch |
889 // messages appropriately. | 978 // messages appropriately. |
890 | 979 |
891 Init("ProxyThreadAssociatedInterfaceIndirectClient"); | 980 InitWithMojo("ProxyThreadAssociatedInterfaceIndirectClient"); |
892 | 981 |
893 ListenerWithIndirectProxyAssociatedInterface listener; | 982 ListenerWithIndirectProxyAssociatedInterface listener; |
894 CreateProxy(&listener); | 983 CreateProxy(&listener); |
895 listener.RegisterInterfaceFactory(proxy()); | 984 listener.RegisterInterfaceFactory(proxy()); |
896 RunProxy(); | 985 RunProxy(); |
897 | 986 |
898 base::RunLoop loop; | 987 base::RunLoop loop; |
899 listener.set_ping_handler(loop.QuitClosure()); | 988 listener.set_ping_handler(loop.QuitClosure()); |
900 loop.Run(); | 989 loop.Run(); |
901 | 990 |
902 EXPECT_TRUE(WaitForClientShutdown()); | 991 EXPECT_TRUE(WaitForClientShutdown()); |
903 | 992 |
904 DestroyProxy(); | 993 DestroyProxy(); |
905 } | 994 } |
906 | 995 |
907 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE( | 996 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT( |
908 ProxyThreadAssociatedInterfaceIndirectClient, | 997 ProxyThreadAssociatedInterfaceIndirectClient, |
909 ChannelProxyClient) { | 998 ChannelProxyClient) { |
910 DummyListener listener; | 999 DummyListener listener; |
911 CreateProxy(&listener); | 1000 CreateProxy(&listener); |
912 RunProxy(); | 1001 RunProxy(); |
913 | 1002 |
914 // Use an interface requested via another interface. On the remote end both | 1003 // Use an interface requested via another interface. On the remote end both |
915 // interfaces are bound on the proxy thread. This ensures that the Ping | 1004 // interfaces are bound on the proxy thread. This ensures that the Ping |
916 // message we send will still be dispatched properly even though the remote | 1005 // message we send will still be dispatched properly even though the remote |
917 // endpoint may not have been bound yet by the time the message is initially | 1006 // endpoint may not have been bound yet by the time the message is initially |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 return false; | 1103 return false; |
1015 return true; | 1104 return true; |
1016 } | 1105 } |
1017 | 1106 |
1018 int32_t* storage_; | 1107 int32_t* storage_; |
1019 | 1108 |
1020 DISALLOW_COPY_AND_ASSIGN(SyncReplyReader); | 1109 DISALLOW_COPY_AND_ASSIGN(SyncReplyReader); |
1021 }; | 1110 }; |
1022 | 1111 |
1023 TEST_F(IPCChannelProxyMojoTest, SyncAssociatedInterface) { | 1112 TEST_F(IPCChannelProxyMojoTest, SyncAssociatedInterface) { |
1024 Init("SyncAssociatedInterface"); | 1113 InitWithMojo("SyncAssociatedInterface"); |
1025 | 1114 |
1026 ListenerWithSyncAssociatedInterface listener; | 1115 ListenerWithSyncAssociatedInterface listener; |
1027 CreateProxy(&listener); | 1116 CreateProxy(&listener); |
1028 listener.set_sync_sender(proxy()); | 1117 listener.set_sync_sender(proxy()); |
1029 listener.RegisterInterfaceFactory(proxy()); | 1118 listener.RegisterInterfaceFactory(proxy()); |
1030 RunProxy(); | 1119 RunProxy(); |
1031 | 1120 |
1032 // Run the client's simple sanity check to completion. | 1121 // Run the client's simple sanity check to completion. |
1033 listener.RunUntilQuitRequested(); | 1122 listener.RunUntilQuitRequested(); |
1034 | 1123 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1120 | 1209 |
1121 bool use_sync_sender_ = false; | 1210 bool use_sync_sender_ = false; |
1122 mojo::AssociatedBinding<IPC::mojom::SimpleTestClient> binding_; | 1211 mojo::AssociatedBinding<IPC::mojom::SimpleTestClient> binding_; |
1123 IPC::Sender* sync_sender_ = nullptr; | 1212 IPC::Sender* sync_sender_ = nullptr; |
1124 IPC::mojom::SimpleTestDriver* driver_ = nullptr; | 1213 IPC::mojom::SimpleTestDriver* driver_ = nullptr; |
1125 std::unique_ptr<base::RunLoop> run_loop_; | 1214 std::unique_ptr<base::RunLoop> run_loop_; |
1126 | 1215 |
1127 DISALLOW_COPY_AND_ASSIGN(SimpleTestClientImpl); | 1216 DISALLOW_COPY_AND_ASSIGN(SimpleTestClientImpl); |
1128 }; | 1217 }; |
1129 | 1218 |
1130 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE(SyncAssociatedInterface, | 1219 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(SyncAssociatedInterface, |
1131 ChannelProxyClient) { | 1220 ChannelProxyClient) { |
1132 SimpleTestClientImpl client_impl; | 1221 SimpleTestClientImpl client_impl; |
1133 CreateProxy(&client_impl); | 1222 CreateProxy(&client_impl); |
1134 client_impl.set_sync_sender(proxy()); | 1223 client_impl.set_sync_sender(proxy()); |
1135 proxy()->AddAssociatedInterface(base::Bind(&SimpleTestClientImpl::BindRequest, | 1224 proxy()->AddAssociatedInterface(base::Bind(&SimpleTestClientImpl::BindRequest, |
1136 base::Unretained(&client_impl))); | 1225 base::Unretained(&client_impl))); |
1137 RunProxy(); | 1226 RunProxy(); |
1138 | 1227 |
1139 IPC::mojom::SimpleTestDriverAssociatedPtr driver; | 1228 IPC::mojom::SimpleTestDriverAssociatedPtr driver; |
1140 proxy()->GetRemoteAssociatedInterface(&driver); | 1229 proxy()->GetRemoteAssociatedInterface(&driver); |
1141 client_impl.set_driver(driver.get()); | 1230 client_impl.set_driver(driver.get()); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1180 // Send(E) | 1269 // Send(E) |
1181 // Flush() | 1270 // Flush() |
1182 // | 1271 // |
1183 // must result in the other end receiving messages A, D, E, B, D; in that | 1272 // must result in the other end receiving messages A, D, E, B, D; in that |
1184 // order. | 1273 // order. |
1185 // | 1274 // |
1186 // This behavior is required by some consumers of IPC::Channel, and it is not | 1275 // This behavior is required by some consumers of IPC::Channel, and it is not |
1187 // sufficient to leave this up to the consumer to implement since associated | 1276 // sufficient to leave this up to the consumer to implement since associated |
1188 // interface requests and messages also need to be queued according to the | 1277 // interface requests and messages also need to be queued according to the |
1189 // same policy. | 1278 // same policy. |
1190 Init("CreatePausedClient"); | 1279 InitWithMojo("CreatePausedClient"); |
1191 | 1280 |
1192 DummyListener listener; | 1281 DummyListener listener; |
1193 CreateProxy(&listener); | 1282 CreateProxy(&listener); |
1194 RunProxy(); | 1283 RunProxy(); |
1195 | 1284 |
1196 // This message must be sent immediately since the channel is unpaused. | 1285 // This message must be sent immediately since the channel is unpaused. |
1197 SendValue(proxy(), 1); | 1286 SendValue(proxy(), 1); |
1198 | 1287 |
1199 proxy()->Pause(); | 1288 proxy()->Pause(); |
1200 | 1289 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 base::MessageLoop::current()->QuitWhenIdle(); | 1322 base::MessageLoop::current()->QuitWhenIdle(); |
1234 return true; | 1323 return true; |
1235 } | 1324 } |
1236 | 1325 |
1237 private: | 1326 private: |
1238 std::queue<int32_t>* expected_values_; | 1327 std::queue<int32_t>* expected_values_; |
1239 | 1328 |
1240 DISALLOW_COPY_AND_ASSIGN(ExpectValueSequenceListener); | 1329 DISALLOW_COPY_AND_ASSIGN(ExpectValueSequenceListener); |
1241 }; | 1330 }; |
1242 | 1331 |
1243 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT_WITH_CUSTOM_FIXTURE(CreatePausedClient, | 1332 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(CreatePausedClient, ChannelProxyClient) { |
1244 ChannelProxyClient) { | |
1245 std::queue<int32_t> expected_values; | 1333 std::queue<int32_t> expected_values; |
1246 ExpectValueSequenceListener listener(&expected_values); | 1334 ExpectValueSequenceListener listener(&expected_values); |
1247 CreateProxy(&listener); | 1335 CreateProxy(&listener); |
1248 expected_values.push(1); | 1336 expected_values.push(1); |
1249 expected_values.push(4); | 1337 expected_values.push(4); |
1250 expected_values.push(5); | 1338 expected_values.push(5); |
1251 expected_values.push(2); | 1339 expected_values.push(2); |
1252 expected_values.push(3); | 1340 expected_values.push(3); |
1253 RunProxy(); | 1341 RunProxy(); |
1254 base::RunLoop().Run(); | 1342 base::RunLoop().Run(); |
(...skipping 20 matching lines...) Expand all Loading... |
1275 base::MessageLoop::current()->QuitWhenIdle(); | 1363 base::MessageLoop::current()->QuitWhenIdle(); |
1276 } | 1364 } |
1277 | 1365 |
1278 void set_sender(IPC::Sender* sender) { sender_ = sender; } | 1366 void set_sender(IPC::Sender* sender) { sender_ = sender; } |
1279 | 1367 |
1280 private: | 1368 private: |
1281 IPC::Sender* sender_; | 1369 IPC::Sender* sender_; |
1282 }; | 1370 }; |
1283 | 1371 |
1284 TEST_F(IPCChannelMojoTest, SendPlatformHandle) { | 1372 TEST_F(IPCChannelMojoTest, SendPlatformHandle) { |
1285 Init("IPCChannelMojoTestSendPlatformHandleClient"); | 1373 InitWithMojo("IPCChannelMojoTestSendPlatformHandleClient"); |
1286 | 1374 |
1287 ListenerThatExpectsOK listener; | 1375 ListenerThatExpectsOK listener; |
1288 CreateChannel(&listener); | 1376 CreateChannel(&listener); |
1289 ASSERT_TRUE(ConnectChannel()); | 1377 ASSERT_TRUE(ConnectChannel()); |
1290 | 1378 |
1291 base::ScopedTempDir temp_dir; | 1379 base::ScopedTempDir temp_dir; |
1292 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 1380 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
1293 base::File file(HandleSendingHelper::GetSendingFilePath(temp_dir.GetPath()), | 1381 base::File file(HandleSendingHelper::GetSendingFilePath(temp_dir.GetPath()), |
1294 base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | | 1382 base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | |
1295 base::File::FLAG_READ); | 1383 base::File::FLAG_READ); |
1296 HandleSendingHelper::WriteFileThenSend(channel(), file); | 1384 HandleSendingHelper::WriteFileThenSend(channel(), file); |
1297 base::RunLoop().Run(); | 1385 base::RunLoop().Run(); |
1298 | 1386 |
1299 channel()->Close(); | 1387 channel()->Close(); |
1300 | 1388 |
1301 EXPECT_TRUE(WaitForClientShutdown()); | 1389 EXPECT_TRUE(WaitForClientShutdown()); |
1302 DestroyChannel(); | 1390 DestroyChannel(); |
1303 } | 1391 } |
1304 | 1392 |
1305 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT( | 1393 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestSendPlatformHandleClient, |
1306 IPCChannelMojoTestSendPlatformHandleClient) { | 1394 ChannelClient) { |
1307 ListenerThatExpectsFile listener; | 1395 ListenerThatExpectsFile listener; |
1308 Connect(&listener); | 1396 Connect(&listener); |
1309 listener.set_sender(channel()); | 1397 listener.set_sender(channel()); |
1310 | 1398 |
1311 base::RunLoop().Run(); | 1399 base::RunLoop().Run(); |
1312 | 1400 |
1313 Close(); | 1401 Close(); |
1314 } | 1402 } |
1315 | 1403 |
1316 class ListenerThatExpectsFileAndPipe : public IPC::Listener { | 1404 class ListenerThatExpectsFileAndPipe : public IPC::Listener { |
(...skipping 14 matching lines...) Expand all Loading... |
1331 base::MessageLoop::current()->QuitWhenIdle(); | 1419 base::MessageLoop::current()->QuitWhenIdle(); |
1332 } | 1420 } |
1333 | 1421 |
1334 void set_sender(IPC::Sender* sender) { sender_ = sender; } | 1422 void set_sender(IPC::Sender* sender) { sender_ = sender; } |
1335 | 1423 |
1336 private: | 1424 private: |
1337 IPC::Sender* sender_; | 1425 IPC::Sender* sender_; |
1338 }; | 1426 }; |
1339 | 1427 |
1340 TEST_F(IPCChannelMojoTest, SendPlatformHandleAndPipe) { | 1428 TEST_F(IPCChannelMojoTest, SendPlatformHandleAndPipe) { |
1341 Init("IPCChannelMojoTestSendPlatformHandleAndPipeClient"); | 1429 InitWithMojo("IPCChannelMojoTestSendPlatformHandleAndPipeClient"); |
1342 | 1430 |
1343 ListenerThatExpectsOK listener; | 1431 ListenerThatExpectsOK listener; |
1344 CreateChannel(&listener); | 1432 CreateChannel(&listener); |
1345 ASSERT_TRUE(ConnectChannel()); | 1433 ASSERT_TRUE(ConnectChannel()); |
1346 | 1434 |
1347 base::ScopedTempDir temp_dir; | 1435 base::ScopedTempDir temp_dir; |
1348 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 1436 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
1349 base::File file(HandleSendingHelper::GetSendingFilePath(temp_dir.GetPath()), | 1437 base::File file(HandleSendingHelper::GetSendingFilePath(temp_dir.GetPath()), |
1350 base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | | 1438 base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE | |
1351 base::File::FLAG_READ); | 1439 base::File::FLAG_READ); |
1352 TestingMessagePipe pipe; | 1440 TestingMessagePipe pipe; |
1353 HandleSendingHelper::WriteFileAndPipeThenSend(channel(), file, &pipe); | 1441 HandleSendingHelper::WriteFileAndPipeThenSend(channel(), file, &pipe); |
1354 | 1442 |
1355 base::RunLoop().Run(); | 1443 base::RunLoop().Run(); |
1356 channel()->Close(); | 1444 channel()->Close(); |
1357 | 1445 |
1358 EXPECT_TRUE(WaitForClientShutdown()); | 1446 EXPECT_TRUE(WaitForClientShutdown()); |
1359 DestroyChannel(); | 1447 DestroyChannel(); |
1360 } | 1448 } |
1361 | 1449 |
1362 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT( | 1450 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT( |
1363 IPCChannelMojoTestSendPlatformHandleAndPipeClient) { | 1451 IPCChannelMojoTestSendPlatformHandleAndPipeClient, |
| 1452 ChannelClient) { |
1364 ListenerThatExpectsFileAndPipe listener; | 1453 ListenerThatExpectsFileAndPipe listener; |
1365 Connect(&listener); | 1454 Connect(&listener); |
1366 listener.set_sender(channel()); | 1455 listener.set_sender(channel()); |
1367 | 1456 |
1368 base::RunLoop().Run(); | 1457 base::RunLoop().Run(); |
1369 | 1458 |
1370 Close(); | 1459 Close(); |
1371 } | 1460 } |
1372 | 1461 |
1373 #endif // defined(OS_POSIX) | 1462 #endif // defined(OS_POSIX) |
1374 | 1463 |
1375 #if defined(OS_LINUX) | 1464 #if defined(OS_LINUX) |
1376 | 1465 |
1377 const base::ProcessId kMagicChildId = 54321; | 1466 const base::ProcessId kMagicChildId = 54321; |
1378 | 1467 |
1379 class ListenerThatVerifiesPeerPid : public IPC::Listener { | 1468 class ListenerThatVerifiesPeerPid : public IPC::Listener { |
1380 public: | 1469 public: |
1381 void OnChannelConnected(int32_t peer_pid) override { | 1470 void OnChannelConnected(int32_t peer_pid) override { |
1382 EXPECT_EQ(peer_pid, kMagicChildId); | 1471 EXPECT_EQ(peer_pid, kMagicChildId); |
1383 base::MessageLoop::current()->QuitWhenIdle(); | 1472 base::MessageLoop::current()->QuitWhenIdle(); |
1384 } | 1473 } |
1385 | 1474 |
1386 bool OnMessageReceived(const IPC::Message& message) override { | 1475 bool OnMessageReceived(const IPC::Message& message) override { |
1387 NOTREACHED(); | 1476 NOTREACHED(); |
1388 return true; | 1477 return true; |
1389 } | 1478 } |
1390 }; | 1479 }; |
1391 | 1480 |
1392 TEST_F(IPCChannelMojoTest, VerifyGlobalPid) { | 1481 TEST_F(IPCChannelMojoTest, VerifyGlobalPid) { |
1393 Init("IPCChannelMojoTestVerifyGlobalPidClient"); | 1482 InitWithMojo("IPCChannelMojoTestVerifyGlobalPidClient"); |
1394 | 1483 |
1395 ListenerThatVerifiesPeerPid listener; | 1484 ListenerThatVerifiesPeerPid listener; |
1396 CreateChannel(&listener); | 1485 CreateChannel(&listener); |
1397 ASSERT_TRUE(ConnectChannel()); | 1486 ASSERT_TRUE(ConnectChannel()); |
1398 | 1487 |
1399 base::RunLoop().Run(); | 1488 base::RunLoop().Run(); |
1400 channel()->Close(); | 1489 channel()->Close(); |
1401 | 1490 |
1402 EXPECT_TRUE(WaitForClientShutdown()); | 1491 EXPECT_TRUE(WaitForClientShutdown()); |
1403 DestroyChannel(); | 1492 DestroyChannel(); |
1404 } | 1493 } |
1405 | 1494 |
1406 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestVerifyGlobalPidClient) { | 1495 DEFINE_IPC_CHANNEL_MOJO_TEST_CLIENT(IPCChannelMojoTestVerifyGlobalPidClient, |
| 1496 ChannelClient) { |
1407 IPC::Channel::SetGlobalPid(kMagicChildId); | 1497 IPC::Channel::SetGlobalPid(kMagicChildId); |
1408 ListenerThatQuits listener; | 1498 ListenerThatQuits listener; |
1409 Connect(&listener); | 1499 Connect(&listener); |
1410 | 1500 |
1411 base::RunLoop().Run(); | 1501 base::RunLoop().Run(); |
1412 | 1502 |
1413 Close(); | 1503 Close(); |
1414 } | 1504 } |
1415 | 1505 |
1416 #endif // OS_LINUX | 1506 #endif // OS_LINUX |
1417 | 1507 |
1418 } // namespace | 1508 } // namespace |
OLD | NEW |