blob: 7a668dde0434012a275f2e469155b4dbe5ebd000 [file] [log] [blame]
Pau Espin Pedrolb54acca2021-11-22 20:35:44 +01001module HNB_Tests {
2
3/* Integration Tests for OsmoHNodeB
4 * (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
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 * This test suite tests OsmoHNodB while emulating both multiple UE as
13 * well as the HNBGW. See README for more details.
14 *
15 * There are test cases that run in so-called 'handler mode' and test cases
16 * that run directly on top of the BSSAP and RSL CodecPorts. The "handler mode"
17 * tests abstract the multiplexing/demultiplexing of multiple SCCP connections
18 * and/or RSL channels and are hence suitable for higher-level test cases, while
19 * the "raw" tests directly on top of the CodecPorts are more suitable for lower-
20 * level testing.
21 */
22
23import from Misc_Helpers all;
24import from General_Types all;
25import from Osmocom_Types all;
26import from IPL4asp_Types all;
27
28import from Osmocom_CTRL_Functions all;
29import from Osmocom_CTRL_Types all;
30import from Osmocom_CTRL_Adapter all;
31
32import from StatsD_Types all;
33import from StatsD_CodecPort all;
34import from StatsD_CodecPort_CtrlFunct all;
35import from StatsD_Checker all;
36
37import from Osmocom_VTY_Functions all;
38import from TELNETasp_PortType all;
39
40import from HNBAP_Templates all;
41
42import from HNBGW_ConnectionHandler all;
43import from Iuh_Emulation all;
44
45modulepar {
46 /* IP address at which the HNodeB can be reached */
47 charstring mp_hnodeb_ip := "127.0.0.1";
48
49 /* IP address at which the test binds */
50 charstring mp_hnbgw_iuh_ip := "127.0.0.1";
51 integer mp_hnbgw_iuh_port := 29169;
52}
53
54type component test_CT extends CTRL_Adapter_CT {
55 port TELNETasp_PT HNBVTY;
56
57 /* global test case guard timer (actual timeout value is set in f_init()) */
58 timer T_guard := 30.0;
59}
60
61/* global altstep for global guard timer; */
62altstep as_Tguard() runs on test_CT {
63 [] T_guard.timeout {
64 setverdict(fail, "Timeout of T_guard");
65 mtc.stop;
66 }
67}
68
69friend function f_logp(TELNETasp_PT pt, charstring log_msg)
70{
71 // log on TTCN3 log output
72 log(log_msg);
73 // log in stderr log
74 f_vty_transceive(pt, "logp lglobal notice TTCN3 f_logp(): " & log_msg);
75}
76
77function f_init_vty(charstring id := "foo") runs on test_CT {
78 if (HNBVTY.checkstate("Mapped")) {
79 /* skip initialization if already executed once */
80 return;
81 }
82 map(self:HNBVTY, system:HNBVTY);
83 f_vty_set_prompts(HNBVTY);
84 f_vty_transceive(HNBVTY, "enable");
85}
86/* global initialization function */
87function f_init(float guard_timeout := 30.0) runs on test_CT {
88 var integer bssap_idx;
89
90 T_guard.start(guard_timeout);
91 activate(as_Tguard());
92
93 f_init_vty("VirtHNBGW");
94
95 /* TODO: Wait for Iuh connection to be established */
96}
97
98friend function f_shutdown_helper() runs on test_CT {
99 all component.stop;
100 setverdict(pass);
101 mtc.stop;
102}
103
104friend function f_gen_test_hdlr_pars() return TestHdlrParams {
105
106 var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
107 pars.hnodeb_addr := mp_hnodeb_ip;
108 pars.hnbgw_addr := mp_hnbgw_iuh_ip;
109 pars.hnbgw_port := mp_hnbgw_iuh_port;
110 return pars;
111}
112
113type function void_fn(charstring id) runs on HNBGW_ConnHdlr;
114
115/* helper function to create and connect a HNBGW_ConnHdlr component */
116private function f_connect_handler(inout HNBGW_ConnHdlr vc_conn, integer bssap_idx := 0) runs on test_CT {
117 /*connect(vc_conn:RAN, g_bssap[bssap_idx].vc_RAN:PROC);
118 connect(vc_conn:MGCP_PROC, vc_MGCP:MGCP_PROC);
119 connect(vc_conn:RSL, bts[0].rsl.vc_RSL:CLIENT_PT);
120 connect(vc_conn:RSL_PROC, bts[0].rsl.vc_RSL:RSL_PROC);
121 if (isvalue(bts[1])) {
122 connect(vc_conn:RSL1, bts[1].rsl.vc_RSL:CLIENT_PT);
123 connect(vc_conn:RSL1_PROC, bts[1].rsl.vc_RSL:RSL_PROC);
124 }
125 if (isvalue(bts[2])) {
126 connect(vc_conn:RSL2, bts[2].rsl.vc_RSL:CLIENT_PT);
127 connect(vc_conn:RSL2_PROC, bts[2].rsl.vc_RSL:RSL_PROC);
128 }
129 connect(vc_conn:BSSAP, g_bssap[bssap_idx].vc_RAN:CLIENT);
130 if (mp_enable_lcs_tests) {
131 connect(vc_conn:BSSAP_LE, g_bssap_le.vc_BSSAP_LE:CLIENT);
132 connect(vc_conn:BSSAP_LE_PROC, g_bssap_le.vc_BSSAP_LE:PROC);
133 }
134 connect(vc_conn:MGCP, vc_MGCP:MGCP_CLIENT);
135 connect(vc_conn:MGCP_MULTI, vc_MGCP:MGCP_CLIENT_MULTI);
136 connect(vc_conn:STATSD_PROC, vc_STATSD:STATSD_PROC);*/
137}
138
139function f_start_handler_create(TestHdlrParams pars)
140runs on test_CT return HNBGW_ConnHdlr {
141 var charstring id := testcasename();
142 var HNBGW_ConnHdlr vc_conn;
143 vc_conn := HNBGW_ConnHdlr.create(id);
144 f_connect_handler(vc_conn);
145 return vc_conn;
146}
147
148function f_start_handler_run(HNBGW_ConnHdlr vc_conn, void_fn fn, TestHdlrParams pars)
149runs on test_CT return HNBGW_ConnHdlr {
150 var charstring id := testcasename();
151 /* Emit a marker to appear in the SUT's own logging output */
152 f_logp(HNBVTY, id & "() start");
153 vc_conn.start(f_handler_init(fn, id, pars));
154 return vc_conn;
155}
156
157function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars_tmpl := omit)
158runs on test_CT return HNBGW_ConnHdlr {
159 var TestHdlrParams pars;
160 if (isvalue(pars)) {
161 pars := valueof(pars_tmpl);
162 } else {
163 pars := valueof(f_gen_test_hdlr_pars());
164 }
165 return f_start_handler_run(f_start_handler_create(pars), fn, pars);
166}
167
168/* first function inside ConnHdlr component; sets g_pars + starts function */
169private function f_handler_init(void_fn fn, charstring id, TestHdlrParams pars)
170runs on HNBGW_ConnHdlr {
171 f_HNBGW_ConnHdlr_init(pars);
172 HNBAP.receive(IUHEM_Event:{up_down:=IUHEM_EVENT_UP}); /* Wait for HNB to connect to us */
173 fn.apply(id);
174}
175
176private function f_tc_hnb_register_request(charstring id) runs on HNBGW_ConnHdlr {
177 f_handle_hnbap_hnb_register_req();
178 f_sleep(1.0);
179}
180testcase TC_hnb_register_request_accept() runs on test_CT {
181 var HNBGW_ConnHdlr vc_conn;
182
183 f_init();
184 vc_conn := f_start_handler(refers(f_tc_hnb_register_request));
185 vc_conn.done;
186 f_shutdown_helper();
187}
188
189private function f_tc_hnb_register_reject(charstring id) runs on HNBGW_ConnHdlr {
190 HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),
191 g_pars.plmnid,
192 int2bit(g_pars.cell_identity, 28),
193 int2oct(g_pars.lac, 2),
194 int2oct(g_pars.rac, 1),
195 int2oct(g_pars.sac, 2)
196 ));
197 HNBAP.send(ts_HNBAP_HNBRegisterReject(ts_HnbapCause(overload)));
198 f_sleep(1.0);
199}
200testcase TC_hnb_register_request_reject() runs on test_CT {
201 var HNBGW_ConnHdlr vc_conn;
202
203 f_init();
204 vc_conn := f_start_handler(refers(f_tc_hnb_register_reject));
205 vc_conn.done;
206 f_shutdown_helper();
207}
208
209control {
210 execute( TC_hnb_register_request_accept() );
211 execute( TC_hnb_register_request_reject() );
212}
213
214}