xref: /qemu/tests/unit/test-fifo.c (revision f2f262c3f9dd50dbe93d5dacacc2e553dd712065)
1*f2f262c3SMark Cave-Ayland /*
2*f2f262c3SMark Cave-Ayland  * Fifo8 tests
3*f2f262c3SMark Cave-Ayland  *
4*f2f262c3SMark Cave-Ayland  * Copyright 2024 Mark Cave-Ayland
5*f2f262c3SMark Cave-Ayland  *
6*f2f262c3SMark Cave-Ayland  * Authors:
7*f2f262c3SMark Cave-Ayland  *  Mark Cave-Ayland    <mark.cave-ayland@ilande.co.uk>
8*f2f262c3SMark Cave-Ayland  *
9*f2f262c3SMark Cave-Ayland  * This work is licensed under the terms of the GNU LGPL, version 2 or later.
10*f2f262c3SMark Cave-Ayland  * See the COPYING.LIB file in the top-level directory.
11*f2f262c3SMark Cave-Ayland  */
12*f2f262c3SMark Cave-Ayland 
13*f2f262c3SMark Cave-Ayland #include "qemu/osdep.h"
14*f2f262c3SMark Cave-Ayland #include "migration/vmstate.h"
15*f2f262c3SMark Cave-Ayland #include "qemu/fifo8.h"
16*f2f262c3SMark Cave-Ayland 
17*f2f262c3SMark Cave-Ayland const VMStateInfo vmstate_info_uint32;
18*f2f262c3SMark Cave-Ayland const VMStateInfo vmstate_info_buffer;
19*f2f262c3SMark Cave-Ayland 
20*f2f262c3SMark Cave-Ayland 
21*f2f262c3SMark Cave-Ayland static void test_fifo8_pop_bufptr_wrap(void)
22*f2f262c3SMark Cave-Ayland {
23*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
24*f2f262c3SMark Cave-Ayland     uint8_t data_in1[] = { 0x1, 0x2, 0x3, 0x4 };
25*f2f262c3SMark Cave-Ayland     uint8_t data_in2[] = { 0x5, 0x6, 0x7, 0x8, 0x1, 0x2 };
26*f2f262c3SMark Cave-Ayland     const uint8_t *buf;
27*f2f262c3SMark Cave-Ayland     uint32_t count;
28*f2f262c3SMark Cave-Ayland 
29*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
30*f2f262c3SMark Cave-Ayland 
31*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
32*f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 2, &count);
33*f2f262c3SMark Cave-Ayland     g_assert(count == 2);
34*f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
35*f2f262c3SMark Cave-Ayland 
36*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
37*f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 8, &count);
38*f2f262c3SMark Cave-Ayland     g_assert(count == 6);
39*f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x3 && buf[1] == 0x4 && buf[2] == 0x5 &&
40*f2f262c3SMark Cave-Ayland              buf[3] == 0x6 && buf[4] == 0x7 && buf[5] == 0x8);
41*f2f262c3SMark Cave-Ayland 
42*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 2);
43*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
44*f2f262c3SMark Cave-Ayland }
45*f2f262c3SMark Cave-Ayland 
46*f2f262c3SMark Cave-Ayland static void test_fifo8_pop_bufptr(void)
47*f2f262c3SMark Cave-Ayland {
48*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
49*f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4 };
50*f2f262c3SMark Cave-Ayland     const uint8_t *buf;
51*f2f262c3SMark Cave-Ayland     uint32_t count;
52*f2f262c3SMark Cave-Ayland 
53*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
54*f2f262c3SMark Cave-Ayland 
55*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
56*f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 2, &count);
57*f2f262c3SMark Cave-Ayland     g_assert(count == 2);
58*f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
59*f2f262c3SMark Cave-Ayland 
60*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 2);
61*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
62*f2f262c3SMark Cave-Ayland }
63*f2f262c3SMark Cave-Ayland 
64*f2f262c3SMark Cave-Ayland static void test_fifo8_peek_bufptr_wrap(void)
65*f2f262c3SMark Cave-Ayland {
66*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
67*f2f262c3SMark Cave-Ayland     uint8_t data_in1[] = { 0x1, 0x2, 0x3, 0x4 };
68*f2f262c3SMark Cave-Ayland     uint8_t data_in2[] = { 0x5, 0x6, 0x7, 0x8, 0x1, 0x2 };
69*f2f262c3SMark Cave-Ayland     const uint8_t *buf;
70*f2f262c3SMark Cave-Ayland     uint32_t count;
71*f2f262c3SMark Cave-Ayland 
72*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
73*f2f262c3SMark Cave-Ayland 
74*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
75*f2f262c3SMark Cave-Ayland     buf = fifo8_peek_bufptr(&fifo, 2, &count);
76*f2f262c3SMark Cave-Ayland     g_assert(count == 2);
77*f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
78*f2f262c3SMark Cave-Ayland 
79*f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 2, &count);
80*f2f262c3SMark Cave-Ayland     g_assert(count == 2);
81*f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
82*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
83*f2f262c3SMark Cave-Ayland 
84*f2f262c3SMark Cave-Ayland     buf = fifo8_peek_bufptr(&fifo, 8, &count);
85*f2f262c3SMark Cave-Ayland     g_assert(count == 6);
86*f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x3 && buf[1] == 0x4 && buf[2] == 0x5 &&
87*f2f262c3SMark Cave-Ayland              buf[3] == 0x6 && buf[4] == 0x7 && buf[5] == 0x8);
88*f2f262c3SMark Cave-Ayland 
89*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 8);
90*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
91*f2f262c3SMark Cave-Ayland }
92*f2f262c3SMark Cave-Ayland 
93*f2f262c3SMark Cave-Ayland static void test_fifo8_peek_bufptr(void)
94*f2f262c3SMark Cave-Ayland {
95*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
96*f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4 };
97*f2f262c3SMark Cave-Ayland     const uint8_t *buf;
98*f2f262c3SMark Cave-Ayland     uint32_t count;
99*f2f262c3SMark Cave-Ayland 
100*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
101*f2f262c3SMark Cave-Ayland 
102*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
103*f2f262c3SMark Cave-Ayland     buf = fifo8_peek_bufptr(&fifo, 2, &count);
104*f2f262c3SMark Cave-Ayland     g_assert(count == 2);
105*f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
106*f2f262c3SMark Cave-Ayland 
107*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 4);
108*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
109*f2f262c3SMark Cave-Ayland }
110*f2f262c3SMark Cave-Ayland 
111*f2f262c3SMark Cave-Ayland static void test_fifo8_pop_buf_wrap(void)
112*f2f262c3SMark Cave-Ayland {
113*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
114*f2f262c3SMark Cave-Ayland     uint8_t data_in1[] = { 0x1, 0x2, 0x3, 0x4 };
115*f2f262c3SMark Cave-Ayland     uint8_t data_in2[] = { 0x5, 0x6, 0x7, 0x8, 0x1, 0x2, 0x3, 0x4 };
116*f2f262c3SMark Cave-Ayland     uint8_t data_out[4];
117*f2f262c3SMark Cave-Ayland     int count;
118*f2f262c3SMark Cave-Ayland 
119*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
120*f2f262c3SMark Cave-Ayland 
121*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
122*f2f262c3SMark Cave-Ayland     fifo8_pop_buf(&fifo, NULL, 4);
123*f2f262c3SMark Cave-Ayland 
124*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
125*f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, NULL, 4);
126*f2f262c3SMark Cave-Ayland     g_assert(count == 4);
127*f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, data_out, 4);
128*f2f262c3SMark Cave-Ayland     g_assert(count == 4);
129*f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0x1 && data_out[1] == 0x2 &&
130*f2f262c3SMark Cave-Ayland              data_out[2] == 0x3 && data_out[3] == 0x4);
131*f2f262c3SMark Cave-Ayland 
132*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 0);
133*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
134*f2f262c3SMark Cave-Ayland }
135*f2f262c3SMark Cave-Ayland 
136*f2f262c3SMark Cave-Ayland static void test_fifo8_pop_buf(void)
137*f2f262c3SMark Cave-Ayland {
138*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
139*f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 };
140*f2f262c3SMark Cave-Ayland     uint8_t data_out[] = { 0xff, 0xff, 0xff, 0xff };
141*f2f262c3SMark Cave-Ayland     int count;
142*f2f262c3SMark Cave-Ayland 
143*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
144*f2f262c3SMark Cave-Ayland 
145*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
146*f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, NULL, 4);
147*f2f262c3SMark Cave-Ayland     g_assert(count == 4);
148*f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, data_out, 4);
149*f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0x5 && data_out[1] == 0x6 &&
150*f2f262c3SMark Cave-Ayland              data_out[2] == 0x7 && data_out[3] == 0x8);
151*f2f262c3SMark Cave-Ayland 
152*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 0);
153*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
154*f2f262c3SMark Cave-Ayland }
155*f2f262c3SMark Cave-Ayland 
156*f2f262c3SMark Cave-Ayland static void test_fifo8_peek_buf_wrap(void)
157*f2f262c3SMark Cave-Ayland {
158*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
159*f2f262c3SMark Cave-Ayland     uint8_t data_in1[] = { 0x1, 0x2, 0x3, 0x4 };
160*f2f262c3SMark Cave-Ayland     uint8_t data_in2[] = { 0x5, 0x6, 0x7, 0x8, 0x1, 0x2, 0x3, 0x4 };
161*f2f262c3SMark Cave-Ayland     uint8_t data_out[4];
162*f2f262c3SMark Cave-Ayland     int count;
163*f2f262c3SMark Cave-Ayland 
164*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
165*f2f262c3SMark Cave-Ayland 
166*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
167*f2f262c3SMark Cave-Ayland     fifo8_pop_buf(&fifo, NULL, 4);
168*f2f262c3SMark Cave-Ayland 
169*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
170*f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, NULL, 4);
171*f2f262c3SMark Cave-Ayland     g_assert(count == 4);
172*f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, data_out, 4);
173*f2f262c3SMark Cave-Ayland     g_assert(count == 4);
174*f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0x5 && data_out[1] == 0x6 &&
175*f2f262c3SMark Cave-Ayland              data_out[2] == 0x7 && data_out[3] == 0x8);
176*f2f262c3SMark Cave-Ayland 
177*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 8);
178*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
179*f2f262c3SMark Cave-Ayland }
180*f2f262c3SMark Cave-Ayland 
181*f2f262c3SMark Cave-Ayland static void test_fifo8_peek_buf(void)
182*f2f262c3SMark Cave-Ayland {
183*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
184*f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4 };
185*f2f262c3SMark Cave-Ayland     uint8_t data_out[] = { 0xff, 0xff, 0xff, 0xff };
186*f2f262c3SMark Cave-Ayland     int count;
187*f2f262c3SMark Cave-Ayland 
188*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
189*f2f262c3SMark Cave-Ayland 
190*f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
191*f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, NULL, 4);
192*f2f262c3SMark Cave-Ayland     g_assert(count == 4);
193*f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0xff && data_out[1] == 0xff &&
194*f2f262c3SMark Cave-Ayland              data_out[2] == 0xff && data_out[3] == 0xff);
195*f2f262c3SMark Cave-Ayland 
196*f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, data_out, 4);
197*f2f262c3SMark Cave-Ayland     g_assert(count == 4);
198*f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0x1 && data_out[1] == 0x2 &&
199*f2f262c3SMark Cave-Ayland              data_out[2] == 0x3 && data_out[3] == 0x4);
200*f2f262c3SMark Cave-Ayland 
201*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 4);
202*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
203*f2f262c3SMark Cave-Ayland }
204*f2f262c3SMark Cave-Ayland 
205*f2f262c3SMark Cave-Ayland static void test_fifo8_peek(void)
206*f2f262c3SMark Cave-Ayland {
207*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
208*f2f262c3SMark Cave-Ayland     uint8_t c;
209*f2f262c3SMark Cave-Ayland 
210*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
211*f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x1);
212*f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x2);
213*f2f262c3SMark Cave-Ayland 
214*f2f262c3SMark Cave-Ayland     c = fifo8_peek(&fifo);
215*f2f262c3SMark Cave-Ayland     g_assert(c == 0x1);
216*f2f262c3SMark Cave-Ayland     fifo8_pop(&fifo);
217*f2f262c3SMark Cave-Ayland     c = fifo8_peek(&fifo);
218*f2f262c3SMark Cave-Ayland     g_assert(c == 0x2);
219*f2f262c3SMark Cave-Ayland 
220*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 1);
221*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
222*f2f262c3SMark Cave-Ayland }
223*f2f262c3SMark Cave-Ayland 
224*f2f262c3SMark Cave-Ayland static void test_fifo8_pushpop(void)
225*f2f262c3SMark Cave-Ayland {
226*f2f262c3SMark Cave-Ayland     Fifo8 fifo;
227*f2f262c3SMark Cave-Ayland     uint8_t c;
228*f2f262c3SMark Cave-Ayland 
229*f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
230*f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x1);
231*f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x2);
232*f2f262c3SMark Cave-Ayland 
233*f2f262c3SMark Cave-Ayland     c = fifo8_pop(&fifo);
234*f2f262c3SMark Cave-Ayland     g_assert(c == 0x1);
235*f2f262c3SMark Cave-Ayland     c = fifo8_pop(&fifo);
236*f2f262c3SMark Cave-Ayland     g_assert(c == 0x2);
237*f2f262c3SMark Cave-Ayland 
238*f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 0);
239*f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
240*f2f262c3SMark Cave-Ayland }
241*f2f262c3SMark Cave-Ayland 
242*f2f262c3SMark Cave-Ayland int main(int argc, char *argv[])
243*f2f262c3SMark Cave-Ayland {
244*f2f262c3SMark Cave-Ayland     g_test_init(&argc, &argv, NULL);
245*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pushpop", test_fifo8_pushpop);
246*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek", test_fifo8_peek);
247*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_buf", test_fifo8_peek_buf);
248*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_buf_wrap", test_fifo8_peek_buf_wrap);
249*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_buf", test_fifo8_pop_buf);
250*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_buf_wrap", test_fifo8_pop_buf_wrap);
251*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_bufptr", test_fifo8_peek_bufptr);
252*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_bufptr_wrap", test_fifo8_peek_bufptr_wrap);
253*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_bufptr", test_fifo8_pop_bufptr);
254*f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_bufptr_wrap", test_fifo8_pop_bufptr_wrap);
255*f2f262c3SMark Cave-Ayland     return g_test_run();
256*f2f262c3SMark Cave-Ayland }
257