aboutsummaryrefslogtreecommitdiffstats
path: root/sccp/SCCP_Tests_RAW.ttcn
diff options
context:
space:
mode:
Diffstat (limited to 'sccp/SCCP_Tests_RAW.ttcn')
-rw-r--r--sccp/SCCP_Tests_RAW.ttcn231
1 files changed, 228 insertions, 3 deletions
diff --git a/sccp/SCCP_Tests_RAW.ttcn b/sccp/SCCP_Tests_RAW.ttcn
index 7d44eb42..5849dad3 100644
--- a/sccp/SCCP_Tests_RAW.ttcn
+++ b/sccp/SCCP_Tests_RAW.ttcn
@@ -69,6 +69,18 @@ function f_init_vty() runs on SCCP_Test_RAW_CT {
"sccp-timer iar " & int2str(g_demo_sccp_timer_iar)});
}
+function f_vty_cmd_connect_req(integer conn_id) runs on SCCP_Test_RAW_CT {
+ f_vty_transceive(SCCP_DEMO_USER_VTY, "sccp-user");
+ f_vty_transceive(SCCP_DEMO_USER_VTY, "connect-req " & int2str(conn_id));
+ f_vty_transceive(SCCP_DEMO_USER_VTY, "end");
+}
+
+function f_vty_cmd_disconnect_req(integer conn_id) runs on SCCP_Test_RAW_CT {
+ f_vty_transceive(SCCP_DEMO_USER_VTY, "sccp-user");
+ f_vty_transceive(SCCP_DEMO_USER_VTY, "disconnect-req " & int2str(conn_id));
+ f_vty_transceive(SCCP_DEMO_USER_VTY, "end");
+}
+
private function f_init_raw(SCCP_Configuration cfg) runs on SCCP_Test_RAW_CT {
g_param := {
sio := {
@@ -178,11 +190,11 @@ testcase TC_cr_cc() runs on SCCP_Test_RAW_CT {
}
/* Verify sccp_demo_user inactivty timers are not armed upon dealing with
-/* connectionless data-unit messages. Since no connection exists. */
+ * connectionless data-unit messages. Since no connection exists. */
testcase TC_udt_without_cr_cc() runs on SCCP_Test_RAW_CT {
var SCCP_PAR_Address calling, called;
var SCCP_MTP3_TRANSFERind rx;
- var octetstring data := f_rnd_octstring(f_rnd_int(100));
+ var octetstring data := f_rnd_octstring_rnd_len(100);
/* Keep recommended ratio of T(iar) >= T(ias)*2, but anyway no IT
should be received in this case. */
@@ -215,7 +227,7 @@ testcase TC_udt_without_cr_cc() runs on SCCP_Test_RAW_CT {
testcase TC_tiar_timeout() runs on SCCP_Test_RAW_CT {
var SCCP_PAR_Address calling, called;
var OCT3 remote_lref;
- var octetstring data := f_rnd_octstring(f_rnd_int(100));
+ var octetstring data := f_rnd_octstring_rnd_len(100);
/* Set T(iar) in sccp_demo_user low enough that it will trigger before other side
has time to keep alive with a T(ias). Keep recommended ratio of
@@ -248,6 +260,7 @@ testcase TC_it_avoids_tiar() runs on SCCP_Test_RAW_CT {
var SCCP_PAR_Address calling, called;
var OCT3 remote_lref;
var boolean it_received := false;
+ var SCCP_MTP3_TRANSFERind rx;
g_demo_sccp_timer_ias := 1;
g_demo_sccp_timer_iar := 3;
@@ -273,6 +286,10 @@ testcase TC_it_avoids_tiar() runs on SCCP_Test_RAW_CT {
setverdict(fail, "Unexpected SCCP RLSD received");
self.stop;
}
+ [] MTP3.receive(tr_SCCP_MTP3_TRANSFERind(*)) -> value rx {
+ setverdict(fail, "Unexpected MTP/SCCP TRANSFERind received: ", rx);
+ self.stop;
+ }
[] MTP3.receive {
setverdict(fail, "Unexpected MTP/SCCP received");
self.stop;
@@ -310,11 +327,219 @@ testcase TC_it_avoids_tiar() runs on SCCP_Test_RAW_CT {
}
}
+private function f_tx_xudt_exp(SCCP_PAR_Address calling, SCCP_PAR_Address called, octetstring data) runs on SCCP_Test_RAW_CT {
+ var template PDU_SCCP exp_rx;
+ f_send_sccp(ts_SCCP_XUDT(calling, called, data));
+ exp_rx := (tr_SCCP_UDT(called, calling, data), tr_SCCP_XUDT(called, calling, data));
+ f_exp_sccp(exp_rx);
+}
+
+/* Test if the IUT SCCP code processes an XUDT [treat it like UDT] and answers back. */
+testcase TC_process_rx_xudt() runs on SCCP_Test_RAW_CT {
+ var SCCP_PAR_Address calling, called;
+ var octetstring data := f_rnd_octstring_rnd_len(100);
+
+ f_init_raw(mp_sccp_cfg[0]);
+ f_sleep(1.0);
+
+ called := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].peer_pc, mp_sccp_cfg[0].peer_ssn,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+ calling := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].own_pc, mp_sccp_cfg[0].own_ssn,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+
+ /* Make sure an XUDT is echoed back just like an UDT */
+ f_tx_xudt_exp(calling, called, data);
+ setverdict(pass);
+}
+
+private function f_tx_ludt_exp(SCCP_PAR_Address calling, SCCP_PAR_Address called, octetstring data) runs on SCCP_Test_RAW_CT {
+ var template PDU_SCCP exp_rx;
+ f_send_sccp(ts_SCCP_LUDT(calling, called, data));
+ exp_rx := tr_SCCP_LUDT(called, calling, data);
+ f_exp_sccp(exp_rx);
+}
+
+/* Test if the IUT SCCP code processes a LUDT [treat it like UDT] and answers back. */
+testcase TC_process_rx_ludt() runs on SCCP_Test_RAW_CT {
+ var SCCP_PAR_Address calling, called;
+ var octetstring data := f_rnd_octstring(1000);
+
+ f_init_raw(mp_sccp_cfg[0]);
+ f_sleep(1.0);
+
+ called := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].peer_pc, mp_sccp_cfg[0].peer_ssn,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+ calling := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].own_pc, mp_sccp_cfg[0].own_ssn,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+
+ /* Make sure an LUDT is echoed back just like an UDT */
+ f_tx_ludt_exp(calling, called, data);
+ setverdict(pass);
+}
+
+function f_scmg_xceive(SCCP_PAR_Address calling, SCCP_PAR_Address called,
+ template (value) PDU_SCMG_message tx,
+ template (omit) PDU_SCMG_message rx_exp,
+ boolean accept_other_called_resp := false) runs on SCCP_Test_RAW_CT
+{
+ var boolean exp_something := true;
+ var SCCP_MTP3_TRANSFERind rx;
+ timer T := 5.0;
+
+ if (istemplatekind(rx_exp, "omit")) {
+ exp_something := false;
+ }
+
+ MTP3.clear;
+ f_send_sccp(ts_SCCP_UDT(calling, called, enc_PDU_SCMG_message(valueof(tx))));
+ T.start;
+ alt {
+ [exp_something] MTP3.receive(tr_SCCP_MTP3_TRANSFERind(tr_SCCP_UDT(called, calling, decmatch rx_exp))) {
+ setverdict(pass);
+ }
+ [exp_something and accept_other_called_resp] MTP3.receive(tr_SCCP_MTP3_TRANSFERind(tr_SCCP_UDT(called, ?, decmatch rx_exp))) {
+ setverdict(pass);
+ }
+ [] MTP3.receive(tr_SCCP_MTP3_TRANSFERind(tr_SCCP_UDT(called, calling, ?))) -> value rx {
+ setverdict(fail, "Received unexpected SCCP/MTP3 TRANSFERind (specific): ", rx, " but waiting for (specific) ", rx_exp);
+ }
+ [] MTP3.receive(tr_SCCP_MTP3_TRANSFERind(*)) -> value rx {
+ setverdict(fail, "Received unexpected SCCP/MTP3 TRANSFERind (*): ", rx, " but waiting for ", rx_exp);
+ }
+ [] MTP3.receive {
+ setverdict(fail, "Received unexpected waiting for ", rx_exp);
+ }
+ [exp_something] T.timeout {
+ setverdict(fail, "Timeout waiting for ", rx_exp);
+ }
+ [not exp_something] T.timeout {
+ setverdict(pass);
+ }
+ }
+
+}
+
+/* Test is SST(SSN=1) returns SSA */
+testcase TC_scmg_sst_ssn1() runs on SCCP_Test_RAW_CT {
+ var SCCP_PAR_Address calling, called;
+ var template (value) PDU_SCMG_message tx;
+ var template (present) PDU_SCMG_message rx_exp;
+
+ f_init_raw(mp_sccp_cfg[0]);
+ f_sleep(1.0);
+
+ called := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].peer_pc, 1,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+ calling := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].own_pc, 1,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+
+ tx := ts_SCMG_SST(1, mp_sccp_cfg[0].peer_pc);
+ rx_exp := ts_SCMG_SSA(1, mp_sccp_cfg[0].peer_pc);
+ f_scmg_xceive(calling, called, tx, rx_exp);
+}
+
+/* Test is SST(SSN=valid) returns SSA */
+testcase TC_scmg_sst_ssn_valid() runs on SCCP_Test_RAW_CT {
+ var SCCP_PAR_Address calling, called;
+ var template (value) PDU_SCMG_message tx;
+ var template (present) PDU_SCMG_message rx_exp;
+
+ f_init_raw(mp_sccp_cfg[0]);
+ f_sleep(1.0);
+
+ called := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].peer_pc, 1,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+ calling := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].own_pc, 1,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+
+ tx := ts_SCMG_SST(mp_sccp_cfg[0].peer_ssn, mp_sccp_cfg[0].peer_pc);
+ rx_exp := ts_SCMG_SSA(mp_sccp_cfg[0].peer_ssn, mp_sccp_cfg[0].peer_pc);
+ f_scmg_xceive(calling, called, tx, rx_exp);
+}
+
+
+/* Test is SST(SSN=invalid) returns nothing */
+testcase TC_scmg_sst_ssn_invalid() runs on SCCP_Test_RAW_CT {
+ var SCCP_PAR_Address calling, called;
+ var template (value) PDU_SCMG_message tx;
+ var template (omit) PDU_SCMG_message rx_exp;
+
+ f_init_raw(mp_sccp_cfg[0]);
+ f_sleep(1.0);
+
+ called := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].peer_pc, 1,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+ calling := valueof(ts_SccpAddr_PC_SSN(mp_sccp_cfg[0].own_pc, 1,
+ mp_sccp_cfg[0].sio, mp_sccp_cfg[0].sccp_service_type));
+
+ tx := ts_SCMG_SST(123, mp_sccp_cfg[0].peer_pc);
+ rx_exp := omit;
+ f_scmg_xceive(calling, called, tx, rx_exp);
+}
+
+/* Test CallingParty(only SSN) solicits response (OS#5146) */
+testcase TC_callingparty_ssn_only() runs on SCCP_Test_RAW_CT {
+ var SCCP_PAR_Address calling, called;
+ var template (value) PDU_SCMG_message tx;
+ var template (present) PDU_SCMG_message rx_exp;
+
+ f_init_raw(mp_sccp_cfg[0]);
+ f_sleep(1.0);
+
+ called := valueof(ts_SccpAddr_SSN(1));
+ calling := valueof(ts_SccpAddr_SSN(1));
+
+ tx := ts_SCMG_SST(1, mp_sccp_cfg[0].peer_pc);
+ rx_exp := ts_SCMG_SSA(1, mp_sccp_cfg[0].peer_pc);
+ f_scmg_xceive(calling, called, tx, rx_exp, accept_other_called_resp:=true);
+}
+
+
+/* Test user initiating a conn (eg RUA), which triggers SCCP CR. While waiting
+ * for CC, user decides it timed out (eg. RUA side timeout) which makes it move to
+ * WAIT_CONN_CONF state. In that state, wait for CC and then submit an RLSD and
+ * wait for ack. */
+testcase TC_cr_timeout_cc_too_late() runs on SCCP_Test_RAW_CT {
+ var SCCP_MTP3_TRANSFERind mtp3_rx;
+ var integer conn_id := 1234;
+ var OCT3 remote_lref;
+
+ f_init_raw(mp_sccp_cfg[0]);
+ f_sleep(1.0);
+
+ f_vty_cmd_connect_req(conn_id);
+ mtp3_rx := f_exp_sccp(tr_SCCP_CR(?, ?, ?));
+
+ /* Emulate disconnection from the user: */
+ f_vty_cmd_disconnect_req(conn_id);
+ remote_lref := mtp3_rx.data.connrequest.sourceLocRef;
+
+ /* Now send CC, user should send RLSD to us: */
+ f_send_sccp(ts_SCCP_CC(g_own_lref, remote_lref));
+ log("Waiting for RLSD");
+ /* Cause set hardcoded by osmo_sccp_demo_user VTY code, nothing to test here: */
+ var template (present) integer cause := ?;
+ f_exp_sccp(tr_SCCP_RLSD(remote_lref, g_own_lref, cause));
+ f_send_sccp(ts_SCCP_RLC(g_own_lref, remote_lref));
+
+ setverdict(pass);
+}
+
+
control {
execute( TC_cr_cc() );
execute( TC_udt_without_cr_cc() );
execute( TC_tiar_timeout() );
execute( TC_it_avoids_tiar() );
+ execute( TC_process_rx_xudt() );
+ execute( TC_process_rx_ludt() );
+
+ execute( TC_scmg_sst_ssn1() );
+ execute( TC_scmg_sst_ssn_valid() );
+ execute( TC_scmg_sst_ssn_invalid() );
+
+ execute( TC_callingparty_ssn_only() );
+ execute( TC_cr_timeout_cc_too_late() );
}