diff --git a/tests/rifo/rifo_test.c b/tests/rifo/rifo_test.c index c656c97..5dac5ba 100644 --- a/tests/rifo/rifo_test.c +++ b/tests/rifo/rifo_test.c @@ -9,11 +9,11 @@ #include "frame_rifo.h" static void *g_e1d_ctx; +static uint32_t init_next_out_fn; static void rifo_in(struct frame_rifo *rifo, uint8_t *frame, uint32_t fn) { - printf("RIFO_IN(%s, %u)\n", osmo_hexdump_nospc(frame, BYTES_PER_FRAME), fn); - OSMO_ASSERT(frame_rifo_in(rifo, frame, fn) == 0); + printf("RIFO_IN(%s, %u)=%d\n", osmo_hexdump_nospc(frame, BYTES_PER_FRAME), fn, frame_rifo_in(rifo, frame, fn)); } static int rifo_out(struct frame_rifo *rifo, uint8_t *out) @@ -23,18 +23,21 @@ static int rifo_out(struct frame_rifo *rifo, uint8_t *out) return rc; } - -static void missing_frames(void) +static void missing_frames(uint8_t modulo) { struct frame_rifo rifo; frame_rifo_init(&rifo); + rifo.next_out_fn = init_next_out_fn; - printf("\nTEST: %s\n", __func__); + printf("\nTEST: %s, starting at FN: %u\n", __func__, init_next_out_fn); for (int i = 0; i < 10; i++) { uint8_t frame[32]; memset(frame, i, sizeof(frame)); - rifo_in(&rifo, frame, 2*i); + + if (i % 2 == modulo) { + rifo_in(&rifo, frame, init_next_out_fn + i); + } } for (int i = 0; i < 10; i++) { @@ -48,14 +51,15 @@ static void reordered_in(void) { struct frame_rifo rifo; frame_rifo_init(&rifo); + rifo.next_out_fn = init_next_out_fn; - printf("\nTEST: %s\n", __func__); + printf("\nTEST: %s, starting at FN: %u\n", __func__, init_next_out_fn); const uint8_t in[] = { 0, 1, 4, 3, 5, 2, 6, 7, 8, 9 }; for (int i = 0; i < sizeof(in); i++) { uint8_t frame[32]; memset(frame, in[i], sizeof(frame)); - rifo_in(&rifo, frame, in[i]); + rifo_in(&rifo, frame, init_next_out_fn + in[i]); } for (int i = 0; i < 10; i++) { @@ -65,12 +69,82 @@ static void reordered_in(void) } } +static void correct_order(void) +{ + struct frame_rifo rifo; + frame_rifo_init(&rifo); + rifo.next_out_fn = init_next_out_fn; + + printf("\nTEST: %s, starting at FN: %u\n", __func__, init_next_out_fn); + + const uint8_t in[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + for (int i = 0; i < sizeof(in); i++) { + uint8_t frame[32]; + memset(frame, in[i], sizeof(frame)); + rifo_in(&rifo, frame, init_next_out_fn + in[i]); + } + + for (int i = 0; i < 10; i++) { + uint8_t frame[32]; + memset(frame, 0xff, sizeof(frame)); + rifo_out(&rifo, frame); + } +} + +static void too_old_frames(void) +{ + struct frame_rifo rifo; + frame_rifo_init(&rifo); + rifo.next_out_fn = init_next_out_fn; + + printf("\nTEST: %s, starting at FN: %u\n", __func__, init_next_out_fn); + + // Put 10 frames at absolute frame numbers 850-860 + // (to get outside of the 800 frame buffer) + const uint8_t in[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; + for (int i = 0; i < sizeof(in); i++) { + uint8_t frame[32]; + memset(frame, in[i], sizeof(frame)); + rifo_in(&rifo, frame, init_next_out_fn + in[i] + 850); + } + + // Skip the first 850 frames + for (int i = 0; i < 850; i++) { + uint8_t frame[32]; + memset(frame, 0xff, sizeof(frame)); + // Note: frame_rifo_out instead of rifo_out + // (just to ignore the output) + frame_rifo_out(&rifo, frame); + } + + // Try to read the 10 real frames (which shouldn't be in the buffer) + for (int i = 0; i < 10; i++) { + uint8_t frame[32]; + memset(frame, 0xff, sizeof(frame)); + rifo_out(&rifo, frame); + } +} + +void run_all_tests(void) +{ + missing_frames(0); + missing_frames(1); + reordered_in(); + correct_order(); + too_old_frames(); +} int main(int argc, char **argv) { g_e1d_ctx = talloc_named_const(NULL, 0, "osmo-e1d"); osmo_init_logging2(g_e1d_ctx, &log_info); - missing_frames(); - reordered_in(); + + // run all tests starting with a framenumber of 0 + init_next_out_fn = 0; + run_all_tests(); + + // re-run all tests at the edge of a framenumber rollover + init_next_out_fn = 0xFFFFFFFF - 5; + run_all_tests(); } diff --git a/tests/rifo/rifo_test.ok b/tests/rifo/rifo_test.ok new file mode 100644 index 0000000..cf1b778 --- /dev/null +++ b/tests/rifo/rifo_test.ok @@ -0,0 +1,200 @@ + +TEST: missing_frames, starting at FN: 0 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 0)=0 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 2)=0 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 4)=0 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 6)=0 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 8)=0 +RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 + +TEST: missing_frames, starting at FN: 0 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 1)=0 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 3)=0 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 5)=0 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 7)=0 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 9)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 + +TEST: reordered_in, starting at FN: 0 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 0)=0 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 1)=0 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 4)=0 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 3)=0 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 5)=0 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 2)=0 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 6)=0 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 7)=0 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 8)=0 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 9)=0 +RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 +RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 +RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 +RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 +RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 +RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 +RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 +RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 +RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 +RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 + +TEST: correct_order, starting at FN: 0 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 0)=0 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 1)=0 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 2)=0 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 3)=0 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 4)=0 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 5)=0 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 6)=0 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 7)=0 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 8)=0 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 9)=0 +RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 +RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 +RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 +RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 +RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 +RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 +RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 +RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 +RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 +RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 + +TEST: too_old_frames, starting at FN: 0 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 850)=-34 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 851)=-34 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 852)=-34 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 853)=-34 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 854)=-34 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 855)=-34 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 856)=-34 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 857)=-34 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 858)=-34 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 859)=-34 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 + +TEST: missing_frames, starting at FN: 4294967290 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 4294967290)=0 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 4294967292)=0 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 4294967294)=0 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 0)=0 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 2)=0 +RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 + +TEST: missing_frames, starting at FN: 4294967290 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 4294967291)=0 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 4294967293)=0 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 4294967295)=0 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 1)=0 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 3)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 + +TEST: reordered_in, starting at FN: 4294967290 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 4294967290)=0 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 4294967291)=0 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 4294967294)=0 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 4294967293)=0 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 4294967295)=0 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 4294967292)=0 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 0)=0 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 1)=0 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 2)=0 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 3)=0 +RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 +RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 +RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 +RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 +RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 +RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 +RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 +RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 +RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 +RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 + +TEST: correct_order, starting at FN: 4294967290 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 4294967290)=0 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 4294967291)=0 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 4294967292)=0 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 4294967293)=0 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 4294967294)=0 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 4294967295)=0 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 0)=0 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 1)=0 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 2)=0 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 3)=0 +RIFO_OUT(0000000000000000000000000000000000000000000000000000000000000000)=0 +RIFO_OUT(0101010101010101010101010101010101010101010101010101010101010101)=0 +RIFO_OUT(0202020202020202020202020202020202020202020202020202020202020202)=0 +RIFO_OUT(0303030303030303030303030303030303030303030303030303030303030303)=0 +RIFO_OUT(0404040404040404040404040404040404040404040404040404040404040404)=0 +RIFO_OUT(0505050505050505050505050505050505050505050505050505050505050505)=0 +RIFO_OUT(0606060606060606060606060606060606060606060606060606060606060606)=0 +RIFO_OUT(0707070707070707070707070707070707070707070707070707070707070707)=0 +RIFO_OUT(0808080808080808080808080808080808080808080808080808080808080808)=0 +RIFO_OUT(0909090909090909090909090909090909090909090909090909090909090909)=0 + +TEST: too_old_frames, starting at FN: 4294967290 +RIFO_IN(0000000000000000000000000000000000000000000000000000000000000000, 844)=-34 +RIFO_IN(0101010101010101010101010101010101010101010101010101010101010101, 845)=-34 +RIFO_IN(0202020202020202020202020202020202020202020202020202020202020202, 846)=-34 +RIFO_IN(0303030303030303030303030303030303030303030303030303030303030303, 847)=-34 +RIFO_IN(0404040404040404040404040404040404040404040404040404040404040404, 848)=-34 +RIFO_IN(0505050505050505050505050505050505050505050505050505050505050505, 849)=-34 +RIFO_IN(0606060606060606060606060606060606060606060606060606060606060606, 850)=-34 +RIFO_IN(0707070707070707070707070707070707070707070707070707070707070707, 851)=-34 +RIFO_IN(0808080808080808080808080808080808080808080808080808080808080808, 852)=-34 +RIFO_IN(0909090909090909090909090909090909090909090909090909090909090909, 853)=-34 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1 +RIFO_OUT(ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)=-1