diff --git a/.gitignore b/.gitignore index ce81e42ce..b9af5cf85 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ tests/agch/agch_test tests/paging/paging_test tests/cipher/cipher_test tests/sysmobts/sysmobts_test +tests/bursts/bursts_test tests/testsuite tests/testsuite.log diff --git a/configure.ac b/configure.ac index 292f438c1..4133728a1 100644 --- a/configure.ac +++ b/configure.ac @@ -84,4 +84,5 @@ AC_OUTPUT( tests/agch/Makefile tests/cipher/Makefile tests/sysmobts/Makefile + tests/bursts/Makefile Makefile) diff --git a/tests/Makefile.am b/tests/Makefile.am index b32241b99..2b0e2fa35 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = paging cipher sysmobts agch +SUBDIRS = paging cipher sysmobts agch bursts # The `:;' works around a Bash 3.2 bug when the output is not writeable. $(srcdir)/package.m4: $(top_srcdir)/configure.ac diff --git a/tests/bursts/Makefile.am b/tests/bursts/Makefile.am new file mode 100644 index 000000000..9f88f9b90 --- /dev/null +++ b/tests/bursts/Makefile.am @@ -0,0 +1,8 @@ +INCLUDES = $(all_includes) -I$(top_srcdir)/include -I$(OPENBSC_INCDIR) +AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) +LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) +noinst_PROGRAMS = bursts_test +EXTRA_DIST = bursts_test.ok + +bursts_test_SOURCES = bursts_test.c $(top_builddir)/src/osmo-bts-trx/xcch.c $(top_builddir)/src/osmo-bts-trx/rach.c $(top_builddir)/src/osmo-bts-trx/sch.c +bursts_test_LDADD = $(LDADD) diff --git a/tests/bursts/bursts_test.c b/tests/bursts/bursts_test.c new file mode 100644 index 000000000..077691334 --- /dev/null +++ b/tests/bursts/bursts_test.c @@ -0,0 +1,210 @@ +/* (C) 2013 by Andreas Eversberg + * + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "../../src/osmo-bts-trx/xcch.h" +#include "../../src/osmo-bts-trx/rach.h" +#include "../../src/osmo-bts-trx/sch.h" + + +#define ASSERT_TRUE(rc) \ + if (!(rc)) { \ + printf("Assert failed in %s:%d.\n", \ + __FILE__, __LINE__); \ + abort(); \ + } + +/* set condition to 1, to show debugging */ +#define printd if (0) printf + +static int ubits2sbits(ubit_t *ubits, sbit_t *sbits, int count) +{ + int i; + + for (i = 0; i < count; i++) { + if ((*ubits++) & 1) + *sbits++ = -127; + else + *sbits++ = 127; + } + + return count; +} + +static void test_xcch(uint8_t *l2) +{ + uint8_t result[23]; + ubit_t bursts_u[116 * 4]; + sbit_t bursts_s[116 * 4]; + + printd("Encoding: %s\n", osmo_hexdump(l2, 23)); + + /* encode */ + xcch_encode(bursts_u, l2); + + printd("U-Bits:\n"); + printd("%s %02x %02x %s\n", osmo_hexdump(bursts_u, 57), + bursts_u[57], bursts_u[58], + osmo_hexdump(bursts_u + 59, 57)); + printd("%s %02x %02x %s\n", osmo_hexdump(bursts_u + 116, 57), + bursts_u[57 + 116], bursts_u[58 + 116], + osmo_hexdump(bursts_u + 59 + 116, 57)); + printd("%s %02x %02x %s\n", osmo_hexdump(bursts_u + 232, 57), + bursts_u[57 + 232], bursts_u[58 + 232], + osmo_hexdump(bursts_u + 59 + 232, 57)); + printd("%s %02x %02x %s\n", osmo_hexdump(bursts_u + 348, 57), + bursts_u[57 + 348], bursts_u[58 + 348], + osmo_hexdump(bursts_u + 59 + 348, 57)); + ubits2sbits(bursts_u, bursts_s, 116 * 4); + printd("S-Bits:\n"); + printd("%s %02x %02x %s\n", osmo_hexdump((uint8_t *)bursts_s, 57), + (uint8_t)bursts_s[57], (uint8_t)bursts_s[58], + osmo_hexdump((uint8_t *)bursts_s + 59, 57)); + printd("%s %02x %02x %s\n", osmo_hexdump((uint8_t *)bursts_s + 116, 57), + (uint8_t)bursts_s[57 + 116], (uint8_t)bursts_s[58 + 116], + osmo_hexdump((uint8_t *)bursts_s + 59 + 116, 57)); + printd("%s %02x %02x %s\n", osmo_hexdump((uint8_t *)bursts_s + 232, 57), + (uint8_t)bursts_s[57 + 232], (uint8_t)bursts_s[58 + 232], + osmo_hexdump((uint8_t *)bursts_s + 59 + 232, 57)); + printd("%s %02x %02x %s\n", osmo_hexdump((uint8_t *)bursts_s + 348, 57), + (uint8_t)bursts_s[57 + 348], (uint8_t)bursts_s[58 + 348], + osmo_hexdump((uint8_t *)bursts_s + 59 + 348, 57)); + + /* destroy */ + memset(bursts_s, 0, 30); + memset(bursts_s + 116, 0, 30); + + /* decode */ + xcch_decode(result, bursts_s); + + printd("Decoded: %s\n", osmo_hexdump(result, 23)); + + ASSERT_TRUE(!memcmp(l2, result, 23)); + + printd("\n"); +} + +static void test_rach(uint8_t bsic, uint8_t ra) +{ + uint8_t result; + ubit_t bursts_u[36]; + sbit_t bursts_s[36]; + + printd("Encoding: %02x\n", ra); + + /* encode */ + rach_encode(bursts_u, &ra, bsic); + + printd("U-Bits:\n"); + printd("%s\n", osmo_hexdump(bursts_u, 36)); + ubits2sbits(bursts_u, bursts_s, 36); + printd("S-Bits:\n"); + printd("%s\n", osmo_hexdump((uint8_t *)bursts_s, 36)); + + /* destroy */ + memset(bursts_s + 6, 0, 8); + + /* decode */ + rach_decode(&result, bursts_s, bsic); + + printd("Decoded: %02x\n", result); + + ASSERT_TRUE(ra == result); + + printd("\n"); +} + +static void test_sch(uint8_t *info) +{ + uint8_t result[4]; + ubit_t bursts_u[78]; + sbit_t bursts_s[78]; + + /* zero bits 25 and above */ + info[3] &= 1; + result[3] = 0; + + printd("Encoding: %s\n", osmo_hexdump(info, 4)); + + /* encode */ + sch_encode(bursts_u, info); + + printd("U-Bits:\n"); + printd("%s\n", osmo_hexdump(bursts_u, 78)); + ubits2sbits(bursts_u, bursts_s, 78); + printd("S-Bits:\n"); + printd("%s\n", osmo_hexdump((uint8_t *)bursts_s, 78)); + + /* destroy */ + memset(bursts_s + 6, 0, 10); + + /* decode */ + sch_decode(result, bursts_s); + + printd("Decoded: %s\n", osmo_hexdump(result, 4)); + + ASSERT_TRUE(!memcmp(info, result, 4)); + + printd("\n"); +} + +uint8_t test_l2[][23] = { + /* dummy frame */ + { 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + /* random frame */ + { 0xa3, 0xaf, 0x5f, 0xc6, 0x36, 0x43, 0x44, 0xab, + 0xd9, 0x6d, 0x7d, 0x62, 0x24, 0xc9, 0xd2, 0x92, + 0xfa, 0x27, 0x5d, 0x71, 0x7a, 0x59, 0xa8 }, + /* jolly frame */ + { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }, +}; + +int main(int argc, char **argv) +{ + int i; + + for (i = 0; i < sizeof(test_l2) / sizeof(test_l2[0]); i++) + test_xcch(test_l2[i]); + + for (i = 0; i < 256; i++) { + test_rach(0x3f, i); + test_rach(0x00, i); + test_rach(0x1a, i); + } + + for (i = 0; i < sizeof(test_l2) / sizeof(test_l2[0]); i++) + test_sch(test_l2[i]); + + printf("Success\n"); + + return 0; +} + diff --git a/tests/bursts/bursts_test.ok b/tests/bursts/bursts_test.ok new file mode 100644 index 000000000..35821117c --- /dev/null +++ b/tests/bursts/bursts_test.ok @@ -0,0 +1 @@ +Success diff --git a/tests/testsuite.at b/tests/testsuite.at index ec3021fd8..337af391e 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -18,3 +18,9 @@ AT_KEYWORDS([cipher]) cat $abs_srcdir/cipher/cipher_test.ok > expout AT_CHECK([$OSMO_QEMU $abs_top_builddir/tests/cipher/cipher_test], [], [expout], [ignore]) AT_CLEANUP + +AT_SETUP([bursts]) +AT_KEYWORDS([bursts]) +cat $abs_srcdir/cipher/bursts_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/bursts/bursts_test], [], [expout], [ignore]) +AT_CLEANUP