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