pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/37476?usp=email )
Change subject: asterisk: TC_ims_call_mo_2nd_mo_rejected
......................................................................
asterisk: TC_ims_call_mo_2nd_mo_rejected
Related: SYS#7003
Change-Id: I7764e29e8df11ad65366642f83ebe922488bf128
---
M asterisk/Asterisk_Tests.ttcn
M asterisk/SIP_ConnectionHandler.ttcn
M asterisk/expected-results.xml
3 files changed, 87 insertions(+), 23 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/76/37476/1
diff --git a/asterisk/Asterisk_Tests.ttcn b/asterisk/Asterisk_Tests.ttcn
index c6ac698..2d3f2f1 100644
--- a/asterisk/Asterisk_Tests.ttcn
+++ b/asterisk/Asterisk_Tests.ttcn
@@ -237,6 +237,18 @@
f_TC_internal_hangup_call_mo_unregister();
setverdict(pass);
}
+private function f_TC_internal_call_mo_rejected(charstring id) runs on SIPConnHdlr {
+ f_SIP_register();
+ COORD.send(COORD_CMD_REGISTERED);
+
+ COORD.receive(COORD_CMD_START);
+ f_SIP_mo_call_setup(503, "Service Unavailable");
+ COORD.send(IMS_COORD_CMD_CALL_FINISHED);
+
+ COORD.receive(COORD_CMD_UNREGISTER);
+ f_SIP_unregister();
+ setverdict(pass);
+}
private function f_TC_internal_call_mt(charstring id) runs on SIPConnHdlr {
@@ -702,15 +714,15 @@
f_shutdown();
}
-private function f_ims_call_mo_configure(inout SIPConnHdlrPars sip_pars, inout
IMS_ConnHdlrPars ims_pars) runs on test_CT {
- const charstring c_ext_msisdn := "90829";
+private function f_ims_call_mo_configure(inout SIPConnHdlrPars sip_pars, inout
IMS_ConnHdlrPars ims_pars,
+ charstring tgt_ext_msisdn := "90829") runs on test_CT {
sip_pars.cp.calling := sip_pars.registrar_sip_record;
sip_pars.cp.called := valueof(ts_SipAddr(ts_HostPort(sip_pars.remote_sip_host),
- ts_UserInfo(c_ext_msisdn)));
+ ts_UserInfo(tgt_ext_msisdn)));
ims_pars.subscr.cp.calling := valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
ts_UserInfo(ims_pars.subscr.msisdn)));
ims_pars.subscr.cp.called := valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
- ts_UserInfo(c_ext_msisdn)));
+ ts_UserInfo(tgt_ext_msisdn)));
}
private function f_ims_call_mo_establish(inout SIPConnHdlr vc_conn_sip, inout
IMS_ConnHdlr vc_conn_ims) runs on test_CT {
@@ -776,7 +788,13 @@
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 {
+ f_sleep(1.0);
+}
+
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),
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;
@@ -815,7 +833,7 @@
if (use_session_timer) {
IMS_COORD.receive(IMS_COORD_CMD_CALL_SESSION_REFRESH);
}
- f_sleep(1.0);
+ call_established_cb.apply(sip_pars, ims_pars);
COORD.send(COORD_CMD_HANGUP) to vc_conn_sip;
IMS_COORD.receive(IMS_COORD_CMD_CALL_FINISHED) from vc_conn_ims;
@@ -850,6 +868,25 @@
ims_fn := refers(f_TC_ims_call_mo_IMS_ConnHdlr_with_holdresume));
}
+/* Test a 2nd call initiated from a local SIP UA towards IMS is rejected with
+ * 503 Service Unavailable if IMS endpoint is already busy in a call. */
+private function call_established_fn_2ndrejected(SIPConnHdlrPars sip_pars,
IMS_ConnHdlrPars ims_pars) runs on test_CT {
+ var SIPConnHdlrPars sip_pars2;
+ var SIPConnHdlr vc_conn_sip2;
+ sip_pars2 := f_init_ConnHdlrPars(idx := 2);
+ f_ims_call_mo_configure(sip_pars2, ims_pars, tgt_ext_msisdn := "88888888");
+ vc_conn_sip2 := f_start_handler(refers(f_TC_internal_call_mo_rejected), sip_pars2);
+
+ COORD.receive(COORD_CMD_REGISTERED) from vc_conn_sip2;
+ COORD.send(COORD_CMD_START) to vc_conn_sip2;
+ COORD.receive(IMS_COORD_CMD_CALL_FINISHED) from vc_conn_sip2;
+ COORD.send(COORD_CMD_UNREGISTER) to vc_conn_sip2;
+ vc_conn_sip2.done;
+}
+testcase TC_ims_call_mo_2nd_mo_rejected() runs on test_CT {
+ f_TC_ims_call_mo(call_established_cb := refers(call_established_fn_2ndrejected));
+}
+
/* Test SIP registration of local clients */
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)));
@@ -967,6 +1004,7 @@
execute( TC_ims_call_mo_session_timer() );
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_mt() );
execute( TC_ims_call_mt_noprecondition() );
}
diff --git a/asterisk/SIP_ConnectionHandler.ttcn b/asterisk/SIP_ConnectionHandler.ttcn
index ad76296..49fa04c 100644
--- a/asterisk/SIP_ConnectionHandler.ttcn
+++ b/asterisk/SIP_ConnectionHandler.ttcn
@@ -423,29 +423,16 @@
return g_rx_sip_resp;
}
-function f_SIP_mo_call_setup() runs on SIPConnHdlr
+private function f_SIP_mo_call_tx_invite(Via via) runs on SIPConnHdlr
{
var template (value) PDU_SIP_Request req;
+ var charstring tx_sdp := f_gen_sdp();
var template (present) PDU_SIP_Response exp;
var template (present) From from_addr_exp;
var template (present) To to_addr_exp;
- var Via via;
- var charstring tx_sdp := f_gen_sdp();
- var default d_trying, d_ringing, d_sessprog;
- var charstring branch_value;
- /* RFC 3261 8.1.1.3 From */
- g_pars.cp.from_addr := valueof(ts_From(g_pars.cp.calling.addr,
g_pars.cp.calling.params));
- g_pars.cp.from_addr.fromParams := f_sip_param_set(g_pars.cp.from_addr.fromParams,
"tag", f_sip_rand_tag());
- g_pars.cp.to_addr := valueof(ts_To(g_pars.cp.called.addr, g_pars.cp.called.params));
from_addr_exp := tr_From(tr_Addr_Union_from_val(g_pars.cp.from_addr.addressField), *);
to_addr_exp := tr_To(tr_Addr_Union_from_val(g_pars.cp.to_addr.addressField), *);
- branch_value :=
f_sip_gen_branch(f_sip_Addr_Union_to_str(g_pars.cp.from_addr.addressField),
- f_sip_Addr_Union_to_str(valueof(g_pars.cp.to_addr.addressField)),
- g_pars.cp.sip_call_id,
- g_pars.cp.sip_seq_nr);
- via := g_pars.local_via;
- via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams,
"branch", branch_value);
req := ts_SIP_INVITE(g_pars.cp.sip_call_id,
g_pars.cp.from_addr,
@@ -477,6 +464,34 @@
g_pars.cp.sip_seq_nr := g_pars.cp.sip_seq_nr + 1;
f_sip_Request_inc_seq_nr(req);
SIP.send(req);
+}
+
+function f_SIP_mo_call_setup(template (present) integer exp_status_code := 200,
+ template (present) charstring exp_reason := "OK") runs on SIPConnHdlr
+{
+ var template (value) PDU_SIP_Request req;
+ var template (present) PDU_SIP_Response exp;
+ var template (present) From from_addr_exp;
+ var template (present) To to_addr_exp;
+ var Via via;
+ var charstring tx_sdp := f_gen_sdp();
+ var default d_trying, d_ringing, d_sessprog;
+ var charstring branch_value;
+
+ /* RFC 3261 8.1.1.3 From */
+ g_pars.cp.from_addr := valueof(ts_From(g_pars.cp.calling.addr,
g_pars.cp.calling.params));
+ g_pars.cp.from_addr.fromParams := f_sip_param_set(g_pars.cp.from_addr.fromParams,
"tag", f_sip_rand_tag());
+ g_pars.cp.to_addr := valueof(ts_To(g_pars.cp.called.addr, g_pars.cp.called.params));
+ from_addr_exp := tr_From(tr_Addr_Union_from_val(g_pars.cp.from_addr.addressField), *);
+ to_addr_exp := tr_To(tr_Addr_Union_from_val(g_pars.cp.to_addr.addressField), *);
+ branch_value :=
f_sip_gen_branch(f_sip_Addr_Union_to_str(g_pars.cp.from_addr.addressField),
+ f_sip_Addr_Union_to_str(valueof(g_pars.cp.to_addr.addressField)),
+ g_pars.cp.sip_call_id,
+ g_pars.cp.sip_seq_nr);
+ via := g_pars.local_via;
+ via.viaBody[0].viaParams := f_sip_param_set(via.viaBody[0].viaParams,
"branch", branch_value);
+
+ f_SIP_mo_call_tx_invite(via);
/* Conditionally match and accept 100 Trying. */
exp := tr_SIP_Response_Trying(g_pars.cp.sip_call_id,
@@ -509,9 +524,9 @@
to_addr_exp,
f_tr_Via_response(via),
*,
- "INVITE", 200,
- g_pars.cp.sip_seq_nr, "OK",
- body := ?);
+ "INVITE", exp_status_code,
+ g_pars.cp.sip_seq_nr, exp_reason,
+ body := *);
as_SIP_expect_resp(exp, fail_others := false);
deactivate(d_trying);
diff --git a/asterisk/expected-results.xml b/asterisk/expected-results.xml
index 1819072..21f0ed4 100644
--- a/asterisk/expected-results.xml
+++ b/asterisk/expected-results.xml
@@ -18,6 +18,7 @@
<testcase classname='Asterisk_Tests'
name='TC_ims_call_mo_session_timer' time='MASKED'/>
<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_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/+/37476?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: I7764e29e8df11ad65366642f83ebe922488bf128
Gerrit-Change-Number: 37476
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange