1#include "thread/workqueue/tests/test_internal.h"
2
3TEST_GROUP_DECLARE(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 (void) boo, (void) unused;
16 finish_ms = time_get_ms();
17
18 snprintf(buffer: msg, buffer_len: sizeof(msg), format: "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(msg);
23 defer_worked = true;
24}
25
26TEST_DECLARE_UNIT(defer, delayed_work_schedule) {
27 atomic_store(&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 (!defer_worked && time_get_ms() < deadline)
34 scheduler_yield();
35
36 TEST_ASSERT(defer_worked);
37 return TEST_SUCCESS;
38}
39