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