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
changes/27/1627/4
Vadim Yanitskiy 6 years ago committed by Harald Welte
parent 77a5b0946f
commit 68930e85b5
  1. 3
      tests/Makefile.am
  2. 143
      tests/conv/conv.c
  3. 16
      tests/conv/conv.h
  4. 160
      tests/conv/conv_test.c

@ -57,7 +57,7 @@ bitvec_bitvec_test_LDADD = $(top_builddir)/src/libosmocore.la
bits_bitcomp_test_SOURCES = bits/bitcomp_test.c
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
gsm0808_gsm0808_test_SOURCES = gsm0808/gsm0808_test.c
@ -187,6 +187,7 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \
socket/socket_test.err
DISTCLEANFILES = atconfig atlocal
noinst_HEADERS = conv/conv.h
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 <stdlib.h>
#include <string.h>
#include <time.h>
#include <osmocom/core/bits.h>
#include <osmocom/core/conv.h>
#include <osmocom/core/utils.h>
#include <osmocom/gsm/gsm0503.h>
#define MAX_LEN_BITS 512
#define MAX_LEN_BYTES (512/8)
#include "conv.h"
/* ------------------------------------------------------------------------ */
/* Test codes */
@ -171,39 +165,16 @@ const struct osmo_conv_code conv_lte_pbch = {
.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 */
/* ------------------------------------------------------------------------ */
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[])
{
const struct conv_test_vector *tst;
ubit_t *bu0, *bu1;
sbit_t *bs;
const struct conv_test_vector *test;
int rc;
/* 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 = {
.N = 2,
.K = 5,
@ -300,126 +271,11 @@ int main(int argc, char *argv[])
{ /* end */ },
};
srandom(time(NULL));
bu0 = malloc(sizeof(ubit_t) * MAX_LEN_BITS);
bu1 = malloc(sizeof(ubit_t) * MAX_LEN_BITS);
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");
for (test = tests; test->name; test++) {
rc = do_check(test);
if (rc)
return rc;
}
free(bs);
free(bu1);
free(bu0);
return 0;
}

Loading…
Cancel
Save