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