blob: f7273dc9767fc5f5b53b6883b712e8e868470962 [file] [log] [blame]
Harald Welte0db44132019-10-17 11:09:05 +02001module STP_Tests_IPA {
2
3/* Osmocom STP test suite in in TTCN-3
4 * (C) 2019 Harald Welte <laforge@gnumonks.org>
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
13friend module STP_Tests;
14
15import from General_Types all;
16import from Osmocom_Types all;
17import from IPL4asp_Types all;
18
19import from TELNETasp_PortType all;
20import from Osmocom_VTY_Functions all;
21
22import from SCCP_Types all;
23import from SCCP_Templates all;
24import from SCCPasp_Types all;
25import from SCCP_Emulation all;
26
27import from IPA_Emulation all;
28
29import from M3UA_Emulation all;
30import from M3UA_CodecPort all;
31import from MTP3asp_Types all;
32import from MTP3asp_PortType all;
33
34import from STP_Tests_Common all;
35
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010036private const integer NR_IPA := 4;
37
38type record of charstring AspNameArray;
Harald Welte0db44132019-10-17 11:09:05 +020039
40modulepar {
41 integer mp_stp_ipa_port := 5000;
42 integer mp_local_ipa_port := 20000;
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010043 AspNameArray mp_ipa_as_names := {"ipa-as-loadshare-sender",
44 "ipa-as-loadshare-receiver",
45 "ipa-as-loadshare-receiver",
46 "ipa-as-dynamic-asp"
47 };
Harald Welte0db44132019-10-17 11:09:05 +020048}
49
50type component IPA_CT extends Test_CT {
51 /* for IPA we use the IPA_Emulation and not directly IPA_CodecPort to avoid
52 * having to re-invent IPA CCM handling here */
53 port MTP3asp_PT IPA[NR_IPA];
54 var IPA_Emulation_CT vc_IPA[NR_IPA];
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010055 var IPA_CCM_Parameters g_ccm_pars[NR_IPA];
Harald Welte0db44132019-10-17 11:09:05 +020056}
57
58friend function f_IPA_send(integer idx, octetstring data) runs on IPA_CT {
59 var MTP3_Field_sio sio := { ni := '00'B, prio := '00'B, si := '0011'B };
60 IPA[idx].send(t_ASP_MTP3_TRANSFERreq(sio, 0, 0, 0, data));
61}
62
63friend function f_IPA_exp(integer idx, template (present) octetstring data) runs on IPA_CT {
Harald Welte0db44132019-10-17 11:09:05 +020064 alt {
65 [] IPA[idx].receive(t_ASP_MTP3_TRANSFERind(?, ?, ?, ?, data)) {
66 setverdict(pass);
67 }
68 [] IPA[idx].receive {
69 setverdict(fail, "Received unexpected data on IPA port while waiting for ", data);
70 mtc.stop;
71 }
72 }
73}
74
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010075private function f_rnd_ipa_len() runs on IPA_CT return integer {
76 var integer rnd_len := f_rnd_int(100);
77 /* We need at least 1 byte of data, othewise osmocom IPA stack will discard and close the socket */
78 if (rnd_len == 0) {
79 rnd_len := 1;
80 }
81 return rnd_len;
82}
83
84/* Test if traffic is routed from idx_tx to idx_rx */
85private function f_test_traffic(integer idx_tx, integer idx_rx)
86runs on IPA_CT {
87 var octetstring data := f_rnd_octstring(f_rnd_ipa_len());
88 f_IPA_send(idx_tx, data);
89 f_IPA_exp(idx_rx, data);
90}
91
Harald Welte0db44132019-10-17 11:09:05 +020092friend function f_init_ipa() runs on IPA_CT {
93 var integer i;
94
95 f_init_common();
96
97 for (i := 0; i < NR_IPA; i:=i+1) {
98 vc_IPA[i] := IPA_Emulation_CT.create("IPA" & int2str(i));
99 map(vc_IPA[i]:IPA_PORT, system:IPA_CODEC_PT);
100 connect(self:IPA[i], vc_IPA[i]:MTP3_SP_PORT);
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100101 g_ccm_pars[i] := c_IPA_default_ccm_pars;
102 g_ccm_pars[i].name := mp_ipa_as_names[i];
Harald Welte0db44132019-10-17 11:09:05 +0200103 }
104}
105
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100106friend function f_connect_ipa(integer idx) runs on IPA_CT {
107 vc_IPA[idx].start(IPA_Emulation.main_client(mp_stp_ip, mp_stp_ipa_port, mp_local_ip,
108 mp_local_ipa_port+idx, g_ccm_pars[idx]));
109}
Harald Welte0db44132019-10-17 11:09:05 +0200110
111
112/* "accept-asp-connections pre-configured" and client from unknown source */
113testcase TC_unknown_client_nodynamic() runs on IPA_CT {
114 f_init_common();
115 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
116 "accept-asp-connections pre-configured");
117 f_init_ipa();
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100118 /* Add 100 to the port since we know that port is not configured in any
119 ASP only up to NR_IPA are configured. */
120 vc_IPA[0].start(IPA_Emulation.main_client(mp_stp_ip, mp_stp_ipa_port, mp_local_ip,
121 mp_local_ipa_port+100, g_ccm_pars[0]));
Harald Welte0db44132019-10-17 11:09:05 +0200122 f_sleep(1.0);
123 if (IPA[0].checkstate("Connected")) {
124 setverdict(fail, "Expected IPA port to be disconnected");
125 } else {
126 setverdict(pass);
127 }
128 /* switch back to default */
129 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
130 "accept-asp-connections dynamic-permitted");
131}
132
133/* "accept-asp-connections pre-configured" and client from known source */
134testcase TC_known_client_nodynamic() runs on IPA_CT {
135 f_init_common();
136 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
137 "accept-asp-connections pre-configured");
Harald Welte0db44132019-10-17 11:09:05 +0200138 f_init_ipa();
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100139 f_connect_ipa(0);
Harald Welte0db44132019-10-17 11:09:05 +0200140 f_sleep(1.0);
141 if (not IPA[0].checkstate("Connected")) {
142 setverdict(fail, "Expected IPA port to be connected");
143 } else {
144 setverdict(pass);
145 }
146 /* switch back to default */
147 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
148 "accept-asp-connections dynamic-permitted");
Harald Welte0db44132019-10-17 11:09:05 +0200149}
150
151
152/* "accept-asp-connections dynamic-permitted" and client from unknown source */
153testcase TC_unknown_client_dynamic() runs on IPA_CT {
154 f_init_common();
155 f_init_ipa();
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100156 /* Add 100 to the port since we know that port is not configured in any
157 ASP only up to NR_IPA are configured. */
158 vc_IPA[0].start(IPA_Emulation.main_client(mp_stp_ip, mp_stp_ipa_port, mp_local_ip,
159 mp_local_ipa_port+100, g_ccm_pars[0]));
Harald Welte0db44132019-10-17 11:09:05 +0200160 f_sleep(1.0);
161 if (not IPA[0].checkstate("Connected")) {
162 setverdict(fail, "Expected IPA port to be connected");
163 } else {
164 setverdict(pass);
165 }
166}
167
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100168private altstep as_count_rx(integer idx, template (present) octetstring exp, inout integer counter)
169runs on IPA_CT {
170 [] IPA[idx].receive(t_ASP_MTP3_TRANSFERind(?, ?, ?, ?, exp)) {
171 counter := counter + 1;
172 }
173}
174
175/* test "traffic-mode load-share" behavior */
176testcase TC_tmt_loadshare() runs on IPA_CT {
177 var integer i;
178
179 f_init_ipa();
180
181 /* bring up the 'sender' side (single ASP in AS) */
182 f_connect_ipa(0);
183 /* activate the first 'receiver' side ASP */
184 f_connect_ipa(1);
185 f_sleep(1.0);
186
187 /* verify traffic is routed from sender to [sole] receiver */
188 for (i := 0; i < 10; i := i+1) {
189 f_test_traffic(0, 1);
190 }
191
192 /* activate the second 'receiver' side ASP */
193 f_connect_ipa(2);
194 f_sleep(1.0);
195
196 /* verify traffic is routed from sender to new receiver */
197 const integer iter_per_asp := 5;
198 var integer num_rx[3] := { 0, 0, 0 };
199 for (i := 0; i < 2*iter_per_asp; i := i+1) {
200 var octetstring data := f_rnd_octstring(f_rnd_ipa_len());
201 f_IPA_send(0, data);
202 alt {
203 [] as_count_rx(1, data, num_rx[1])
204 [] as_count_rx(2, data, num_rx[2])
205 }
206 }
207 /* FIXME: check for extraneous messages? */
208 for (i := 1; i <= 2; i := i+1) {
209 if (num_rx[i] != iter_per_asp) {
210 setverdict(fail, "Received ", num_rx[i], " out of expected ", iter_per_asp,
211 "DATA messages at IPA port ", i);
212 }
213 }
214 setverdict(pass);
215}
216
Harald Welte0db44132019-10-17 11:09:05 +0200217
218control {
219 execute( TC_unknown_client_nodynamic() );
220 execute( TC_known_client_nodynamic() );
221 execute( TC_unknown_client_dynamic() );
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100222 execute( TC_tmt_loadshare() );
Harald Welte0db44132019-10-17 11:09:05 +0200223}
224
225
226}