#define BOOST_TEST_DYN_LINK #include "core/sophiar_obj.hpp" #include "utility/coro_worker.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_worker_1() { int cnt = 0; auto worker = make_infinite_coro_worker([&]() -> awaitable { co_await coro_sleep(50ms); ++cnt; co_return true; }); worker->run(); co_await coro_sleep(210ms); worker->cancel(); co_await worker->coro_wait_stop(); BOOST_TEST(cnt == 4); co_return; } awaitable test_coro_worker_2() { int cnt = 0; auto worker = make_infinite_coro_worker([&]() -> awaitable { co_await coro_sleep(50ms); ++cnt; co_return false; }); worker->run(); co_await coro_sleep(210ms); worker->cancel(); co_await worker->coro_wait_stop(); BOOST_TEST(cnt == 1); co_return; } awaitable test_coro_worker_3() { int cnt = 0; auto worker = make_interval_coro_worker(50ms, [&]() -> awaitable { ++cnt; co_return true; }); worker->run(); co_await coro_sleep(190ms); worker->cancel(); co_await worker->coro_wait_stop(); BOOST_TEST(cnt == 4); co_return; } awaitable test_coro_worker_4() { int cnt = 0; auto worker = make_interval_coro_worker(50ms, [&]() -> awaitable { ++cnt; co_return false; }); worker->run(); co_await coro_sleep(210ms); worker->cancel(); co_await worker->coro_wait_stop(); BOOST_TEST(cnt == 1); co_return; } awaitable test_coro_worker_5() { int cnt = 0; auto worker = make_interval_coro_worker(10ms, [&]() -> awaitable { co_await coro_sleep(50ms); ++cnt; co_return true; }); worker->run(); co_await coro_sleep(210ms); worker->cancel(); co_await worker->coro_wait_stop(); BOOST_TEST(cnt == 4); co_return; } awaitable test_coro_worker_6() { int cnt = 0, exit_cnt = 0; auto worker = make_interval_coro_worker(10ms, [&]() -> awaitable { co_await coro_sleep(50ms); ++cnt; co_return true; }, [&]() { ++exit_cnt; }); worker->run(); co_await coro_sleep(210ms); BOOST_TEST(exit_cnt == 0); worker->cancel(); co_await worker->coro_wait_stop(); BOOST_TEST(cnt == 4); BOOST_TEST(exit_cnt == 1); co_return; } BOOST_AUTO_TEST_CASE(test_coro_worker) { initialize({}); co_spawn(*global_context, test_coro_worker_1(), detached); co_spawn(*global_context, test_coro_worker_2(), detached); co_spawn(*global_context, test_coro_worker_3(), detached); co_spawn(*global_context, test_coro_worker_4(), detached); co_spawn(*global_context, test_coro_worker_5(), detached); co_spawn(*global_context, test_coro_worker_6(), detached); global_context->run(); }