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: Idbdc7e19cb9b9a36cd1fccd621cd858e87530d98changes/27/1627/4
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_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…
Reference in New Issue