blob: 5d9754efee1998fb426a4b6819ed00846c6d1f65 [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
14import from General_Types all;
15import from Osmocom_Types all;
16import from Native_Functions all;
17import from Misc_Helpers all;
18
19import from SDP_Types all;
20import from SDP_Templates all;
21
22import from SIP_Emulation all;
23import from SIPmsg_Types all;
24import from SIP_Templates all;
25
26modulepar {
27 charstring mp_local_sip_host := "127.0.0.2";
28 integer mp_local_sip_port := 5060;
29 charstring mp_remote_sip_host := "127.0.0.1";
30 integer mp_remote_sip_port := 5060;
31}
32
33type component test_CT {
34 var SIP_Emulation_CT vc_SIP;
35}
36
37type component ConnHdlr extends SIP_ConnHdlr {
38 var ConnHdlrPars g_pars;
39 timer g_Tguard;
40 var PDU_SIP_Request g_rx_sip_req;
41 var PDU_SIP_Response g_rx_sip_resp;
42}
43
44type record ConnHdlrPars {
45 float t_guard,
46 charstring user,
47 SipUrl registrar_sip_url,
48 SipAddr registrar_sip_record,
49 CallidString registrar_sip_call_id,
50 Via registrar_via,
51 integer registrar_sip_seq_nr,
52 SipAddr sip_url_ext,
53 Contact local_contact,
54 CallPars cp optional
55}
56
57template (value) ConnHdlrPars t_Pars(charstring user,
58 charstring displayname := "\"Anonymous\"") := {
59 t_guard := 30.0,
60 user := user,
61 registrar_sip_url := valueof(ts_SipUrlHost(mp_remote_sip_host)),
62 registrar_sip_record := ts_SipAddr(ts_HostPort(mp_remote_sip_host),
63 ts_UserInfo(user),
64 displayName := displayname),
65 registrar_sip_call_id := hex2str(f_rnd_hexstring(15)) & "@" & mp_local_sip_host,
66 registrar_via := ts_Via_from(ts_HostPort(mp_local_sip_host, mp_local_sip_port)),
67 registrar_sip_seq_nr := f_sip_rand_seq_nr(),
68 sip_url_ext := ts_SipAddr(ts_HostPort(mp_local_sip_host, mp_local_sip_port),
69 ts_UserInfo(user)),
70 local_contact := valueof(ts_Contact({
71 ts_ContactAddress(
72 ts_Addr_Union_SipUrl(ts_SipUrl(ts_HostPort(
73 mp_local_sip_host,
74 mp_local_sip_port),
75 ts_UserInfo(user))),
76 omit)
77 })),
78 cp := omit
79}
80
81function f_init_ConnHdlrPars(integer idx := 1) runs on test_CT return ConnHdlrPars {
82 var ConnHdlrPars pars := valueof(t_Pars(int2str(500 + idx)));
83 return pars;
84}
85
86type record CallPars {
87 boolean is_mo,
88 charstring calling,
89 charstring called,
90
91 CallParsComputed comp optional,
92
93 charstring sip_rtp_addr,
94 uint16_t sip_rtp_port,
95 charstring cn_rtp_addr,
96 uint16_t cn_rtp_port
97}
98
99type record CallParsComputed {
100 CallidString sip_call_id,
101 charstring sip_body,
102 integer sip_seq_nr
103}
104
105private template (value) CallPars t_CallPars(boolean is_mo) := {
106 is_mo := is_mo,
107 calling := "12345",
108 called := "98766",
109 comp := {
110 sip_call_id := hex2str(f_rnd_hexstring(15)),
111 sip_body := "",
112 sip_seq_nr := f_sip_rand_seq_nr()
113 },
114 sip_rtp_addr := "1.2.3.4",
115 sip_rtp_port := 1234,
116 cn_rtp_addr := "5.6.7.8",
117 cn_rtp_port := 5678
118}
119
120function f_init() runs on test_CT {
121 f_init_sip(vc_SIP, "Asterisk_Test");
122 log("end of f_init");
123}
124
125type function void_fn(charstring id) runs on ConnHdlr;
126
127function f_start_handler(void_fn fn, ConnHdlrPars pars)
128runs on test_CT return ConnHdlr {
129 var ConnHdlr vc_conn;
130 var charstring id := testcasename();
131
132 vc_conn := ConnHdlr.create(id);
133
134 connect(vc_conn:SIP, vc_SIP:CLIENT);
135 connect(vc_conn:SIP_PROC, vc_SIP:CLIENT_PROC);
136
137 vc_conn.start(f_handler_init(fn, id, pars));
138 return vc_conn;
139}
140
141private altstep as_Tguard() runs on ConnHdlr {
142 [] g_Tguard.timeout {
143 setverdict(fail, "Tguard timeout");
144 mtc.stop;
145 }
146}
147
148private function f_handler_init(void_fn fn, charstring id, ConnHdlrPars pars)
149runs on ConnHdlr {
150 g_pars := pars;
151 g_Tguard.start(pars.t_guard);
152 activate(as_Tguard());
153
154 // Make sure the UA is deregistered before starting the test:
155 // sends REGISTER with Contact = "*" and Expires = 0
156 //f_SIP_deregister();
157
158 /* call the user-supied test case function */
159 fn.apply(id);
160}
161
162altstep as_SIP_expect_req(template PDU_SIP_Request sip_expect) runs on ConnHdlr
163{
164 [] SIP.receive(sip_expect) -> value g_rx_sip_req;
165 [] SIP.receive {
166 log("FAIL: expected SIP message ", sip_expect);
167 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received unexpected SIP message");
168 }
169}
170
171altstep as_SIP_expect_resp(template PDU_SIP_Response sip_expect) runs on ConnHdlr
172{
173 [] SIP.receive(sip_expect) -> value g_rx_sip_resp;
174 [] SIP.receive {
175 log("FAIL: expected SIP message ", sip_expect);
176 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received unexpected SIP message");
177 }
178}
179
180private function f_tr_Via_response(Via via_req) return template (present) Via {
181 template (present) SemicolonParam_List via_resp_params := ?;
182
183 /*via_resp_params := {
184 { id := "rport", paramValue := int2str(mp_remote_sip_port) },
185 { id := "received", paramValue := mp_remote_sip_host }
186 }; */
187 return tr_Via_from(via_req.viaBody[0].sentBy,
188 via_resp_params);
189}
190
191function f_SIP_register() runs on ConnHdlr return PDU_SIP_Response
192{
193 var template (present) PDU_SIP_Response exp;
194
195 SIP.send(ts_SIP_REGISTER(g_pars.registrar_sip_url,
196 g_pars.registrar_sip_call_id,
197 g_pars.registrar_sip_record,
198 g_pars.registrar_sip_record,
199 g_pars.registrar_via,
200 g_pars.registrar_sip_seq_nr,
201 g_pars.local_contact,
202 ts_Expires("7200")));
203
204 exp := tr_SIP_Response_REGISTER_Unauthorized(
205 g_pars.registrar_sip_call_id,
206 g_pars.registrar_sip_record,
207 g_pars.registrar_sip_record,
208 f_tr_Via_response(g_pars.registrar_via),
209 *,
210 g_pars.registrar_sip_seq_nr);
211 as_SIP_expect_resp(exp);
212
213 /* Do the registering after calculating the md5 hash, etc. */
214 return g_rx_sip_resp;
215}
216
217/* Successful MO Call, which is subsequently released by SIP side */
218private function f_TC_internal_registration(charstring id) runs on ConnHdlr {
219
220 f_SIP_register();
221 /* now call is fully established */
222 f_sleep(2.0);
223 // f_SIP_deregister();
224 setverdict(pass);
225}
226
227testcase TC_internal_registration() runs on test_CT {
228 var ConnHdlrPars pars;
229 var ConnHdlr vc_conn;
230 f_init();
231 pars := f_init_ConnHdlrPars();
232 vc_conn := f_start_handler(refers(f_TC_internal_registration), pars);
233 vc_conn.done;
234}
235
236control {
237 execute( TC_internal_registration() );
238}
239
240}