coro_signal_group.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #define BOOST_TEST_DYN_LINK
  2. #include "core/sophiar_obj.hpp"
  3. #include "utility/coro_signal_group.hpp"
  4. #include "utility/debug_utility.hpp"
  5. #include <boost/asio/co_spawn.hpp>
  6. #include <boost/asio/detached.hpp>
  7. #include <boost/asio/this_coro.hpp>
  8. #include <boost/asio/use_awaitable.hpp>
  9. #include <boost/test/unit_test.hpp>
  10. #include <chrono>
  11. #include <iostream>
  12. #include <vector>
  13. using boost::asio::awaitable;
  14. using boost::asio::co_spawn;
  15. using boost::asio::detached;
  16. using boost::asio::use_awaitable;
  17. using namespace sophiar;
  18. using namespace std::chrono_literals;
  19. awaitable<void> test_coro_signal_group_1() {
  20. coro_signal2 sig_a(global_context);
  21. coro_signal2 sig_b(global_context);
  22. coro_signal_any_group group_any(global_context);
  23. coro_signal_all_group group_all(global_context);
  24. group_any.add_watcher(sig_a.new_watcher(global_context));
  25. group_any.add_watcher(sig_b.new_watcher(global_context));
  26. group_all.add_watcher(sig_a.new_watcher(global_context));
  27. group_all.add_watcher(sig_b.new_watcher(global_context));
  28. int cnt_any = 0, cnt_all = 0;
  29. auto worker_any = make_infinite_coro_worker(global_context, [
  30. &cnt_any,
  31. watcher = group_any.new_watcher(global_context)]() mutable
  32. -> awaitable<bool> {
  33. co_await watcher.coro_wait(false);
  34. ++cnt_any;
  35. });
  36. auto worker_all = make_infinite_coro_worker(global_context, [
  37. &cnt_all,
  38. watcher = group_all.new_watcher(global_context)]() mutable
  39. -> awaitable<bool> {
  40. co_await watcher.coro_wait(false);
  41. ++cnt_all;
  42. });
  43. worker_any->run();
  44. worker_all->run();
  45. group_any.start(global_context);
  46. group_all.start(global_context);
  47. sig_a.try_notify_all();
  48. co_await coro_sleep(10ms);
  49. BOOST_TEST(cnt_any == 1);
  50. BOOST_TEST(cnt_all == 0);
  51. sig_b.try_notify_all();
  52. co_await coro_sleep(10ms);
  53. BOOST_TEST(cnt_any == 2);
  54. BOOST_TEST(cnt_all == 1);
  55. sig_a.try_notify_all();
  56. sig_b.try_notify_all();
  57. co_await coro_sleep(10ms);
  58. BOOST_TEST(cnt_any == 3);
  59. BOOST_TEST(cnt_all == 2);
  60. worker_any->cancel();
  61. worker_all->cancel();
  62. co_await worker_any->coro_wait_stop();
  63. co_await worker_all->coro_wait_stop();
  64. co_await group_any.stop();
  65. co_await group_all.stop();
  66. co_return;
  67. }
  68. BOOST_AUTO_TEST_CASE(test_coro_signal_group) {
  69. co_spawn(global_context, test_coro_signal_group_1(), detached);
  70. global_context.run();
  71. }