Max has uploaded this change for review. ( https://gerrit.osmocom.org/12556


Change subject: Add tests for transaction routines
......................................................................

Add tests for transaction routines

Change-Id: I78dfb7cd35073a305cf668beda7d9d58d5a5a713
---
M configure.ac
M tests/Makefile.am
M tests/testsuite.at
A tests/trans/Makefile.am
A tests/trans/trans_test.c
A tests/trans/trans_test.err
A tests/trans/trans_test.ok
7 files changed, 242 insertions(+), 0 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/56/12556/1

diff --git a/configure.ac b/configure.ac
index a4979cf..d955187 100644
--- a/configure.ac
+++ b/configure.ac
@@ -257,6 +257,7 @@
     tests/Makefile
     tests/atlocal
     tests/smpp/Makefile
+    tests/trans/Makefile
     tests/sms_queue/Makefile
     tests/msc_vlr/Makefile
     doc/Makefile
diff --git a/tests/Makefile.am b/tests/Makefile.am
index dc5194c..883df23 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,6 +1,7 @@
 SUBDIRS = \
        sms_queue \
        msc_vlr \
+       trans \
        $(NULL)

 if BUILD_SMPP
diff --git a/tests/testsuite.at b/tests/testsuite.at
index f27b60c..f3cb740 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -9,6 +9,13 @@
 AT_CHECK([$abs_top_builddir/tests/smpp/smpp_test], [], [expout], [experr])
 AT_CLEANUP

+AT_SETUP([trans])
+AT_KEYWORDS([trans])
+cat $abs_srcdir/trans/trans_test.ok > expout
+cat $abs_srcdir/trans/trans_test.err > experr
+AT_CHECK([$abs_top_builddir/tests/trans/trans_test], [], [expout], [experr])
+AT_CLEANUP
+
 AT_SETUP([sms_queue_test])
 AT_KEYWORDS([sms_queue_test])
 cat $abs_srcdir/sms_queue/sms_queue_test.ok > expout
diff --git a/tests/trans/Makefile.am b/tests/trans/Makefile.am
new file mode 100644
index 0000000..1a05307
--- /dev/null
+++ b/tests/trans/Makefile.am
@@ -0,0 +1,31 @@
+AM_CPPFLAGS = \
+       $(all_includes) \
+       -I$(top_srcdir)/include \
+       -I$(top_srcdir)/src/libmsc \
+       $(NULL)
+
+AM_CFLAGS = \
+       -Wall \
+       -ggdb3 \
+       $(LIBOSMOCORE_CFLAGS) \
+       $(LIBOSMOGSM_CFLAGS) \
+       $(LIBOSMOSCCP_CFLAGS) \
+       $(LIBOSMOABIS_CFLAGS) \
+       $(COVERAGE_CFLAGS) \
+       $(NULL)
+
+AM_LDFLAGS = $(COVERAGE_LDFLAGS)
+
+EXTRA_DIST = trans_test.ok trans_test.err
+
+trans_test_LDADD = \
+       $(top_builddir)/src/libmsc/libmsc.a \
+       $(top_builddir)/src/libvlr/libvlr.a \
+       $(LIBOSMOCORE_LIBS) \
+       $(LIBOSMOGSM_LIBS) \
+       $(LIBOSMOABIS_LIBS) \
+       $(LIBOSMOSIGTRAN_LIBS) \
+       $(LIBOSMOMGCPCLIENT_LIBS) \
+       $(LIBOSMOGSUPCLIENT_LIBS) \
+       -ldbi \
+       $(NULL)
diff --git a/tests/trans/trans_test.c b/tests/trans/trans_test.c
new file mode 100644
index 0000000..42b39c6
--- /dev/null
+++ b/tests/trans/trans_test.c
@@ -0,0 +1,184 @@
+/*
+ * (C) 2019 sysmocom s.f.m.c. GmbH <[email protected]>
+ * 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 Affero 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 <stdlib.h>
+#include <stdio.h>
+
+#include <osmocom/msc/debug.h>
+#include <osmocom/msc/vlr.h>
+#include <osmocom/msc/msc_common.h>
+#include <osmocom/msc/transaction.h>
+
+#include <osmocom/core/application.h>
+#include <osmocom/core/backtrace.h>
+#include <osmocom/core/talloc.h>
+
+
+static bool wrong_tran(const struct gsm_trans *t, uint8_t ref_id)
+{
+       if (!t) {
+               printf("Failed to obtain transaction with expected ID %u.\n", 
ref_id);
+               return true;
+       }
+
+       if (t->transaction_id != ref_id) {
+               printf("Wrong transaction obtained with ID %u != %u 
(expected)\n", t->transaction_id, ref_id);
+               return true;
+       }
+
+       return false;
+}
+
+static struct gsm_trans *make_tran(struct gsm_network *net, struct vlr_subscr 
*vsub, uint8_t proto, uint32_t callref)
+{
+       int trans_id = trans_assign_trans_id(net, vsub, proto, 0);
+       if (trans_id < 0) {
+               printf("Failed to get next transaction ID.\n");
+               return NULL;
+       }
+
+       return trans_alloc(net, vsub, proto, trans_id, callref);
+}
+
+static struct ran_conn *make_conn(struct gsm_network *net, struct vlr_subscr 
*vsub)
+{
+       struct ran_conn *ran_c = ran_conn_alloc(net, OSMO_RAT_UNKNOWN, 69);
+       if (ran_c)
+               ran_c->vsub = vlr_subscr_get(vsub);
+       return ran_c;
+}
+
+static void test_tran_single(struct gsm_network *net, struct vlr_subscr *vsub, 
uint32_t base_callref)
+{
+       struct gsm_trans *t, *x;
+       struct ran_conn *ran_c;
+       uint8_t p = GSM48_PDISC_GROUP_CC;
+       int trans_id;
+
+       printf("\nStarting basic transaction test...\n");
+
+       ran_c = make_conn(net, vsub);
+       if (!ran_c)
+               return;
+
+       t = make_tran(net, vsub, p, base_callref);
+       if (!t)
+               return;
+
+       printf("Transaction allocation complete: 0x%X CallRef used.\n", 
t->callref);
+
+       if (trans_has_conn(ran_c))
+               return;
+
+       t->conn = ran_conn_get(ran_c, RAN_CONN_USE_SILENT_CALL);
+       if (!trans_has_conn(ran_c))
+               return;
+
+       printf("Connection %s assigned to transaction.\n", 
vlr_subscr_name(ran_c->vsub));
+
+       trans_id = trans_assign_trans_id(net, vsub, p, 0);
+       if (trans_id < 0) {
+               printf("Failed to allocate next transaction id.\n");
+               return;
+       }
+
+       if (trans_id == t->transaction_id) {
+               printf("Transaction id allocated twice.\n");
+               return;
+       }
+       printf("Next transaction ID: %u\n", trans_id);
+
+       printf("Transaction lookup:\n");
+
+       x = trans_find_by_callref(net, base_callref);
+       if (wrong_tran(x, t->transaction_id))
+               return;
+       printf("\tCallRef OK.\n");
+
+       x = trans_find_by_id(ran_c, p, t->transaction_id);
+       if (wrong_tran(x, t->transaction_id))
+               return;
+       printf("\tID OK.\n");
+
+       printf("Transaction cleanup.\n");
+       trans_free(t);
+
+       printf("Basic transaction test for CallRef 0x%X complete.\n", 
base_callref);
+}
+
+static void test_tran_overflow(struct gsm_network *net, struct vlr_subscr 
*vsub, uint32_t base_callref)
+{
+       unsigned i, max_t = 32, al;
+       struct gsm_trans *t;
+
+       printf("\nStarting overflow transaction test...\nAllocating: ");
+
+       for (i = 0; i < max_t; i++) {
+               t = make_tran(net, vsub, GSM48_PDISC_BCAST_CC, base_callref);
+               if (!t)
+                       break;
+               printf(".");
+       }
+
+       al = i;
+       printf("\tAllocated %u transactions.\n  Cleaning: ", al);
+
+       for (i = 0; i < max_t; i++) {
+               t = trans_find_by_callref(net, base_callref);
+               if (!t)
+                       break;
+               trans_free(t);
+               printf(".");
+       }
+
+       printf("\n\tCleared   %u transactions.\nOverflow transaction test for 
CallRef 0x%X complete: %s\n",
+              i, base_callref, (al != i) ? "FAILED" : "OK");
+}
+
+
+int main(int argc, char **argv)
+{
+       void *ctx = talloc_named_const(NULL, 0, "trans_test");
+       struct gsm_network *net;
+       struct vlr_subscr *v;
+
+       osmo_init_logging2(ctx, NULL);
+       log_set_use_color(osmo_stderr_target, 0);
+       log_set_print_filename(osmo_stderr_target, 0);
+
+       net = gsm_network_init(ctx, NULL);
+       if (!net) {
+               printf("Failed to allocate network struct\n");
+               return 1;
+       }
+
+       ran_conn_init();
+
+       if (msc_vlr_alloc(net)) {
+               printf("Failed to allocate VLR\n");
+               return 2;
+       }
+
+       v = vlr_subscr_alloc(net->vlr);
+
+       test_tran_single(net, v, 1);
+       test_tran_overflow(net, v, 2);
+
+       return EXIT_SUCCESS;
+}
diff --git a/tests/trans/trans_test.err b/tests/trans/trans_test.err
new file mode 100644
index 0000000..19cfbdb
--- /dev/null
+++ b/tests/trans/trans_test.err
@@ -0,0 +1 @@
+unknown: Unknown RAN type, cannot tx release/clear
diff --git a/tests/trans/trans_test.ok b/tests/trans/trans_test.ok
new file mode 100644
index 0000000..20622bf
--- /dev/null
+++ b/tests/trans/trans_test.ok
@@ -0,0 +1,17 @@
+
+Starting basic transaction test...
+Transaction allocation complete: 0x1 CallRef used.
+Connection unknown assigned to transaction.
+Next transaction ID: 1
+Transaction lookup:
+       CallRef OK.
+       ID OK.
+Transaction cleanup.
+Basic transaction test for CallRef 0x1 complete.
+
+Starting overflow transaction test...
+Allocating: .......Failed to get next transaction ID.
+       Allocated 7 transactions.
+  Cleaning: .......
+       Cleared   7 transactions.
+Overflow transaction test for CallRef 0x2 complete: OK

--
To view, visit https://gerrit.osmocom.org/12556
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-msc
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I78dfb7cd35073a305cf668beda7d9d58d5a5a713
Gerrit-Change-Number: 12556
Gerrit-PatchSet: 1
Gerrit-Owner: Max <[email protected]>

Reply via email to