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