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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 | 52 |
53 EXPECT_EQ(0u, info.GetCtorCallCount()); | 53 EXPECT_EQ(0u, info.GetCtorCallCount()); |
54 MojoHandle h = CreateMockHandle(&info); | 54 MojoHandle h = CreateMockHandle(&info); |
55 EXPECT_EQ(1u, info.GetCtorCallCount()); | 55 EXPECT_EQ(1u, info.GetCtorCallCount()); |
56 EXPECT_NE(h, MOJO_HANDLE_INVALID); | 56 EXPECT_NE(h, MOJO_HANDLE_INVALID); |
57 | 57 |
58 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; | 58 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; |
59 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights))); | 59 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights))); |
60 EXPECT_EQ(kDefaultMockHandleRights, rights); | 60 EXPECT_EQ(kDefaultMockHandleRights, rights); |
61 | 61 |
| 62 MojoHandle h_dup = MOJO_HANDLE_INVALID; |
| 63 EXPECT_EQ(MOJO_RESULT_OK, |
| 64 core()->DuplicateHandleWithReducedRights( |
| 65 h, MOJO_HANDLE_RIGHT_DUPLICATE, MakeUserPointer(&h_dup))); |
| 66 EXPECT_EQ(1u, info.GetDuplicateDispatcherCallCount()); |
| 67 EXPECT_NE(h_dup, MOJO_HANDLE_INVALID); |
| 68 EXPECT_NE(h_dup, h); |
| 69 rights = MOJO_HANDLE_RIGHT_NONE; |
| 70 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h_dup, MakeUserPointer(&rights))); |
| 71 EXPECT_EQ(kDefaultMockHandleRights & ~MOJO_HANDLE_RIGHT_DUPLICATE, rights); |
| 72 MojoHandle h_denied = MOJO_HANDLE_INVALID; |
| 73 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
| 74 core()->DuplicateHandleWithReducedRights( |
| 75 h_dup, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
| 76 EXPECT_EQ(1u, info.GetDuplicateDispatcherCallCount()); |
| 77 EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied); |
| 78 |
| 79 EXPECT_EQ(0u, info.GetDtorCallCount()); |
| 80 EXPECT_EQ(0u, info.GetCloseCallCount()); |
| 81 EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount()); |
| 82 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_dup)); |
| 83 EXPECT_EQ(1u, info.GetDtorCallCount()); |
| 84 EXPECT_EQ(1u, info.GetCloseCallCount()); |
| 85 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount()); |
| 86 |
62 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); | 87 EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
63 EXPECT_EQ(MOJO_RESULT_OK, | 88 EXPECT_EQ(MOJO_RESULT_OK, |
64 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, | 89 core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, |
65 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 90 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
66 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); | 91 EXPECT_EQ(1u, info.GetWriteMessageCallCount()); |
67 | 92 |
68 EXPECT_EQ(0u, info.GetReadMessageCallCount()); | 93 EXPECT_EQ(0u, info.GetReadMessageCallCount()); |
69 uint32_t num_bytes = 0; | 94 uint32_t num_bytes = 0; |
70 EXPECT_EQ( | 95 EXPECT_EQ( |
71 MOJO_RESULT_OK, | 96 MOJO_RESULT_OK, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 EXPECT_EQ( | 209 EXPECT_EQ( |
185 MOJO_RESULT_FAILED_PRECONDITION, | 210 MOJO_RESULT_FAILED_PRECONDITION, |
186 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1, | 211 core()->WaitMany(MakeUserPointer(&h), MakeUserPointer(&handle_signals), 1, |
187 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), | 212 MOJO_DEADLINE_INDEFINITE, MakeUserPointer(&result_index), |
188 MakeUserPointer(&hss))); | 213 MakeUserPointer(&hss))); |
189 EXPECT_EQ(9u, info.GetAddAwakableCallCount()); | 214 EXPECT_EQ(9u, info.GetAddAwakableCallCount()); |
190 EXPECT_EQ(0u, result_index); | 215 EXPECT_EQ(0u, result_index); |
191 EXPECT_EQ(0u, hss.satisfied_signals); | 216 EXPECT_EQ(0u, hss.satisfied_signals); |
192 EXPECT_EQ(0u, hss.satisfiable_signals); | 217 EXPECT_EQ(0u, hss.satisfiable_signals); |
193 | 218 |
194 EXPECT_EQ(0u, info.GetDtorCallCount()); | 219 // |h| shares |info| with |h_dup|, which was closed above. |
195 EXPECT_EQ(0u, info.GetCloseCallCount()); | 220 EXPECT_EQ(1u, info.GetDtorCallCount()); |
196 EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount()); | 221 EXPECT_EQ(1u, info.GetCloseCallCount()); |
| 222 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount()); |
197 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 223 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
198 EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount()); | 224 EXPECT_EQ(2u, info.GetDtorCallCount()); |
199 EXPECT_EQ(1u, info.GetCloseCallCount()); | 225 EXPECT_EQ(2u, info.GetCloseCallCount()); |
200 EXPECT_EQ(1u, info.GetDtorCallCount()); | 226 EXPECT_EQ(2u, info.GetCancelAllAwakablesCallCount()); |
201 | 227 |
202 // No awakables should ever have ever been added. | 228 // No awakables should ever have ever been added. |
203 EXPECT_EQ(0u, info.GetRemoveAwakableCallCount()); | 229 EXPECT_EQ(0u, info.GetRemoveAwakableCallCount()); |
204 } | 230 } |
205 | 231 |
206 TEST_F(CoreTest, InvalidArguments) { | 232 TEST_F(CoreTest, InvalidArguments) { |
207 // |Close()|: | 233 // |Close()|: |
208 { | 234 { |
209 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID)); | 235 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID)); |
210 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10)); | 236 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10)); |
(...skipping 12 matching lines...) Expand all Loading... |
223 { | 249 { |
224 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; | 250 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; |
225 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 251 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
226 core()->GetRights(MOJO_HANDLE_INVALID, MakeUserPointer(&rights))); | 252 core()->GetRights(MOJO_HANDLE_INVALID, MakeUserPointer(&rights))); |
227 EXPECT_EQ(0u, rights); | 253 EXPECT_EQ(0u, rights); |
228 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 254 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
229 core()->GetRights(10, MakeUserPointer(&rights))); | 255 core()->GetRights(10, MakeUserPointer(&rights))); |
230 EXPECT_EQ(0u, rights); | 256 EXPECT_EQ(0u, rights); |
231 } | 257 } |
232 | 258 |
| 259 // |DuplicateHandleWithReducedRights()|: |
| 260 { |
| 261 MojoHandle h = MOJO_HANDLE_INVALID; |
| 262 EXPECT_EQ( |
| 263 MOJO_RESULT_INVALID_ARGUMENT, |
| 264 core()->DuplicateHandleWithReducedRights( |
| 265 MOJO_HANDLE_INVALID, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h))); |
| 266 EXPECT_EQ(MOJO_HANDLE_INVALID, h); |
| 267 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
| 268 core()->DuplicateHandleWithReducedRights( |
| 269 10, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h))); |
| 270 EXPECT_EQ(MOJO_HANDLE_INVALID, h); |
| 271 } |
| 272 |
233 // |Wait()|: | 273 // |Wait()|: |
234 { | 274 { |
235 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 275 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
236 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, | 276 core()->Wait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, |
237 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); | 277 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); |
238 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 278 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
239 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, | 279 core()->Wait(10, ~MOJO_HANDLE_SIGNAL_NONE, |
240 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); | 280 MOJO_DEADLINE_INDEFINITE, NullUserPointer())); |
241 | 281 |
242 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; | 282 MojoHandleSignalsState hss = kFullMojoHandleSignalsState; |
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
585 // |GetRights()|: | 625 // |GetRights()|: |
586 { | 626 { |
587 MockHandleInfo info; | 627 MockHandleInfo info; |
588 MojoHandle h = CreateMockHandle(&info); | 628 MojoHandle h = CreateMockHandle(&info); |
589 EXPECT_DEATH_IF_SUPPORTED(core()->GetRights(h, NullUserPointer()), | 629 EXPECT_DEATH_IF_SUPPORTED(core()->GetRights(h, NullUserPointer()), |
590 kMemoryCheckFailedRegex); | 630 kMemoryCheckFailedRegex); |
591 | 631 |
592 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 632 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
593 } | 633 } |
594 | 634 |
| 635 // |DuplicateHandleWithReducedRights()|: |
| 636 { |
| 637 MockHandleInfo info; |
| 638 MojoHandle h = CreateMockHandle(&info); |
| 639 EXPECT_DEATH_IF_SUPPORTED(core()->DuplicateHandleWithReducedRights( |
| 640 h, MOJO_HANDLE_RIGHT_NONE, NullUserPointer()), |
| 641 kMemoryCheckFailedRegex); |
| 642 |
| 643 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
| 644 } |
| 645 |
595 // |WaitMany()|: | 646 // |WaitMany()|: |
596 { | 647 { |
597 MojoHandle handle = MOJO_HANDLE_INVALID; | 648 MojoHandle handle = MOJO_HANDLE_INVALID; |
598 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE; | 649 MojoHandleSignals signals = ~MOJO_HANDLE_SIGNAL_NONE; |
599 EXPECT_DEATH_IF_SUPPORTED( | 650 EXPECT_DEATH_IF_SUPPORTED( |
600 core()->WaitMany(NullUserPointer(), MakeUserPointer(&signals), 1, | 651 core()->WaitMany(NullUserPointer(), MakeUserPointer(&signals), 1, |
601 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), | 652 MOJO_DEADLINE_INDEFINITE, NullUserPointer(), |
602 NullUserPointer()), | 653 NullUserPointer()), |
603 kMemoryCheckFailedRegex); | 654 kMemoryCheckFailedRegex); |
604 EXPECT_DEATH_IF_SUPPORTED( | 655 EXPECT_DEATH_IF_SUPPORTED( |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
681 EXPECT_NE(h[0], h[1]); | 732 EXPECT_NE(h[0], h[1]); |
682 | 733 |
683 // Both should have the correct rights. | 734 // Both should have the correct rights. |
684 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; | 735 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; |
685 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[0], MakeUserPointer(&rights))); | 736 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[0], MakeUserPointer(&rights))); |
686 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights); | 737 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights); |
687 rights = MOJO_HANDLE_RIGHT_NONE; | 738 rights = MOJO_HANDLE_RIGHT_NONE; |
688 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights))); | 739 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights))); |
689 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights); | 740 EXPECT_EQ(kDefaultMessagePipeHandleRights, rights); |
690 | 741 |
| 742 // Neither should be duplicatable. |
| 743 MojoHandle h_denied = MOJO_HANDLE_INVALID; |
| 744 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
| 745 core()->DuplicateHandleWithReducedRights( |
| 746 h[0], MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
| 747 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
| 748 core()->DuplicateHandleWithReducedRights( |
| 749 h[1], MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
| 750 EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied); |
| 751 |
691 // Neither should be readable. | 752 // Neither should be readable. |
692 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, | 753 MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, |
693 MOJO_HANDLE_SIGNAL_READABLE}; | 754 MOJO_HANDLE_SIGNAL_READABLE}; |
694 result_index = static_cast<uint32_t>(-1); | 755 result_index = static_cast<uint32_t>(-1); |
695 hss[0] = kEmptyMojoHandleSignalsState; | 756 hss[0] = kEmptyMojoHandleSignalsState; |
696 hss[1] = kEmptyMojoHandleSignalsState; | 757 hss[1] = kEmptyMojoHandleSignalsState; |
697 EXPECT_EQ( | 758 EXPECT_EQ( |
698 MOJO_RESULT_DEADLINE_EXCEEDED, | 759 MOJO_RESULT_DEADLINE_EXCEEDED, |
699 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0, | 760 core()->WaitMany(MakeUserPointer(h), MakeUserPointer(signals), 2, 0, |
700 MakeUserPointer(&result_index), MakeUserPointer(hss))); | 761 MakeUserPointer(&result_index), MakeUserPointer(hss))); |
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 EXPECT_NE(ph, ch); | 1101 EXPECT_NE(ph, ch); |
1041 | 1102 |
1042 // Both should have the correct rights. | 1103 // Both should have the correct rights. |
1043 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; | 1104 MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; |
1044 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ph, MakeUserPointer(&rights))); | 1105 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ph, MakeUserPointer(&rights))); |
1045 EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights); | 1106 EXPECT_EQ(kDefaultDataPipeProducerHandleRights, rights); |
1046 rights = MOJO_HANDLE_RIGHT_NONE; | 1107 rights = MOJO_HANDLE_RIGHT_NONE; |
1047 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights))); | 1108 EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights))); |
1048 EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights); | 1109 EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights); |
1049 | 1110 |
| 1111 // Neither should be duplicatable. |
| 1112 MojoHandle h_denied = MOJO_HANDLE_INVALID; |
| 1113 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
| 1114 core()->DuplicateHandleWithReducedRights( |
| 1115 ph, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
| 1116 EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
| 1117 core()->DuplicateHandleWithReducedRights( |
| 1118 ch, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
| 1119 EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied); |
| 1120 |
1050 // Producer should be never-readable, but already writable. | 1121 // Producer should be never-readable, but already writable. |
1051 hss = kEmptyMojoHandleSignalsState; | 1122 hss = kEmptyMojoHandleSignalsState; |
1052 EXPECT_EQ( | 1123 EXPECT_EQ( |
1053 MOJO_RESULT_FAILED_PRECONDITION, | 1124 MOJO_RESULT_FAILED_PRECONDITION, |
1054 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); | 1125 core()->Wait(ph, MOJO_HANDLE_SIGNAL_READABLE, 0, MakeUserPointer(&hss))); |
1055 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1126 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1056 hss.satisfied_signals); | 1127 hss.satisfied_signals); |
1057 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | | 1128 EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED | |
1058 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, | 1129 MOJO_HANDLE_SIGNAL_WRITE_THRESHOLD, |
1059 hss.satisfiable_signals); | 1130 hss.satisfiable_signals); |
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1752 | 1823 |
1753 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); | 1824 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
1754 } | 1825 } |
1755 | 1826 |
1756 // TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and | 1827 // TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and |
1757 // |MapBuffer()|. | 1828 // |MapBuffer()|. |
1758 | 1829 |
1759 } // namespace | 1830 } // namespace |
1760 } // namespace system | 1831 } // namespace system |
1761 } // namespace mojo | 1832 } // namespace mojo |
OLD | NEW |