pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37481?usp=email )
Change subject: ttcn3-asterisk: Introduce test TC_ims_call_mo_2nd_mt_rejected
......................................................................
ttcn3-asterisk: Introduce test TC_ims_call_mo_2nd_mt_rejected
Change-Id: Id6577d0e9137c86855469904d347e95b5bcfa4a7
---
M asterisk/Asterisk_Tests.ttcn
M asterisk/IMS_ConnectionHandler.ttcn
M asterisk/expected-results.xml
3 files changed, 101 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/81/37481/1
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index 00b6edb..9b5bb11 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -787,14 +787,37 @@
as_IMS_exp_call_resume();
f_TC_ims_call_mo_IMS_ConnHdlr_hangup_call_unregister();
}
+private function f_TC_ims_call_mo_IMS_ConnHdlr_2nd_mt_rejected(charstring id) runs on
IMS_ConnHdlr {
+ var IMS_ConnHdlrSubscrPars subscr0;
+ var default d_trying, d_ringing, d_sessprog;
+ var Via via;
+
+ /* Establish 1st (MO) call */
+ f_TC_ims_call_mo_IMS_ConnHdlr_register_establish_call();
+
+ /* Backup state of 1st call subscriber: */
+ subscr0 := g_pars.subscr;
+ /* Initiate second (MT) call: */
+ f_IMS_mt_call_rejected(486, "Busy Here");
+ /* Leave some time for last ACK from IMS to arrive to Asterisk */
+ f_sleep(1.0);
+ /* Restore 1s call metadata before hanging it up here: */
+ g_pars.subscr := subscr0;
+ COORD.send(IMS_COORD_CMD_CALL_REJECTED);
+
+ f_TC_ims_call_mo_IMS_ConnHdlr_hangup_call_unregister();
+}
type function call_established_fn(SIPConnHdlrPars sip_pars, IMS_ConnHdlrPars ims_pars)
runs on test_CT;
-private function call_established_fn_sleep(SIPConnHdlrPars sip_pars, IMS_ConnHdlrPars
ims_pars) runs on test_CT {
+private function call_established_fn_sleep1(SIPConnHdlrPars sip_pars, IMS_ConnHdlrPars
ims_pars) runs on test_CT {
f_sleep(1.0);
}
+private function call_established_fn_wait_ims_coord_cmd_call_rejected(SIPConnHdlrPars
sip_pars, IMS_ConnHdlrPars ims_pars) runs on test_CT {
+ IMS_COORD.receive(IMS_COORD_CMD_CALL_REJECTED);
+}
private function f_TC_ims_call_mo(boolean use_precondition_ext := true, boolean
use_session_timer := false,
- call_established_fn call_established_cb := refers(call_established_fn_sleep),
+ call_established_fn call_established_cb := refers(call_established_fn_sleep1),
void_fn sip_fn := refers(f_TC_internal_call_mo),
ims_void_fn ims_fn := refers(f_TC_ims_call_mo_IMS_ConnHdlr)) runs on test_CT {
var SIPConnHdlrPars sip_pars;
@@ -887,7 +910,14 @@
f_TC_ims_call_mo(call_established_cb := refers(call_established_fn_2ndrejected));
}
-/* Test SIP registration of local clients */
+/* Test a 2nd call initiated from IMS towards Astierisk is rejected with
+ * 486 Busy Here if IMS endpoint is already busy in a call. */
+testcase TC_ims_call_mo_2nd_mt_rejected() runs on test_CT {
+ f_TC_ims_call_mo(call_established_cb :=
refers(call_established_fn_wait_ims_coord_cmd_call_rejected),
+ ims_fn := refers(f_TC_ims_call_mo_IMS_ConnHdlr_2nd_mt_rejected));
+}
+
+/* Test MT call initiated by IMS */
private function f_TC_ims_call_mt_IMS_ConnHdlr(charstring id) runs on IMS_ConnHdlr {
f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.registrar_sip_record.addr)));
as_IMS_register();
@@ -1005,6 +1035,7 @@
execute( TC_ims_call_mo_noprecondition() );
execute( TC_ims_call_mo_holdresume_mo() );
execute( TC_ims_call_mo_2nd_mo_rejected() );
+ execute( TC_ims_call_mo_2nd_mt_rejected() );
execute( TC_ims_call_mt() );
execute( TC_ims_call_mt_noprecondition() );
}
diff --git a/asterisk/IMS_ConnectionHandler.ttcn b/asterisk/IMS_ConnectionHandler.ttcn
index d4c9da2..d644a75 100644
--- a/asterisk/IMS_ConnectionHandler.ttcn
+++ b/asterisk/IMS_ConnectionHandler.ttcn
@@ -48,6 +48,7 @@
const charstring IMS_COORD_CMD_CALL_ESTABLISHED :=
"IMS_COORD_CMD_CALL_ESTABLISHED";
const charstring IMS_COORD_CMD_HANGUP := "IMS_COORD_CMD_HANGUP";
const charstring IMS_COORD_CMD_CALL_FINISHED := "IMS_COORD_CMD_CALL_FINISHED";
+const charstring IMS_COORD_CMD_CALL_REJECTED := "IMS_COORD_CMD_CALL_REJECTED";
const charstring IMS_COORD_CMD_CALL_TRYING := "IMS_COORD_CMD_CALL_TRYING";
const charstring IMS_COORD_CMD_CALL_SESSION_PROGRESS :=
"IMS_COORD_CMD_CALL_SESSION_PROGRESS";
const charstring IMS_COORD_CMD_CALL_SESSION_REFRESH :=
"IMS_COORD_CMD_CALL_SESSION_REFRESH";
@@ -1379,6 +1380,62 @@
g_pars.subscr.cp.sip_seq_nr := g_pars.subscr.cp.sip_seq_nr + 1;
}
+/* IMS Core starts a call towards the peer and gets rejected. */
+function f_IMS_mt_call_rejected(template (present) integer exp_status_code := 486,
+ template (present) charstring exp_reason := "Busy Here") runs on
IMS_ConnHdlr
+{
+ var template (value) PDU_SIP_Request req;
+ var template (present) PDU_SIP_Response exp;
+ var default d_trying, d_ringing, d_sessprog;
+ var Via via;
+
+ g_pars.subscr.cp.from_addr := valueof(ts_From(g_pars.subscr.cp.calling.addr,
g_pars.subscr.cp.calling.params));
+ g_pars.subscr.cp.from_addr.fromParams :=
f_sip_param_set(g_pars.subscr.cp.from_addr.fromParams, "tag",
f_sip_rand_tag());
+ g_pars.subscr.cp.to_addr := valueof(ts_To(g_pars.subscr.cp.called.addr,
g_pars.subscr.cp.called.params));
+ via := f_IMS_gen_new_Via();
+ f_IMS_mt_call_tx_invite(via);
+
+ /* Conditionally match and accept 100 Trying. */
+ exp := tr_SIP_Response_Trying(g_pars.subscr.cp.sip_call_id,
+ ?, ?,
+ f_tr_Via_response(via),
+ g_pars.subscr.cp.sip_seq_nr, "INVITE");
+ d_trying := activate(as_SIP_ignore_resp(exp));
+ /* Conditionally match and accept 183 Session Progress. */
+ exp := tr_SIP_Response_SessionProgress(g_pars.subscr.cp.sip_call_id,
+ ?, ?,
+ f_tr_Via_response(via),
+ g_pars.subscr.cp.sip_seq_nr, "INVITE");
+ d_sessprog := activate(as_SIP_ignore_resp(exp));
+
+ /* Wait for 486 Busy Here (INVITE) answer */
+ exp := tr_SIP_Response(g_pars.subscr.cp.sip_call_id,
+ ?, ?,
+ f_tr_Via_response(via),
+ *,
+ "INVITE", 486,
+ g_pars.subscr.cp.sip_seq_nr, "Busy Here",
+ body := omit);
+ as_SIP_expect_resp(exp, fail_others := false);
+
+ deactivate(d_sessprog);
+ deactivate(d_trying);
+
+ /* Update To with the tags received from peer: */
+ g_pars.subscr.cp.to_addr := g_rx_sip_resp.msgHeader.toField;
+
+ /* Transmit ACK */
+ req := ts_SIP_ACK(ts_SipUrl_from_Addr_Union(g_pars.subscr.cp.called.addr),
+ g_pars.subscr.cp.sip_call_id,
+ g_pars.subscr.cp.from_addr,
+ g_pars.subscr.cp.to_addr,
+ via,
+ g_pars.subscr.cp.sip_seq_nr,
+ omit);
+ SIP.send(req);
+ g_pars.subscr.cp.sip_seq_nr := g_pars.subscr.cp.sip_seq_nr + 1;
+}
+
/* Tx BYE: */
function f_IMS_do_call_hangup() runs on IMS_ConnHdlr
{
diff --git a/asterisk/expected-results.xml b/asterisk/expected-results.xml
index 21f0ed4..ddc50a5 100644
--- a/asterisk/expected-results.xml
+++ b/asterisk/expected-results.xml
@@ -19,6 +19,7 @@
<testcase classname='Asterisk_Tests'
name='TC_ims_call_mo_noprecondition' time='MASKED'/>
<testcase classname='Asterisk_Tests'
name='TC_ims_call_mo_holdresume_mo' time='MASKED'/>
<testcase classname='Asterisk_Tests'
name='TC_ims_call_mo_2nd_mo_rejected' time='MASKED'/>
+ <testcase classname='Asterisk_Tests'
name='TC_ims_call_mo_2nd_mt_rejected' time='MASKED'/>
<testcase classname='Asterisk_Tests' name='TC_ims_call_mt'
time='MASKED'/>
<testcase classname='Asterisk_Tests'
name='TC_ims_call_mt_noprecondition' time='MASKED'/>
</testsuite>
--
To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37481?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Id6577d0e9137c86855469904d347e95b5bcfa4a7
Gerrit-Change-Number: 37481
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange