1 /*
2 * Copyright (c) 2024 Måns Ansgariusson <mansgariusson@gmail.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/kernel.h>
8 #include <zephyr/ztest.h>
9
10 #define NUM_TEST_ITEMS 10
11 /* In fact, each work item could take up to this value */
12 #define WORK_ITEM_WAIT_ALIGNED \
13 k_ticks_to_ms_floor64(k_ms_to_ticks_ceil32(CONFIG_TEST_WORK_ITEM_WAIT_MS) + _TICK_ALIGN)
14 #define CHECK_WAIT ((NUM_TEST_ITEMS + 1) * WORK_ITEM_WAIT_ALIGNED)
15
16 static K_THREAD_STACK_DEFINE(work_q_stack, 1024 + CONFIG_TEST_EXTRA_STACK_SIZE);
17
work_handler(struct k_work * work)18 static void work_handler(struct k_work *work)
19 {
20 ARG_UNUSED(work);
21 k_msleep(CONFIG_TEST_WORK_ITEM_WAIT_MS);
22 }
23
ZTEST(workqueue_api,test_k_work_queue_stop)24 ZTEST(workqueue_api, test_k_work_queue_stop)
25 {
26 size_t i;
27 struct k_work work;
28 struct k_work_q work_q;
29 struct k_work works[NUM_TEST_ITEMS];
30 struct k_work_queue_config cfg = {
31 .name = "test_work_q",
32 .no_yield = true,
33 };
34
35 zassert_equal(k_work_queue_stop(&work_q, K_FOREVER), -EALREADY,
36 "Succeeded to stop work queue on non-initialized work queue");
37 k_work_queue_start(&work_q, work_q_stack, K_THREAD_STACK_SIZEOF(work_q_stack),
38 K_PRIO_PREEMPT(4), &cfg);
39
40 for (i = 0; i < NUM_TEST_ITEMS; i++) {
41 k_work_init(&works[i], work_handler);
42 zassert_equal(k_work_submit_to_queue(&work_q, &works[i]), 1,
43 "Failed to submit work item");
44 }
45
46 /* Wait for the work item to complete */
47 k_sleep(K_MSEC(CHECK_WAIT));
48
49 zassert_equal(k_work_queue_stop(&work_q, K_FOREVER), -EBUSY,
50 "Succeeded to stop work queue while it is running & not plugged");
51 zassert_true(k_work_queue_drain(&work_q, true) >= 0, "Failed to drain & plug work queue");
52 zassert_ok(k_work_queue_stop(&work_q, K_FOREVER), "Failed to stop work queue");
53
54 k_work_init(&work, work_handler);
55 zassert_equal(k_work_submit_to_queue(&work_q, &work), -ENODEV,
56 "Succeeded to submit work item to non-initialized work queue");
57 }
58
59 ZTEST_SUITE(workqueue_api, NULL, NULL, NULL, NULL, NULL);
60