|
|
@@ -0,0 +1,89 @@
|
|
|
+#define BOOST_TEST_DYN_LINK
|
|
|
+
|
|
|
+#include "core/sophiar_obj.hpp"
|
|
|
+#include "utility/coro_signal_group.hpp"
|
|
|
+#include "utility/debug_utility.hpp"
|
|
|
+
|
|
|
+#include <boost/asio/co_spawn.hpp>
|
|
|
+#include <boost/asio/detached.hpp>
|
|
|
+#include <boost/asio/this_coro.hpp>
|
|
|
+#include <boost/asio/use_awaitable.hpp>
|
|
|
+#include <boost/test/unit_test.hpp>
|
|
|
+
|
|
|
+#include <chrono>
|
|
|
+#include <iostream>
|
|
|
+#include <vector>
|
|
|
+
|
|
|
+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<void> 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<bool> {
|
|
|
+ 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<bool> {
|
|
|
+ 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();
|
|
|
+}
|