coro_worker.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #define BOOST_TEST_DYN_LINK
  2. #include "core/sophiar_obj.hpp"
  3. #include "utility/coro_worker.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_worker_1() {
  20. int cnt = 0;
  21. auto worker = make_infinite_coro_worker([&]() -> awaitable<bool> {
  22. co_await coro_sleep(50ms);
  23. ++cnt;
  24. co_return true;
  25. });
  26. worker->run();
  27. co_await coro_sleep(210ms);
  28. worker->cancel();
  29. co_await worker->coro_wait_stop();
  30. BOOST_TEST(cnt == 4);
  31. co_return;
  32. }
  33. awaitable<void> test_coro_worker_2() {
  34. int cnt = 0;
  35. auto worker = make_infinite_coro_worker([&]() -> awaitable<bool> {
  36. co_await coro_sleep(50ms);
  37. ++cnt;
  38. co_return false;
  39. });
  40. worker->run();
  41. co_await coro_sleep(210ms);
  42. worker->cancel();
  43. co_await worker->coro_wait_stop();
  44. BOOST_TEST(cnt == 1);
  45. co_return;
  46. }
  47. awaitable<void> test_coro_worker_3() {
  48. int cnt = 0;
  49. auto worker = make_interval_coro_worker(50ms, [&]() -> awaitable<bool> {
  50. ++cnt;
  51. co_return true;
  52. });
  53. worker->run();
  54. co_await coro_sleep(190ms);
  55. worker->cancel();
  56. co_await worker->coro_wait_stop();
  57. BOOST_TEST(cnt == 4);
  58. co_return;
  59. }
  60. awaitable<void> test_coro_worker_4() {
  61. int cnt = 0;
  62. auto worker = make_interval_coro_worker(50ms, [&]() -> awaitable<bool> {
  63. ++cnt;
  64. co_return false;
  65. });
  66. worker->run();
  67. co_await coro_sleep(210ms);
  68. worker->cancel();
  69. co_await worker->coro_wait_stop();
  70. BOOST_TEST(cnt == 1);
  71. co_return;
  72. }
  73. awaitable<void> test_coro_worker_5() {
  74. int cnt = 0;
  75. auto worker = make_interval_coro_worker(10ms, [&]() -> awaitable<bool> {
  76. co_await coro_sleep(50ms);
  77. ++cnt;
  78. co_return true;
  79. });
  80. worker->run();
  81. co_await coro_sleep(210ms);
  82. worker->cancel();
  83. co_await worker->coro_wait_stop();
  84. BOOST_TEST(cnt == 4);
  85. co_return;
  86. }
  87. awaitable<void> test_coro_worker_6() {
  88. int cnt = 0, exit_cnt = 0;
  89. auto worker = make_interval_coro_worker(10ms, [&]() -> awaitable<bool> {
  90. co_await coro_sleep(50ms);
  91. ++cnt;
  92. co_return true;
  93. }, [&]() {
  94. ++exit_cnt;
  95. });
  96. worker->run();
  97. co_await coro_sleep(210ms);
  98. BOOST_TEST(exit_cnt == 0);
  99. worker->cancel();
  100. co_await worker->coro_wait_stop();
  101. BOOST_TEST(cnt == 4);
  102. BOOST_TEST(exit_cnt == 1);
  103. co_return;
  104. }
  105. BOOST_AUTO_TEST_CASE(test_coro_worker) {
  106. initialize({});
  107. co_spawn(*global_context, test_coro_worker_1(), detached);
  108. co_spawn(*global_context, test_coro_worker_2(), detached);
  109. co_spawn(*global_context, test_coro_worker_3(), detached);
  110. co_spawn(*global_context, test_coro_worker_4(), detached);
  111. co_spawn(*global_context, test_coro_worker_5(), detached);
  112. co_spawn(*global_context, test_coro_worker_6(), detached);
  113. global_context->run();
  114. }