pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40636?usp=email )
Change subject: msc: Introduce test TC_stat_bsc_sctp_disconnected
......................................................................
msc: Introduce test TC_stat_bsc_sctp_disconnected
Related: OS#5917
Depends: osmo-msc.git Change-Id Ice1b2c163b1b0d134fcaa1c8bf543038a35fabdf
Change-Id: I4cf30ea09cb1d1286bd5ab6975f3f27e39b9c183
---
M msc/MSC_Tests.default
M msc/MSC_Tests.ttcn
M msc/MSC_Tests_Iu.ttcn
M msc/expected-results.xml
4 files changed, 196 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/36/40636/1
diff --git a/msc/MSC_Tests.default b/msc/MSC_Tests.default
index 34954bd..149d8e7 100644
--- a/msc/MSC_Tests.default
+++ b/msc/MSC_Tests.default
@@ -31,6 +31,15 @@
*.STATSVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"
*.STATSVTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"
*.STATSVTY.PROMPT1 := "OsmoMSC> "
+*.STPVTY.CTRL_MODE := "client"
+*.STPVTY.CTRL_HOSTNAME := "127.0.0.1"
+*.STPVTY.CTRL_PORTNUM := "4239"
+*.STPVTY.CTRL_LOGIN_SKIPPED := "yes"
+*.STPVTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes"
+*.STPVTY.CTRL_READMODE := "buffered"
+*.STPVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"
+*.STPVTY.CTRL_DETECT_CONNECTION_ESTABLISHMENT_RESULT := "yes"
+*.STPVTY.PROMPT1 := "OsmoSTP> "
[MODULE_PARAMETERS]
diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn
index 1ba52d9..4a7acdc 100644
--- a/msc/MSC_Tests.ttcn
+++ b/msc/MSC_Tests.ttcn
@@ -110,8 +110,10 @@
/* only to get events from IPA underneath GSUP */
port IPA_CTRL_PT GSUP_IPA_EVENT;
- /* VTY to MSC */
+ /* VTY to MSC: */
port TELNETasp_PT MSCVTY;
+ /* VTY to STP: */
+ port TELNETasp_PT STPVTY;
/* StatsD */
var StatsD_Checker_CT vc_STATSD;
@@ -315,6 +317,34 @@
}
}
+friend function f_init_vty_stp() runs on MTC_CT {
+ if (STPVTY.checkstate("Mapped")) {
+ /* skip initialization if already executed once */
+ return;
+ }
+ map(self:STPVTY, system:STPVTY);
+ f_vty_set_prompts(STPVTY, prompt_prefix := "OsmoSTP");
+ f_vty_transceive(STPVTY, "enable");
+}
+
+friend function f_vty_stp_msc_asp_cmd(charstring cmd) runs on MTC_CT
+{
+ var charstring asp_name;
+ var charstring loc_port;
+ var charstring rem_port;
+ var charstring asp_proto;
+ if (mp_bssap_cfg[0].transport == BSSAP_TRANSPORT_AoIP) {
+ asp_name := "msc0-0";
+ loc_port := int2str(1905);
+ rem_port := int2str(2905);
+ asp_proto := "m3ua";
+ } else {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "osmo-stp not used in
SCCPLite!");
+ }
+ var charstring asp_node := "asp " & asp_name & " " &
loc_port & " " & rem_port & " " & asp_proto;
+ f_vty_config2(STPVTY, {"cs7 instance 0", asp_node}, cmd);
+}
+
function f_init(integer num_bsc := 1, boolean sgsap := false, boolean gsup := true,
boolean osmux := false) runs on MTC_CT {
if (g_initialized == true) {
@@ -499,6 +529,12 @@
return f_start_handler_with_pars(fn, f_init_pars(imsi_suffix, ran_idx := ran_idx,
ran_is_geran := ran_is_geran, use_osmux := use_osmux, verify_cell_id := verify_cell_id));
}
+friend function f_msc_stats_prefix() return charstring
+{
+ return mp_statsd_prefix & "net.0.msc.";
+}
+
+
private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on
BSC_ConnHdlr {
f_init_handler(pars);
f_perform_lu();
@@ -2464,6 +2500,7 @@
f_mt_sms(spars);
f_expect_clear();
+ f_ran_unregister_imsi(g_pars.imsi);
}
testcase TC_lu_and_mt_sms() runs on MTC_CT {
var BSC_ConnHdlrPars pars;
@@ -3525,6 +3562,8 @@
/* then test the transaction mode */
f_smpp_mt_sms(spars, true);
+
+ f_ran_unregister_imsi(g_pars.imsi);
}
testcase TC_smpp_mt_sms() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
@@ -7594,6 +7633,83 @@
vc_conn.done;
}
+/* When the last local IPA/SCTP link/ASP is terminated, last AS goes inactive
+ * and a SCCP N-PCSTATE.ind (unavailable) should arrive to upper layers.
+ * As a result, osmo-msc should immediately mark the ran_peer as unusable.
+ * In AoIP, the SCCP N-PCSTATE is triggered by instructing the STP to
+ * shutdown the ASP serving the MSC, which will close the SCTP assoc between
+ * itself and IUT (MSC), which should then generate an N-PCSTATE.ind.
+ */
+friend function f_tc_mt_sms(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+ var SmsParameters spars := valueof(t_SmsPars);
+
+ f_init_handler(pars);
+
+ /* register an 'expect' for given IMSI (+TMSI) */
+ f_ran_register_imsi(g_pars.imsi, g_pars.tmsi);
+
+ f_vty_sms_send(hex2str(pars.imsi), "2342", "Hello SMS");
+
+ /* MSC->BSC: expect PAGING from MSC. We can't match on specific TMSI
+ because it was provided in a previous first vc_conn in test during 1st LU. */
+ f_expect_paging_tmsi(?);
+
+ /* Establish DTAP / BSSAP / SCCP connection */
+ f_establish_fully(EST_TYPE_PAG_RESP);
+
+ spars.tp.ud := 'C8329BFD064D9B53'O;
+ f_mt_sms(spars);
+
+ f_expect_clear();
+ f_ran_unregister_imsi(g_pars.imsi);
+}
+testcase TC_stat_bsc_sctp_disconnected() runs on MTC_CT {
+ var BSC_ConnHdlr vc_conn;
+ var BSC_ConnHdlrPars pars;
+ var charstring msc_stats_prefix := f_msc_stats_prefix();
+
+ var StatsDExpects expect_connected := {
+ {name := msc_stats_prefix & "ran_peers.total", mtype := "g",
min := 1, max := 1},
+ {name := msc_stats_prefix & "ran_peers.active", mtype := "g",
min := 1, max := 1}
+ };
+ var StatsDExpects expect_disconnected := {
+ {name := msc_stats_prefix & "ran_peers.total", mtype := "g",
min := 1, max := 1},
+ {name := msc_stats_prefix & "ran_peers.active", mtype := "g",
min := 0, max := 0}
+ };
+
+ g_statd_timeout := 15.0;
+ f_init();
+ f_init_vty_stp();
+
+ connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+ f_statsd_reset();
+ f_statsd_expect(expect_connected, wait_converge := true);
+ disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+
+ pars := f_init_pars(1);
+ vc_conn := f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms), pars);
+ vc_conn.done;
+
+ f_logp(MSCVTY, "Shutting down MSC ASP in STP");
+ f_vty_stp_msc_asp_cmd("shutdown");
+
+ /* Wait for AS PENDING->INACTIVE transition (T(r) timeout after 2000msec): */
+ connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+ f_statsd_expect(expect_disconnected, wait_converge := true);
+ disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+
+ f_logp(MSCVTY, "Restarting MSC ASP in STP");
+ f_vty_stp_msc_asp_cmd("no shutdown");
+
+ connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+ f_statsd_expect(expect_connected, wait_converge := true);
+ disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+
+ vc_conn := f_start_handler_with_pars(refers(f_tc_mt_sms), pars);
+ vc_conn.done;
+ setverdict(pass);
+}
+
control {
execute( TC_cr_before_reset() );
execute( TC_lu_imsi_noauth_tmsi() );
@@ -7787,6 +7903,13 @@
execute( TC_lu_and_mt_csd() );
execute( TC_lu_and_mo_call_reass_for_mt_codec() );
+
+ /* This "nightly" if can be removed once libosmo-sigtran (osmo-stp) > 2.1.0
is released.
+ * Currently released osmo-stp 2.1.0 ends up in in broken AS-ACTIVE+ASP-DOWN state when
+ * restarting the ASP after exiting the related asp node through VTY: */
+ if (Misc_Helpers.f_osmo_repo_is("nightly")) {
+ execute( TC_stat_bsc_sctp_disconnected() );
+ }
}
diff --git a/msc/MSC_Tests_Iu.ttcn b/msc/MSC_Tests_Iu.ttcn
index c78b86b..c3c7231 100644
--- a/msc/MSC_Tests_Iu.ttcn
+++ b/msc/MSC_Tests_Iu.ttcn
@@ -12,6 +12,7 @@
import from General_Types all;
import from Osmocom_Types all;
+import from Misc_Helpers all;
import from BSC_ConnectionHandler all;
import from MSC_Tests all;
@@ -29,7 +30,10 @@
import from L3_Templates all;
import from L3_Common all;
-
+import from StatsD_Types all;
+import from StatsD_CodecPort all;
+import from StatsD_CodecPort_CtrlFunct all;
+import from StatsD_Checker all;
testcase TC_iu_lu_imsi_reject() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
@@ -593,6 +597,54 @@
vc_conn.done;
}
+testcase TC_stat_rnc_sctp_disconnected() runs on MTC_CT {
+ var BSC_ConnHdlr vc_conn;
+ var BSC_ConnHdlrPars pars;
+ var charstring msc_stats_prefix := f_msc_stats_prefix();
+
+ var StatsDExpects expect_connected := {
+ {name := msc_stats_prefix & "ran_peers.total", mtype := "g",
min := 3, max := 3},
+ {name := msc_stats_prefix & "ran_peers.active", mtype := "g",
min := 3, max := 3}
+ };
+ var StatsDExpects expect_disconnected := {
+ {name := msc_stats_prefix & "ran_peers.total", mtype := "g",
min := 3, max := 3},
+ {name := msc_stats_prefix & "ran_peers.active", mtype := "g",
min := 0, max := 0}
+ };
+
+ g_statd_timeout := 15.0;
+ f_init(3);
+ f_init_vty_stp();
+
+ connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+ f_statsd_reset();
+ f_statsd_expect(expect_connected, wait_converge := true);
+ disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+
+ pars := f_init_pars(1, ran_idx := 2, ran_is_geran := false);
+ vc_conn := f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms), pars);
+ vc_conn.done;
+
+ f_logp(MSCVTY, "Shutting down MSC ASP in STP");
+ f_vty_stp_msc_asp_cmd("shutdown");
+
+ /* Wait for AS PENDING->INACTIVE transition (T(r) timeout after 2000msec): */
+ connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+ f_statsd_expect(expect_disconnected, wait_converge := true);
+ disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+
+ f_logp(MSCVTY, "Restarting MSC ASP in STP");
+ f_vty_stp_msc_asp_cmd("no shutdown");
+
+ connect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+ f_statsd_expect(expect_connected, wait_converge := true);
+ disconnect(self:STATSD_PROC, vc_STATSD:STATSD_PROC);
+
+ pars := f_init_pars(2, ran_idx := 2, ran_is_geran := false);
+ vc_conn := f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms), pars);
+ vc_conn.done;
+ setverdict(pass);
+}
+
control {
execute( TC_iu_lu_imsi_reject() );
execute( TC_iu_lu_imsi_timeout_gsup() );
@@ -664,6 +716,13 @@
/* Run this last: at the time of writing this test crashes the MSC */
execute( TC_mo_cc_iu_release() );
+
+ /* This "nightly" if can be removed once libosmo-sigtran (osmo-stp) > 2.1.0
is released.
+ * Currently released osmo-stp 2.1.0 ends up in in broken AS-ACTIVE+ASP-DOWN state when
+ * restarting the ASP after exiting the related asp node through VTY: */
+ if (Misc_Helpers.f_osmo_repo_is("nightly")) {
+ execute( TC_stat_rnc_sctp_disconnected() );
+ }
}
diff --git a/msc/expected-results.xml b/msc/expected-results.xml
index 9d7e315..04cd191 100644
--- a/msc/expected-results.xml
+++ b/msc/expected-results.xml
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
-<testsuite name='Titan' tests='227' failures='10'
errors='0' skipped='0' inconc='0' time='MASKED'>
+<testsuite name='Titan' tests='228' failures='10'
errors='0' skipped='0' inconc='0' time='MASKED'>
<testcase classname='MSC_Tests' name='TC_cr_before_reset'
time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_lu_imsi_noauth_tmsi'
time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_lu_imsi_noauth_notmsi'
time='MASKED'/>
@@ -176,6 +176,7 @@
<testcase classname='MSC_Tests' name='TC_lu_and_mo_csd'
time='MASKED'/>
<testcase classname='MSC_Tests' name='TC_lu_and_mt_csd'
time='MASKED'/>
<testcase classname='MSC_Tests'
name='TC_lu_and_mo_call_reass_for_mt_codec' time='MASKED'/>
+ <testcase classname='MSC_Tests' name='TC_stat_bsc_sctp_disconnected'
time='MASKED'/>
<!-- MSC_Tests_Iu testcases start here -->
<testcase classname='MSC_Tests_Iu' name='TC_iu_lu_imsi_reject'
time='MASKED'/>
<testcase classname='MSC_Tests_Iu' name='TC_iu_lu_imsi_timeout_gsup'
time='MASKED'/>
@@ -256,6 +257,7 @@
</testcase>
<testcase classname='MSC_Tests_Iu'
name='TC_iu_lu_and_expire_while_paging' time='MASKED'/>
<testcase classname='MSC_Tests_Iu' name='TC_mo_cc_iu_release'
time='MASKED'/>
+ <testcase classname='MSC_Tests_Iu'
name='TC_stat_rnc_sctp_disconnected' time='MASKED'/>
<!-- MSC_Tests_ASCI testcases start here -->
<testcase classname='MSC_Tests_ASCI' name='TC_no_callref'
time='MASKED'/>
<testcase classname='MSC_Tests_ASCI' name='TC_setup_refuse'
time='MASKED'/>
--
To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40636?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I4cf30ea09cb1d1286bd5ab6975f3f27e39b9c183
Gerrit-Change-Number: 40636
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>