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 <stdint.h> | 5 #include <stdint.h> |
6 #include <stdio.h> | 6 #include <stdio.h> |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <utility> | 10 #include <utility> |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 using mojo::platform::PlatformSharedBufferMapping; | 43 using mojo::platform::PlatformSharedBufferMapping; |
44 using mojo::platform::ScopedPlatformHandle; | 44 using mojo::platform::ScopedPlatformHandle; |
45 using mojo::platform::ThreadSleep; | 45 using mojo::platform::ThreadSleep; |
46 using mojo::util::MakeRefCounted; | 46 using mojo::util::MakeRefCounted; |
47 using mojo::util::RefPtr; | 47 using mojo::util::RefPtr; |
48 | 48 |
49 namespace mojo { | 49 namespace mojo { |
50 namespace system { | 50 namespace system { |
51 namespace { | 51 namespace { |
52 | 52 |
53 const MojoHandleSignals kAllSignals = MOJO_HANDLE_SIGNAL_READABLE | | |
54 MOJO_HANDLE_SIGNAL_WRITABLE | | |
55 MOJO_HANDLE_SIGNAL_PEER_CLOSED; | |
56 | |
57 class RemoteMessagePipeTest : public testing::Test { | 53 class RemoteMessagePipeTest : public testing::Test { |
58 public: | 54 public: |
59 RemoteMessagePipeTest() | 55 RemoteMessagePipeTest() |
60 : platform_support_(embedder::CreateSimplePlatformSupport()), | 56 : platform_support_(embedder::CreateSimplePlatformSupport()), |
61 io_thread_(test::TestIOThread::StartMode::AUTO) {} | 57 io_thread_(test::TestIOThread::StartMode::AUTO) {} |
62 ~RemoteMessagePipeTest() override {} | 58 ~RemoteMessagePipeTest() override {} |
63 | 59 |
64 void SetUp() override { | 60 void SetUp() override { |
65 io_thread_.PostTaskAndWait([this]() { SetUpOnIOThread(); }); | 61 io_thread_.PostTaskAndWait([this]() { SetUpOnIOThread(); }); |
66 } | 62 } |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 205 mp0->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
210 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 206 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
211 | 207 |
212 // Wait. | 208 // Wait. |
213 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 209 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
214 EXPECT_EQ(123u, context); | 210 EXPECT_EQ(123u, context); |
215 hss = HandleSignalsState(); | 211 hss = HandleSignalsState(); |
216 mp1->RemoveAwakable(1, &waiter, &hss); | 212 mp1->RemoveAwakable(1, &waiter, &hss); |
217 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 213 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
218 hss.satisfied_signals); | 214 hss.satisfied_signals); |
219 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 215 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 216 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 217 hss.satisfiable_signals); |
220 | 218 |
221 // Read from MP 1, port 1. | 219 // Read from MP 1, port 1. |
222 EXPECT_EQ(MOJO_RESULT_OK, | 220 EXPECT_EQ(MOJO_RESULT_OK, |
223 mp1->ReadMessage(1, UserPointer<void>(buffer), | 221 mp1->ReadMessage(1, UserPointer<void>(buffer), |
224 MakeUserPointer(&buffer_size), nullptr, nullptr, | 222 MakeUserPointer(&buffer_size), nullptr, nullptr, |
225 MOJO_READ_MESSAGE_FLAG_NONE)); | 223 MOJO_READ_MESSAGE_FLAG_NONE)); |
226 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | 224 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); |
227 EXPECT_STREQ(kHello, buffer); | 225 EXPECT_STREQ(kHello, buffer); |
228 | 226 |
229 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. | 227 // Write in the other direction: MP 1, port 1 -> ... -> MP 0, port 0. |
230 | 228 |
231 waiter.Init(); | 229 waiter.Init(); |
232 ASSERT_EQ( | 230 ASSERT_EQ( |
233 MOJO_RESULT_OK, | 231 MOJO_RESULT_OK, |
234 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr)); | 232 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr)); |
235 | 233 |
236 EXPECT_EQ( | 234 EXPECT_EQ( |
237 MOJO_RESULT_OK, | 235 MOJO_RESULT_OK, |
238 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), | 236 mp1->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), |
239 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 237 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
240 | 238 |
241 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 239 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
242 EXPECT_EQ(456u, context); | 240 EXPECT_EQ(456u, context); |
243 hss = HandleSignalsState(); | 241 hss = HandleSignalsState(); |
244 mp0->RemoveAwakable(0, &waiter, &hss); | 242 mp0->RemoveAwakable(0, &waiter, &hss); |
245 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 243 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
246 hss.satisfied_signals); | 244 hss.satisfied_signals); |
247 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 245 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 246 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 247 hss.satisfiable_signals); |
248 | 248 |
249 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 249 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
250 EXPECT_EQ(MOJO_RESULT_OK, | 250 EXPECT_EQ(MOJO_RESULT_OK, |
251 mp0->ReadMessage(0, UserPointer<void>(buffer), | 251 mp0->ReadMessage(0, UserPointer<void>(buffer), |
252 MakeUserPointer(&buffer_size), nullptr, nullptr, | 252 MakeUserPointer(&buffer_size), nullptr, nullptr, |
253 MOJO_READ_MESSAGE_FLAG_NONE)); | 253 MOJO_READ_MESSAGE_FLAG_NONE)); |
254 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); | 254 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); |
255 EXPECT_STREQ(kWorld, buffer); | 255 EXPECT_STREQ(kWorld, buffer); |
256 | 256 |
257 // Close MP 0, port 0. | 257 // Close MP 0, port 0. |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()), | 361 mp0->WriteMessage(0, UserPointer<const void>(endpoint_info.get()), |
362 static_cast<uint32_t>(endpoint_info_size), | 362 static_cast<uint32_t>(endpoint_info_size), |
363 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 363 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
364 | 364 |
365 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 365 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
366 EXPECT_EQ(123u, context); | 366 EXPECT_EQ(123u, context); |
367 hss = HandleSignalsState(); | 367 hss = HandleSignalsState(); |
368 mp1->RemoveAwakable(1, &waiter, &hss); | 368 mp1->RemoveAwakable(1, &waiter, &hss); |
369 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 369 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
370 hss.satisfied_signals); | 370 hss.satisfied_signals); |
371 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 371 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 372 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 373 hss.satisfiable_signals); |
372 | 374 |
373 EXPECT_EQ(endpoint_info_size, channels(1)->GetSerializedEndpointSize()); | 375 EXPECT_EQ(endpoint_info_size, channels(1)->GetSerializedEndpointSize()); |
374 std::unique_ptr<char[]> received_endpoint_info(new char[endpoint_info_size]); | 376 std::unique_ptr<char[]> received_endpoint_info(new char[endpoint_info_size]); |
375 buffer_size = static_cast<uint32_t>(endpoint_info_size); | 377 buffer_size = static_cast<uint32_t>(endpoint_info_size); |
376 EXPECT_EQ(MOJO_RESULT_OK, | 378 EXPECT_EQ(MOJO_RESULT_OK, |
377 mp1->ReadMessage(1, UserPointer<void>(received_endpoint_info.get()), | 379 mp1->ReadMessage(1, UserPointer<void>(received_endpoint_info.get()), |
378 MakeUserPointer(&buffer_size), nullptr, nullptr, | 380 MakeUserPointer(&buffer_size), nullptr, nullptr, |
379 MOJO_READ_MESSAGE_FLAG_NONE)); | 381 MOJO_READ_MESSAGE_FLAG_NONE)); |
380 EXPECT_EQ(endpoint_info_size, static_cast<size_t>(buffer_size)); | 382 EXPECT_EQ(endpoint_info_size, static_cast<size_t>(buffer_size)); |
381 EXPECT_EQ(0, memcmp(received_endpoint_info.get(), endpoint_info.get(), | 383 EXPECT_EQ(0, memcmp(received_endpoint_info.get(), endpoint_info.get(), |
(...skipping 17 matching lines...) Expand all Loading... |
399 MOJO_RESULT_OK, | 401 MOJO_RESULT_OK, |
400 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), | 402 mp2->WriteMessage(0, UserPointer<const void>(kHello), sizeof(kHello), |
401 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 403 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
402 | 404 |
403 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 405 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
404 EXPECT_EQ(789u, context); | 406 EXPECT_EQ(789u, context); |
405 hss = HandleSignalsState(); | 407 hss = HandleSignalsState(); |
406 mp3->RemoveAwakable(0, &waiter, &hss); | 408 mp3->RemoveAwakable(0, &waiter, &hss); |
407 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 409 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
408 hss.satisfied_signals); | 410 hss.satisfied_signals); |
409 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 411 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 412 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 413 hss.satisfiable_signals); |
410 | 414 |
411 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0. | 415 // Make sure there's nothing on MP 0, port 0 or MP 1, port 1 or MP 2, port 0. |
412 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 416 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
413 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 417 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
414 mp0->ReadMessage(0, UserPointer<void>(buffer), | 418 mp0->ReadMessage(0, UserPointer<void>(buffer), |
415 MakeUserPointer(&buffer_size), nullptr, nullptr, | 419 MakeUserPointer(&buffer_size), nullptr, nullptr, |
416 MOJO_READ_MESSAGE_FLAG_NONE)); | 420 MOJO_READ_MESSAGE_FLAG_NONE)); |
417 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 421 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
418 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 422 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
419 mp1->ReadMessage(1, UserPointer<void>(buffer), | 423 mp1->ReadMessage(1, UserPointer<void>(buffer), |
(...skipping 25 matching lines...) Expand all Loading... |
445 MOJO_RESULT_OK, | 449 MOJO_RESULT_OK, |
446 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), | 450 mp0->WriteMessage(0, UserPointer<const void>(kWorld), sizeof(kWorld), |
447 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 451 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
448 | 452 |
449 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 453 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
450 EXPECT_EQ(123u, context); | 454 EXPECT_EQ(123u, context); |
451 hss = HandleSignalsState(); | 455 hss = HandleSignalsState(); |
452 mp1->RemoveAwakable(1, &waiter, &hss); | 456 mp1->RemoveAwakable(1, &waiter, &hss); |
453 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 457 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
454 hss.satisfied_signals); | 458 hss.satisfied_signals); |
455 EXPECT_EQ(kAllSignals | MOJO_HANDLE_SIGNAL_PEER_CLOSED, | 459 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 460 MOJO_HANDLE_SIGNAL_PEER_CLOSED | MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
456 hss.satisfiable_signals); | 461 hss.satisfiable_signals); |
457 | 462 |
458 // Make sure there's nothing on the other ports. | 463 // Make sure there's nothing on the other ports. |
459 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 464 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
460 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 465 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
461 mp0->ReadMessage(0, UserPointer<void>(buffer), | 466 mp0->ReadMessage(0, UserPointer<void>(buffer), |
462 MakeUserPointer(&buffer_size), nullptr, nullptr, | 467 MakeUserPointer(&buffer_size), nullptr, nullptr, |
463 MOJO_READ_MESSAGE_FLAG_NONE)); | 468 MOJO_READ_MESSAGE_FLAG_NONE)); |
464 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 469 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
465 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 470 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
620 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); | 625 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); |
621 RefPtr<ChannelEndpoint> ep1; | 626 RefPtr<ChannelEndpoint> ep1; |
622 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 627 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
623 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 628 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
624 | 629 |
625 // We'll try to pass this dispatcher. | 630 // We'll try to pass this dispatcher. |
626 auto dispatcher = MessagePipeDispatcher::Create( | 631 auto dispatcher = MessagePipeDispatcher::Create( |
627 MessagePipeDispatcher::kDefaultCreateOptions); | 632 MessagePipeDispatcher::kDefaultCreateOptions); |
628 auto local_mp = MessagePipe::CreateLocalLocal(); | 633 auto local_mp = MessagePipe::CreateLocalLocal(); |
629 dispatcher->Init(local_mp.Clone(), 0); | 634 dispatcher->Init(local_mp.Clone(), 0); |
630 Handle handle(std::move(dispatcher), MOJO_HANDLE_RIGHT_TRANSFER | | 635 Handle handle(std::move(dispatcher), |
631 MOJO_HANDLE_RIGHT_READ | | 636 MessagePipeDispatcher::kDefaultHandleRights); |
632 MOJO_HANDLE_RIGHT_WRITE); | |
633 | 637 |
634 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 638 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
635 // it later, it might already be readable.) | 639 // it later, it might already be readable.) |
636 waiter.Init(); | 640 waiter.Init(); |
637 ASSERT_EQ( | 641 ASSERT_EQ( |
638 MOJO_RESULT_OK, | 642 MOJO_RESULT_OK, |
639 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 643 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); |
640 | 644 |
641 // Write to MP 0, port 0. | 645 // Write to MP 0, port 0. |
642 { | 646 { |
(...skipping 14 matching lines...) Expand all Loading... |
657 handle.reset(); | 661 handle.reset(); |
658 } | 662 } |
659 | 663 |
660 // Wait. | 664 // Wait. |
661 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 665 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
662 EXPECT_EQ(123u, context); | 666 EXPECT_EQ(123u, context); |
663 hss = HandleSignalsState(); | 667 hss = HandleSignalsState(); |
664 mp1->RemoveAwakable(1, &waiter, &hss); | 668 mp1->RemoveAwakable(1, &waiter, &hss); |
665 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 669 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
666 hss.satisfied_signals); | 670 hss.satisfied_signals); |
667 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 671 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 672 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 673 hss.satisfiable_signals); |
668 | 674 |
669 // Read from MP 1, port 1. | 675 // Read from MP 1, port 1. |
670 char read_buffer[100] = {0}; | 676 char read_buffer[100] = {0}; |
671 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 677 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
672 DispatcherVector read_dispatchers; | 678 DispatcherVector read_dispatchers; |
673 uint32_t read_num_dispatchers = 10; // Maximum to get. | 679 uint32_t read_num_dispatchers = 10; // Maximum to get. |
674 EXPECT_EQ( | 680 EXPECT_EQ( |
675 MOJO_RESULT_OK, | 681 MOJO_RESULT_OK, |
676 mp1->ReadMessage(1, UserPointer<void>(read_buffer), | 682 mp1->ReadMessage(1, UserPointer<void>(read_buffer), |
677 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 683 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
(...skipping 24 matching lines...) Expand all Loading... |
702 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately | 708 // TODO(vtl): FIXME -- We (racily) crash if I close |dispatcher| immediately |
703 // here. (We don't crash if I sleep and then close.) | 709 // here. (We don't crash if I sleep and then close.) |
704 | 710 |
705 // Wait for the dispatcher to become readable. | 711 // Wait for the dispatcher to become readable. |
706 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 712 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
707 EXPECT_EQ(456u, context); | 713 EXPECT_EQ(456u, context); |
708 hss = HandleSignalsState(); | 714 hss = HandleSignalsState(); |
709 dispatcher->RemoveAwakable(&waiter, &hss); | 715 dispatcher->RemoveAwakable(&waiter, &hss); |
710 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 716 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
711 hss.satisfied_signals); | 717 hss.satisfied_signals); |
712 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 718 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 719 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 720 hss.satisfiable_signals); |
713 | 721 |
714 // Read from the dispatcher. | 722 // Read from the dispatcher. |
715 memset(read_buffer, 0, sizeof(read_buffer)); | 723 memset(read_buffer, 0, sizeof(read_buffer)); |
716 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 724 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
717 EXPECT_EQ(MOJO_RESULT_OK, | 725 EXPECT_EQ(MOJO_RESULT_OK, |
718 dispatcher->ReadMessage(UserPointer<void>(read_buffer), | 726 dispatcher->ReadMessage(UserPointer<void>(read_buffer), |
719 MakeUserPointer(&read_buffer_size), 0, | 727 MakeUserPointer(&read_buffer_size), 0, |
720 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 728 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
721 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 729 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
722 EXPECT_STREQ(kHello, read_buffer); | 730 EXPECT_STREQ(kHello, read_buffer); |
723 | 731 |
724 // Prepare to wait on "local_mp", port 1. | 732 // Prepare to wait on "local_mp", port 1. |
725 waiter.Init(); | 733 waiter.Init(); |
726 ASSERT_EQ(MOJO_RESULT_OK, | 734 ASSERT_EQ(MOJO_RESULT_OK, |
727 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, | 735 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, |
728 nullptr)); | 736 nullptr)); |
729 | 737 |
730 // Write to the dispatcher. | 738 // Write to the dispatcher. |
731 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( | 739 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( |
732 UserPointer<const void>(kHello), sizeof(kHello), | 740 UserPointer<const void>(kHello), sizeof(kHello), |
733 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 741 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
734 | 742 |
735 // Wait. | 743 // Wait. |
736 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 744 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
737 EXPECT_EQ(789u, context); | 745 EXPECT_EQ(789u, context); |
738 hss = HandleSignalsState(); | 746 hss = HandleSignalsState(); |
739 local_mp->RemoveAwakable(1, &waiter, &hss); | 747 local_mp->RemoveAwakable(1, &waiter, &hss); |
740 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 748 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
741 hss.satisfied_signals); | 749 hss.satisfied_signals); |
742 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 750 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 751 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 752 hss.satisfiable_signals); |
743 | 753 |
744 // Read from "local_mp", port 1. | 754 // Read from "local_mp", port 1. |
745 memset(read_buffer, 0, sizeof(read_buffer)); | 755 memset(read_buffer, 0, sizeof(read_buffer)); |
746 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 756 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
747 EXPECT_EQ(MOJO_RESULT_OK, | 757 EXPECT_EQ(MOJO_RESULT_OK, |
748 local_mp->ReadMessage(1, UserPointer<void>(read_buffer), | 758 local_mp->ReadMessage(1, UserPointer<void>(read_buffer), |
749 MakeUserPointer(&read_buffer_size), nullptr, | 759 MakeUserPointer(&read_buffer_size), nullptr, |
750 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 760 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
751 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 761 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
752 EXPECT_STREQ(kHello, read_buffer); | 762 EXPECT_STREQ(kHello, read_buffer); |
(...skipping 14 matching lines...) Expand all Loading... |
767 static const char kWorld[] = "world!"; | 777 static const char kWorld[] = "world!"; |
768 Waiter waiter; | 778 Waiter waiter; |
769 HandleSignalsState hss; | 779 HandleSignalsState hss; |
770 uint32_t context = 0; | 780 uint32_t context = 0; |
771 | 781 |
772 // We'll try to pass this dispatcher. | 782 // We'll try to pass this dispatcher. |
773 auto dispatcher = MessagePipeDispatcher::Create( | 783 auto dispatcher = MessagePipeDispatcher::Create( |
774 MessagePipeDispatcher::kDefaultCreateOptions); | 784 MessagePipeDispatcher::kDefaultCreateOptions); |
775 auto local_mp = MessagePipe::CreateLocalLocal(); | 785 auto local_mp = MessagePipe::CreateLocalLocal(); |
776 dispatcher->Init(local_mp.Clone(), 0); | 786 dispatcher->Init(local_mp.Clone(), 0); |
777 Handle handle(std::move(dispatcher), MOJO_HANDLE_RIGHT_TRANSFER | | 787 Handle handle(std::move(dispatcher), |
778 MOJO_HANDLE_RIGHT_READ | | 788 MessagePipeDispatcher::kDefaultHandleRights); |
779 MOJO_HANDLE_RIGHT_WRITE); | |
780 | 789 |
781 hss = local_mp->GetHandleSignalsState(0); | 790 hss = local_mp->GetHandleSignalsState(0); |
782 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); | 791 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE, hss.satisfied_signals); |
783 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 792 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 793 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 794 hss.satisfiable_signals); |
784 // Write to the other end (|local_mp|, port 1), and then close it. | 795 // Write to the other end (|local_mp|, port 1), and then close it. |
785 EXPECT_EQ( | 796 EXPECT_EQ( |
786 MOJO_RESULT_OK, | 797 MOJO_RESULT_OK, |
787 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), | 798 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), |
788 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 799 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
789 hss = local_mp->GetHandleSignalsState(0); | 800 hss = local_mp->GetHandleSignalsState(0); |
790 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 801 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
791 hss.satisfied_signals); | 802 hss.satisfied_signals); |
792 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 803 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 804 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 805 hss.satisfiable_signals); |
793 // Then the second message.... | 806 // Then the second message.... |
794 EXPECT_EQ( | 807 EXPECT_EQ( |
795 MOJO_RESULT_OK, | 808 MOJO_RESULT_OK, |
796 local_mp->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), | 809 local_mp->WriteMessage(1, UserPointer<const void>(kWorld), sizeof(kWorld), |
797 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 810 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
798 hss = local_mp->GetHandleSignalsState(0); | 811 hss = local_mp->GetHandleSignalsState(0); |
799 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 812 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
800 hss.satisfied_signals); | 813 hss.satisfied_signals); |
801 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 814 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 815 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 816 hss.satisfiable_signals); |
802 // Then close it. | 817 // Then close it. |
803 local_mp->Close(1); | 818 local_mp->Close(1); |
804 | 819 |
805 RefPtr<ChannelEndpoint> ep0; | 820 RefPtr<ChannelEndpoint> ep0; |
806 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); | 821 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); |
807 RefPtr<ChannelEndpoint> ep1; | 822 RefPtr<ChannelEndpoint> ep1; |
808 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 823 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
809 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 824 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
810 | 825 |
811 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 826 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
(...skipping 22 matching lines...) Expand all Loading... |
834 handle.reset(); | 849 handle.reset(); |
835 } | 850 } |
836 | 851 |
837 // Wait. | 852 // Wait. |
838 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 853 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
839 EXPECT_EQ(123u, context); | 854 EXPECT_EQ(123u, context); |
840 hss = HandleSignalsState(); | 855 hss = HandleSignalsState(); |
841 mp1->RemoveAwakable(1, &waiter, &hss); | 856 mp1->RemoveAwakable(1, &waiter, &hss); |
842 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 857 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
843 hss.satisfied_signals); | 858 hss.satisfied_signals); |
844 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 859 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 860 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 861 hss.satisfiable_signals); |
845 | 862 |
846 // Read from MP 1, port 1. | 863 // Read from MP 1, port 1. |
847 char read_buffer[100] = {0}; | 864 char read_buffer[100] = {0}; |
848 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 865 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
849 DispatcherVector read_dispatchers; | 866 DispatcherVector read_dispatchers; |
850 uint32_t read_num_dispatchers = 10; // Maximum to get. | 867 uint32_t read_num_dispatchers = 10; // Maximum to get. |
851 EXPECT_EQ( | 868 EXPECT_EQ( |
852 MOJO_RESULT_OK, | 869 MOJO_RESULT_OK, |
853 mp1->ReadMessage(1, UserPointer<void>(read_buffer), | 870 mp1->ReadMessage(1, UserPointer<void>(read_buffer), |
854 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 871 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
918 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 935 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
919 | 936 |
920 // We'll try to pass this dispatcher. | 937 // We'll try to pass this dispatcher. |
921 MojoResult result = MOJO_RESULT_INTERNAL; | 938 MojoResult result = MOJO_RESULT_INTERNAL; |
922 auto dispatcher = SharedBufferDispatcher::Create( | 939 auto dispatcher = SharedBufferDispatcher::Create( |
923 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, | 940 platform_support(), SharedBufferDispatcher::kDefaultCreateOptions, 100, |
924 &result); | 941 &result); |
925 EXPECT_EQ(MOJO_RESULT_OK, result); | 942 EXPECT_EQ(MOJO_RESULT_OK, result); |
926 ASSERT_TRUE(dispatcher); | 943 ASSERT_TRUE(dispatcher); |
927 Handle handle(std::move(dispatcher), | 944 Handle handle(std::move(dispatcher), |
928 MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_TRANSFER | | 945 SharedBufferDispatcher::kDefaultHandleRights); |
929 MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE); | |
930 | 946 |
931 // Make a mapping. | 947 // Make a mapping. |
932 std::unique_ptr<PlatformSharedBufferMapping> mapping0; | 948 std::unique_ptr<PlatformSharedBufferMapping> mapping0; |
933 EXPECT_EQ(MOJO_RESULT_OK, handle.dispatcher->MapBuffer( | 949 EXPECT_EQ(MOJO_RESULT_OK, handle.dispatcher->MapBuffer( |
934 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping0)); | 950 0, 100, MOJO_MAP_BUFFER_FLAG_NONE, &mapping0)); |
935 ASSERT_TRUE(mapping0); | 951 ASSERT_TRUE(mapping0); |
936 ASSERT_TRUE(mapping0->GetBase()); | 952 ASSERT_TRUE(mapping0->GetBase()); |
937 ASSERT_EQ(100u, mapping0->GetLength()); | 953 ASSERT_EQ(100u, mapping0->GetLength()); |
938 static_cast<char*>(mapping0->GetBase())[0] = 'A'; | 954 static_cast<char*>(mapping0->GetBase())[0] = 'A'; |
939 static_cast<char*>(mapping0->GetBase())[50] = 'B'; | 955 static_cast<char*>(mapping0->GetBase())[50] = 'B'; |
(...skipping 25 matching lines...) Expand all Loading... |
965 handle.reset(); | 981 handle.reset(); |
966 } | 982 } |
967 | 983 |
968 // Wait. | 984 // Wait. |
969 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 985 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
970 EXPECT_EQ(123u, context); | 986 EXPECT_EQ(123u, context); |
971 hss = HandleSignalsState(); | 987 hss = HandleSignalsState(); |
972 mp1->RemoveAwakable(1, &waiter, &hss); | 988 mp1->RemoveAwakable(1, &waiter, &hss); |
973 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 989 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
974 hss.satisfied_signals); | 990 hss.satisfied_signals); |
975 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 991 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 992 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 993 hss.satisfiable_signals); |
976 | 994 |
977 // Read from MP 1, port 1. | 995 // Read from MP 1, port 1. |
978 char read_buffer[100] = {0}; | 996 char read_buffer[100] = {0}; |
979 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 997 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
980 DispatcherVector read_dispatchers; | 998 DispatcherVector read_dispatchers; |
981 uint32_t read_num_dispatchers = 10; // Maximum to get. | 999 uint32_t read_num_dispatchers = 10; // Maximum to get. |
982 EXPECT_EQ( | 1000 EXPECT_EQ( |
983 MOJO_RESULT_OK, | 1001 MOJO_RESULT_OK, |
984 mp1->ReadMessage(1, UserPointer<void>(read_buffer), | 1002 mp1->ReadMessage(1, UserPointer<void>(read_buffer), |
985 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 1003 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 RefPtr<ChannelEndpoint> ep1; | 1058 RefPtr<ChannelEndpoint> ep1; |
1041 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 1059 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
1042 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 1060 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
1043 | 1061 |
1044 util::ScopedFILE fp(test_dir.CreateFile()); | 1062 util::ScopedFILE fp(test_dir.CreateFile()); |
1045 EXPECT_EQ(sizeof(kHello), fwrite(kHello, 1, sizeof(kHello), fp.get())); | 1063 EXPECT_EQ(sizeof(kHello), fwrite(kHello, 1, sizeof(kHello), fp.get())); |
1046 // We'll try to pass this dispatcher, which will cause a |PlatformHandle| to | 1064 // We'll try to pass this dispatcher, which will cause a |PlatformHandle| to |
1047 // be passed. | 1065 // be passed. |
1048 auto dispatcher = | 1066 auto dispatcher = |
1049 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp))); | 1067 PlatformHandleDispatcher::Create(PlatformHandleFromFILE(std::move(fp))); |
1050 // TODO(vtl): Are these the correct rights for a |PlatformHandleDispatcher|? | 1068 Handle handle(std::move(dispatcher), |
1051 Handle handle(std::move(dispatcher), MOJO_HANDLE_RIGHT_TRANSFER | | 1069 PlatformHandleDispatcher::kDefaultHandleRights); |
1052 MOJO_HANDLE_RIGHT_READ | | |
1053 MOJO_HANDLE_RIGHT_WRITE); | |
1054 | 1070 |
1055 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 1071 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
1056 // it later, it might already be readable.) | 1072 // it later, it might already be readable.) |
1057 waiter.Init(); | 1073 waiter.Init(); |
1058 ASSERT_EQ( | 1074 ASSERT_EQ( |
1059 MOJO_RESULT_OK, | 1075 MOJO_RESULT_OK, |
1060 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 1076 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); |
1061 | 1077 |
1062 // Write to MP 0, port 0. | 1078 // Write to MP 0, port 0. |
1063 { | 1079 { |
(...skipping 14 matching lines...) Expand all Loading... |
1078 handle.reset(); | 1094 handle.reset(); |
1079 } | 1095 } |
1080 | 1096 |
1081 // Wait. | 1097 // Wait. |
1082 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 1098 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
1083 EXPECT_EQ(123u, context); | 1099 EXPECT_EQ(123u, context); |
1084 hss = HandleSignalsState(); | 1100 hss = HandleSignalsState(); |
1085 mp1->RemoveAwakable(1, &waiter, &hss); | 1101 mp1->RemoveAwakable(1, &waiter, &hss); |
1086 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1102 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
1087 hss.satisfied_signals); | 1103 hss.satisfied_signals); |
1088 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 1104 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1105 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1106 hss.satisfiable_signals); |
1089 | 1107 |
1090 // Read from MP 1, port 1. | 1108 // Read from MP 1, port 1. |
1091 char read_buffer[100] = {0}; | 1109 char read_buffer[100] = {0}; |
1092 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1110 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
1093 DispatcherVector read_dispatchers; | 1111 DispatcherVector read_dispatchers; |
1094 uint32_t read_num_dispatchers = 10; // Maximum to get. | 1112 uint32_t read_num_dispatchers = 10; // Maximum to get. |
1095 EXPECT_EQ( | 1113 EXPECT_EQ( |
1096 MOJO_RESULT_OK, | 1114 MOJO_RESULT_OK, |
1097 mp1->ReadMessage(1, UserPointer<void>(read_buffer), | 1115 mp1->ReadMessage(1, UserPointer<void>(read_buffer), |
1098 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 1116 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1178 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); | 1196 auto mp0 = MessagePipe::CreateLocalProxy(&ep0); |
1179 RefPtr<ChannelEndpoint> ep1; | 1197 RefPtr<ChannelEndpoint> ep1; |
1180 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); | 1198 auto mp1 = MessagePipe::CreateProxyLocal(&ep1); |
1181 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); | 1199 BootstrapChannelEndpoints(std::move(ep0), std::move(ep1)); |
1182 | 1200 |
1183 // We'll try to pass this dispatcher. | 1201 // We'll try to pass this dispatcher. |
1184 auto dispatcher = MessagePipeDispatcher::Create( | 1202 auto dispatcher = MessagePipeDispatcher::Create( |
1185 MessagePipeDispatcher::kDefaultCreateOptions); | 1203 MessagePipeDispatcher::kDefaultCreateOptions); |
1186 auto local_mp = MessagePipe::CreateLocalLocal(); | 1204 auto local_mp = MessagePipe::CreateLocalLocal(); |
1187 dispatcher->Init(local_mp.Clone(), 0); | 1205 dispatcher->Init(local_mp.Clone(), 0); |
1188 Handle handle(std::move(dispatcher), MOJO_HANDLE_RIGHT_TRANSFER | | 1206 Handle handle(std::move(dispatcher), |
1189 MOJO_HANDLE_RIGHT_READ | | 1207 MessagePipeDispatcher::kDefaultHandleRights); |
1190 MOJO_HANDLE_RIGHT_WRITE); | |
1191 | 1208 |
1192 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | 1209 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do |
1193 // it later, it might already be readable.) | 1210 // it later, it might already be readable.) |
1194 waiter.Init(); | 1211 waiter.Init(); |
1195 ASSERT_EQ( | 1212 ASSERT_EQ( |
1196 MOJO_RESULT_OK, | 1213 MOJO_RESULT_OK, |
1197 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | 1214 mp1->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); |
1198 | 1215 |
1199 // Write to MP 0, port 0. | 1216 // Write to MP 0, port 0. |
1200 { | 1217 { |
(...skipping 14 matching lines...) Expand all Loading... |
1215 handle.reset(); | 1232 handle.reset(); |
1216 } | 1233 } |
1217 | 1234 |
1218 // Wait. | 1235 // Wait. |
1219 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 1236 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
1220 EXPECT_EQ(123u, context); | 1237 EXPECT_EQ(123u, context); |
1221 hss = HandleSignalsState(); | 1238 hss = HandleSignalsState(); |
1222 mp1->RemoveAwakable(1, &waiter, &hss); | 1239 mp1->RemoveAwakable(1, &waiter, &hss); |
1223 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1240 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
1224 hss.satisfied_signals); | 1241 hss.satisfied_signals); |
1225 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 1242 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1243 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1244 hss.satisfiable_signals); |
1226 | 1245 |
1227 // Read from MP 1, port 1. | 1246 // Read from MP 1, port 1. |
1228 char read_buffer[100] = {0}; | 1247 char read_buffer[100] = {0}; |
1229 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1248 uint32_t read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
1230 DispatcherVector read_dispatchers; | 1249 DispatcherVector read_dispatchers; |
1231 uint32_t read_num_dispatchers = 10; // Maximum to get. | 1250 uint32_t read_num_dispatchers = 10; // Maximum to get. |
1232 EXPECT_EQ( | 1251 EXPECT_EQ( |
1233 MOJO_RESULT_OK, | 1252 MOJO_RESULT_OK, |
1234 mp1->ReadMessage(1, UserPointer<void>(read_buffer), | 1253 mp1->ReadMessage(1, UserPointer<void>(read_buffer), |
1235 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 1254 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
1236 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 1255 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
1237 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 1256 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
1238 EXPECT_STREQ(kHello, read_buffer); | 1257 EXPECT_STREQ(kHello, read_buffer); |
1239 EXPECT_EQ(1u, read_dispatchers.size()); | 1258 EXPECT_EQ(1u, read_dispatchers.size()); |
1240 EXPECT_EQ(1u, read_num_dispatchers); | 1259 EXPECT_EQ(1u, read_num_dispatchers); |
1241 ASSERT_TRUE(read_dispatchers[0]); | 1260 ASSERT_TRUE(read_dispatchers[0]); |
1242 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); | 1261 EXPECT_TRUE(read_dispatchers[0]->HasOneRef()); |
1243 | 1262 |
1244 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, read_dispatchers[0]->GetType()); | 1263 EXPECT_EQ(Dispatcher::Type::MESSAGE_PIPE, read_dispatchers[0]->GetType()); |
1245 dispatcher = RefPtr<MessagePipeDispatcher>( | 1264 dispatcher = RefPtr<MessagePipeDispatcher>( |
1246 static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get())); | 1265 static_cast<MessagePipeDispatcher*>(read_dispatchers[0].get())); |
1247 read_dispatchers.clear(); | 1266 read_dispatchers.clear(); |
1248 // TODO(vtl): We should really get |handle| from |ReadMessage()|. | 1267 // TODO(vtl): We should really get |handle| from |ReadMessage()|. |
1249 handle = Handle(std::move(dispatcher), MOJO_HANDLE_RIGHT_TRANSFER | | 1268 handle = Handle(std::move(dispatcher), |
1250 MOJO_HANDLE_RIGHT_READ | | 1269 MessagePipeDispatcher::kDefaultHandleRights); |
1251 MOJO_HANDLE_RIGHT_WRITE); | |
1252 | 1270 |
1253 // Now pass it back. | 1271 // Now pass it back. |
1254 | 1272 |
1255 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do | 1273 // Prepare to wait on MP 0, port 0. (Add the waiter now. Otherwise, if we do |
1256 // it later, it might already be readable.) | 1274 // it later, it might already be readable.) |
1257 waiter.Init(); | 1275 waiter.Init(); |
1258 ASSERT_EQ( | 1276 ASSERT_EQ( |
1259 MOJO_RESULT_OK, | 1277 MOJO_RESULT_OK, |
1260 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr)); | 1278 mp0->AddAwakable(0, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 456, nullptr)); |
1261 | 1279 |
(...skipping 16 matching lines...) Expand all Loading... |
1278 handle.reset(); | 1296 handle.reset(); |
1279 } | 1297 } |
1280 | 1298 |
1281 // Wait. | 1299 // Wait. |
1282 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 1300 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
1283 EXPECT_EQ(456u, context); | 1301 EXPECT_EQ(456u, context); |
1284 hss = HandleSignalsState(); | 1302 hss = HandleSignalsState(); |
1285 mp0->RemoveAwakable(0, &waiter, &hss); | 1303 mp0->RemoveAwakable(0, &waiter, &hss); |
1286 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1304 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
1287 hss.satisfied_signals); | 1305 hss.satisfied_signals); |
1288 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 1306 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1307 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1308 hss.satisfiable_signals); |
1289 | 1309 |
1290 // Read from MP 0, port 0. | 1310 // Read from MP 0, port 0. |
1291 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1311 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
1292 read_num_dispatchers = 10; // Maximum to get. | 1312 read_num_dispatchers = 10; // Maximum to get. |
1293 EXPECT_EQ( | 1313 EXPECT_EQ( |
1294 MOJO_RESULT_OK, | 1314 MOJO_RESULT_OK, |
1295 mp0->ReadMessage(0, UserPointer<void>(read_buffer), | 1315 mp0->ReadMessage(0, UserPointer<void>(read_buffer), |
1296 MakeUserPointer(&read_buffer_size), &read_dispatchers, | 1316 MakeUserPointer(&read_buffer_size), &read_dispatchers, |
1297 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); | 1317 &read_num_dispatchers, MOJO_READ_MESSAGE_FLAG_NONE)); |
1298 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(read_buffer_size)); | 1318 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(read_buffer_size)); |
(...skipping 20 matching lines...) Expand all Loading... |
1319 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), | 1339 local_mp->WriteMessage(1, UserPointer<const void>(kHello), sizeof(kHello), |
1320 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1340 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
1321 | 1341 |
1322 // Wait for the dispatcher to become readable. | 1342 // Wait for the dispatcher to become readable. |
1323 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 1343 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
1324 EXPECT_EQ(789u, context); | 1344 EXPECT_EQ(789u, context); |
1325 hss = HandleSignalsState(); | 1345 hss = HandleSignalsState(); |
1326 dispatcher->RemoveAwakable(&waiter, &hss); | 1346 dispatcher->RemoveAwakable(&waiter, &hss); |
1327 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1347 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
1328 hss.satisfied_signals); | 1348 hss.satisfied_signals); |
1329 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 1349 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1350 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1351 hss.satisfiable_signals); |
1330 | 1352 |
1331 // Read from the dispatcher. | 1353 // Read from the dispatcher. |
1332 memset(read_buffer, 0, sizeof(read_buffer)); | 1354 memset(read_buffer, 0, sizeof(read_buffer)); |
1333 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1355 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
1334 EXPECT_EQ(MOJO_RESULT_OK, | 1356 EXPECT_EQ(MOJO_RESULT_OK, |
1335 dispatcher->ReadMessage(UserPointer<void>(read_buffer), | 1357 dispatcher->ReadMessage(UserPointer<void>(read_buffer), |
1336 MakeUserPointer(&read_buffer_size), 0, | 1358 MakeUserPointer(&read_buffer_size), 0, |
1337 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 1359 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
1338 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 1360 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
1339 EXPECT_STREQ(kHello, read_buffer); | 1361 EXPECT_STREQ(kHello, read_buffer); |
1340 | 1362 |
1341 // Prepare to wait on "local_mp", port 1. | 1363 // Prepare to wait on "local_mp", port 1. |
1342 waiter.Init(); | 1364 waiter.Init(); |
1343 ASSERT_EQ(MOJO_RESULT_OK, | 1365 ASSERT_EQ(MOJO_RESULT_OK, |
1344 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, | 1366 local_mp->AddAwakable(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 789, |
1345 nullptr)); | 1367 nullptr)); |
1346 | 1368 |
1347 // Write to the dispatcher. | 1369 // Write to the dispatcher. |
1348 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( | 1370 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->WriteMessage( |
1349 UserPointer<const void>(kHello), sizeof(kHello), | 1371 UserPointer<const void>(kHello), sizeof(kHello), |
1350 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); | 1372 nullptr, MOJO_WRITE_MESSAGE_FLAG_NONE)); |
1351 | 1373 |
1352 // Wait. | 1374 // Wait. |
1353 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | 1375 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); |
1354 EXPECT_EQ(789u, context); | 1376 EXPECT_EQ(789u, context); |
1355 hss = HandleSignalsState(); | 1377 hss = HandleSignalsState(); |
1356 local_mp->RemoveAwakable(1, &waiter, &hss); | 1378 local_mp->RemoveAwakable(1, &waiter, &hss); |
1357 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, | 1379 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
1358 hss.satisfied_signals); | 1380 hss.satisfied_signals); |
1359 EXPECT_EQ(kAllSignals, hss.satisfiable_signals); | 1381 EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE | |
| 1382 MOJO_HANDLE_SIGNAL_PEER_CLOSED, |
| 1383 hss.satisfiable_signals); |
1360 | 1384 |
1361 // Read from "local_mp", port 1. | 1385 // Read from "local_mp", port 1. |
1362 memset(read_buffer, 0, sizeof(read_buffer)); | 1386 memset(read_buffer, 0, sizeof(read_buffer)); |
1363 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); | 1387 read_buffer_size = static_cast<uint32_t>(sizeof(read_buffer)); |
1364 EXPECT_EQ(MOJO_RESULT_OK, | 1388 EXPECT_EQ(MOJO_RESULT_OK, |
1365 local_mp->ReadMessage(1, UserPointer<void>(read_buffer), | 1389 local_mp->ReadMessage(1, UserPointer<void>(read_buffer), |
1366 MakeUserPointer(&read_buffer_size), nullptr, | 1390 MakeUserPointer(&read_buffer_size), nullptr, |
1367 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); | 1391 nullptr, MOJO_READ_MESSAGE_FLAG_NONE)); |
1368 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); | 1392 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(read_buffer_size)); |
1369 EXPECT_STREQ(kHello, read_buffer); | 1393 EXPECT_STREQ(kHello, read_buffer); |
1370 | 1394 |
1371 // TODO(vtl): Also test the cases where messages are written and read (at | 1395 // TODO(vtl): Also test the cases where messages are written and read (at |
1372 // various points) on the message pipe being passed around. | 1396 // various points) on the message pipe being passed around. |
1373 | 1397 |
1374 // Close everything that belongs to us. | 1398 // Close everything that belongs to us. |
1375 mp0->Close(0); | 1399 mp0->Close(0); |
1376 mp1->Close(1); | 1400 mp1->Close(1); |
1377 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); | 1401 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); |
1378 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. | 1402 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. |
1379 local_mp->Close(1); | 1403 local_mp->Close(1); |
1380 } | 1404 } |
1381 | 1405 |
1382 } // namespace | 1406 } // namespace |
1383 } // namespace system | 1407 } // namespace system |
1384 } // namespace mojo | 1408 } // namespace mojo |
OLD | NEW |