libosmocore/tests/gad/gad_test.c

144 lines
4.0 KiB
C

#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;
}