#include #include #include #include #include #include #include #include "conv.h" static void fill_random(ubit_t *b, int n) { int i; for (i = 0; i < n; i++) b[i] = random() & 1; } int do_check(const struct conv_test_vector *test) { ubit_t *bu0, *bu1; sbit_t *bs; int len, j; bu0 = malloc(sizeof(ubit_t) * MAX_LEN_BITS); bu1 = malloc(sizeof(ubit_t) * MAX_LEN_BITS); bs = malloc(sizeof(sbit_t) * MAX_LEN_BITS); srandom(time(NULL)); /* Test name */ printf("[+] Testing: %s\n", test->name); /* Check length */ len = osmo_conv_get_input_length(test->code, 0); printf("[.] Input length : ret = %3d exp = %3d -> %s\n", len, test->in_len, len == test->in_len ? "OK" : "Bad !"); if (len != test->in_len) { fprintf(stderr, "[!] Failure for input length computation\n"); return -1; } len = osmo_conv_get_output_length(test->code, 0); printf("[.] Output length : ret = %3d exp = %3d -> %s\n", len, test->out_len, len == test->out_len ? "OK" : "Bad !"); if (len != test->out_len) { fprintf(stderr, "[!] Failure for output length computation\n"); return -1; } /* Check pre-computed vector */ if (test->has_vec) { printf("[.] Pre computed vector checks:\n"); printf("[..] Encoding: "); osmo_pbit2ubit(bu0, test->vec_in, test->in_len); len = osmo_conv_encode(test->code, bu0, bu1); if (len != test->out_len) { printf("ERROR !\n"); fprintf(stderr, "[!] Failed encoding length check\n"); return -1; } osmo_pbit2ubit(bu0, test->vec_out, test->out_len); if (memcmp(bu0, bu1, test->out_len)) { printf("ERROR !\n"); fprintf(stderr, "[!] Failed encoding: Results don't match\n"); return -1; }; printf("OK\n"); printf("[..] Decoding: "); osmo_ubit2sbit(bs, bu0, len); len = osmo_conv_decode(test->code, bs, bu1); if (len != 0) { printf("ERROR !\n"); fprintf(stderr, "[!] Failed decoding: non-zero path (%d)\n", len); return -1; } osmo_pbit2ubit(bu0, test->vec_in, test->in_len); if (memcmp(bu0, bu1, test->in_len)) { printf("ERROR !\n"); fprintf(stderr, "[!] Failed decoding: Results don't match\n"); return -1; } printf("OK\n"); } /* Check random vector */ printf("[.] Random vector checks:\n"); for (j = 0; j < 3; j++) { printf("[..] Encoding / Decoding cycle : "); fill_random(bu0, test->in_len); len = osmo_conv_encode(test->code, bu0, bu1); if (len != test->out_len) { printf("ERROR !\n"); fprintf(stderr, "[!] Failed encoding length check\n"); return -1; } osmo_ubit2sbit(bs, bu1, len); len = osmo_conv_decode(test->code, bs, bu1); if (len != 0) { printf("ERROR !\n"); fprintf(stderr, "[!] Failed decoding: non-zero path (%d)\n", len); return -1; } if (memcmp(bu0, bu1, test->in_len)) { printf("ERROR !\n"); fprintf(stderr, "[!] Failed decoding: Results don't match\n"); return -1; } printf("OK\n"); } /* Spacing */ printf("\n"); free(bs); free(bu1); free(bu0); return 0; }