diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 5 | ||||
-rw-r--r-- | tests/gad/gad_test.c | 143 | ||||
-rw-r--r-- | tests/gad/gad_test.ok | 8 | ||||
-rw-r--r-- | tests/testsuite.at | 6 |
4 files changed, 162 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index 2d0cf939..c4e6b9f5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -38,6 +38,7 @@ check_PROGRAMS = timer/timer_test sms/sms_test ussd/ussd_test \ dtx/dtx_gsm0503_test \ i460_mux/i460_mux_test \ bitgen/bitgen_test \ + gad/gad_test \ $(NULL) if ENABLE_MSGFILE @@ -281,6 +282,9 @@ i460_mux_i460_mux_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/libosmogsm.la bitgen_bitgen_test_SOURCES = bitgen/bitgen_test.c bitgen_bitgen_test_LDADD = $(LDADD) +gad_gad_test_SOURCES = gad/gad_test.c +gad_gad_test_LDADD = $(LDADD) $(top_builddir)/src/gsm/gad.o + # The `:;' works around a Bash 3.2 bug when the output is not writeable. $(srcdir)/package.m4: $(top_srcdir)/configure.ac :;{ \ @@ -361,6 +365,7 @@ EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \ exec/exec_test.ok exec/exec_test.err \ i460_mux/i460_mux_test.ok \ bitgen/bitgen_test.ok \ + gad/gad_test.ok \ $(NULL) if ENABLE_LIBSCTP diff --git a/tests/gad/gad_test.c b/tests/gad/gad_test.c new file mode 100644 index 00000000..ca8c4fa8 --- /dev/null +++ b/tests/gad/gad_test.c @@ -0,0 +1,143 @@ +#include <stdio.h> + +#include <osmocom/core/utils.h> +#include <osmocom/core/msgb.h> +#include <osmocom/gsm/gad.h> + +void test_gad_lat_lon_dec_enc_stability() +{ + uint32_t lat_enc; + uint32_t lon_enc; + printf("--- %s\n", __func__); + for (lat_enc = 0x0; lat_enc <= 0xffffff; lat_enc++) { + int32_t lat_dec = osmo_gad_dec_lat(lat_enc); + uint32_t enc2 = osmo_gad_enc_lat(lat_dec); + uint32_t want_enc = lat_enc; + /* "-0" == 0, because the highest bit is defined as a sign bit. */ + if (lat_enc == 0x800000) + want_enc = 0; + if (enc2 != want_enc) { + printf("ERR: lat=%u --> %d --> %u\n", lat_enc, lat_dec, enc2); + printf("%d -> %u\n", lat_dec + 1, osmo_gad_enc_lat(lat_dec + 1)); + OSMO_ASSERT(false); + } + } + printf("osmo_gad_dec_lat() -> osmo_gad_enc_lat() of %u values successful\n", lat_enc); + for (lon_enc = 0; lon_enc <= 0xffffff; lon_enc++) { + int32_t lon_dec = osmo_gad_dec_lon(lon_enc); + uint32_t enc2 = osmo_gad_enc_lon(lon_dec); + uint32_t want_enc = lon_enc; + if (enc2 != want_enc) { + printf("ERR: lon=%u 0x%x --> %d --> %u\n", lon_enc, lon_enc, lon_dec, enc2); + printf("%d -> %u\n", lon_dec + 1, osmo_gad_enc_lon(lon_dec + 1)); + printf("%d -> %u\n", lon_dec - 1, osmo_gad_enc_lon(lon_dec - 1)); + OSMO_ASSERT(false); + } + } + printf("osmo_gad_dec_lon() -> osmo_gad_enc_lon() of %u values successful\n", lon_enc); +} + +struct osmo_gad gad_test_values[] = { + { + .type = GAD_TYPE_ELL_POINT_UNC_CIRCLE, + .ell_point_unc_circle = { + /* Values rounded to the nearest encodable value, for test result matching */ + .lat = 23000006, + .lon = 42000002, + .unc = 442592, + }, + }, +}; + +void test_gad_enc_dec() +{ + int i; + printf("--- %s\n", __func__); + + for (i = 0; i < ARRAY_SIZE(gad_test_values); i++) { + struct osmo_gad *t = &gad_test_values[i]; + struct msgb *msg = msgb_alloc(1024, __func__); + union gad_raw raw_write; + union gad_raw raw_read; + struct osmo_gad dec_pdu; + int rc; + struct osmo_gad_err *err; + void *loop_ctx = msg; + rc = osmo_gad_enc(&raw_write, t); + if (rc <= 0) { + printf("[%d] %s: ERROR: osmo_gad_enc() failed\n", i, osmo_gad_type_name(t->type)); + goto loop_end; + } + rc = osmo_gad_raw_write(msg, &raw_write); + if (rc <= 0) { + printf("[%d] %s: ERROR: osmo_gad_raw_write() failed\n", i, osmo_gad_type_name(t->type)); + goto loop_end; + } + if (rc != msg->len) { + printf("[%d] %s: ERROR: osmo_gad_raw_write() returned length %d but msgb has %d bytes\n", + i, osmo_gad_type_name(t->type), + rc, msg->len); + goto loop_end; + } + + memset(&raw_read, 0xff, sizeof(raw_read)); + rc = osmo_gad_raw_read(&raw_read, &err, loop_ctx, msg->data, msg->len); + if (rc) { + printf("[%d] ERROR: osmo_gad_raw_read() failed: %s\n", i, err->logmsg); + printf(" encoded data: %s\n", osmo_hexdump(msg->data, msg->len)); + goto loop_end; + } + + memset(&dec_pdu, 0xff, sizeof(dec_pdu)); + rc = osmo_gad_dec(&dec_pdu, &err, loop_ctx, &raw_read); + if (rc) { + printf("[%d] ERROR: failed to decode pdu: %s\n", i, err->logmsg); + printf(" encoded data: %s\n", osmo_hexdump(msg->data, msg->len)); + goto loop_end; + } + + if (memcmp(t, &dec_pdu, sizeof(dec_pdu))) { + char strbuf[128]; + printf("[%d] %s: ERROR: decoded PDU != encoded PDU\n", i, + osmo_gad_type_name(t->type)); + osmo_gad_to_str_buf(strbuf, sizeof(strbuf), t); + printf(" original struct: %s\n", strbuf); + osmo_gad_to_str_buf(strbuf, sizeof(strbuf), &dec_pdu); + printf(" decoded struct: %s\n", strbuf); + goto loop_end; + } + + printf("[%d] %s: ok\n", i, osmo_gad_type_name(t->type)); + printf(" encoded data: %s\n", msgb_hexdump(msg)); + +loop_end: + msgb_free(msg); + } +} + +void test_gad_to_str() +{ + int i; + printf("--- %s\n", __func__); + + for (i = 0; i < ARRAY_SIZE(gad_test_values); i++) { + struct osmo_gad *t = &gad_test_values[i]; + char buf[1024]; + int rc; + rc = osmo_gad_to_str_buf(buf, sizeof(buf), t); + + printf("[%d] ", i); + if (rc <= 0) + printf("%s: ERROR: osmo_gad_to_str_buf() failed\n", osmo_gad_type_name(t->type)); + else + printf("%s\n", buf); + } +} + +int main() +{ + test_gad_lat_lon_dec_enc_stability(); + test_gad_enc_dec(); + test_gad_to_str(); + return 0; +} diff --git a/tests/gad/gad_test.ok b/tests/gad/gad_test.ok new file mode 100644 index 00000000..ec5432a8 --- /dev/null +++ b/tests/gad/gad_test.ok @@ -0,0 +1,8 @@ +--- test_gad_lat_lon_dec_enc_stability +osmo_gad_dec_lat() -> osmo_gad_enc_lat() of 16777216 values successful +osmo_gad_dec_lon() -> osmo_gad_enc_lon() of 16777216 values successful +--- test_gad_enc_dec +[0] Ellipsoid-point-with-uncertainty-circle: ok + encoded data: 10 20 b6 0c 1d dd de 28 +--- test_gad_to_str +[0] Ellipsoid-point-with-uncertainty-circle{lat=23.000006,lon=42.000002,unc=442.592m} diff --git a/tests/testsuite.at b/tests/testsuite.at index 8b6a20a1..e29c1312 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -403,3 +403,9 @@ AT_KEYWORDS([bitgen]) cat $abs_srcdir/bitgen/bitgen_test.ok > expout AT_CHECK([$abs_top_builddir/tests/bitgen/bitgen_test], [0], [expout], [ignore]) AT_CLEANUP + +AT_SETUP([gad]) +AT_KEYWORDS([gad]) +cat $abs_srcdir/gad/gad_test.ok > expout +AT_CHECK([$abs_top_builddir/tests/gad/gad_test], [0], [expout], [ignore]) +AT_CLEANUP |