aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile.am5
-rw-r--r--tests/gad/gad_test.c143
-rw-r--r--tests/gad/gad_test.ok8
-rw-r--r--tests/testsuite.at6
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