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 <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 MOJO_READ_MESSAGE_FLAG_NONE)); | 472 MOJO_READ_MESSAGE_FLAG_NONE)); |
473 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); | 473 EXPECT_EQ(sizeof(kWorld), static_cast<size_t>(buffer_size)); |
474 EXPECT_STREQ(kWorld, buffer); | 474 EXPECT_STREQ(kWorld, buffer); |
475 | 475 |
476 mp0->Close(0); | 476 mp0->Close(0); |
477 mp1->Close(1); | 477 mp1->Close(1); |
478 mp2->Close(0); | 478 mp2->Close(0); |
479 mp3->Close(0); | 479 mp3->Close(0); |
480 } | 480 } |
481 | 481 |
482 TEST_F(RemoteMessagePipeTest, CloseBeforeAttachAndRun) { | |
483 static const char kHello[] = "hello"; | |
484 char buffer[100] = {0}; | |
485 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | |
486 Waiter waiter; | |
487 HandleSignalsState hss; | |
488 uint32_t context = 0; | |
489 | |
490 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and | |
491 // connected to MP 1, port 0, which will be attached to channel 1. This leaves | |
492 // MP 0, port 0 and MP 1, port 1 as the "user-facing" endpoints. | |
493 | |
494 scoped_refptr<ChannelEndpoint> ep0; | |
495 scoped_refptr<MessagePipe> mp0(MessagePipe::CreateLocalProxy(&ep0)); | |
496 | |
497 // Write to MP 0, port 0. | |
498 EXPECT_EQ(MOJO_RESULT_OK, | |
499 mp0->WriteMessage(0, | |
500 UserPointer<const void>(kHello), | |
501 sizeof(kHello), | |
502 nullptr, | |
503 MOJO_WRITE_MESSAGE_FLAG_NONE)); | |
504 | |
505 // Close MP 0, port 0 before it's even been attached to the channel and run. | |
506 mp0->Close(0); | |
507 | |
508 BootstrapChannelEndpointNoWait(0, ep0); | |
509 | |
510 scoped_refptr<ChannelEndpoint> ep1; | |
511 scoped_refptr<MessagePipe> mp1(MessagePipe::CreateProxyLocal(&ep1)); | |
512 | |
513 // Prepare to wait on MP 1, port 1. (Add the waiter now. Otherwise, if we do | |
514 // it later, it might already be readable.) | |
515 waiter.Init(); | |
516 ASSERT_EQ( | |
517 MOJO_RESULT_OK, | |
518 mp1->AddWaiter(1, &waiter, MOJO_HANDLE_SIGNAL_READABLE, 123, nullptr)); | |
519 | |
520 BootstrapChannelEndpointNoWait(1, ep1); | |
521 | |
522 // Wait. | |
523 EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(MOJO_DEADLINE_INDEFINITE, &context)); | |
524 EXPECT_EQ(123u, context); | |
525 hss = HandleSignalsState(); | |
526 // Note: MP 1, port 1 should definitely should be readable, but it may or may | |
527 // not appear as writable (there's a race, and it may not have noticed that | |
528 // the other side was closed yet -- e.g., inserting a sleep here would make it | |
529 // much more likely to notice that it's no longer writable). | |
530 mp1->RemoveWaiter(1, &waiter, &hss); | |
531 EXPECT_TRUE((hss.satisfied_signals & MOJO_HANDLE_SIGNAL_READABLE)); | |
532 EXPECT_TRUE((hss.satisfiable_signals & MOJO_HANDLE_SIGNAL_READABLE)); | |
533 | |
534 // Read from MP 1, port 1. | |
535 EXPECT_EQ(MOJO_RESULT_OK, | |
536 mp1->ReadMessage(1, | |
537 UserPointer<void>(buffer), | |
538 MakeUserPointer(&buffer_size), | |
539 nullptr, | |
540 nullptr, | |
541 MOJO_READ_MESSAGE_FLAG_NONE)); | |
542 EXPECT_EQ(sizeof(kHello), static_cast<size_t>(buffer_size)); | |
543 EXPECT_STREQ(kHello, buffer); | |
544 | |
545 // And MP 1, port 1. | |
546 mp1->Close(1); | |
547 } | |
548 | |
549 TEST_F(RemoteMessagePipeTest, CloseBeforeConnect) { | 482 TEST_F(RemoteMessagePipeTest, CloseBeforeConnect) { |
550 static const char kHello[] = "hello"; | 483 static const char kHello[] = "hello"; |
551 char buffer[100] = {0}; | 484 char buffer[100] = {0}; |
552 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 485 uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
553 Waiter waiter; | 486 Waiter waiter; |
554 HandleSignalsState hss; | 487 HandleSignalsState hss; |
555 uint32_t context = 0; | 488 uint32_t context = 0; |
556 | 489 |
557 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and | 490 // Connect message pipes. MP 0, port 1 will be attached to channel 0 and |
558 // connected to MP 1, port 0, which will be attached to channel 1. This leaves | 491 // connected to MP 1, port 0, which will be attached to channel 1. This leaves |
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1288 mp0->Close(0); | 1221 mp0->Close(0); |
1289 mp1->Close(1); | 1222 mp1->Close(1); |
1290 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); | 1223 EXPECT_EQ(MOJO_RESULT_OK, dispatcher->Close()); |
1291 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. | 1224 // Note that |local_mp|'s port 0 belong to |dispatcher|, which was closed. |
1292 local_mp->Close(1); | 1225 local_mp->Close(1); |
1293 } | 1226 } |
1294 | 1227 |
1295 } // namespace | 1228 } // namespace |
1296 } // namespace system | 1229 } // namespace system |
1297 } // namespace mojo | 1230 } // namespace mojo |
OLD | NEW |