aboutsummaryrefslogtreecommitdiffstats
path: root/tests/gsm48
diff options
context:
space:
mode:
Diffstat (limited to 'tests/gsm48')
-rw-r--r--tests/gsm48/rest_octets_test.c120
-rw-r--r--tests/gsm48/rest_octets_test.ok2
2 files changed, 122 insertions, 0 deletions
diff --git a/tests/gsm48/rest_octets_test.c b/tests/gsm48/rest_octets_test.c
new file mode 100644
index 00000000..beff6e44
--- /dev/null
+++ b/tests/gsm48/rest_octets_test.c
@@ -0,0 +1,120 @@
+/*
+ * (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/gsm48_rest_octets.h>
+
+struct si13_test {
+ const char *name;
+ const struct osmo_gsm48_si13_info si;
+ int enc_rc;
+ int dec_rc;
+ void (*post_dec_cb)(const struct si13_test *test, const struct osmo_gsm48_si13_info* dec);
+};
+
+void post_dec_cb_test_alpha(const struct si13_test *test, const struct osmo_gsm48_si13_info* dec)
+{
+ OSMO_ASSERT(test->si.pwr_ctrl_pars.alpha == dec->pwr_ctrl_pars.alpha);
+}
+
+static const struct si13_test test_si13_arr[] = {
+ {
+ .name = "test alpha",
+ .si = {
+ .cell_opts = {
+ .nmo = GPRS_NMO_II,
+ .t3168 = 2000,
+ .t3192 = 1500,
+ .drx_timer_max = 3,
+ .bs_cv_max = 15,
+ .ctrl_ack_type_use_block = true,
+ .ext_info_present = 0,
+ .ext_info = {
+ .egprs_supported = 1,
+ .use_egprs_p_ch_req = 1,
+ .bep_period = 5,
+ .pfc_supported = 0,
+ .dtm_supported = 0,
+ .bss_paging_coordination = 0,
+ .ccn_active = true,
+ },
+ },
+ .pwr_ctrl_pars = {
+ .alpha = 5,
+ .t_avg_w = 16,
+ .t_avg_t = 16,
+ .pc_meas_chan = 0,
+ .n_avg_i = 8,
+ },
+ .bcch_change_mark = 1,
+ .si_change_field = 0,
+ .rac = 0x03,
+ .spgc_ccch_sup = 0,
+ .net_ctrl_ord = 0,
+ .prio_acc_thr = 6,
+ },
+ .enc_rc = 20,
+ .dec_rc = 71,
+ .post_dec_cb = post_dec_cb_test_alpha,
+ },
+};
+
+static void test_si13()
+{
+ int i, rc;
+ uint8_t data[GSM_MACBLOCK_LEN];
+ struct osmo_gsm48_si13_info si13;
+
+ for (i = 0; i < ARRAY_SIZE(test_si13_arr); i++) {
+ memset(data, 0, sizeof(data));
+ rc = osmo_gsm48_rest_octets_si13_encode(data, &test_si13_arr[i].si);
+ if (rc >= 0) {
+ printf("si13_encode (%d): %s\n", rc, osmo_hexdump(data, rc));
+ } else {
+ printf("si13_encode failed (%d)\n", rc);
+ }
+ OSMO_ASSERT(rc == test_si13_arr[i].enc_rc);
+ if (rc <= 0)
+ continue;
+ memset(&si13, 0 , sizeof(si13));
+ rc = osmo_gsm48_rest_octets_si13_decode(&si13, data);
+ if (rc >= 0) {
+ printf("si13_decode (%d)\n", rc);
+ } else {
+ printf("si13_decode failed (%d)\n", rc);
+ }
+ OSMO_ASSERT(rc == test_si13_arr[i].dec_rc);
+ if (test_si13_arr[i].post_dec_cb) {
+ test_si13_arr[i].post_dec_cb(&test_si13_arr[i], &si13);
+ }
+ }
+}
+
+int main(int argc, char **argv)
+{
+ test_si13();
+
+ return EXIT_SUCCESS;
+}
diff --git a/tests/gsm48/rest_octets_test.ok b/tests/gsm48/rest_octets_test.ok
new file mode 100644
index 00000000..54204f24
--- /dev/null
+++ b/tests/gsm48/rest_octets_test.ok
@@ -0,0 +1,2 @@
+si13_encode (20): 90 00 d8 5a 6f c9 e5 84 10 ab 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b
+si13_decode (71)