pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-bsc/+/28001 )
Change subject: WIP: Introduce pagting_test
......................................................................
WIP: Introduce pagting_test
Change-Id: Iab61bf6a6eece5f439a19f7a5a0dc068a808ae8a
---
M configure.ac
M tests/Makefile.am
A tests/paging/Makefile.am
A tests/paging/paging_test.c
A tests/paging/paging_test.ok
M tests/testsuite.at
6 files changed, 235 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/01/28001/1
diff --git a/configure.ac b/configure.ac
index 3ff4524..85d7c59 100644
--- a/configure.ac
+++ b/configure.ac
@@ -237,6 +237,7 @@
tests/gsm0408/Makefile
tests/handover/Makefile
tests/nanobts_omlattr/Makefile
+ tests/paging/Makefile
tests/subscr/Makefile
doc/Makefile
doc/examples/Makefile
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 77c621f..be693cc 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -6,6 +6,7 @@
gsm0408 \
handover \
nanobts_omlattr \
+ paging \
subscr \
$(NULL)
diff --git a/tests/paging/Makefile.am b/tests/paging/Makefile.am
new file mode 100644
index 0000000..5472c48
--- /dev/null
+++ b/tests/paging/Makefile.am
@@ -0,0 +1,38 @@
+AM_CPPFLAGS = \
+ $(all_includes) \
+ -I$(top_srcdir)/include \
+ $(NULL)
+
+AM_CFLAGS = \
+ -Wall \
+ -ggdb3 \
+ $(LIBOSMOCORE_CFLAGS) \
+ $(LIBOSMOGSM_CFLAGS) \
+ $(LIBOSMOABIS_CFLAGS) \
+ $(LIBOSMONETIF_CFLAGS) \
+ $(LIBOSMOSIGTRAN_CFLAGS) \
+ $(COVERAGE_CFLAGS) \
+ $(NULL)
+
+EXTRA_DIST = \
+ paging_test.ok \
+ $(NULL)
+
+check_PROGRAMS = \
+ paging_test \
+ $(NULL)
+
+paging_test_SOURCES = \
+ paging_test.c \
+ $(NULL)
+
+paging_test_LDFLAGS = \
+ -Wl,--wrap=abis_rsl_sendmsg \
+ $(NULL)
+
+paging_test_LDADD = \
+ $(top_builddir)/src/osmo-bsc/libbsc.la \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOABIS_LIBS) \
+ $(LIBOSMOGSM_LIBS) \
+ $(NULL)
diff --git a/tests/paging/paging_test.c b/tests/paging/paging_test.c
new file mode 100644
index 0000000..c844e8b
--- /dev/null
+++ b/tests/paging/paging_test.c
@@ -0,0 +1,188 @@
+/*
+ * (C) 2022 by sysmocom s.f.m.c. GmbH <info(a)sysmocom.de>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 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 Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#include <osmocom/core/application.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/gsm/protocol/gsm_12_21.h>
+#include <osmocom/gsm/gsm23003.h>
+
+#include <osmocom/bsc/gsm_data.h>
+#include <osmocom/bsc/bts.h>
+#include <osmocom/bsc/abis_nm.h>
+#include <osmocom/bsc/debug.h>
+
+struct timespec *clk_monotonic_override;
+
+static void clock_debug(char* str)
+{
+ struct timeval tv;
+ osmo_gettimeofday(&tv, NULL);
+ fprintf(stderr, "sys={%lu.%06lu}: %s\n",
+ tv.tv_sec, tv.tv_usec, str);
+}
+
+
+static void clock_set(uint64_t sec, uint64_t usec)
+{
+ osmo_gettimeofday_override_time.tv_sec = sec;
+ osmo_gettimeofday_override_time.tv_usec = usec;
+ clk_monotonic_override->tv_sec = sec;
+ clk_monotonic_override->tv_nsec = usec * 1000;
+}
+
+static void clock_inc(unsigned int sec, unsigned int usec)
+{
+ osmo_gettimeofday_override_add(sec, usec);
+ osmo_clock_override_add(CLOCK_MONOTONIC, sec, usec * 1000);
+}
+
+#define bts_init(net) _bts_init(net, __func__)
+static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)
+{
+ struct gsm_bts_sm *bts_sm = gsm_bts_sm_alloc(net, 0);
+ struct gsm_bts *bts = bts_sm->bts[0];
+ if (!bts) {
+ fprintf(stderr, "BTS allocation failure in %s()\n", msg);
+ exit(1);
+ }
+ fprintf(stderr, "BTS allocation OK in %s()\n", msg);
+
+ bts->network = net;
+
+ /* Make sure trx_is_usable() returns true for bts->c0: */
+ bts->c0->mo.nm_state.operational = NM_OPSTATE_ENABLED;
+ bts->c0->mo.nm_state.availability = NM_AVSTATE_OK;
+ bts->c0->mo.nm_state.administrative = NM_STATE_UNLOCKED;
+ bts->c0->bb_transc.mo.nm_state.operational = NM_OPSTATE_ENABLED;
+ bts->c0->bb_transc.mo.nm_state.availability = NM_AVSTATE_OK;
+ bts->c0->bb_transc.mo.nm_state.administrative = NM_STATE_UNLOCKED;
+ bts->c0->rsl_link_primary = (struct e1inp_sign_link *)(intptr_t)0x01; /* Fake RSL
is UP */
+
+ return bts;
+}
+
+#define bts_del(bts) _bts_del(bts, __func__)
+static inline void _bts_del(struct gsm_bts *bts, const char *msg)
+{
+ osmo_stat_item_group_free(bts->bts_statg);
+ rate_ctr_group_free(bts->bts_ctrs);
+ /* no need to llist_del(&bts->list), we never registered the bts there. */
+ talloc_free(bts->site_mgr);
+ fprintf(stderr, "BTS deallocated OK in %s()\n", msg);
+}
+
+static void test_paging1(struct gsm_network *net)
+{
+ fprintf(stderr, "===%s===\n", __func__);
+ int i;
+ int ret;
+ struct gsm_bts *bts = bts_init(net);
+ clock_set(0, 0);
+
+ struct bsc_paging_params params = {
+ .reason = BSC_PAGING_FROM_CN,
+ .msc = NULL,
+ .tmsi = GSM_RESERVED_TMSI,
+ .imsi = {
+ .type = GSM_MI_TYPE_IMSI,
+ .imsi = "1234567",
+ }
+ };
+ params.bsub = bsc_subscr_find_or_create_by_imsi(net->bsc_subscribers,
params.imsi.imsi,
+ BSUB_USE_PAGING_START);
+ ret = paging_request_bts(¶ms, bts);
+ OSMO_ASSERT(ret == 1);
+
+ for (i = 0; i < 9; i++) {
+ clock_inc(0, 200);
+ clock_debug("select()");
+ osmo_select_main_ctx(0);
+ }
+
+ bts_del(bts);
+}
+
+static const struct log_info_cat log_categories[] = {
+ [DPAG] = {
+ .name = "DPAG",
+ .description = "",
+ .enabled = 1, .loglevel = LOGL_NOTICE,
+ },
+};
+
+static const struct log_info log_info = {
+ .cat = log_categories,
+ .num_cat = ARRAY_SIZE(log_categories),
+};
+
+int main(int argc, char **argv)
+{
+ struct gsm_network *net;
+
+ osmo_gettimeofday_override = true;
+ osmo_clock_override_enable(CLOCK_MONOTONIC, true);
+ clk_monotonic_override = osmo_clock_override_gettimespec(CLOCK_MONOTONIC);
+ clock_set(0, 0);
+
+ tall_bsc_ctx = talloc_named_const(NULL, 0, "paging_test");
+ osmo_init_logging2(tall_bsc_ctx, &log_info);
+ log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
+ log_set_print_category_hex(osmo_stderr_target, 0);
+ log_set_print_category(osmo_stderr_target, 0);
+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
+ log_set_use_color(osmo_stderr_target, 0);
+ log_parse_category_mask(osmo_stderr_target, "DPAG,1:");
+ osmo_fsm_log_addr(false);
+
+ net = gsm_network_init(tall_bsc_ctx);
+ if (!net) {
+ fprintf(stderr, "Network init failure.\n");
+ return EXIT_FAILURE;
+ }
+
+ test_paging1(net);
+
+ return EXIT_SUCCESS;
+}
+
+/* override, requires '-Wl,--wrap=abis_rsl_sendmsg'.
+ * Catch RSL messages sent towards the BTS. */
+int __real_abis_rsl_sendmsg(struct msgb *msg);
+int __wrap_abis_rsl_sendmsg(struct msgb *msg)
+{
+ struct abis_rsl_cchan_hdr *cch = (struct abis_rsl_cchan_hdr *) msg->data;
+ struct tlv_parsed tp;
+
+ switch (cch->c.msg_type) {
+ case RSL_MT_PAGING_CMD:
+ fprintf(stderr, "abis_rsl_sendmsg: Paging CMD\n");
+ if (rsl_tlv_parse(&tp, msgb_data(msg) + sizeof(*cch), msgb_len(msg) - sizeof(*cch))
< 0) {
+ LOGPTRX(trx, DRSL, LOGL_ERROR, "%s(): rsl_tlv_parse() failed\n", __func__);
+ return rsl_tx_error_report(trx, RSL_ERR_PROTO, &cch->chan_nr, NULL, msg);
+ }
+ break;
+ default:
+ fprintf(stderr, "abis_rsl_sendmsg: unknown rsl message=0x%x\n",
dh->c.msg_type);
+ }
+ return 0;
+}
diff --git a/tests/paging/paging_test.ok b/tests/paging/paging_test.ok
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/tests/paging/paging_test.ok
@@ -0,0 +1 @@
+
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 9e3e614..270d10c 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -37,6 +37,12 @@
AT_CHECK([$abs_srcdir/handover/handover_tests.sh $abs_srcdir/handover
$abs_builddir/handover], [], [expout], [ignore])
AT_CLEANUP
+AT_SETUP([paging])
+AT_KEYWORDS([paging])
+cat $abs_srcdir/paging/paging_test.ok > experr
+AT_CHECK([$abs_top_builddir/tests/paging/paging_test], [], [ignore], [experr])
+AT_CLEANUP
+
AT_SETUP([nanobts_omlattr])
AT_KEYWORDS([nanobts_omlattr])
cat $abs_srcdir/nanobts_omlattr/nanobts_omlattr_test.ok > expout
--
To view, visit
https://gerrit.osmocom.org/c/osmo-bsc/+/28001
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: Iab61bf6a6eece5f439a19f7a5a0dc068a808ae8a
Gerrit-Change-Number: 28001
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange