diff options
| author | Vadim Yanitskiy <axilirator@gmail.com> | 2017-01-19 03:33:24 +0700 | 
|---|---|---|
| committer | Harald Welte <laforge@gnumonks.org> | 2017-03-06 17:06:45 +0000 | 
| commit | 68930e85b5945db8ffea055fd178bc1f88b31d99 (patch) | |
| tree | 9f8dc6855539d156c6a49e9c8b5a425fcaf2355e /tests | |
| parent | 77a5b0946f67d0228a4dbb5a04940070e12ebf2f (diff) | |
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
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/Makefile.am | 3 | ||||
| -rw-r--r-- | tests/conv/conv.c | 143 | ||||
| -rw-r--r-- | tests/conv/conv.h | 16 | ||||
| -rw-r--r-- | tests/conv/conv_test.c | 160 | 
4 files changed, 169 insertions, 153 deletions
| diff --git a/tests/Makefile.am b/tests/Makefile.am index 35b91501..0472082e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 diff --git a/tests/conv/conv.c b/tests/conv/conv.c new file mode 100644 index 00000000..7dac1558 --- /dev/null +++ b/tests/conv/conv.c @@ -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; +} diff --git a/tests/conv/conv.h b/tests/conv/conv.h new file mode 100644 index 00000000..676c5aff --- /dev/null +++ b/tests/conv/conv.h @@ -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); diff --git a/tests/conv/conv_test.c b/tests/conv/conv_test.c index 3064f9ca..131b4599 100644 --- a/tests/conv/conv_test.c +++ b/tests/conv/conv_test.c @@ -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                                                               */ @@ -172,38 +166,15 @@ const struct osmo_conv_code conv_lte_pbch = {  };  /* ------------------------------------------------------------------------ */ -/* 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;  } | 
