| 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 |