1 /*
2 * Copyright (c) 2017 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include "test_queue.h"
8
9 #define STACK_SIZE (512 + CONFIG_TEST_EXTRA_STACK_SIZE)
10 #define LIST_LEN 4
11 #define LOOPS 32
12
13 static qdata_t data[LIST_LEN];
14 static qdata_t data_p[LIST_LEN];
15 static qdata_t data_r[LIST_LEN];
16 static struct k_queue queue;
17 static K_THREAD_STACK_DEFINE(tstack, STACK_SIZE);
18 static struct k_thread tdata;
19 static struct k_sem end_sema;
20
tqueue_append(struct k_queue * pqueue)21 static void tqueue_append(struct k_queue *pqueue)
22 {
23 /**TESTPOINT: queue append*/
24 for (int i = 0; i < LIST_LEN; i++) {
25 k_queue_append(pqueue, (void *)&data[i]);
26 }
27
28 /**TESTPOINT: queue prepend*/
29 for (int i = LIST_LEN - 1; i >= 0; i--) {
30 k_queue_prepend(pqueue, (void *)&data_p[i]);
31 }
32
33 /**TESTPOINT: queue find and remove*/
34 for (int i = LIST_LEN - 1; i >= 0; i--) {
35 k_queue_prepend(pqueue, (void *)&data_r[i]);
36 }
37 }
38
tqueue_get(struct k_queue * pqueue)39 static void tqueue_get(struct k_queue *pqueue)
40 {
41 void *rx_data;
42
43 /*get queue data from "queue_prepend"*/
44 for (int i = 0; i < LIST_LEN; i++) {
45 /**TESTPOINT: queue get*/
46 rx_data = k_queue_get(pqueue, K_NO_WAIT);
47 zassert_equal(rx_data, (void *)&data_p[i]);
48 }
49
50 /*get queue data from "queue_append"*/
51 for (int i = 0; i < LIST_LEN; i++) {
52 /**TESTPOINT: queue get*/
53 rx_data = k_queue_get(pqueue, K_NO_WAIT);
54 zassert_equal(rx_data, (void *)&data[i]);
55 }
56 }
57
tqueue_find_and_remove(struct k_queue * pqueue)58 static void tqueue_find_and_remove(struct k_queue *pqueue)
59 {
60 /*remove queue data from "queue_find_and_remove"*/
61 for (int i = 0; i < LIST_LEN; i++) {
62 /**TESTPOINT: queue find and remove*/
63 zassert_true(k_queue_remove(pqueue, &data_r[i]));
64 }
65 }
66
67 /*entry of contexts*/
tIsr_entry(const void * p)68 static void tIsr_entry(const void *p)
69 {
70 tqueue_find_and_remove((struct k_queue *)p);
71 tqueue_get((struct k_queue *)p);
72 tqueue_append((struct k_queue *)p);
73 }
74
tThread_entry(void * p1,void * p2,void * p3)75 static void tThread_entry(void *p1, void *p2, void *p3)
76 {
77 tqueue_find_and_remove((struct k_queue *)p1);
78 tqueue_get((struct k_queue *)p1);
79 k_sem_give(&end_sema);
80 tqueue_append((struct k_queue *)p1);
81 k_sem_give(&end_sema);
82 }
83
84 /* queue read write job */
tqueue_read_write(struct k_queue * pqueue)85 static void tqueue_read_write(struct k_queue *pqueue)
86 {
87 k_sem_init(&end_sema, 0, 1);
88 /**TESTPOINT: thread-isr-thread data passing via queue*/
89 k_tid_t tid = k_thread_create(&tdata, tstack, STACK_SIZE,
90 tThread_entry, pqueue, NULL, NULL,
91 K_PRIO_PREEMPT(0), 0, K_NO_WAIT);
92
93 tqueue_append(pqueue);
94 irq_offload(tIsr_entry, (const void *)pqueue);
95 k_sem_take(&end_sema, K_FOREVER);
96 k_sem_take(&end_sema, K_FOREVER);
97
98 tqueue_find_and_remove(pqueue);
99 tqueue_get(pqueue);
100 k_thread_abort(tid);
101 }
102
103 /*test cases*/
104 /**
105 * @brief Test queue operations in loop
106 * @ingroup kernel_queue_tests
107 * @see k_queue_append(), k_queue_get(),
108 * k_queue_init(), k_queue_remove()
109 */
ZTEST(queue_api_1cpu,test_queue_loop)110 ZTEST(queue_api_1cpu, test_queue_loop)
111 {
112 k_queue_init(&queue);
113 for (int i = 0; i < LOOPS; i++) {
114 TC_PRINT("* Pass data by queue in loop %d\n", i);
115 tqueue_read_write(&queue);
116 }
117 }
118