mirror of https://gerrit.osmocom.org/libosmocore
144 lines
4.0 KiB
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;
|
|
}
|