Index: mojo/edk/system/core_unittest.cc |
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc |
index c91ef7bd370a6b4128110003fe4f4e6e94f3cf9b..005dede1c62d15160a4dc3f8205f2c0701faf8d2 100644 |
--- a/mojo/edk/system/core_unittest.cc |
+++ b/mojo/edk/system/core_unittest.cc |
@@ -59,6 +59,31 @@ TEST_F(CoreTest, Basic) { |
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights))); |
EXPECT_EQ(kDefaultMockHandleRights, rights); |
+ MojoHandle h_dup = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_OK, |
+ core()->DuplicateHandleWithReducedRights( |
+ h, MOJO_HANDLE_RIGHT_DUPLICATE, MakeUserPointer(&h_dup))); |
+ EXPECT_EQ(1u, info.GetDuplicateDispatcherCallCount()); |
+ EXPECT_NE(h_dup, MOJO_HANDLE_INVALID); |
+ EXPECT_NE(h_dup, h); |
+ rights = MOJO_HANDLE_RIGHT_NONE; |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h_dup, MakeUserPointer(&rights))); |
+ EXPECT_EQ(kDefaultMockHandleRights & ~MOJO_HANDLE_RIGHT_DUPLICATE, rights); |
+ MojoHandle h_denied = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ core()->DuplicateHandleWithReducedRights( |
+ h_dup, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
+ EXPECT_EQ(1u, info.GetDuplicateDispatcherCallCount()); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied); |
+ |
+ EXPECT_EQ(0u, info.GetDtorCallCount()); |
+ EXPECT_EQ(0u, info.GetCloseCallCount()); |
+ EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount()); |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h_dup)); |
+ EXPECT_EQ(1u, info.GetDtorCallCount()); |
+ EXPECT_EQ(1u, info.GetCloseCallCount()); |
+ EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount()); |
+ |
EXPECT_EQ(0u, info.GetWriteMessageCallCount()); |
EXPECT_EQ(MOJO_RESULT_OK, |
core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, |
@@ -191,13 +216,14 @@ TEST_F(CoreTest, Basic) { |
EXPECT_EQ(0u, hss.satisfied_signals); |
EXPECT_EQ(0u, hss.satisfiable_signals); |
- EXPECT_EQ(0u, info.GetDtorCallCount()); |
- EXPECT_EQ(0u, info.GetCloseCallCount()); |
- EXPECT_EQ(0u, info.GetCancelAllAwakablesCallCount()); |
- EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
- EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount()); |
- EXPECT_EQ(1u, info.GetCloseCallCount()); |
+ // |h| shares |info| with |h_dup|, which was closed above. |
EXPECT_EQ(1u, info.GetDtorCallCount()); |
+ EXPECT_EQ(1u, info.GetCloseCallCount()); |
+ EXPECT_EQ(1u, info.GetCancelAllAwakablesCallCount()); |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
+ EXPECT_EQ(2u, info.GetDtorCallCount()); |
+ EXPECT_EQ(2u, info.GetCloseCallCount()); |
+ EXPECT_EQ(2u, info.GetCancelAllAwakablesCallCount()); |
// No awakables should ever have ever been added. |
EXPECT_EQ(0u, info.GetRemoveAwakableCallCount()); |
@@ -230,6 +256,20 @@ TEST_F(CoreTest, InvalidArguments) { |
EXPECT_EQ(0u, rights); |
} |
+ // |DuplicateHandleWithReducedRights()|: |
+ { |
+ MojoHandle h = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ( |
+ MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->DuplicateHandleWithReducedRights( |
+ MOJO_HANDLE_INVALID, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h))); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, h); |
+ EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
+ core()->DuplicateHandleWithReducedRights( |
+ 10, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h))); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, h); |
+ } |
+ |
// |Wait()|: |
{ |
EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
@@ -592,6 +632,17 @@ TEST_F(CoreTest, InvalidArgumentsDeath) { |
EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
} |
+ // |DuplicateHandleWithReducedRights()|: |
+ { |
+ MockHandleInfo info; |
+ MojoHandle h = CreateMockHandle(&info); |
+ EXPECT_DEATH_IF_SUPPORTED(core()->DuplicateHandleWithReducedRights( |
+ h, MOJO_HANDLE_RIGHT_NONE, NullUserPointer()), |
+ kMemoryCheckFailedRegex); |
+ |
+ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); |
+ } |
+ |
// |WaitMany()|: |
{ |
MojoHandle handle = MOJO_HANDLE_INVALID; |
@@ -688,6 +739,16 @@ TEST_F(CoreTest, MessagePipe) { |
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights))); |
EXPECT_EQ(kDefaultMessagePipeHandleRights, rights); |
+ // Neither should be duplicatable. |
+ MojoHandle h_denied = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ core()->DuplicateHandleWithReducedRights( |
+ h[0], MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ core()->DuplicateHandleWithReducedRights( |
+ h[1], MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied); |
+ |
// Neither should be readable. |
MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, |
MOJO_HANDLE_SIGNAL_READABLE}; |
@@ -1047,6 +1108,16 @@ TEST_F(CoreTest, DataPipe) { |
EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights))); |
EXPECT_EQ(kDefaultDataPipeConsumerHandleRights, rights); |
+ // Neither should be duplicatable. |
+ MojoHandle h_denied = MOJO_HANDLE_INVALID; |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ core()->DuplicateHandleWithReducedRights( |
+ ph, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
+ EXPECT_EQ(MOJO_RESULT_PERMISSION_DENIED, |
+ core()->DuplicateHandleWithReducedRights( |
+ ch, MOJO_HANDLE_RIGHT_NONE, MakeUserPointer(&h_denied))); |
+ EXPECT_EQ(MOJO_HANDLE_INVALID, h_denied); |
+ |
// Producer should be never-readable, but already writable. |
hss = kEmptyMojoHandleSignalsState; |
EXPECT_EQ( |