OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/edk/system/core.h" | 5 #include "mojo/edk/system/core.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 26 matching lines...) Expand all Loading... |
37 } | 37 } |
38 | 38 |
39 TEST_F(CoreTest, Basic) { | 39 TEST_F(CoreTest, Basic) { |
40 MockHandleInfo info; | 40 MockHandleInfo info; |
41 | 41 |
42 EXPECT_EQ(0u, info.GetCtorCallCount()); | 42 EXPECT_EQ(0u, info.GetCtorCallCount()); |
43 MojoHandle h = CreateMockHandle(&info); | 43 MojoHandle h = CreateMockHandle(&info); |
44 EXPECT_EQ(1u, info.GetCtorCallCount()); | 44 EXPECT_EQ(1u, info.GetCtorCallCount()); |
45 EXPECT_NE(h, MOJO_HANDLE_INVALID); | 45 EXPECT_NE(h, MOJO_HANDLE_INVALID); |
46 | 46 |
| 47 MojoHandleRights rights = 0; |
| 48 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights))); |
| 49 EXPECT_EQ(kDefaultMockHandleRights, rights); |
| 50 |
47 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 51 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
48 EXPECT_EQ(MOJO_RESULT_OK, | 52 EXPECT_EQ(MOJO_RESULT_OK, |
49 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, | 53 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, |
50 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 54 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
51 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 55 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
52 | 56 |
53 EXPECT_EQ(0u, info.GetReadMessageCallCount()); | 57 EXPECT_EQ(0u, info.GetReadMessageCallCount()); |
54 uint32_t num_bytes = 0; | 58 uint32_t num_bytes = 0; |
55 EXPECT_EQ( | 59 EXPECT_EQ( |
56 MOJO_RESULT_OK, | 60 MOJO_RESULT_OK, |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 | 201 |
198 // Test a double-close. | 202 // Test a double-close. |
199 MockHandleInfo info; | 203 MockHandleInfo info; |
200 MojoHandle h = CreateMockHandle(&info); | 204 MojoHandle h = CreateMockHandle(&info); |
201 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 205 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
202 EXPECT_EQ(1u, info.GetCloseCallCount()); | 206 EXPECT_EQ(1u, info.GetCloseCallCount()); |
203 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h)); | 207 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h)); |
204 EXPECT_EQ(1u, info.GetCloseCallCount()); | 208 EXPECT_EQ(1u, info.GetCloseCallCount()); |
205 } | 209 } |
206 | 210 |
| 211 // |GetRights()|: |
| 212 { |
| 213 MojoHandleRights rights = 0; |
| 214 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 215 core()->GetRights(MOJO_HANDLE_INVALID, MakeUserPointer(&rights))); |
| 216 EXPECT_EQ(0u, rights); |
| 217 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 218 core()->GetRights(10, MakeUserPointer(&rights))); |
| 219 EXPECT_EQ(0u, rights); |
| 220 } |
| 221 |
207 // |Wait()|: | 222 // |Wait()|: |
208 { | 223 { |
209 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 224 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
210 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, | 225 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, |
211 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); | 226 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); |
212 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 227 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
213 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, | 228 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, |
214 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); | 229 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); |
215 | 230 |
216 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; | 231 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 | 564 |
550 // These test invalid arguments that should cause death if we're being paranoid | 565 // These test invalid arguments that should cause death if we're being paranoid |
551 // about checking arguments (which we would want to do if, e.g., we were in a | 566 // about checking arguments (which we would want to do if, e.g., we were in a |
552 // true "kernel" situation, but we might not want to do otherwise for | 567 // true "kernel" situation, but we might not want to do otherwise for |
553 // performance reasons). Probably blatant errors like passing in null pointers | 568 // performance reasons). Probably blatant errors like passing in null pointers |
554 // (for required pointer arguments) will still cause death, but perhaps not | 569 // (for required pointer arguments) will still cause death, but perhaps not |
555 // predictably. | 570 // predictably. |
556 TEST_F(CoreTest, InvalidArgumentsDeath) { | 571 TEST_F(CoreTest, InvalidArgumentsDeath) { |
557 const char kMemoryCheckFailedRegex[] = "Check failed"; | 572 const char kMemoryCheckFailedRegex[] = "Check failed"; |
558 | 573 |
| 574 // |GetRights()|: |
| 575 { |
| 576 MockHandleInfo info; |
| 577 MojoHandle h = CreateMockHandle(&info); |
| 578 EXPECT_DEATH_IF_SUPPORTED(core()->GetRights(h, NullUserPointer()), |
| 579 kMemoryCheckFailedRegex); |
| 580 |
| 581 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 582 } |
| 583 |
559 // |WaitMany()|: | 584 // |WaitMany()|: |
560 { | 585 { |
561 MojoHandle handle = MOJO_HANDLE_INVALID; | 586 MojoHandle handle = MOJO_HANDLE_INVALID; |
562 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE; | 587 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE; |
563 EXPECT_DEATH_IF_SUPPORTED( | 588 EXPECT_DEATH_IF_SUPPORTED( |
564 core()->WaitMany(NullUserPointer(), MakeUserPointer(&signals), 1, | 589 core()->WaitMany(NullUserPointer(), MakeUserPointer(&signals), 1, |
565 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), | 590 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), |
566 NullUserPointer()), | 591 NullUserPointer()), |
567 kMemoryCheckFailedRegex); | 592 kMemoryCheckFailedRegex); |
568 EXPECT_DEATH_IF_SUPPORTED( | 593 EXPECT_DEATH_IF_SUPPORTED( |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
625 } | 650 } |
626 | 651 |
627 // TODO(vtl): Missing a bunch here. | 652 // TODO(vtl): Missing a bunch here. |
628 } | 653 } |
629 | 654 |
630 // TODO(vtl): test |Wait()| and |WaitMany()| properly | 655 // TODO(vtl): test |Wait()| and |WaitMany()| properly |
631 // - including |WaitMany()| with the same handle more than once (with | 656 // - including |WaitMany()| with the same handle more than once (with |
632 // same/different signals) | 657 // same/different signals) |
633 | 658 |
634 TEST_F(CoreTest, MessagePipe) { | 659 TEST_F(CoreTest, MessagePipe) { |
635 MojoHandle h[2]; | 660 MojoHandle h[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; |
636 MojoHandleSignalsState hss[2]; | 661 MojoHandleSignalsState hss[2]; |
637 uint32_t result_index; | 662 uint32_t result_index; |
638 | 663 |
639 EXPECT_EQ(MOJO_RESULT_OK, | 664 EXPECT_EQ(MOJO_RESULT_OK, |
640 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h[0]), | 665 core()->CreateMessagePipe(NullUserPointer(), MakeUserPointer(&h[0]), |
641 MakeUserPointer(&h[1]))); | 666 MakeUserPointer(&h[1]))); |
642 // Should get two distinct, valid handles. | 667 // Should get two distinct, valid handles. |
643 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); | 668 EXPECT_NE(h[0], MOJO_HANDLE_INVALID); |
644 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); | 669 EXPECT_NE(h[1], MOJO_HANDLE_INVALID); |
645 EXPECT_NE(h[0], h[1]); | 670 EXPECT_NE(h[0], h[1]); |
646 | 671 |
| 672 // Both should have the correct rights. |
| 673 static const MojoHandleRights kMessagePipeHandleRights = |
| 674 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ | |
| 675 MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS | |
| 676 MOJO_HANDLE_RIGHT_SET_OPTIONS; |
| 677 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; |
| 678 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[0], MakeUserPointer(&rights))); |
| 679 EXPECT_EQ(kMessagePipeHandleRights, rights); |
| 680 rights = MOJO_HANDLE_RIGHT_NONE; |
| 681 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights))); |
| 682 EXPECT_EQ(kMessagePipeHandleRights, rights); |
| 683 |
647 // Neither should be readable. | 684 // Neither should be readable. |
648 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, | 685 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, |
649 MOJO_HANDLE_SIGNAL_READABLE}; | 686 MOJO_HANDLE_SIGNAL_READABLE}; |
650 result_index = static_cast<uint32_t>(-1); | 687 result_index = static_cast<uint32_t>(-1); |
651 hss[0] = kEmptyMojoHandleSignalsState; | 688 hss[0] = kEmptyMojoHandleSignalsState; |
652 hss[1] = kEmptyMojoHandleSignalsState; | 689 hss[1] = kEmptyMojoHandleSignalsState; |
653 EXPECT_EQ( | 690 EXPECT_EQ( |
654 MOJO_RESULT_DEADLINE_EXCEEDED, | 691 MOJO_RESULT_DEADLINE_EXCEEDED, |
655 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0, | 692 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0, |
656 MakeUserPointer(&result_index), MakeUserPointer(hss))); | 693 MakeUserPointer(&result_index), MakeUserPointer(hss))); |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
969 EXPECT_STREQ(kHello, buffer); | 1006 EXPECT_STREQ(kHello, buffer); |
970 EXPECT_EQ(0u, num_handles); | 1007 EXPECT_EQ(0u, num_handles); |
971 | 1008 |
972 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); | 1009 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[0])); |
973 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); | 1010 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passing[1])); |
974 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); | 1011 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_passed[0])); |
975 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); | 1012 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_received)); |
976 } | 1013 } |
977 | 1014 |
978 TEST_F(CoreTest, DataPipe) { | 1015 TEST_F(CoreTest, DataPipe) { |
979 MojoHandle ph, ch; // p is for producer and c is for consumer. | 1016 // p is for producer and c is for consumer. |
| 1017 MojoHandle ph = MOJO_HANDLE_INVALID; |
| 1018 MojoHandle ch = MOJO_HANDLE_INVALID; |
980 MojoHandleSignalsState hss; | 1019 MojoHandleSignalsState hss; |
981 | 1020 |
982 EXPECT_EQ(MOJO_RESULT_OK, | 1021 EXPECT_EQ(MOJO_RESULT_OK, |
983 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph), | 1022 core()->CreateDataPipe(NullUserPointer(), MakeUserPointer(&ph), |
984 MakeUserPointer(&ch))); | 1023 MakeUserPointer(&ch))); |
985 // Should get two distinct, valid handles. | 1024 // Should get two distinct, valid handles. |
986 EXPECT_NE(ph, MOJO_HANDLE_INVALID); | 1025 EXPECT_NE(ph, MOJO_HANDLE_INVALID); |
987 EXPECT_NE(ch, MOJO_HANDLE_INVALID); | 1026 EXPECT_NE(ch, MOJO_HANDLE_INVALID); |
988 EXPECT_NE(ph, ch); | 1027 EXPECT_NE(ph, ch); |
989 | 1028 |
| 1029 // Both should have the correct rights. |
| 1030 static const MojoHandleRights kDataPipeProducerHandleRights = |
| 1031 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE | |
| 1032 MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS; |
| 1033 static const MojoHandleRights kDataPipeConsumerHandleRights = |
| 1034 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ | |
| 1035 MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS; |
| 1036 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; |
| 1037 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ph, MakeUserPointer(&rights))); |
| 1038 EXPECT_EQ(kDataPipeProducerHandleRights, rights); |
| 1039 rights = MOJO_HANDLE_RIGHT_NONE; |
| 1040 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights))); |
| 1041 EXPECT_EQ(kDataPipeConsumerHandleRights, rights); |
| 1042 |
990 // Producer should be never-readable, but already writable. | 1043 // Producer should be never-readable, but already writable. |
991 hss = kEmptyMojoHandleSignalsState; | 1044 hss = kEmptyMojoHandleSignalsState; |
992 EXPECT_EQ( | 1045 EXPECT_EQ( |
993 MOJO_RESULT_FAILED_PRECONDITION, | 1046 MOJO_RESULT_FAILED_PRECONDITION, |
994 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); | 1047 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
995 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1048 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
996 hss.satisfied_signals); | 1049 hss.satisfied_signals); |
997 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1050 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
998 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1051 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
999 hss.satisfiable_signals); | 1052 hss.satisfiable_signals); |
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1674 waiter.Awake(result); | 1727 waiter.Awake(result); |
1675 })); | 1728 })); |
1676 EXPECT_EQ(1u, info.GetAddedAwakableSize()); | 1729 EXPECT_EQ(1u, info.GetAddedAwakableSize()); |
1677 | 1730 |
1678 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0)); | 1731 EXPECT_FALSE(info.GetAddedAwakableAt(0)->Awake(MOJO_RESULT_BUSY, 0)); |
1679 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); | 1732 EXPECT_EQ(MOJO_RESULT_BUSY, waiter.result); |
1680 | 1733 |
1681 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 1734 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
1682 } | 1735 } |
1683 | 1736 |
1684 // TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. | 1737 // TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and |
| 1738 // |MapBuffer()|. |
1685 | 1739 |
1686 } // namespace | 1740 } // namespace |
1687 } // namespace system | 1741 } // namespace system |
1688 } // namespace mojo | 1742 } // namespace mojo |
OLD | NEW |