#define BOOST_TEST_DYN_LINK #include "core/sophiar_obj.hpp" #include "utility/coro_signal_group.hpp" #include "utility/debug_utility.hpp" #include #include #include #include #include #include #include #include using boost::asio::awaitable; using boost::asio::co_spawn; using boost::asio::detached; using boost::asio::use_awaitable; using namespace sophiar; using namespace std::chrono_literals; awaitable test_coro_signal_group_1() { coro_signal2 sig_a(global_context); coro_signal2 sig_b(global_context); coro_signal_any_group group_any(global_context); coro_signal_all_group group_all(global_context); group_any.add_watcher(sig_a.new_watcher(global_context)); group_any.add_watcher(sig_b.new_watcher(global_context)); group_all.add_watcher(sig_a.new_watcher(global_context)); group_all.add_watcher(sig_b.new_watcher(global_context)); int cnt_any = 0, cnt_all = 0; auto worker_any = make_infinite_coro_worker(global_context, [ &cnt_any, watcher = group_any.new_watcher(global_context)]() mutable -> awaitable { co_await watcher.coro_wait(false); ++cnt_any; }); auto worker_all = make_infinite_coro_worker(global_context, [ &cnt_all, watcher = group_all.new_watcher(global_context)]() mutable -> awaitable { co_await watcher.coro_wait(false); ++cnt_all; }); worker_any->run(); worker_all->run(); group_any.start(global_context); group_all.start(global_context); sig_a.try_notify_all(); co_await coro_sleep(10ms); BOOST_TEST(cnt_any == 1); BOOST_TEST(cnt_all == 0); sig_b.try_notify_all(); co_await coro_sleep(10ms); BOOST_TEST(cnt_any == 2); BOOST_TEST(cnt_all == 1); sig_a.try_notify_all(); sig_b.try_notify_all(); co_await coro_sleep(10ms); BOOST_TEST(cnt_any == 3); BOOST_TEST(cnt_all == 2); worker_any->cancel(); worker_all->cancel(); co_await worker_any->coro_wait_stop(); co_await worker_all->coro_wait_stop(); co_await group_any.stop(); co_await group_all.stop(); co_return; } BOOST_AUTO_TEST_CASE(test_coro_signal_group) { co_spawn(global_context, test_coro_signal_group_1(), detached); global_context.run(); }