Index: mojo/edk/system/wait_set_dispatcher_unittest.cc |
diff --git a/mojo/edk/system/wait_set_dispatcher_unittest.cc b/mojo/edk/system/wait_set_dispatcher_unittest.cc |
deleted file mode 100644 |
index 42ac86548d6ff96f6c5f12310c14e481c397cd1e..0000000000000000000000000000000000000000 |
--- a/mojo/edk/system/wait_set_dispatcher_unittest.cc |
+++ /dev/null |
@@ -1,493 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "mojo/edk/system/wait_set_dispatcher.h" |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <algorithm> |
- |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "mojo/edk/embedder/embedder_internal.h" |
-#include "mojo/edk/system/core.h" |
-#include "mojo/edk/system/message_for_transit.h" |
-#include "mojo/edk/system/message_pipe_dispatcher.h" |
-#include "mojo/edk/system/request_context.h" |
-#include "mojo/edk/system/test_utils.h" |
-#include "mojo/edk/system/waiter.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace mojo { |
-namespace edk { |
-namespace { |
- |
-class WaitSetDispatcherTest : public ::testing::Test { |
- public: |
- WaitSetDispatcherTest() {} |
- ~WaitSetDispatcherTest() override {} |
- |
- void SetUp() override { |
- CreateMessagePipe(&dispatcher0_, &dispatcher1_); |
- } |
- |
- void TearDown() override { |
- for (auto& d : dispatchers_to_close_) |
- d->Close(); |
- } |
- |
- MojoResult GetOneReadyDispatcher( |
- const scoped_refptr<WaitSetDispatcher>& wait_set, |
- scoped_refptr<Dispatcher>* ready_dispatcher, |
- uintptr_t* context) { |
- uint32_t count = 1; |
- MojoResult dispatcher_result = MOJO_RESULT_UNKNOWN; |
- DispatcherVector dispatchers; |
- MojoResult result = wait_set->GetReadyDispatchers( |
- &count, &dispatchers, &dispatcher_result, context); |
- if (result == MOJO_RESULT_OK) { |
- CHECK_EQ(1u, dispatchers.size()); |
- *ready_dispatcher = dispatchers[0]; |
- return dispatcher_result; |
- } |
- return result; |
- } |
- |
- void CreateMessagePipe(scoped_refptr<MessagePipeDispatcher>* d0, |
- scoped_refptr<MessagePipeDispatcher>* d1) { |
- MojoHandle h0, h1; |
- EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(nullptr, &h0, &h1)); |
- |
- Core* core = mojo::edk::internal::g_core; |
- *d0 = scoped_refptr<MessagePipeDispatcher>( |
- static_cast<MessagePipeDispatcher*>(core->GetDispatcher(h0).get())); |
- *d1 = scoped_refptr<MessagePipeDispatcher>( |
- static_cast<MessagePipeDispatcher*>(core->GetDispatcher(h1).get())); |
- pipe_id_generator_++; |
- |
- dispatchers_to_close_.push_back(*d0); |
- dispatchers_to_close_.push_back(*d1); |
- } |
- |
- void CloseOnShutdown(const scoped_refptr<Dispatcher>& dispatcher) { |
- dispatchers_to_close_.push_back(dispatcher); |
- } |
- |
- void WriteMessage(MessagePipeDispatcher* dispatcher, |
- const void* bytes, |
- size_t num_bytes) { |
- Core* core = mojo::edk::internal::g_core; |
- MojoMessageHandle msg; |
- ASSERT_EQ(MOJO_RESULT_OK, |
- core->AllocMessage(static_cast<uint32_t>(num_bytes), nullptr, 0, |
- MOJO_ALLOC_MESSAGE_FLAG_NONE, &msg)); |
- void* buffer; |
- ASSERT_EQ(MOJO_RESULT_OK, core->GetMessageBuffer(msg, &buffer)); |
- memcpy(buffer, bytes, num_bytes); |
- |
- std::unique_ptr<MessageForTransit> message( |
- reinterpret_cast<MessageForTransit*>(msg)); |
- ASSERT_EQ(MOJO_RESULT_OK, |
- dispatcher->WriteMessage(std::move(message), |
- MOJO_WRITE_MESSAGE_FLAG_NONE)); |
- } |
- |
- void ReadMessage(MessagePipeDispatcher* dispatcher, |
- void* bytes, |
- uint32_t* num_bytes) { |
- std::unique_ptr<MessageForTransit> message; |
- ASSERT_EQ(MOJO_RESULT_OK, |
- dispatcher->ReadMessage(&message, num_bytes, nullptr, 0, |
- MOJO_READ_MESSAGE_FLAG_NONE, false)); |
- memcpy(bytes, message->bytes(), *num_bytes); |
- } |
- |
- protected: |
- scoped_refptr<MessagePipeDispatcher> dispatcher0_; |
- scoped_refptr<MessagePipeDispatcher> dispatcher1_; |
- |
- private: |
- // We keep an active RequestContext for the duration of each test. It's unused |
- // since these tests don't rely on the MojoWatch API. |
- const RequestContext request_context_; |
- |
- static uint64_t pipe_id_generator_; |
- DispatcherVector dispatchers_to_close_; |
- |
- DISALLOW_COPY_AND_ASSIGN(WaitSetDispatcherTest); |
-}; |
- |
-// static |
-uint64_t WaitSetDispatcherTest::pipe_id_generator_ = 1; |
- |
-TEST_F(WaitSetDispatcherTest, Basic) { |
- scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
- CloseOnShutdown(wait_set); |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher0_, |
- MOJO_HANDLE_SIGNAL_READABLE, 1)); |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher1_, |
- MOJO_HANDLE_SIGNAL_WRITABLE, 2)); |
- |
- Waiter w; |
- uintptr_t context = 0; |
- w.Init(); |
- HandleSignalsState hss; |
- // |dispatcher1_| should already be writable. |
- EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
- |
- scoped_refptr<Dispatcher> woken_dispatcher; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
- EXPECT_EQ(dispatcher1_, woken_dispatcher); |
- EXPECT_EQ(2u, context); |
- // If a ready dispatcher isn't removed, it will continue to be returned. |
- EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- woken_dispatcher = nullptr; |
- context = 0; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
- EXPECT_EQ(dispatcher1_, woken_dispatcher); |
- EXPECT_EQ(2u, context); |
- ASSERT_EQ(MOJO_RESULT_OK, wait_set->RemoveWaitingDispatcher(dispatcher1_)); |
- |
- // No ready dispatcher. |
- hss = HandleSignalsState(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
- EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
- EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- |
- // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
- char buffer[] = "abcd"; |
- w.Init(); |
- WriteMessage(dispatcher1_.get(), buffer, sizeof(buffer)); |
- EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
- woken_dispatcher = nullptr; |
- context = 0; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
- EXPECT_EQ(dispatcher0_, woken_dispatcher); |
- EXPECT_EQ(1u, context); |
- |
- // Again, if a ready dispatcher isn't removed, it will continue to be |
- // returned. |
- woken_dispatcher = nullptr; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- EXPECT_EQ(dispatcher0_, woken_dispatcher); |
- |
- wait_set->RemoveAwakable(&w, nullptr); |
-} |
- |
-TEST_F(WaitSetDispatcherTest, HandleWithoutRemoving) { |
- scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
- CloseOnShutdown(wait_set); |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher0_, |
- MOJO_HANDLE_SIGNAL_READABLE, 1)); |
- |
- Waiter w; |
- uintptr_t context = 0; |
- w.Init(); |
- HandleSignalsState hss; |
- // No ready dispatcher. |
- hss = HandleSignalsState(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- EXPECT_FALSE(hss.satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
- EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
- scoped_refptr<Dispatcher> woken_dispatcher; |
- EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- |
- // The tested behaviour below should be repeatable. |
- for (size_t i = 0; i < 3; i++) { |
- // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
- char buffer[] = "abcd"; |
- w.Init(); |
- WriteMessage(dispatcher1_.get(), buffer, sizeof(buffer)); |
- EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
- woken_dispatcher = nullptr; |
- context = 0; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
- EXPECT_EQ(dispatcher0_, woken_dispatcher); |
- EXPECT_EQ(1u, context); |
- |
- // Read from |dispatcher0_| which should change it's state to non-readable. |
- char read_buffer[sizeof(buffer) + 5]; |
- uint32_t num_bytes = sizeof(read_buffer); |
- ReadMessage(dispatcher0_.get(), read_buffer, &num_bytes); |
- EXPECT_EQ(sizeof(buffer), num_bytes); |
- |
- // No dispatchers are ready. |
- w.Init(); |
- woken_dispatcher = nullptr; |
- context = 0; |
- EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, &context)); |
- EXPECT_FALSE(woken_dispatcher); |
- EXPECT_EQ(0u, context); |
- EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
- } |
- |
- wait_set->RemoveAwakable(&w, nullptr); |
-} |
- |
-TEST_F(WaitSetDispatcherTest, MultipleReady) { |
- scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
- CloseOnShutdown(wait_set); |
- |
- scoped_refptr<MessagePipeDispatcher> mp1_dispatcher0; |
- scoped_refptr<MessagePipeDispatcher> mp1_dispatcher1; |
- CreateMessagePipe(&mp1_dispatcher0, &mp1_dispatcher1); |
- |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher0_, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher1_, |
- MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(mp1_dispatcher0, |
- MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(mp1_dispatcher1, |
- MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
- |
- Waiter w; |
- w.Init(); |
- HandleSignalsState hss; |
- // The three writable dispatchers should be ready. |
- EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
- |
- scoped_refptr<Dispatcher> woken_dispatcher; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- // Don't know which dispatcher was returned, just that it was one of the |
- // writable ones. |
- EXPECT_TRUE(woken_dispatcher == dispatcher1_ || |
- woken_dispatcher == mp1_dispatcher0 || |
- woken_dispatcher == mp1_dispatcher1); |
- |
- DispatcherVector dispatchers_vector; |
- uint32_t count = 4; |
- MojoResult results[4]; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->GetReadyDispatchers(&count, |
- &dispatchers_vector, |
- results, |
- nullptr)); |
- EXPECT_EQ(3u, count); |
- std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
- DispatcherVector expected_dispatchers; |
- expected_dispatchers.push_back(dispatcher1_); |
- expected_dispatchers.push_back(mp1_dispatcher0); |
- expected_dispatchers.push_back(mp1_dispatcher1); |
- std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); |
- EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
- |
- // If a ready dispatcher isn't removed, it will continue to be returned. |
- EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
- count = 4; |
- dispatchers_vector.clear(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->GetReadyDispatchers(&count, |
- &dispatchers_vector, |
- results, |
- nullptr)); |
- EXPECT_EQ(3u, count); |
- std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
- EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
- |
- // Remove one. It shouldn't be returned any longer. |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->RemoveWaitingDispatcher(expected_dispatchers.back())); |
- expected_dispatchers.pop_back(); |
- EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
- count = 4; |
- dispatchers_vector.clear(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->GetReadyDispatchers(&count, |
- &dispatchers_vector, |
- results, |
- nullptr)); |
- EXPECT_EQ(2u, count); |
- std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
- EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
- |
- // Write to |dispatcher1_|, which should make |dispatcher0_| readable. |
- char buffer[] = "abcd"; |
- w.Init(); |
- WriteMessage(dispatcher1_.get(), buffer, sizeof(buffer)); |
- { |
- Waiter mp_w; |
- mp_w.Init(); |
- // Wait for |dispatcher0_| to be readable. |
- if (dispatcher0_->AddAwakable(&mp_w, MOJO_HANDLE_SIGNAL_READABLE, 0, |
- nullptr) == MOJO_RESULT_OK) { |
- EXPECT_EQ(MOJO_RESULT_OK, mp_w.Wait(MOJO_DEADLINE_INDEFINITE, 0)); |
- dispatcher0_->RemoveAwakable(&mp_w, nullptr); |
- } |
- } |
- expected_dispatchers.push_back(dispatcher0_); |
- std::sort(expected_dispatchers.begin(), expected_dispatchers.end()); |
- EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
- count = 4; |
- dispatchers_vector.clear(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->GetReadyDispatchers(&count, |
- &dispatchers_vector, |
- results, |
- nullptr)); |
- EXPECT_EQ(3u, count); |
- std::sort(dispatchers_vector.begin(), dispatchers_vector.end()); |
- EXPECT_EQ(expected_dispatchers, dispatchers_vector); |
-} |
- |
-TEST_F(WaitSetDispatcherTest, InvalidParams) { |
- scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
- |
- // Can't add a wait set to itself. |
- EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
- wait_set->AddWaitingDispatcher(wait_set, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
- |
- // Can't add twice. |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher0_, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
- EXPECT_EQ(MOJO_RESULT_ALREADY_EXISTS, |
- wait_set->AddWaitingDispatcher(dispatcher0_, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
- |
- // Remove a dispatcher that wasn't added. |
- EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
- wait_set->RemoveWaitingDispatcher(dispatcher1_)); |
- |
- // Add to a closed wait set. |
- wait_set->Close(); |
- EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
- wait_set->AddWaitingDispatcher(dispatcher0_, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
-} |
- |
-TEST_F(WaitSetDispatcherTest, NotSatisfiable) { |
- scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
- CloseOnShutdown(wait_set); |
- |
- // Wait sets can only satisfy MOJO_HANDLE_SIGNAL_READABLE. |
- Waiter w; |
- w.Init(); |
- HandleSignalsState hss; |
- EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_WRITABLE, 0, &hss)); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
- |
- hss = HandleSignalsState(); |
- EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_PEER_CLOSED, 0, &hss)); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_NONE, hss.satisfied_signals); |
- EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfiable_signals); |
-} |
- |
-TEST_F(WaitSetDispatcherTest, ClosedDispatchers) { |
- scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
- CloseOnShutdown(wait_set); |
- |
- Waiter w; |
- w.Init(); |
- HandleSignalsState hss; |
- // A dispatcher that was added and then closed will be cancelled. |
- ASSERT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher0_, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, &hss)); |
- dispatcher0_->Close(); |
- EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
- EXPECT_TRUE( |
- wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
- scoped_refptr<Dispatcher> woken_dispatcher; |
- EXPECT_EQ(MOJO_RESULT_CANCELLED, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- EXPECT_EQ(dispatcher0_, woken_dispatcher); |
- |
- // Dispatcher will be implicitly removed because it may be impossible to |
- // remove explicitly. |
- woken_dispatcher = nullptr; |
- EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- EXPECT_EQ(MOJO_RESULT_NOT_FOUND, |
- wait_set->RemoveWaitingDispatcher(dispatcher0_)); |
- |
- // A dispatcher that's not satisfiable should give an error. |
- w.Init(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(dispatcher1_, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
- EXPECT_EQ(MOJO_RESULT_OK, w.Wait(MOJO_DEADLINE_INDEFINITE, nullptr)); |
- EXPECT_TRUE( |
- wait_set->GetHandleSignalsState().satisfies(MOJO_HANDLE_SIGNAL_READABLE)); |
- EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- EXPECT_EQ(dispatcher1_, woken_dispatcher); |
- |
- wait_set->RemoveAwakable(&w, nullptr); |
-} |
- |
-TEST_F(WaitSetDispatcherTest, NestedSets) { |
- scoped_refptr<WaitSetDispatcher> wait_set = new WaitSetDispatcher(); |
- CloseOnShutdown(wait_set); |
- scoped_refptr<WaitSetDispatcher> nested_wait_set = new WaitSetDispatcher(); |
- CloseOnShutdown(nested_wait_set); |
- |
- Waiter w; |
- w.Init(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->AddWaitingDispatcher(nested_wait_set, |
- MOJO_HANDLE_SIGNAL_READABLE, 0)); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- wait_set->AddAwakable(&w, MOJO_HANDLE_SIGNAL_READABLE, 0, nullptr)); |
- EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, w.Wait(0, nullptr)); |
- |
- // Writable signal is immediately satisfied by the message pipe. |
- w.Init(); |
- EXPECT_EQ(MOJO_RESULT_OK, |
- nested_wait_set->AddWaitingDispatcher( |
- dispatcher0_, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
- EXPECT_EQ(MOJO_RESULT_OK, w.Wait(0, nullptr)); |
- scoped_refptr<Dispatcher> woken_dispatcher; |
- EXPECT_EQ(MOJO_RESULT_OK, |
- GetOneReadyDispatcher(wait_set, &woken_dispatcher, nullptr)); |
- EXPECT_EQ(nested_wait_set, woken_dispatcher); |
- |
- wait_set->RemoveAwakable(&w, nullptr); |
-} |
- |
-} // namespace |
-} // namespace edk |
-} // namespace mojo |