1#include "thread/workqueue/tests/test_internal.h"
2
3TEST_GROUP_DEFINE(defer, .intensity_desc = {
4 .curve = SCALE_PIECEWISE_LOG,
5 .unit = "iters",
6 });
7
8static atomic_bool defer_worked = false;
9static uint64_t enqueue_ms;
10static uint64_t finish_ms;
11static char msg[100] = {0};
12static struct delayed_work test_dwork;
13
14static void defer_func(void *boo, void *unused) {
15 cc_ignore(boo, unused);
16 finish_ms = time_get_ms();
17
18 snprintf(msg, sizeof(msg), "Start ms was %lu, end ms was %lu, took %lu ms",
19 enqueue_ms, finish_ms, finish_ms - enqueue_ms);
20
21 test_info("Delayed work complete");
22 test_info("%s", msg);
23 atomic_store_release(&defer_worked, true);
24}
25
26TEST_DEFINE_UNIT(defer, delayed_work_schedule) {
27 atomic_store_rlx(&defer_worked, false);
28 delayed_work_init(dwork: &test_dwork, fn: defer_func, WORK_ARGS(NULL, NULL));
29 enqueue_ms = time_get_ms();
30 delayed_work_schedule(dwork: &test_dwork, delay_ms: 5);
31
32 time_ms_t deadline = time_get_ms() + 500;
33 while (!atomic_load_acq(&defer_worked) && time_get_ms() < deadline)
34 scheduler_yield();
35
36 TEST_ASSERT(atomic_load_acq(&defer_worked));
37 return TEST_SUCCESS;
38}
39