mirror of https://gerrit.osmocom.org/libosmocore
144 lines
3.0 KiB
C
144 lines
3.0 KiB
C
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
|
|
#include <osmocom/core/bits.h>
|
|
#include <osmocom/core/conv.h>
|
|
#include <osmocom/core/utils.h>
|
|
|
|
#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;
|
|
}
|