mirror of https://gerrit.osmocom.org/libosmocore
tests/conv: separate test logic
To be able to add some more tests, related to convolutional coding, without duplication of code, the test logic was separated from the conv_test.c into conv.c and conv.h. Change-Id: Idbdc7e19cb9b9a36cd1fccd621cd858e87530d98
This commit is contained in:
parent
77a5b0946f
commit
68930e85b5
|
@ -57,7 +57,7 @@ bitvec_bitvec_test_LDADD = $(top_builddir)/src/libosmocore.la
|
||||||
bits_bitcomp_test_SOURCES = bits/bitcomp_test.c
|
bits_bitcomp_test_SOURCES = bits/bitcomp_test.c
|
||||||
bits_bitcomp_test_LDADD = $(top_builddir)/src/libosmocore.la
|
bits_bitcomp_test_LDADD = $(top_builddir)/src/libosmocore.la
|
||||||
|
|
||||||
conv_conv_test_SOURCES = conv/conv_test.c
|
conv_conv_test_SOURCES = conv/conv_test.c conv/conv.c
|
||||||
conv_conv_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libgsmint.la
|
conv_conv_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/gsm/libgsmint.la
|
||||||
|
|
||||||
gsm0808_gsm0808_test_SOURCES = gsm0808/gsm0808_test.c
|
gsm0808_gsm0808_test_SOURCES = gsm0808/gsm0808_test.c
|
||||||
|
@ -187,6 +187,7 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \
|
||||||
socket/socket_test.err
|
socket/socket_test.err
|
||||||
|
|
||||||
DISTCLEANFILES = atconfig atlocal
|
DISTCLEANFILES = atconfig atlocal
|
||||||
|
noinst_HEADERS = conv/conv.h
|
||||||
|
|
||||||
TESTSUITE = $(srcdir)/testsuite
|
TESTSUITE = $(srcdir)/testsuite
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,143 @@
|
||||||
|
#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;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define MAX_LEN_BITS 512
|
||||||
|
#define MAX_LEN_BYTES (512/8)
|
||||||
|
|
||||||
|
struct conv_test_vector {
|
||||||
|
const char *name;
|
||||||
|
const struct osmo_conv_code *code;
|
||||||
|
int in_len;
|
||||||
|
int out_len;
|
||||||
|
int has_vec;
|
||||||
|
pbit_t vec_in[MAX_LEN_BYTES];
|
||||||
|
pbit_t vec_out[MAX_LEN_BYTES];
|
||||||
|
};
|
||||||
|
|
||||||
|
int do_check(const struct conv_test_vector *test);
|
|
@ -1,16 +1,10 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
#include <osmocom/core/bits.h>
|
|
||||||
#include <osmocom/core/conv.h>
|
#include <osmocom/core/conv.h>
|
||||||
#include <osmocom/core/utils.h>
|
|
||||||
#include <osmocom/gsm/gsm0503.h>
|
#include <osmocom/gsm/gsm0503.h>
|
||||||
|
|
||||||
#define MAX_LEN_BITS 512
|
#include "conv.h"
|
||||||
#define MAX_LEN_BYTES (512/8)
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
/* Test codes */
|
/* Test codes */
|
||||||
|
@ -171,39 +165,16 @@ const struct osmo_conv_code conv_lte_pbch = {
|
||||||
.next_state = conv_lte_pbch_next_state,
|
.next_state = conv_lte_pbch_next_state,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
/* Test vectors */
|
|
||||||
/* ------------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
struct conv_test_vector {
|
|
||||||
const char *name;
|
|
||||||
const struct osmo_conv_code *code;
|
|
||||||
int in_len;
|
|
||||||
int out_len;
|
|
||||||
int has_vec;
|
|
||||||
pbit_t vec_in[MAX_LEN_BYTES];
|
|
||||||
pbit_t vec_out[MAX_LEN_BYTES];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
/* Main */
|
/* Main */
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
static void
|
|
||||||
fill_random(ubit_t *b, int n)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i=0; i<n; i++)
|
|
||||||
b[i] = random() & 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
const struct conv_test_vector *tst;
|
const struct conv_test_vector *test;
|
||||||
ubit_t *bu0, *bu1;
|
int rc;
|
||||||
sbit_t *bs;
|
|
||||||
|
|
||||||
/* Random code -> Non recursive code, direct truncation, non-punctured */
|
/* Random code -> Non recursive code, direct truncation, non-punctured */
|
||||||
const struct osmo_conv_code conv_trunc = {
|
const struct osmo_conv_code conv_trunc = {
|
||||||
.N = 2,
|
.N = 2,
|
||||||
.K = 5,
|
.K = 5,
|
||||||
|
@ -300,126 +271,11 @@ int main(int argc, char *argv[])
|
||||||
{ /* end */ },
|
{ /* end */ },
|
||||||
};
|
};
|
||||||
|
|
||||||
srandom(time(NULL));
|
for (test = tests; test->name; test++) {
|
||||||
|
rc = do_check(test);
|
||||||
bu0 = malloc(sizeof(ubit_t) * MAX_LEN_BITS);
|
if (rc)
|
||||||
bu1 = malloc(sizeof(ubit_t) * MAX_LEN_BITS);
|
return rc;
|
||||||
bs = malloc(sizeof(sbit_t) * MAX_LEN_BITS);
|
|
||||||
|
|
||||||
for (tst=tests; tst->name; tst++)
|
|
||||||
{
|
|
||||||
int i,l;
|
|
||||||
|
|
||||||
/* Test name */
|
|
||||||
printf("[+] Testing: %s\n", tst->name);
|
|
||||||
|
|
||||||
/* Check length */
|
|
||||||
l = osmo_conv_get_input_length(tst->code, 0);
|
|
||||||
printf("[.] Input length : ret = %3d exp = %3d -> %s\n",
|
|
||||||
l, tst->in_len, l == tst->in_len ? "OK" : "Bad !");
|
|
||||||
|
|
||||||
if (l != tst->in_len) {
|
|
||||||
fprintf(stderr, "[!] Failure for input length computation\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
l = osmo_conv_get_output_length(tst->code, 0);
|
|
||||||
printf("[.] Output length : ret = %3d exp = %3d -> %s\n",
|
|
||||||
l, tst->out_len, l == tst->out_len ? "OK" : "Bad !");
|
|
||||||
|
|
||||||
if (l != tst->out_len) {
|
|
||||||
fprintf(stderr, "[!] Failure for output length computation\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check pre-computed vector */
|
|
||||||
if (tst->has_vec) {
|
|
||||||
printf("[.] Pre computed vector checks:\n");
|
|
||||||
|
|
||||||
printf("[..] Encoding: ");
|
|
||||||
|
|
||||||
osmo_pbit2ubit(bu0, tst->vec_in, tst->in_len);
|
|
||||||
|
|
||||||
l = osmo_conv_encode(tst->code, bu0, bu1);
|
|
||||||
if (l != tst->out_len) {
|
|
||||||
printf("ERROR !\n");
|
|
||||||
fprintf(stderr, "[!] Failed encoding length check\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
osmo_pbit2ubit(bu0, tst->vec_out, tst->out_len);
|
|
||||||
|
|
||||||
if (memcmp(bu0, bu1, tst->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, l);
|
|
||||||
|
|
||||||
l = osmo_conv_decode(tst->code, bs, bu1);
|
|
||||||
if (l != 0) {
|
|
||||||
printf("ERROR !\n");
|
|
||||||
fprintf(stderr, "[!] Failed decoding: non-zero path (%d)\n", l);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
osmo_pbit2ubit(bu0, tst->vec_in, tst->in_len);
|
|
||||||
|
|
||||||
if (memcmp(bu0, bu1, tst->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 (i=0; i<3; i++) {
|
|
||||||
printf("[..] Encoding / Decoding cycle : ");
|
|
||||||
|
|
||||||
fill_random(bu0, tst->in_len);
|
|
||||||
|
|
||||||
l = osmo_conv_encode(tst->code, bu0, bu1);
|
|
||||||
if (l != tst->out_len) {
|
|
||||||
printf("ERROR !\n");
|
|
||||||
fprintf(stderr, "[!] Failed encoding length check\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
osmo_ubit2sbit(bs, bu1, l);
|
|
||||||
|
|
||||||
l = osmo_conv_decode(tst->code, bs, bu1);
|
|
||||||
if (l != 0) {
|
|
||||||
printf("ERROR !\n");
|
|
||||||
fprintf(stderr, "[!] Failed decoding: non-zero path (%d)\n", l);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (memcmp(bu0, bu1, tst->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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue