EDK: Add Core::GetRights(). Don't actually plumb it out yet. I'll do that separately. R=azani@chromium.org Review URL: https://codereview.chromium.org/1993983002 .
diff --git a/mojo/edk/system/core.cc b/mojo/edk/system/core.cc index 65eb073..f1c869f 100644 --- a/mojo/edk/system/core.cc +++ b/mojo/edk/system/core.cc
@@ -175,6 +175,17 @@ return h.dispatcher->Close(); } +MojoResult Core::GetRights(MojoHandle handle, + UserPointer<MojoHandleRights> rights) { + Handle h; + MojoResult result = GetHandle(handle, &h); + if (result != MOJO_RESULT_OK) + return result; + + rights.Put(h.rights); + return MOJO_RESULT_OK; +} + MojoResult Core::Wait(MojoHandle handle, MojoHandleSignals signals, MojoDeadline deadline,
diff --git a/mojo/edk/system/core.h b/mojo/edk/system/core.h index 74c5f47..a97010f 100644 --- a/mojo/edk/system/core.h +++ b/mojo/edk/system/core.h
@@ -116,6 +116,7 @@ // This method corresponds to the API function defined in // "mojo/public/c/system/handle.h": MojoResult Close(MojoHandle handle); + MojoResult GetRights(MojoHandle handle, UserPointer<MojoHandleRights> rights); // These methods correspond to the API functions defined in // "mojo/public/c/system/wait.h":
diff --git a/mojo/edk/system/core_test_base.cc b/mojo/edk/system/core_test_base.cc index 1f982ec..0bddeaa 100644 --- a/mojo/edk/system/core_test_base.cc +++ b/mojo/edk/system/core_test_base.cc
@@ -208,6 +208,9 @@ // CoreTestBase ---------------------------------------------------------------- +// static +constexpr MojoHandleRights CoreTestBase::kDefaultMockHandleRights; + CoreTestBase::CoreTestBase() : platform_support_(embedder::CreateSimplePlatformSupport()) {}
diff --git a/mojo/edk/system/core_test_base.h b/mojo/edk/system/core_test_base.h index a3dd3fd..4dde782 100644 --- a/mojo/edk/system/core_test_base.h +++ b/mojo/edk/system/core_test_base.h
@@ -32,6 +32,13 @@ public: using MockHandleInfo = CoreTestBase_MockHandleInfo; + static constexpr MojoHandleRights kDefaultMockHandleRights = + MOJO_HANDLE_RIGHT_DUPLICATE | MOJO_HANDLE_RIGHT_TRANSFER | + MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE | + MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS | + MOJO_HANDLE_RIGHT_MAP_READABLE | MOJO_HANDLE_RIGHT_MAP_WRITABLE | + MOJO_HANDLE_RIGHT_MAP_EXECUTABLE; + CoreTestBase(); ~CoreTestBase() override;
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc index 1b3c1fa..745b5af 100644 --- a/mojo/edk/system/core_unittest.cc +++ b/mojo/edk/system/core_unittest.cc
@@ -44,6 +44,10 @@ EXPECT_EQ(1u, info.GetCtorCallCount()); EXPECT_NE(h, MOJO_HANDLE_INVALID); + MojoHandleRights rights = 0; + EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h, MakeUserPointer(&rights))); + EXPECT_EQ(kDefaultMockHandleRights, rights); + EXPECT_EQ(0u, info.GetWriteMessageCallCount()); EXPECT_EQ(MOJO_RESULT_OK, core()->WriteMessage(h, NullUserPointer(), 0, NullUserPointer(), 0, @@ -204,6 +208,17 @@ EXPECT_EQ(1u, info.GetCloseCallCount()); } + // |GetRights()|: + { + MojoHandleRights rights = 0; + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + core()->GetRights(MOJO_HANDLE_INVALID, MakeUserPointer(&rights))); + EXPECT_EQ(0u, rights); + EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, + core()->GetRights(10, MakeUserPointer(&rights))); + EXPECT_EQ(0u, rights); + } + // |Wait()|: { EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, @@ -556,6 +571,16 @@ TEST_F(CoreTest, InvalidArgumentsDeath) { const char kMemoryCheckFailedRegex[] = "Check failed"; + // |GetRights()|: + { + MockHandleInfo info; + MojoHandle h = CreateMockHandle(&info); + EXPECT_DEATH_IF_SUPPORTED(core()->GetRights(h, NullUserPointer()), + kMemoryCheckFailedRegex); + + EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); + } + // |WaitMany()|: { MojoHandle handle = MOJO_HANDLE_INVALID; @@ -632,7 +657,7 @@ // same/different signals) TEST_F(CoreTest, MessagePipe) { - MojoHandle h[2]; + MojoHandle h[2] = {MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID}; MojoHandleSignalsState hss[2]; uint32_t result_index; @@ -644,6 +669,18 @@ EXPECT_NE(h[1], MOJO_HANDLE_INVALID); EXPECT_NE(h[0], h[1]); + // Both should have the correct rights. + static const MojoHandleRights kMessagePipeHandleRights = + MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ | + MOJO_HANDLE_RIGHT_WRITE | MOJO_HANDLE_RIGHT_GET_OPTIONS | + MOJO_HANDLE_RIGHT_SET_OPTIONS; + MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; + EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[0], MakeUserPointer(&rights))); + EXPECT_EQ(kMessagePipeHandleRights, rights); + rights = MOJO_HANDLE_RIGHT_NONE; + EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(h[1], MakeUserPointer(&rights))); + EXPECT_EQ(kMessagePipeHandleRights, rights); + // Neither should be readable. MojoHandleSignals signals[2] = {MOJO_HANDLE_SIGNAL_READABLE, MOJO_HANDLE_SIGNAL_READABLE}; @@ -976,7 +1013,9 @@ } TEST_F(CoreTest, DataPipe) { - MojoHandle ph, ch; // p is for producer and c is for consumer. + // p is for producer and c is for consumer. + MojoHandle ph = MOJO_HANDLE_INVALID; + MojoHandle ch = MOJO_HANDLE_INVALID; MojoHandleSignalsState hss; EXPECT_EQ(MOJO_RESULT_OK, @@ -987,6 +1026,20 @@ EXPECT_NE(ch, MOJO_HANDLE_INVALID); EXPECT_NE(ph, ch); + // Both should have the correct rights. + static const MojoHandleRights kDataPipeProducerHandleRights = + MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE | + MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS; + static const MojoHandleRights kDataPipeConsumerHandleRights = + MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ | + MOJO_HANDLE_RIGHT_GET_OPTIONS | MOJO_HANDLE_RIGHT_SET_OPTIONS; + MojoHandleRights rights = MOJO_HANDLE_RIGHT_NONE; + EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ph, MakeUserPointer(&rights))); + EXPECT_EQ(kDataPipeProducerHandleRights, rights); + rights = MOJO_HANDLE_RIGHT_NONE; + EXPECT_EQ(MOJO_RESULT_OK, core()->GetRights(ch, MakeUserPointer(&rights))); + EXPECT_EQ(kDataPipeConsumerHandleRights, rights); + // Producer should be never-readable, but already writable. hss = kEmptyMojoHandleSignalsState; EXPECT_EQ( @@ -1681,7 +1734,8 @@ EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h)); } -// TODO(vtl): Test |DuplicateBufferHandle()| and |MapBuffer()|. +// TODO(vtl): Test |CreateSharedBuffer()|, |DuplicateBufferHandle()|, and +// |MapBuffer()|. } // namespace } // namespace system