blob: 20a9e6c5048dfce6accd7583128ebd13e78e64cc [file] [log] [blame]
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +01001module Asterisk_Tests {
2
3/* Asterisk test suite in TTCN-3
4 * (C) 2024 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
5 * All rights reserved.
6 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
7 *
8 * Released under the terms of GNU General Public License, Version 2 or
9 * (at your option) any later version.
10 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 */
13
Pau Espin Pedrol05eaa1a2024-04-02 12:56:26 +020014import from TCCOpenSecurity_Functions all;
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010015import from General_Types all;
16import from Osmocom_Types all;
17import from Native_Functions all;
18import from Misc_Helpers all;
Pau Espin Pedrol54b614a2024-04-17 18:58:36 +020019import from TELNETasp_PortType all;
20import from AMI_Functions all;
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010021
22import from SDP_Types all;
23import from SDP_Templates all;
24
25import from SIP_Emulation all;
26import from SIPmsg_Types all;
27import from SIP_Templates all;
28
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +020029import from SIP_ConnectionHandler all;
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +020030import from IMS_ConnectionHandler all;
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +020031
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010032modulepar {
33 charstring mp_local_sip_host := "127.0.0.2";
34 integer mp_local_sip_port := 5060;
35 charstring mp_remote_sip_host := "127.0.0.1";
36 integer mp_remote_sip_port := 5060;
Pau Espin Pedrol54b614a2024-04-17 18:58:36 +020037
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +020038 charstring mp_local_ims_host := "127.0.0.3";
39 integer mp_local_ims_port := 5060;
Pau Espin Pedrolf46132e2024-06-04 17:11:59 +020040 charstring mp_ims_domain := "ims.mnc001.mcc238.3gppnetwork.org"
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +020041 charstring mp_ims_imsi := "238010000090828";
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +020042
Pau Espin Pedrol54b614a2024-04-17 18:58:36 +020043 /* Asterisk AMI: */
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +020044 charstring mp_ami_remote_host := "127.0.0.1";
45 integer mp_ami_remote_port := 5038;
46 charstring mp_ami_local_host := "0.0.0.0";
47 integer mp_ami_local_port := 0;
Pau Espin Pedrol54b614a2024-04-17 18:58:36 +020048 charstring mp_ami_user := "test_user";
49 charstring mp_ami_secret := "1234";
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +020050 charstring mp_volte_ims_outbound_registration := "volte_ims";
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010051}
52
53type component test_CT {
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +020054 /* Manages all local VoIP users Asterisk is serving: */
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010055 var SIP_Emulation_CT vc_SIP;
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +020056 /* Manages the IMS server Asterisk connects to: */
57 var SIP_Emulation_CT vc_IMS;
58
Pau Espin Pedrolbcb4e822024-04-26 20:16:47 +020059 /* Connection towards Asterisk AMI iface: */
60 var AMI_Adapter_CT vc_AMI;
61 port AMI_Msg_PT AMI_CLIENT;
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +020062
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +020063 port Coord_PT COORD;
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +020064 port IMSCoord_PT IMS_COORD;
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010065}
66
Pau Espin Pedrol32167d82024-04-10 13:14:51 +020067const charstring broadcast_sip_extension := "0500";
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010068
Pau Espin Pedrol901cede2024-05-30 13:03:42 +020069/* TODO: need to find correct RES, CK, IK, values for:
70 * Response: "a19de225d030e6e0ec20f6de5f9dd80d"
71 * CNonce Value: "9a6460bcc3c84a3eac69455a93b67a77"
72 */
73const charstring c_auth_res := "a19de225d030e6e0";
74const charstring c_auth_ck := "9a6460bcc3c84a3eac69455a93b67a77";
75const charstring c_auth_ik := "5238297dfcca759bd05d48ff49bc63fa";
76
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +020077function f_init_ConnHdlrPars(integer idx := 1) runs on test_CT return SIPConnHdlrPars {
78 var template (value) CallPars cp := t_CallPars(mp_local_sip_host, 1234 + 2*idx);
79 var template (value) SIPConnHdlrPars pars := t_Pars(mp_local_sip_host,
80 mp_local_sip_port,
81 mp_remote_sip_host,
82 mp_remote_sip_port,
83 "0" & int2str(str2int(broadcast_sip_extension) + idx),
84 cp := cp);
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +020085 return valueof(pars);
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +010086}
87
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +020088function f_init_IMS_ConnHdlrPars(integer idx := 1) runs on test_CT return IMS_ConnHdlrPars {
89 var template (value) IMS_CallPars cp := t_IMS_CallPars(mp_local_sip_host, 1234 + 2*idx);
90 var template (value) IMS_ConnHdlrPars pars := t_IMS_Pars(mp_local_ims_host,
91 mp_local_ims_port,
Pau Espin Pedrolf46132e2024-06-04 17:11:59 +020092 mp_ims_domain,
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +020093 mp_ims_imsi,
94 cp := cp);
95 return valueof(pars);
96}
97
Pau Espin Pedrol54b614a2024-04-17 18:58:36 +020098/* Initialize connection towards Asterisk AMI */
99private function f_init_ami() runs on test_CT {
Pau Espin Pedrolbcb4e822024-04-26 20:16:47 +0200100 var charstring id := "Asterisk_Tests_AMI_EMU";
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +0200101 vc_AMI := AMI_Adapter_CT.create(id) alive;
Pau Espin Pedrolbcb4e822024-04-26 20:16:47 +0200102 connect(self:AMI_CLIENT, vc_AMI:CLIENT);
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +0200103
104 var AMI_Adapter_Parameters ami_pars := {
105 remote_host := mp_ami_remote_host,
106 remote_port := mp_ami_remote_port,
107 local_host := mp_ami_local_host,
108 local_port := mp_ami_local_port,
109 welcome_str := c_default_AMI_Adapter_pars.welcome_str
110 };
111 vc_AMI.start(f_AMI_Adapter_main(ami_pars));
Pau Espin Pedrolbcb4e822024-04-26 20:16:47 +0200112
Pau Espin Pedrolbcb4e822024-04-26 20:16:47 +0200113 f_ami_action_login(AMI_CLIENT, mp_ami_user, mp_ami_secret);
Pau Espin Pedrole98f4412024-05-17 19:33:46 +0200114
115 timer tReady;
116 tReady.start(10.0);
117 alt {
118 [] AMI_CLIENT.receive(tr_AMI_Event_FullyBooted);
119 [] as_ami_rx_ignore(AMI_CLIENT);
120 [] tReady.timeout {
121 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
122 log2str("AMI FullyBooted timeout: "));
123 }
124 }
Pau Espin Pedrol54b614a2024-04-17 18:58:36 +0200125}
126
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +0200127/* Local SIP UAs */
128private function f_init_sip_local() runs on test_CT {
129 var charstring id := "Asterisk_Tests_LOCAL_SIP_EMU";
130 f_init_sip(vc_SIP, id);
131}
132
133/* IMS Server connection */
134private function f_init_sip_ims() runs on test_CT {
135 var charstring id := "Asterisk_Tests_IMS_SIP_EMU";
136 f_init_sip(vc_IMS, id);
137}
138
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100139function f_init() runs on test_CT {
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +0200140 var charstring id;
141
Pau Espin Pedrol54b614a2024-04-17 18:58:36 +0200142 f_init_ami();
Pau Espin Pedrolac8a0542024-04-19 17:30:57 +0200143 f_init_sip_local();
144 f_init_sip_ims();
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100145 log("end of f_init");
146}
147
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +0200148function f_shutdown() runs on test_CT {
149 /* Tear down AMI Adapter to avoid it keep receiving data from Asterisk
150 * and sending it to us after we stopped, causing error (Broken Pipe): */
151 vc_AMI.stop;
152 vc_AMI.done;
153 log("end of ", testcasename());
154 setverdict(pass);
155}
156
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200157function f_start_handler(void_fn fn, SIPConnHdlrPars pars)
158runs on test_CT return SIPConnHdlr {
159 var SIPConnHdlr vc_conn;
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200160 var charstring id := testcasename() & "-ConnHdlr-" & pars.user;
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100161
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200162 vc_conn := SIPConnHdlr.create(id) alive;
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100163
164 connect(vc_conn:SIP, vc_SIP:CLIENT);
165 connect(vc_conn:SIP_PROC, vc_SIP:CLIENT_PROC);
166
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200167 connect(vc_conn:COORD, self:COORD);
168
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100169 vc_conn.start(f_handler_init(fn, id, pars));
170 return vc_conn;
171}
172
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200173function f_start_handler_IMS(ims_void_fn fn, IMS_ConnHdlrPars pars)
174runs on test_CT return IMS_ConnHdlr {
175 var IMS_ConnHdlr vc_conn;
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200176 var charstring id := testcasename() & "-IMS_ConnHdlr-" & pars.subscr.imsi;
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200177
178 vc_conn := IMS_ConnHdlr.create(id) alive;
179
180 connect(vc_conn:SIP, vc_IMS:CLIENT);
181 connect(vc_conn:SIP_PROC, vc_IMS:CLIENT_PROC);
182
183 connect(vc_conn:COORD, self:IMS_COORD);
184
185 vc_conn.start(f_ims_handler_init(fn, id, pars));
186 return vc_conn;
187}
188
Pau Espin Pedrol05eaa1a2024-04-02 12:56:26 +0200189/* Test SIP registration of local clients */
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200190private function f_TC_internal_registration(charstring id) runs on SIPConnHdlr {
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100191
192 f_SIP_register();
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100193 // f_SIP_deregister();
194 setverdict(pass);
195}
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100196testcase TC_internal_registration() runs on test_CT {
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200197 var SIPConnHdlrPars pars;
198 var SIPConnHdlr vc_conn;
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100199 f_init();
200 pars := f_init_ConnHdlrPars();
201 vc_conn := f_start_handler(refers(f_TC_internal_registration), pars);
202 vc_conn.done;
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +0200203 f_shutdown();
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100204}
205
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200206/* Successful SIP MO-MT Call between local clients: */
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200207private function f_TC_internal_call_mo(charstring id) runs on SIPConnHdlr {
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200208
209 f_SIP_register();
210 COORD.send(COORD_CMD_REGISTERED);
211
212 COORD.receive(COORD_CMD_START);
213 f_SIP_mo_call_setup();
214 COORD.send(COORD_CMD_CALL_ESTABLISHED);
215
216 COORD.receive(COORD_CMD_HANGUP);
217 f_SIP_do_call_hangup();
218
219 setverdict(pass);
220}
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200221private function f_TC_internal_call_mt(charstring id) runs on SIPConnHdlr {
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200222
223 f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.cp.called.addr)));
224
225 f_SIP_register();
226 COORD.send(COORD_CMD_REGISTERED);
227
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200228 if (g_pars.cp.mt.exp_cancel) {
229 as_SIP_mt_call_cancelled();
230 COORD.send(COORD_CMD_CALL_CANCELLED);
231 setverdict(pass);
232 return;
233 }
234
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200235 as_SIP_mt_call_accept();
236 COORD.send(COORD_CMD_CALL_ESTABLISHED);
237
238 /* Once MO hangs up, Asterisk updates us to point RTP to it: */
239 as_SIP_exp_call_update(g_pars.cp.sip_seq_nr + 1);
240 as_SIP_exp_call_hangup(g_pars.cp.sip_seq_nr + 1);
241
242 setverdict(pass);
243}
244testcase TC_internal_call_momt() runs on test_CT {
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200245 var SIPConnHdlrPars pars[2];
246 var SIPConnHdlr vc_conn[2];
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200247
248 f_init();
249
250 pars[0] := f_init_ConnHdlrPars(idx := 1);
251 pars[1] := f_init_ConnHdlrPars(idx := 2);
252
253 pars[0].cp.calling := pars[0].registrar_sip_record;
254 pars[0].cp.called := pars[1].registrar_sip_record;
255
256 pars[1].cp.calling := pars[0].registrar_sip_record;
257 pars[1].cp.called := pars[1].local_sip_record;
258
259 vc_conn[0] := f_start_handler(refers(f_TC_internal_call_mo), pars[0]);
260 vc_conn[1] := f_start_handler(refers(f_TC_internal_call_mt), pars[1]);
261
262 interleave {
263 [] COORD.receive(COORD_CMD_REGISTERED) from vc_conn[0];
264 [] COORD.receive(COORD_CMD_REGISTERED) from vc_conn[1];
265 }
266
267 COORD.send(COORD_CMD_START) to vc_conn[0];
268
269 interleave {
270 [] COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn[0];
271 [] COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn[1];
272 }
273
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200274 /* Call on-going */
275 f_sleep(1.0);
276
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200277 COORD.send(COORD_CMD_HANGUP) to vc_conn[0];
278
279
280 vc_conn[0].done;
281 vc_conn[1].done;
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +0200282 f_shutdown();
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200283}
284
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200285/* One of the users calls (INVITE) shared extension, which makes all other user
286 * equipments ring (INVITE). The first one to pick up the call (OK 200) gets the
287 * call established (ACK), others get a CANCEL event. */
288private function TC_internal_call_all_Nregistered(integer num_conns := 2) runs on test_CT {
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200289 var SIPConnHdlrList vc_conn_list := {};
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200290 const integer vc_conn_mo_idx := 0; /* Index of MO leg in vc_conn_list */
291 const integer vc_conn_mt_idx := 1; /* Index of MT leg in vc_conn_list, peer picking up first the call */
292 var SipAddr broadcast_sip_record;
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200293 var SIPConnHdlrPars pars_mo;
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200294
295 f_init();
296
297 broadcast_sip_record := valueof(ts_SipAddr(ts_HostPort(mp_local_sip_host),
298 ts_UserInfo(broadcast_sip_extension)));
299
300 for (var integer i := 0; i < num_conns; i := i + 1) {
Pau Espin Pedrolcaf028d2024-04-18 13:47:07 +0200301 var SIPConnHdlrPars pars;
302 var SIPConnHdlr vc_conn;
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200303 pars := f_init_ConnHdlrPars(idx := i + 1);
304 if (i == vc_conn_mo_idx) { /* MO */
305 pars.cp.calling := pars.registrar_sip_record;
306 pars.cp.called := broadcast_sip_record;
307 vc_conn := f_start_handler(refers(f_TC_internal_call_mo), pars);
308 pars_mo := pars;
309 } else { /* MT */
310 pars.cp.calling := pars_mo.registrar_sip_record;
311 pars.cp.called := pars.local_sip_record;
312 pars.cp.mt.wait_coord_cmd_pickup := true;
313 if (i != vc_conn_mt_idx) {
314 /* Only first MT picking up (OK 200 INVITE) will be ACKed, others CANCELed: */
315 pars.cp.mt.exp_cancel := true;
316 }
317 vc_conn := f_start_handler(refers(f_TC_internal_call_mt), pars);
318 }
319 vc_conn_list := vc_conn_list & { vc_conn };
320 }
321
322 /* Wait all users are registered: */
323 for (var integer i := 0; i < num_conns; i := i + 1) {
324 /* Note: "from vc_conn_list[i]" can't be used since they may arrive from components in any order: */
325 COORD.receive(COORD_CMD_REGISTERED);
326 }
327
328 /* Ask MO user to start the call: */
329 COORD.send(COORD_CMD_START) to vc_conn_list[vc_conn_mo_idx];
330
331 /* Make sure the desired MT is the one picking up first the call: */
332 COORD.send(COORD_CMD_PICKUP) to vc_conn_list[vc_conn_mt_idx];
333 interleave {
334 [] COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn_list[vc_conn_mo_idx];
335 [] COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn_list[vc_conn_mt_idx];
336 }
337
338 /* Pick up from other phone calls and expect CANCEL: */
339 for (var integer i := 0; i < num_conns; i := i + 1) {
340 if (i != vc_conn_mo_idx and i != vc_conn_mt_idx) {
341 COORD.send(COORD_CMD_PICKUP) to vc_conn_list[i];
342 COORD.receive(COORD_CMD_CALL_CANCELLED) from vc_conn_list[i];
343 }
344 }
345
346 /* Call on-going */
347 f_sleep(1.0);
348
349 COORD.send(COORD_CMD_HANGUP) to vc_conn_list[vc_conn_mo_idx];
350
351 for (var integer i := 0; i < num_conns; i := i + 1) {
352 vc_conn_list[i].done;
353 }
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +0200354 f_shutdown();
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200355}
356testcase TC_internal_call_all_2registered() runs on test_CT {
357 TC_internal_call_all_Nregistered(2);
358}
359testcase TC_internal_call_all_3registered() runs on test_CT {
360 TC_internal_call_all_Nregistered(3);
361}
362testcase TC_internal_call_all_4registered() runs on test_CT {
363 TC_internal_call_all_Nregistered(4);
364}
365
Pau Espin Pedrol05eaa1a2024-04-02 12:56:26 +0200366testcase TC_selftest() runs on test_CT {
Pau Espin Pedrol01f1df82024-05-08 16:55:55 +0200367 f_ami_selftest();
Pau Espin Pedrol05eaa1a2024-04-02 12:56:26 +0200368 f_sip_digest_selftest();
369 setverdict(pass);
370}
371
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200372private function f_AMI_IMS_register(IMS_ConnHdlrPars pars) runs on test_CT
373{
374 /* Give some time for IMS_ConnHdlr to register SIP expect. This could be done through IMS_COORD. */
375 f_sleep(1.0);
376 /* Clear events: */
377 AMI_CLIENT.clear;
378
379 /* Announce network information, this should usually happen when UE
380 * becomes attached to network and before IMS APN is set up: */
381 f_ami_action_PJSIPAccessNetworkInfo(AMI_CLIENT, mp_volte_ims_outbound_registration,
382 f_ami_gen_PJSIPAccessNetworkInfo_Info_EUTRAN(pars.subscr.uli_str));
383
384 /* Trigger registration: */
385 f_ami_action_PJSIPRegister(AMI_CLIENT, mp_volte_ims_outbound_registration);
386
387 var charstring rand_str := oct2str(pars.subscr.rand);
388 var charstring autn_str := oct2str(pars.subscr.autn);
389 AMI_CLIENT.receive(tr_AMI_Event_AuthRequest(mp_volte_ims_outbound_registration,
390 rand := pattern @nocase rand_str,
391 autn := pattern @nocase autn_str));
392
393 f_ami_action_AuthResponse_RES(AMI_CLIENT,
394 mp_volte_ims_outbound_registration,
395 c_auth_res, c_auth_ck, c_auth_ik);
396
397 AMI_CLIENT.receive(tr_AMI_Event_Registry(f_sip_SipAddr_to_str(pars.subscr.local_sip_record),
Pau Espin Pedrolf46132e2024-06-04 17:11:59 +0200398 "sip:" & mp_ims_domain,
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200399 "Registered"));
Pau Espin Pedrol586eec52024-06-04 19:07:33 +0200400}
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200401
Pau Espin Pedrol586eec52024-06-04 19:07:33 +0200402private function f_AMI_IMS_unregister(IMS_ConnHdlrPars pars) runs on test_CT
403{
404 f_ami_action_PJSIPUnregister(AMI_CLIENT, mp_volte_ims_outbound_registration);
405 AMI_CLIENT.receive(tr_AMI_Event_Registry(f_sip_SipAddr_to_str(pars.subscr.local_sip_record),
406 "sip:" & mp_ims_domain,
407 "Unregistered"));
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200408}
409
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200410/* Test SIP registration of local clients */
411private function f_TC_ims_registration(charstring id) runs on IMS_ConnHdlr {
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200412 f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.registrar_sip_record.addr)));
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200413 as_IMS_register();
Pau Espin Pedrol586eec52024-06-04 19:07:33 +0200414 as_IMS_unregister();
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200415 setverdict(pass);
416}
417testcase TC_ims_registration() runs on test_CT {
418 var IMS_ConnHdlrPars pars;
419 var IMS_ConnHdlr vc_conn;
420 f_init();
421 pars := f_init_IMS_ConnHdlrPars();
422 vc_conn := f_start_handler_IMS(refers(f_TC_ims_registration), pars);
423
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200424 f_AMI_IMS_register(pars);
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200425
Pau Espin Pedrol586eec52024-06-04 19:07:33 +0200426 /* Stay registered for one second */
427 f_sleep(1.0);
428
429 /* Trigger unregistration: */
430 f_AMI_IMS_unregister(pars);
431
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200432 vc_conn.done;
433 f_shutdown();
434}
435
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200436/* Test SIP registration of local clients */
437private function f_TC_ims_call_mo(charstring id) runs on IMS_ConnHdlr {
438 f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.registrar_sip_record.addr)));
439 if (ispresent(g_pars.subscr.cp.called)) {
440 f_create_sip_expect(valueof(ts_SipUrl_from_Addr_Union(g_pars.subscr.cp.called.addr)));
441 }
442 as_IMS_register();
443 setverdict(pass);
444 as_IMS_mo_call_accept();
445 setverdict(pass);
446 COORD.send(COORD_CMD_CALL_ESTABLISHED);
447 as_IMS_exp_call_hangup(g_pars.subscr.cp.sip_seq_nr + 1);
448 setverdict(pass);
449}
450testcase TC_ims_call_mo() runs on test_CT {
451 var SIPConnHdlrPars sip_pars;
452 var IMS_ConnHdlrPars ims_pars;
453 var SIPConnHdlr vc_conn_sip;
454 var IMS_ConnHdlr vc_conn_ims;
455 const charstring c_ext_msisdn := "90829";
456
457 f_init();
458
459 sip_pars := f_init_ConnHdlrPars(idx := 1);
460 ims_pars := f_init_IMS_ConnHdlrPars();
461
462 sip_pars.cp.calling := sip_pars.registrar_sip_record;
463 sip_pars.cp.called := valueof(ts_SipAddr(ts_HostPort(sip_pars.remote_sip_host),
464 ts_UserInfo(c_ext_msisdn)));
Pau Espin Pedrolf46132e2024-06-04 17:11:59 +0200465 ims_pars.subscr.cp.calling := valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200466 ts_UserInfo(ims_pars.subscr.msisdn)));
Pau Espin Pedrolf46132e2024-06-04 17:11:59 +0200467 ims_pars.subscr.cp.called := valueof(ts_SipAddr(ts_HostPort(ims_pars.realm),
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200468 ts_UserInfo(c_ext_msisdn)));
469
470 vc_conn_ims := f_start_handler_IMS(refers(f_TC_ims_call_mo), ims_pars);
471 vc_conn_sip := f_start_handler(refers(f_TC_internal_call_mo), sip_pars);
472
473 COORD.receive(COORD_CMD_REGISTERED) from vc_conn_sip;
474
475 f_AMI_IMS_register(ims_pars);
476
477 COORD.send(COORD_CMD_START) to vc_conn_sip;
478 COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn_sip;
479 IMS_COORD.receive(COORD_CMD_CALL_ESTABLISHED) from vc_conn_ims;
480
Pau Espin Pedrol586eec52024-06-04 19:07:33 +0200481 /* TODO: "Action: DedicatedBearerStatus" */
482
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200483 /* Call on-going */
484 f_sleep(1.0);
485
486 COORD.send(COORD_CMD_HANGUP) to vc_conn_sip;
487
488 vc_conn_sip.done;
489 vc_conn_ims.done;
490 f_shutdown();
491}
492
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100493control {
494 execute( TC_internal_registration() );
Pau Espin Pedrol7011bf42024-04-08 17:56:58 +0200495 execute( TC_internal_call_momt() );
Pau Espin Pedrol32167d82024-04-10 13:14:51 +0200496 execute( TC_internal_call_all_2registered() );
497 execute( TC_internal_call_all_3registered() );
498 execute( TC_internal_call_all_4registered() );
Pau Espin Pedrola2812ec2024-05-10 20:30:44 +0200499 execute( TC_ims_registration() );
Pau Espin Pedrol901cede2024-05-30 13:03:42 +0200500 execute( TC_ims_call_mo() );
Pau Espin Pedrol37ee0ed2024-03-28 21:17:12 +0100501}
502
503}