xref: /qemu/tests/unit/test-fifo.c (revision ea9cdbcf3a0b8d5497cddf87990f1b39d8f3bb0a)
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 
test_fifo8_pop_bufptr_wrap(void)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);
30*143897ebSPhilippe Mathieu-Daudé     /*
31*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
32*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ . . . . . . . . ]
33*143897ebSPhilippe Mathieu-Daudé      */
34f2f262c3SMark Cave-Ayland 
35f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
36*143897ebSPhilippe Mathieu-Daudé     /*
37*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
38*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ 1 2 3 4 . . . . ]
39*143897ebSPhilippe Mathieu-Daudé      */
40f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 2, &count);
41*143897ebSPhilippe Mathieu-Daudé     /*
42*143897ebSPhilippe Mathieu-Daudé      *      head --v  ]-- tail      used = 2
43*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ 1 2 3 4 . . . . ]
44*143897ebSPhilippe Mathieu-Daudé      *  buf  --^                    count = 2
45*143897ebSPhilippe Mathieu-Daudé      */
46f2f262c3SMark Cave-Ayland     g_assert(count == 2);
47f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
48f2f262c3SMark Cave-Ayland 
49f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
50*143897ebSPhilippe Mathieu-Daudé     /*
51*143897ebSPhilippe Mathieu-Daudé      *     tail --]v-- head         used = 8
52*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ 9 a 3 4 5 6 7 8 ]
53*143897ebSPhilippe Mathieu-Daudé      */
54f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 8, &count);
55*143897ebSPhilippe Mathieu-Daudé     /*
56*143897ebSPhilippe Mathieu-Daudé      *  head --v  ]-- tail          used = 2
57*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ 9 a 3 4 5 6 7 8 ]
58*143897ebSPhilippe Mathieu-Daudé      *  buf      --^                count = 6
59*143897ebSPhilippe Mathieu-Daudé      */
60f2f262c3SMark Cave-Ayland     g_assert(count == 6);
61f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x3 && buf[1] == 0x4 && buf[2] == 0x5 &&
62f2f262c3SMark Cave-Ayland              buf[3] == 0x6 && buf[4] == 0x7 && buf[5] == 0x8);
63f2f262c3SMark Cave-Ayland 
64f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 2);
65f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
66f2f262c3SMark Cave-Ayland }
67f2f262c3SMark Cave-Ayland 
test_fifo8_pop_bufptr(void)68f2f262c3SMark Cave-Ayland static void test_fifo8_pop_bufptr(void)
69f2f262c3SMark Cave-Ayland {
70f2f262c3SMark Cave-Ayland     Fifo8 fifo;
71f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4 };
72f2f262c3SMark Cave-Ayland     const uint8_t *buf;
73f2f262c3SMark Cave-Ayland     uint32_t count;
74f2f262c3SMark Cave-Ayland 
75f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
76*143897ebSPhilippe Mathieu-Daudé     /*
77*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
78*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ . . . . . . . . ]
79*143897ebSPhilippe Mathieu-Daudé      */
80f2f262c3SMark Cave-Ayland 
81f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
82*143897ebSPhilippe Mathieu-Daudé     /*
83*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
84*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ 1 2 3 4 . . . . ]
85*143897ebSPhilippe Mathieu-Daudé      */
86f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 2, &count);
87*143897ebSPhilippe Mathieu-Daudé     /*
88*143897ebSPhilippe Mathieu-Daudé      *      head --v  ]-- tail      used = 2
89*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ 1 2 3 4 . . . . ]
90*143897ebSPhilippe Mathieu-Daudé      *  buf  --^                    count = 2
91*143897ebSPhilippe Mathieu-Daudé      */
92f2f262c3SMark Cave-Ayland     g_assert(count == 2);
93f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
94f2f262c3SMark Cave-Ayland 
95f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 2);
96f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
97f2f262c3SMark Cave-Ayland }
98f2f262c3SMark Cave-Ayland 
test_fifo8_peek_bufptr_wrap(void)99f2f262c3SMark Cave-Ayland static void test_fifo8_peek_bufptr_wrap(void)
100f2f262c3SMark Cave-Ayland {
101f2f262c3SMark Cave-Ayland     Fifo8 fifo;
102f2f262c3SMark Cave-Ayland     uint8_t data_in1[] = { 0x1, 0x2, 0x3, 0x4 };
103e7217726SPhilippe Mathieu-Daudé     uint8_t data_in2[] = { 0x5, 0x6, 0x7, 0x8, 0x9, 0xa };
104f2f262c3SMark Cave-Ayland     const uint8_t *buf;
105f2f262c3SMark Cave-Ayland     uint32_t count;
106f2f262c3SMark Cave-Ayland 
107f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
108*143897ebSPhilippe Mathieu-Daudé     /*
109*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
110*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
111*143897ebSPhilippe Mathieu-Daudé      */
112f2f262c3SMark Cave-Ayland 
113f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
114*143897ebSPhilippe Mathieu-Daudé     /*
115*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
116*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
117*143897ebSPhilippe Mathieu-Daudé      */
118f2f262c3SMark Cave-Ayland     buf = fifo8_peek_bufptr(&fifo, 2, &count);
119*143897ebSPhilippe Mathieu-Daudé     /*
120*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
121*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
122*143897ebSPhilippe Mathieu-Daudé      *  buf: [ 1 2 ]                count = 2
123*143897ebSPhilippe Mathieu-Daudé      */
124f2f262c3SMark Cave-Ayland     g_assert(count == 2);
125f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
126f2f262c3SMark Cave-Ayland 
127f2f262c3SMark Cave-Ayland     buf = fifo8_pop_bufptr(&fifo, 2, &count);
128*143897ebSPhilippe Mathieu-Daudé     /*
129*143897ebSPhilippe Mathieu-Daudé      *     head  --v  ]-- tail      used = 2
130*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
131*143897ebSPhilippe Mathieu-Daudé      *  buf: [ 1 2 ]                count = 2
132*143897ebSPhilippe Mathieu-Daudé      */
133f2f262c3SMark Cave-Ayland     g_assert(count == 2);
134f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
135f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
136*143897ebSPhilippe Mathieu-Daudé     /*
137*143897ebSPhilippe Mathieu-Daudé      *  tail   ---]v-- head         used = 8
138*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a 3 4 5 6 7 8 }
139*143897ebSPhilippe Mathieu-Daudé      */
140f2f262c3SMark Cave-Ayland 
141f2f262c3SMark Cave-Ayland     buf = fifo8_peek_bufptr(&fifo, 8, &count);
142*143897ebSPhilippe Mathieu-Daudé     /*
143*143897ebSPhilippe Mathieu-Daudé      *     tail --]v-- head         used = 8
144*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a 3 4 5 6 7 8 }
145*143897ebSPhilippe Mathieu-Daudé      *  buf:     [ 3 4 5 6 7 8 ]    count = 6
146*143897ebSPhilippe Mathieu-Daudé      */
147f2f262c3SMark Cave-Ayland     g_assert(count == 6);
148f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x3 && buf[1] == 0x4 && buf[2] == 0x5 &&
149f2f262c3SMark Cave-Ayland              buf[3] == 0x6 && buf[4] == 0x7 && buf[5] == 0x8);
150f2f262c3SMark Cave-Ayland 
151f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 8);
152f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
153f2f262c3SMark Cave-Ayland }
154f2f262c3SMark Cave-Ayland 
test_fifo8_peek_bufptr(void)155f2f262c3SMark Cave-Ayland static void test_fifo8_peek_bufptr(void)
156f2f262c3SMark Cave-Ayland {
157f2f262c3SMark Cave-Ayland     Fifo8 fifo;
158f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4 };
159f2f262c3SMark Cave-Ayland     const uint8_t *buf;
160f2f262c3SMark Cave-Ayland     uint32_t count;
161f2f262c3SMark Cave-Ayland 
162f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
163*143897ebSPhilippe Mathieu-Daudé     /*
164*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
165*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
166*143897ebSPhilippe Mathieu-Daudé      */
167f2f262c3SMark Cave-Ayland 
168f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
169*143897ebSPhilippe Mathieu-Daudé     /*
170*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
171*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
172*143897ebSPhilippe Mathieu-Daudé      */
173f2f262c3SMark Cave-Ayland     buf = fifo8_peek_bufptr(&fifo, 2, &count);
174*143897ebSPhilippe Mathieu-Daudé     /*
175*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
176*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
177*143897ebSPhilippe Mathieu-Daudé      *  buf: [ 1 2 ]                count = 2
178*143897ebSPhilippe Mathieu-Daudé      */
179f2f262c3SMark Cave-Ayland     g_assert(count == 2);
180f2f262c3SMark Cave-Ayland     g_assert(buf[0] == 0x1 && buf[1] == 0x2);
181f2f262c3SMark Cave-Ayland 
182f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 4);
183f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
184f2f262c3SMark Cave-Ayland }
185f2f262c3SMark Cave-Ayland 
test_fifo8_pop_buf_wrap(void)186f2f262c3SMark Cave-Ayland static void test_fifo8_pop_buf_wrap(void)
187f2f262c3SMark Cave-Ayland {
188f2f262c3SMark Cave-Ayland     Fifo8 fifo;
189f2f262c3SMark Cave-Ayland     uint8_t data_in1[] = { 0x1, 0x2, 0x3, 0x4 };
190e7217726SPhilippe Mathieu-Daudé     uint8_t data_in2[] = { 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc };
191f2f262c3SMark Cave-Ayland     uint8_t data_out[4];
192f2f262c3SMark Cave-Ayland     int count;
193f2f262c3SMark Cave-Ayland 
194f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
195*143897ebSPhilippe Mathieu-Daudé     /*
196*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
197*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
198*143897ebSPhilippe Mathieu-Daudé      */
199f2f262c3SMark Cave-Ayland 
200f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
201*143897ebSPhilippe Mathieu-Daudé     /*
202*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
203*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
204*143897ebSPhilippe Mathieu-Daudé      */
205f2f262c3SMark Cave-Ayland     fifo8_pop_buf(&fifo, NULL, 4);
206*143897ebSPhilippe Mathieu-Daudé     /*
207*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 0
208*143897ebSPhilippe Mathieu-Daudé      * FIFO: [ 1 2 3 4 . . . . ]
209*143897ebSPhilippe Mathieu-Daudé      */
210f2f262c3SMark Cave-Ayland 
211f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
212*143897ebSPhilippe Mathieu-Daudé     /*
213*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 8
214*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a b c 5 6 7 8 }
215*143897ebSPhilippe Mathieu-Daudé      */
216f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, NULL, 4);
217*143897ebSPhilippe Mathieu-Daudé     /*
218*143897ebSPhilippe Mathieu-Daudé      * head  --v      ]-- tail      used = 4
219*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a b c 5 6 7 8 }
220*143897ebSPhilippe Mathieu-Daudé      */
221f2f262c3SMark Cave-Ayland     g_assert(count == 4);
222f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, data_out, 4);
223*143897ebSPhilippe Mathieu-Daudé     /*
224*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 0
225*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a b c 5 6 7 8 }
226*143897ebSPhilippe Mathieu-Daudé      */
227f2f262c3SMark Cave-Ayland     g_assert(count == 4);
228e7217726SPhilippe Mathieu-Daudé     g_assert(data_out[0] == 0x9 && data_out[1] == 0xa &&
229e7217726SPhilippe Mathieu-Daudé              data_out[2] == 0xb && data_out[3] == 0xc);
230f2f262c3SMark Cave-Ayland 
231f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 0);
232f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
233f2f262c3SMark Cave-Ayland }
234f2f262c3SMark Cave-Ayland 
test_fifo8_pop_buf(void)235f2f262c3SMark Cave-Ayland static void test_fifo8_pop_buf(void)
236f2f262c3SMark Cave-Ayland {
237f2f262c3SMark Cave-Ayland     Fifo8 fifo;
238f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8 };
239f2f262c3SMark Cave-Ayland     uint8_t data_out[] = { 0xff, 0xff, 0xff, 0xff };
240f2f262c3SMark Cave-Ayland     int count;
241f2f262c3SMark Cave-Ayland 
242f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
243*143897ebSPhilippe Mathieu-Daudé     /*
244*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
245*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
246*143897ebSPhilippe Mathieu-Daudé      */
247f2f262c3SMark Cave-Ayland 
248f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
249*143897ebSPhilippe Mathieu-Daudé     /*
250*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
251*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
252*143897ebSPhilippe Mathieu-Daudé      */
253f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, NULL, 4);
254*143897ebSPhilippe Mathieu-Daudé     /*
255*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 0
256*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
257*143897ebSPhilippe Mathieu-Daudé      */
258f2f262c3SMark Cave-Ayland     g_assert(count == 4);
259f2f262c3SMark Cave-Ayland     count = fifo8_pop_buf(&fifo, data_out, 4);
260f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0x5 && data_out[1] == 0x6 &&
261f2f262c3SMark Cave-Ayland              data_out[2] == 0x7 && data_out[3] == 0x8);
262f2f262c3SMark Cave-Ayland 
263f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 0);
264f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
265f2f262c3SMark Cave-Ayland }
266f2f262c3SMark Cave-Ayland 
test_fifo8_peek_buf_wrap(void)267f2f262c3SMark Cave-Ayland static void test_fifo8_peek_buf_wrap(void)
268f2f262c3SMark Cave-Ayland {
269f2f262c3SMark Cave-Ayland     Fifo8 fifo;
270f2f262c3SMark Cave-Ayland     uint8_t data_in1[] = { 0x1, 0x2, 0x3, 0x4 };
271e7217726SPhilippe Mathieu-Daudé     uint8_t data_in2[] = { 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc };
27283dd07bbSPhilippe Mathieu-Daudé     uint8_t data_out[8];
273f2f262c3SMark Cave-Ayland     int count;
274f2f262c3SMark Cave-Ayland 
275f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
276*143897ebSPhilippe Mathieu-Daudé     /*
277*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
278*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
279*143897ebSPhilippe Mathieu-Daudé      */
280f2f262c3SMark Cave-Ayland 
281f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in1, sizeof(data_in1));
282*143897ebSPhilippe Mathieu-Daudé     /*
283*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
284*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
285*143897ebSPhilippe Mathieu-Daudé      */
286f2f262c3SMark Cave-Ayland     fifo8_pop_buf(&fifo, NULL, 4);
287*143897ebSPhilippe Mathieu-Daudé     /*
288*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 0
289*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
290*143897ebSPhilippe Mathieu-Daudé      */
291f2f262c3SMark Cave-Ayland 
292f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in2, sizeof(data_in2));
293*143897ebSPhilippe Mathieu-Daudé     /*
294*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 8
295*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a b c 5 6 7 8 }
296*143897ebSPhilippe Mathieu-Daudé      */
297f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, NULL, 4);
298f2f262c3SMark Cave-Ayland     g_assert(count == 4);
299f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, data_out, 4);
300*143897ebSPhilippe Mathieu-Daudé     /*
301*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 8
302*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a b c 5 6 7 8 }
303*143897ebSPhilippe Mathieu-Daudé      *  buf:         [ 5 6 7 8 ]    count = 4
304*143897ebSPhilippe Mathieu-Daudé      */
305f2f262c3SMark Cave-Ayland     g_assert(count == 4);
306f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0x5 && data_out[1] == 0x6 &&
307f2f262c3SMark Cave-Ayland              data_out[2] == 0x7 && data_out[3] == 0x8);
308f2f262c3SMark Cave-Ayland 
30983dd07bbSPhilippe Mathieu-Daudé     count = fifo8_peek_buf(&fifo, data_out, 8);
310*143897ebSPhilippe Mathieu-Daudé     /*
311*143897ebSPhilippe Mathieu-Daudé      *         tail --]v-- head     used = 8
312*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 9 a b c 5 6 7 8 }
313*143897ebSPhilippe Mathieu-Daudé      *  buf:         [ 5 6 7 8 9 a b c ] count = 8
314*143897ebSPhilippe Mathieu-Daudé      */
31583dd07bbSPhilippe Mathieu-Daudé     g_assert(count == 8);
31683dd07bbSPhilippe Mathieu-Daudé     g_assert(data_out[0] == 0x5 && data_out[1] == 0x6 &&
31783dd07bbSPhilippe Mathieu-Daudé              data_out[2] == 0x7 && data_out[3] == 0x8);
31883dd07bbSPhilippe Mathieu-Daudé     g_assert(data_out[4] == 0x9 && data_out[5] == 0xa &&
31983dd07bbSPhilippe Mathieu-Daudé              data_out[6] == 0xb && data_out[7] == 0xc);
32083dd07bbSPhilippe Mathieu-Daudé 
321f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 8);
322f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
323f2f262c3SMark Cave-Ayland }
324f2f262c3SMark Cave-Ayland 
test_fifo8_peek_buf(void)325f2f262c3SMark Cave-Ayland static void test_fifo8_peek_buf(void)
326f2f262c3SMark Cave-Ayland {
327f2f262c3SMark Cave-Ayland     Fifo8 fifo;
328f2f262c3SMark Cave-Ayland     uint8_t data_in[] = { 0x1, 0x2, 0x3, 0x4 };
329f2f262c3SMark Cave-Ayland     uint8_t data_out[] = { 0xff, 0xff, 0xff, 0xff };
330f2f262c3SMark Cave-Ayland     int count;
331f2f262c3SMark Cave-Ayland 
332f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
333*143897ebSPhilippe Mathieu-Daudé     /*
334*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
335*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
336*143897ebSPhilippe Mathieu-Daudé      */
337f2f262c3SMark Cave-Ayland 
338f2f262c3SMark Cave-Ayland     fifo8_push_all(&fifo, data_in, sizeof(data_in));
339*143897ebSPhilippe Mathieu-Daudé     /*
340*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
341*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
342*143897ebSPhilippe Mathieu-Daudé      */
343f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, NULL, 4);
344f2f262c3SMark Cave-Ayland     g_assert(count == 4);
345*143897ebSPhilippe Mathieu-Daudé 
346f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0xff && data_out[1] == 0xff &&
347f2f262c3SMark Cave-Ayland              data_out[2] == 0xff && data_out[3] == 0xff);
348f2f262c3SMark Cave-Ayland     count = fifo8_peek_buf(&fifo, data_out, 4);
349*143897ebSPhilippe Mathieu-Daudé     /*
350*143897ebSPhilippe Mathieu-Daudé      *  head --v      ]-- tail      used = 4
351*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 3 4 . . . . }
352*143897ebSPhilippe Mathieu-Daudé      *  buf: [ 1 2 3 4 ]            count = 4
353*143897ebSPhilippe Mathieu-Daudé      */
354f2f262c3SMark Cave-Ayland     g_assert(count == 4);
355f2f262c3SMark Cave-Ayland     g_assert(data_out[0] == 0x1 && data_out[1] == 0x2 &&
356f2f262c3SMark Cave-Ayland              data_out[2] == 0x3 && data_out[3] == 0x4);
357f2f262c3SMark Cave-Ayland 
358f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 4);
359f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
360f2f262c3SMark Cave-Ayland }
361f2f262c3SMark Cave-Ayland 
test_fifo8_peek(void)362f2f262c3SMark Cave-Ayland static void test_fifo8_peek(void)
363f2f262c3SMark Cave-Ayland {
364f2f262c3SMark Cave-Ayland     Fifo8 fifo;
365f2f262c3SMark Cave-Ayland     uint8_t c;
366f2f262c3SMark Cave-Ayland 
367f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
368*143897ebSPhilippe Mathieu-Daudé     /*
369*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
370*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
371*143897ebSPhilippe Mathieu-Daudé      */
372f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x1);
373*143897ebSPhilippe Mathieu-Daudé     /*
374*143897ebSPhilippe Mathieu-Daudé      *  head --v]-- tail            used = 1
375*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 . . . . . . . }
376*143897ebSPhilippe Mathieu-Daudé      */
377f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x2);
378*143897ebSPhilippe Mathieu-Daudé     /*
379*143897ebSPhilippe Mathieu-Daudé      *  head --v  ]-- tail          used = 2
380*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 . . . . . . }
381*143897ebSPhilippe Mathieu-Daudé      */
382f2f262c3SMark Cave-Ayland 
383f2f262c3SMark Cave-Ayland     c = fifo8_peek(&fifo);
384f2f262c3SMark Cave-Ayland     g_assert(c == 0x1);
385f2f262c3SMark Cave-Ayland     fifo8_pop(&fifo);
386*143897ebSPhilippe Mathieu-Daudé     /*
387*143897ebSPhilippe Mathieu-Daudé      *    head --v]-- tail          used = 1
388*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 . . . . . . }
389*143897ebSPhilippe Mathieu-Daudé      */
390f2f262c3SMark Cave-Ayland     c = fifo8_peek(&fifo);
391f2f262c3SMark Cave-Ayland     g_assert(c == 0x2);
392f2f262c3SMark Cave-Ayland 
393f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 1);
394f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
395f2f262c3SMark Cave-Ayland }
396f2f262c3SMark Cave-Ayland 
test_fifo8_pushpop(void)397f2f262c3SMark Cave-Ayland static void test_fifo8_pushpop(void)
398f2f262c3SMark Cave-Ayland {
399f2f262c3SMark Cave-Ayland     Fifo8 fifo;
400f2f262c3SMark Cave-Ayland     uint8_t c;
401f2f262c3SMark Cave-Ayland 
402f2f262c3SMark Cave-Ayland     fifo8_create(&fifo, 8);
403*143897ebSPhilippe Mathieu-Daudé     /*
404*143897ebSPhilippe Mathieu-Daudé      *  head --v-- tail             used = 0
405*143897ebSPhilippe Mathieu-Daudé      * FIFO: { . . . . . . . . }
406*143897ebSPhilippe Mathieu-Daudé      */
407f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x1);
408*143897ebSPhilippe Mathieu-Daudé     /*
409*143897ebSPhilippe Mathieu-Daudé      *  head --v]-- tail            used = 1
410*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 . . . . . . . }
411*143897ebSPhilippe Mathieu-Daudé      */
412f2f262c3SMark Cave-Ayland     fifo8_push(&fifo, 0x2);
413*143897ebSPhilippe Mathieu-Daudé     /*
414*143897ebSPhilippe Mathieu-Daudé      *  head --v  ]-- tail          used = 2
415*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 . . . . . . }
416*143897ebSPhilippe Mathieu-Daudé      */
417f2f262c3SMark Cave-Ayland 
418f2f262c3SMark Cave-Ayland     c = fifo8_pop(&fifo);
419*143897ebSPhilippe Mathieu-Daudé     /*
420*143897ebSPhilippe Mathieu-Daudé      *    head --v]-- tail          used = 1
421*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 . . . . . . }
422*143897ebSPhilippe Mathieu-Daudé      */
423f2f262c3SMark Cave-Ayland     g_assert(c == 0x1);
424f2f262c3SMark Cave-Ayland     c = fifo8_pop(&fifo);
425*143897ebSPhilippe Mathieu-Daudé     /*
426*143897ebSPhilippe Mathieu-Daudé      *     tail --]v-- head         used = 0
427*143897ebSPhilippe Mathieu-Daudé      * FIFO: { 1 2 . . . . . . }
428*143897ebSPhilippe Mathieu-Daudé      */
429f2f262c3SMark Cave-Ayland     g_assert(c == 0x2);
430f2f262c3SMark Cave-Ayland 
431f2f262c3SMark Cave-Ayland     g_assert(fifo8_num_used(&fifo) == 0);
432f2f262c3SMark Cave-Ayland     fifo8_destroy(&fifo);
433f2f262c3SMark Cave-Ayland }
434f2f262c3SMark Cave-Ayland 
main(int argc,char * argv[])435f2f262c3SMark Cave-Ayland int main(int argc, char *argv[])
436f2f262c3SMark Cave-Ayland {
437f2f262c3SMark Cave-Ayland     g_test_init(&argc, &argv, NULL);
438f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pushpop", test_fifo8_pushpop);
439f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek", test_fifo8_peek);
440f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_buf", test_fifo8_peek_buf);
441f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_buf_wrap", test_fifo8_peek_buf_wrap);
442f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_buf", test_fifo8_pop_buf);
443f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_buf_wrap", test_fifo8_pop_buf_wrap);
444f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_bufptr", test_fifo8_peek_bufptr);
445f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/peek_bufptr_wrap", test_fifo8_peek_bufptr_wrap);
446f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_bufptr", test_fifo8_pop_bufptr);
447f2f262c3SMark Cave-Ayland     g_test_add_func("/fifo8/pop_bufptr_wrap", test_fifo8_pop_bufptr_wrap);
448f2f262c3SMark Cave-Ayland     return g_test_run();
449f2f262c3SMark Cave-Ayland }
450