13#ifdef LIBCOTASK_MACRO_ENABLED
15static int g_test_coroutine_task_manager_status = 0;
16class test_context_task_manager_action :
public cotask::impl::task_action_impl {
18 int operator()(
void *)
override {
19 ++g_test_coroutine_task_manager_status;
23 cotask::this_task::get_task()->yield();
25 ++g_test_coroutine_task_manager_status;
31CASE_TEST(coroutine_task_manager, tickspec_t) {
32 cotask::detail::tickspec_t l;
33 cotask::detail::tickspec_t r;
63CASE_TEST(coroutine_task_manager, task_timer_node) {
64 cotask::detail::task_timer_node<cotask::task<>::id_type> l;
65 cotask::detail::task_timer_node<cotask::task<>::id_type> r;
67 l.expired_time.tv_sec = 123;
68 l.expired_time.tv_nsec = 456;
71 r.expired_time.tv_sec = 123;
72 r.expired_time.tv_nsec = 456;
87 r.expired_time.tv_nsec = 45;
95 r.expired_time.tv_nsec = 456;
103 r.expired_time.tv_nsec = 4567;
112CASE_TEST(coroutine_task_manager, add_and_timeout) {
114 task_ptr_type co_task = cotask::task<>::create(test_context_task_manager_action());
115 task_ptr_type co_another_task = cotask::task<>::create(test_context_task_manager_action());
117 typedef cotask::task_manager<cotask::task<> >
mgr_t;
118 mgr_t::ptr_t
task_mgr = mgr_t::create();
121 g_test_coroutine_task_manager_status = 0;
124 task_mgr->add_task(co_another_task);
139 CASE_EXPECT_EQ(8, (
int)
task_mgr->get_container().find(co_task->get_id())->second.timer_node->expired_time.tv_sec);
156 task_mgr->start(co_another_task->get_id());
158 CASE_EXPECT_EQ(cotask::EN_TS_WAITING, co_another_task->get_status());
161 task_mgr->resume(co_another_task->get_id());
165 CASE_EXPECT_EQ(cotask::EN_TS_DONE, co_another_task->get_status());
177 task_ptr_type co_task = cotask::task<>::create(test_context_task_manager_action());
178 task_ptr_type co_another_task = cotask::task<>::create(test_context_task_manager_action());
180 typedef cotask::task_manager<cotask::task<> >
mgr_t;
181 mgr_t::ptr_t
task_mgr = mgr_t::create();
184 g_test_coroutine_task_manager_status = 0;
188 task_mgr->add_task(co_another_task, 10, 0);
196 task_mgr->cancel(co_another_task->get_id());
204 CASE_EXPECT_EQ(cotask::EN_TS_CANCELED, co_another_task->get_status());
207CASE_TEST(coroutine_task_manager, duplicated_checkpoints) {
209 task_ptr_type co_task = cotask::task<>::create(test_context_task_manager_action());
211 typedef cotask::task_manager<cotask::task<> >
mgr_t;
212 mgr_t::ptr_t
task_mgr = mgr_t::create();
215 g_test_coroutine_task_manager_status = 0;
234CASE_TEST(coroutine_task_manager, update_timeout) {
236 task_ptr_type co_task = cotask::task<>::create(test_context_task_manager_action());
238 typedef cotask::task_manager<cotask::task<> >
mgr_t;
239 mgr_t::ptr_t
task_mgr = mgr_t::create();
242 g_test_coroutine_task_manager_status = 0;
267class test_context_task_manager_action_protect_this_task :
public cotask::impl::task_action_impl {
269 int operator()(
void *)
override {
270 int use_count =
static_cast<int>(cotask::this_task::get<cotask::task<> >()->use_count());
272 cotask::this_task::get_task()->yield();
273 use_count =
static_cast<int>(cotask::this_task::get<cotask::task<> >()->use_count());
279 ++g_test_coroutine_task_manager_status;
284CASE_TEST(coroutine_task_manager, protect_this_task) {
288 typedef cotask::task_manager<cotask::task<> >
mgr_t;
289 mgr_t::ptr_t
task_mgr = mgr_t::create();
291 g_test_coroutine_task_manager_status = 0;
292 task_ptr_type co_task = cotask::task<>::create(test_context_task_manager_action_protect_this_task());
293 cotask::task<>::id_t id_finished = co_task->get_id();
296 co_task = cotask::task<>::create(test_context_task_manager_action_protect_this_task());
297 cotask::task<>::id_t id_unfinished = co_task->get_id();
300 co_task = cotask::task<>::create(test_context_task_manager_action_protect_this_task());
301 cotask::task<>::id_t id_removed = co_task->get_id();
324# if LIBCOPP_MACRO_ENABLE_MULTI_THREAD
325static LIBCOPP_COPP_NAMESPACE_ID::util::lock::atomic_int_type<int> g_test_coroutine_task_manager_atomic;
327static constexpr const int test_context_task_manager_action_mt_run_times = 10000;
328enum { test_context_task_manager_action_mt_thread_num = 1000 };
330struct test_context_task_manager_action_mt_thread :
public cotask::impl::task_action_impl {
332 int operator()(
void *run_count_p)
override {
334 int *run_count =
reinterpret_cast<int *
>(run_count_p);
336 while (*run_count < test_context_task_manager_action_mt_run_times) {
338 ++g_test_coroutine_task_manager_atomic;
340 cotask::this_task::get_task()->yield(&run_count_p);
342 run_count =
reinterpret_cast<int *
>(run_count_p);
348struct test_context_task_manager_mt_thread_runner {
349 typedef cotask::task_manager<cotask::task<> >
mgr_t;
352 test_context_task_manager_mt_thread_runner(mgr_t::ptr_t mgr) : run_count(0),
task_mgr(mgr) {}
358 cotask::task<>::create(test_context_task_manager_action_mt_thread(), 16 * 1024);
359 cotask::task<>::id_t task_id = co_task->get_id();
362 task_mgr->start(task_id, &run_count);
364 while (
false == co_task->is_completed()) {
365 task_mgr->resume(task_id, &run_count);
368 CASE_EXPECT_EQ(test_context_task_manager_action_mt_run_times, run_count);
373CASE_TEST(coroutine_task_manager, create_and_run_mt) {
374 typedef cotask::task_manager<cotask::task<> >
mgr_t;
375 mgr_t::ptr_t
task_mgr = mgr_t::create();
377 g_test_coroutine_task_manager_atomic.store(0);
379 std::unique_ptr<std::thread> thds[test_context_task_manager_action_mt_thread_num];
380 for (
int i = 0; i < test_context_task_manager_action_mt_thread_num; ++i) {
381 thds[i].reset(
new std::thread(test_context_task_manager_mt_thread_runner(
task_mgr)));
384 for (
int i = 0; i < test_context_task_manager_action_mt_thread_num; ++i) {
388 CASE_EXPECT_EQ(test_context_task_manager_action_mt_run_times * test_context_task_manager_action_mt_thread_num,
389 g_test_coroutine_task_manager_atomic.load());
393# if defined(LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER) && LIBCOTASK_MACRO_AUTO_CLEANUP_MANAGER
394CASE_TEST(coroutine_task_manager, auto_cleanup_for_manager) {
396 task_ptr_type co_task = cotask::task<>::create(test_context_task_manager_action());
398 typedef cotask::task_manager<cotask::task<> >
mgr_t;
399 mgr_t::ptr_t task_mgr1 = mgr_t::create();
400 mgr_t::ptr_t task_mgr2 = mgr_t::create();
403 CASE_EXPECT_EQ(copp::COPP_EC_TASK_ALREADY_IN_ANOTHER_MANAGER, task_mgr2->add_task(co_task, 5, 0));
416# if defined(LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR) && LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR
417class test_context_task_manager_action_with_exception :
public cotask::impl::task_action_impl {
419 int operator()(
void *)
override {
420 ++g_test_coroutine_task_manager_status;
422 cotask::this_task::get_task()->yield();
424 ++g_test_coroutine_task_manager_status;
432CASE_TEST(coroutine_task_manager, exception_safe) {
434 task_ptr_type co_task = cotask::task<>::create(test_context_task_manager_action_with_exception());
436 typedef cotask::task_manager<cotask::task<> >
mgr_t;
437 mgr_t::ptr_t task_mgr1 = mgr_t::create();
438 mgr_t::ptr_t task_mgr2 = mgr_t::create();
441 CASE_EXPECT_EQ(copp::COPP_EC_TASK_ALREADY_IN_ANOTHER_MANAGER, task_mgr2->add_task(co_task, 5, 0));
446 int check_status = g_test_coroutine_task_manager_status;
450 }
catch (
const std::exception &e) {
451 CASE_MSG_INFO() <<
"Catch a exception: " << e.what() << std::endl;
454 CASE_EXPECT_EQ(check_status + 2, g_test_coroutine_task_manager_status);
cotask::task_manager< my_task_t > mgr_t
my_task_t::ptr_t task_ptr_type
#define CASE_EXPECT_FALSE(c)
#define CASE_EXPECT_EQ(l, r)
#define CASE_EXPECT_NE(l, r)
#define CASE_TEST(test_name, case_name)
#define CASE_EXPECT_TRUE(c)