blob: 00c66c33bee544131b3f7193750e2ce947590e9f [file] [log] [blame]
Harald Welteed0c1562019-02-07 20:26:29 +01001module BTS_Tests_OML {
2
3/* Integration Tests for OsmoBTS A-bis OML (Organization & Maintenance Link)
4 *
5 * (C) 2019 by Harald Welte <laforge@gnumonks.org>
6 * All rights reserved.
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 AbisOML_Types all;
17import from IPA_Emulation all;
18import from IPA_Types all;
19
20const integer NUM_TRX := 8;
21
22type record of uint16_t ArfcnList;
23
24modulepar {
25 charstring mp_oml_ip := "127.0.0.1";
26 integer mp_oml_port := 3002;
27 ArfcnList mp_arfcn := { 100, 101, 102, 103, 104, 105, 106, 107 };
28 OML_FOM_InterfLevBoundaries mp_interf_bound := { 85, 91, 97, 103, 109, 115 };
29 OML_FOM_T200 mp_t200 := {
30 sdcch_5ms := 30,
31 facch_f_5ms := 36,
32 facch_h_5ms := 36,
33 sacch_tch_sapi0_10ms := 168,
34 sacch_sdcch_10ms := 52,
35 sdcch_sapi3_5ms := 33,
36 sacch_rch_sapi3_10ms := 168
37 };
38 uint8_t mp_max_ta := 63;
39 uint8_t mp_load_threshold := 10;
40 uint8_t mp_load_ind_period := 1;
41 uint8_t mp_rach_b_thresh := 90;
42 uint16_t mp_loadavg_slots := 1000;
43 uint8_t mp_air_timer := 100;
44 uint8_t mp_ny1 := 10;
45 uint8_t mp_bsic := 63;
46};
47
48/* BSC side OML component */
49type component BSC_OML_CT {
50 /* IPA emulation component underneath OML */
51 var IPA_Emulation_CT vc_IPA_OML;
52 /* Port for OML */
53 port IPA_OML_PT OML;
54 var uint8_t g_bts_nr := 0;
Pau Espin Pedrol6924ef72021-06-09 16:19:26 +020055 /* Port for Abis/Osmo/PCU */
56 port IPA_OSMO_PCU_PT IPA_OSMO_PCU;
Harald Welteed0c1562019-02-07 20:26:29 +010057
58 /* global test case guard timer */
59 timer T_oml_guard := 60.0;
60};
61
62private altstep as_Tguard() runs on BSC_OML_CT {
63 [] T_oml_guard.timeout {
64 setverdict(fail, "Timeout of T_guard");
65 mtc.stop;
66 }
67}
68
69private altstep as_SwAct() runs on BSC_OML_CT {
70 var OML_PDU rx;
71 [] OML.receive(tr_OML_SwActReq(?, ?, ?, ?)) -> value rx {
72 var OML_FOM_ObjectClass obj_class := rx.u.fom.hdr.obj_class;
73 var OML_FOM_ObjectInstance obj_inst := rx.u.fom.hdr.obj_inst;
74
75 /* acknowledge the activate request */
76 OML.send(f_OML_make_ack(rx));
77 var octetstring file_id := ''O;
78 var octetstring sw_desc := ''O;
79
80 /* Request activation of software and check for ACK */
81 OML.send(ts_OML_ActivateSw(obj_class, obj_inst, file_id, sw_desc));
82 interleave {
83 [] OML.receive(tr_OML_ActivateSwACK(obj_class, obj_inst, file_id, sw_desc));
84 [] OML.receive(tr_OML_SwActivatedRep(obj_class, obj_inst));
85 }
86 repeat;
87 }
88}
89
90private altstep as_IPA_evt() runs on BSC_OML_CT {
91 var ASP_IPA_Event evt;
92 [] OML.receive(ASP_IPA_Event:?) -> value evt {
93 log("Ignoring ", evt);
94 repeat;
95 }
96}
97
98function f_init_oml(charstring id) runs on BSC_OML_CT {
99 vc_IPA_OML := IPA_Emulation_CT.create(id & "-OML-IPA");
100 map(vc_IPA_OML:IPA_PORT, system:IPA_CODEC_PT);
101 connect(vc_IPA_OML:IPA_OML_PORT, self:OML);
Pau Espin Pedrol6924ef72021-06-09 16:19:26 +0200102 connect(vc_IPA_OML:IPA_OSMO_PCU_PORT, self:IPA_OSMO_PCU);
Harald Welteed0c1562019-02-07 20:26:29 +0100103 vc_IPA_OML.start(IPA_Emulation.main_server(mp_oml_ip, mp_oml_port));
104
105 T_oml_guard.start;
106 activate(as_Tguard());
107
Vadim Yanitskiy61564be2020-05-18 20:44:14 +0700108 OML.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP));
109 //OML.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK));
Harald Welteed0c1562019-02-07 20:26:29 +0100110
111 activate(as_SwAct());
112 activate(as_IPA_evt());
113}
114
115
116/* Perform an "OPSTART" procedure with the speciifed MO" */
117private function f_oml_opstart(template (value) OML_FOM_ObjectClass obj_class,
118 template (value) OML_FOM_ObjectInstance obj_inst,
Pau Espin Pedrold0ec1492020-10-16 14:54:14 +0200119 boolean exp_fail := false,
120 template OML_FOM_OperationalState exp_stchg := ?)
Harald Welteed0c1562019-02-07 20:26:29 +0100121runs on BSC_OML_CT {
Pau Espin Pedrold0ec1492020-10-16 14:54:14 +0200122 var boolean check_stchg := not istemplatekind(exp_stchg, "?");
123 var boolean ack_received := false;
124 var boolean stchg_received := not check_stchg;
125
Harald Welteed0c1562019-02-07 20:26:29 +0100126 OML.send(ts_OML_Opstart(obj_class, obj_inst));
Pau Espin Pedrold0ec1492020-10-16 14:54:14 +0200127
Harald Welteed0c1562019-02-07 20:26:29 +0100128 alt {
Pau Espin Pedrold0ec1492020-10-16 14:54:14 +0200129 [check_stchg] OML.receive(tr_OML_StateChgEvtRep(obj_class, obj_inst,
130 exp_stchg, NM_AVSTATE_OK)) {
131 stchg_received := true;
132 if (not ack_received) {
133 repeat;
134 }
135 setverdict(pass);
136 }
137 [check_stchg] OML.receive(tr_OML_StateChgEvtRep(obj_class, obj_inst,
138 ?, NM_AVSTATE_OK)) {
139 setverdict(fail, "Unexpected State Change for ", obj_class, " ", obj_inst);
140 }
Harald Welteed0c1562019-02-07 20:26:29 +0100141 [not exp_fail] OML.receive(tr_OML_OpstartACK(obj_class, obj_inst)) {
Pau Espin Pedrold0ec1492020-10-16 14:54:14 +0200142 ack_received := true;
143 if (not stchg_received) {
144 repeat;
145 }
Harald Welteed0c1562019-02-07 20:26:29 +0100146 setverdict(pass);
147 }
148 [not exp_fail] OML.receive(tr_OML_OpstartNACK(obj_class, obj_inst)) {
149 setverdict(fail, "Unexpected OPSTART NACK for ", obj_class, " ", obj_inst);
150 }
151 [exp_fail] OML.receive(tr_OML_OpstartACK(obj_class, obj_inst)) {
152 setverdict(fail, "Unexpected OPSTART ACK for ", obj_class, " ", obj_inst);
153 }
154 [exp_fail] OML.receive(tr_OML_OpstartNACK(obj_class, obj_inst)) {
155 setverdict(pass);
156 }
157 [] OML.receive { repeat; }
158 }
159}
160
161/* Perform a "CHANGE ADMINISTRATIVE STATE" procedure with the speciifed MO" */
162private function f_oml_chg_adm_st(template (value) OML_FOM_ObjectClass obj_class,
163 template (value) OML_FOM_ObjectInstance obj_inst,
164 template (value) OML_FOM_AdministrativeState adm_st,
165 boolean exp_fail := false)
166runs on BSC_OML_CT {
167 OML.send(ts_OML_ChangeAdmState(obj_class, obj_inst, adm_st));
168 alt {
169 [not exp_fail] OML.receive(tr_OML_ChangeAdmStateACK(obj_class, obj_inst, adm_st)) {
170 setverdict(pass);
171 }
172 [not exp_fail] OML.receive(tr_OML_ChangeAdmStateNACK(obj_class, obj_inst)) {
173 setverdict(fail, "Unexpected CHANGE ADM STATE NACK for ", obj_class, " ", obj_inst);
174 }
175 [exp_fail] OML.receive(tr_OML_ChangeAdmStateACK(obj_class, obj_inst, adm_st)) {
176 setverdict(fail, "Unexpected CHANGE ADM STATE ACK for ", obj_class, " ", obj_inst);
177 }
178 [exp_fail] OML.receive(tr_OML_ChangeAdmStateNACK(obj_class, obj_inst)) {
179 setverdict(pass);
180 }
181 [] OML.receive { repeat; }
182 }
183}
184
185/* Perform a "SET RADIO CARRIER ATTRIBUTES" procedure with the BTS */
186private function f_oml_radio_attr(uint8_t trx_nr)
187runs on BSC_OML_CT {
188 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, trx_nr, 255));
189 var OML_PDU cmd := valueof(ts_OML_SetRadioAttr(obj_inst, 0, {mp_arfcn[trx_nr]}));
190 var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
191 var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
192 var OML_PDU rx;
193
194 OML.send(cmd);
195 alt {
196 [] OML.receive(exp_ack) -> value rx {
197 setverdict(pass);
198 }
199 [] OML.receive(exp_nack) -> value rx {
200 setverdict(fail, "SET RADIO CARRIER ATTRIBUTES NACK ", exp_nack);
201 }
202 [] OML.receive(tr_OML_MsgType(NM_MT_SET_RADIO_ATTR_ACK, NM_OC_RADIO_CARRIER, obj_inst, omit)) {
203 setverdict(fail, "SET RADIO CARRIER ATTRIBUTES ACK without IEs");
204 }
205 [] OML.receive { repeat; }
206 }
207}
208
209/* Perform a "SET CHANNEL ATTRIBUTES" procedure with the BTS */
210private function f_oml_ts_attr(uint8_t trx_nr, uint8_t ts_nr)
211runs on BSC_OML_CT {
212 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, trx_nr, ts_nr));
213 var OML_PDU cmd := valueof(ts_OML_SetChanAttr(obj_inst, NM_CHANC_TCHFull, tsc := 7));
214 var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
215 var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
216 var OML_PDU rx;
217
218 OML.send(cmd);
219 alt {
220 [] OML.receive(exp_ack) -> value rx {
221 setverdict(pass);
222 }
223 [] OML.receive(exp_nack) -> value rx {
224 setverdict(fail, "SET CHANNEL ATTRIBUTES NACK ", exp_nack);
225 }
226 [] OML.receive(tr_OML_MsgType(NM_MT_SET_CHAN_ATTR_ACK, NM_OC_CHANNEL, obj_inst, omit)) {
227 setverdict(fail, "SET CHANNEL ATTRIBUTES ACK without IEs");
228 }
229 [] OML.receive { repeat; }
230 }
231
232}
233
234/* Perform a "SET BTS ATTRIBUTES" procedure with the BTS */
Pau Espin Pedrol6c864ec2021-06-25 13:52:23 +0200235private function f_oml_bts_setattr()
Harald Welteed0c1562019-02-07 20:26:29 +0100236runs on BSC_OML_CT {
237 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
238 var template (value) OML_FOM_IE_List ies := {
239 ts_OML_IE(NM_ATT_INTERF_BOUND, OML_FOM_IE_Body:{interf_bound:=mp_interf_bound}),
240 ts_OML_IE(NM_ATT_BCCH_ARFCN, OML_FOM_IE_Body:{bcch_arfcn:=mp_arfcn[0]}),
241 ts_OML_IE(NM_ATT_CONN_FAIL_CRIT, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(2, '0120'O)}),
242 ts_OML_IE(NM_ATT_T200, OML_FOM_IE_Body:{t200 := mp_t200}),
243 ts_OML_IE(NM_ATT_MAX_TA, OML_FOM_IE_Body:{max_ta := mp_max_ta}),
244 ts_OML_IE(NM_ATT_OVERL_PERIOD, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(1, '0a'O)}),
245 ts_OML_IE(NM_ATT_CCCH_L_T, OML_FOM_IE_Body:{load_threshold := mp_load_threshold}),
246 ts_OML_IE(NM_ATT_CCCH_L_I_P, OML_FOM_IE_Body:{load_ind_period := mp_load_ind_period}),
247 ts_OML_IE(NM_ATT_RACH_B_THRESH, OML_FOM_IE_Body:{rach_b_thresh := mp_rach_b_thresh}),
248 ts_OML_IE(NM_ATT_LDAVG_SLOTS, OML_FOM_IE_Body:{loadavg_slots := mp_loadavg_slots}),
249 ts_OML_IE(NM_ATT_BTS_AIR_TIMER, OML_FOM_IE_Body:{air_timer := mp_air_timer}),
250 ts_OML_IE(NM_ATT_NY1, OML_FOM_IE_Body:{ny1 := mp_ny1}),
251 ts_OML_IE(NM_ATT_BSIC, OML_FOM_IE_Body:{bsic := mp_bsic})
252 //ts_OML_IE(NM_ATT_IPACC_CGI, ...)
253 };
254 var OML_PDU cmd := valueof(ts_OML_SetBtsAttr(obj_inst, ies));
255 var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
256 var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
257 var OML_PDU rx;
258
259 OML.send(cmd);
260 alt {
261 [] OML.receive(exp_ack) -> value rx {
262 setverdict(pass);
263 }
264 [] OML.receive(exp_nack) -> value rx {
265 setverdict(fail, "SET BTS ATTRIBUTES NACK ", exp_nack);
266 }
267
268 [] OML.receive(tr_OML_MsgType(NM_MT_SET_BTS_ATTR_ACK, NM_OC_BTS, obj_inst, omit)) {
269 setverdict(fail, "SET BTS ATTRIBUTES ACK without IEs");
270 }
271 [] OML.receive { repeat; }
272 }
273}
274
275/* Send an OML message and expect no response at all */
276private function f_oml_send_exp_no_resp(template (value) OML_PDU tx, charstring err_msg,
277 float tout := 5.0) runs on BSC_OML_CT
278{
279 timer T := 5.0;
280
281 OML.send(tx);
282 T.start;
283 alt {
284 [] OML.receive {
285 setverdict(fail, err_msg);
286 }
287 [] T.timeout {
288 setverdict(pass);
289 }
290 }
291}
292
293private function f_oml_exp_rx(template OML_PDU exp_rx, charstring err_msg) runs on BSC_OML_CT
294{
295 timer T := 5.0;
296 T.start;
297 alt {
298 [] OML.receive(exp_rx) {
299 setverdict(pass);
300 }
301 [] OML.receive { repeat; }
302 [] T.timeout {
303 setverdict(fail, "Timeout waiting for ", err_msg);
304 }
305 }
306}
307
308/* Send an OML message and expect a failure event report in response */
309private function f_oml_send_exp_fail_rep(template (value) OML_PDU tx, charstring err_msg,
310 template OML_FOM_EventType evt := ?,
311 template OML_FOM_Severity severity := ?,
312 template OML_FOM_ProbableCause cause := ?,
313 float tout := 5.0) runs on BSC_OML_CT
314{
315 var template OML_FOM_ObjectClass obj_class := ?;
316 var template OML_FOM_ObjectInstance obj_inst := ?;
317 if (ischosen(tx.u.fom)) {
318 obj_class := tx.u.fom.hdr.obj_class;
319 obj_inst := tx.u.fom.hdr.obj_inst;
320 }
321 var template OML_PDU exp_fail := tr_OML_FailureEvtRep(obj_class,obj_inst, evt, severity, cause);
322
323 OML.send(tx);
324 f_oml_exp_rx(exp_fail, "Failure Event Report");
325}
326
327/* Send an OML message and expect it to be NACKed with specified cause */
328private function f_oml_send_exp_nack(template (value) OML_PDU tx, template OML_FOM_NackCause exp_cause,
329 float tout := 5.0) runs on BSC_OML_CT
330{
331 timer T := 5.0;
332
333 var template OML_PDU exp_nack := f_OML_make_nack_exp(valueof(tx), exp_cause);
334 var template OML_PDU exp_ack := f_OML_make_ack_exp(valueof(tx));
335 var OML_PDU rx;
336
337 OML.send(tx);
338 T.start;
339 alt {
340 [] OML.receive(exp_ack) -> value rx {
341 setverdict(fail, "Unexpected ACK ", rx);
342 }
343 [] OML.receive(exp_nack) -> value rx {
344 setverdict(pass);
345 }
346 [] OML.receive { repeat; }
347 [] T.timeout {
348 setverdict(fail, "Timeout waiting for NACK ", exp_nack);
349 }
350 }
351}
352
353
354
355
356
357
358testcase TC_oml_selftest() runs on BSC_OML_CT {
359 const octetstring state_chg_bts := '8080000d610100ffff'O & '2401'O & '07000107'O & '0401'O;
360 const octetstring set_attr_bts := '80800033410100ffff19555b61676d7318060e00020110331e2424a83421a81f3f2500010a0c1e0b642a0a2b03e80a80230a08007b0920'O
361 const octetstring set_attr_radio := '8080000c44020000ff2d00050002007b'O;
362 const octetstring set_attr_ts0 := '8080000947030000000d074000'O;
363 const octetstring ipa_rsl_connect := '1080000a0d636f6d2e697061636365737300e0040000ff8500810bbb'O;
364
365 log(dec_OML_PDU(state_chg_bts));
366 log(dec_OML_PDU(set_attr_bts));
367 log(dec_OML_PDU(set_attr_radio));
368 log(dec_OML_PDU(set_attr_ts0));
369 log(dec_OML_PDU(ipa_rsl_connect));
370};
371
372testcase TC_oml_nothing() runs on BSC_OML_CT {
373 f_init_oml(testcasename());
374 f_sleep(100.0);
375}
376
377/* test behavior for unsupported message discriminator */
378testcase TC_wrong_mdisc() runs on BSC_OML_CT {
379 f_init_oml(testcasename());
380
381 var OML_PDU mmi_pdu := {
382 mdisc := ABIS_OM_MDISC_MMI,
383 placement := ABIS_OM_PLACEMENT_ONLY,
384 sequence := 0,
385 u := {
386 other := '01020304'O
387 }
388 };
389
390 f_oml_send_exp_fail_rep(mmi_pdu, "Unexpected response to MMI message");
391}
392
393/* send a message of unknown/unsupported type */
394testcase TC_wrong_msgtype() runs on BSC_OML_CT {
395 f_init_oml(testcasename());
396 var OML_PDU tx := valueof(ts_OML_MsgType(NM_MT_ESTABLISH_TEI, NM_OC_BTS,
397 ts_OML_ObjectInstance(0, 255, 255), omit));
398 f_oml_send_exp_fail_rep(tx, "ESTABLISH_TEI");
399}
400
401/* send message shorter than OML header length indicates */
402testcase TC_short_length() runs on BSC_OML_CT {
403 f_init_oml(testcasename());
404
405 /* Send "Change Adm State (Locked) to BTS, but with length 09 instead of 07 */
406 OML.send('80800009690100ffff0401'O);
407
408 template OML_PDU exp_fail := tr_OML_FailureEvtRep(NM_OC_BTS,
409 ts_OML_ObjectInstance(0, 255, 255),
410 ?, ?, ?);
411 f_oml_exp_rx(exp_fail, "Failure Event Report");
412}
413
414/* send message longer than OML header length indicates */
415testcase TC_long_length() runs on BSC_OML_CT {
416 f_init_oml(testcasename());
417 /* Send "Change Adm State (Locked) to BTS, but with two extra bytes at the end */
418 OML.send('80800007690100ffff04010402'O);
419
420 template OML_PDU exp :=
421 tr_OML_ChangeAdmStateACK(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
422 NM_STATE_LOCKED);
423 f_oml_exp_rx(exp, "Change ADM State ACK");
424}
425
426/* test behavior for unsupported placement (!= ONLY) */
427testcase TC_wrong_placement() runs on BSC_OML_CT {
428 f_init_oml(testcasename());
429
430 var OML_FOM_ObjectClass obj_class := NM_OC_BTS
431 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
432
433 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
434
435 pdu.placement := ABIS_OM_PLACEMENT_FIRST;
436 f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_FIRST");
437
438 pdu.placement := ABIS_OM_PLACEMENT_MIDDLE;
439 f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_MIDDLE");
440
441 pdu.placement := ABIS_OM_PLACEMENT_LAST;
442 f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_LAST");
443}
444
445/* test behavior for sequence != 0 (invalid if mdisc == ONLY) */
446testcase TC_wrong_seq() runs on BSC_OML_CT {
447 f_init_oml(testcasename());
448
449 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
450 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
451 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
452
453 OML.clear;
454
455 pdu.sequence := 23;
456 f_oml_send_exp_fail_rep(pdu, "Unexpected response to sequence != 0");
457}
458
459/* test behavior for unsupported obj_class */
460testcase TC_wrong_obj_class() runs on BSC_OML_CT {
461 f_init_oml(testcasename());
462
463 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
464 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
465 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
466 pdu.u.fom.hdr.obj_class := NM_OC_NULL;
467
468 /* NM_NACK_OBJCLASS_INVAL */
469 f_oml_send_exp_nack(pdu, NM_NACK_OBJCLASS_NOTSUPP);
470}
471
472/* test behavior for wrong BTS number in object instance */
473testcase TC_wrong_bts_nr() runs on BSC_OML_CT {
474 f_init_oml(testcasename());
475
476 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
477 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(250, 255, 255));
478 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
479
480 f_oml_send_exp_nack(pdu, NM_NACK_BTSNR_UNKN);
481}
482
483/* test behavior for wrong TRX number in object instance */
484testcase TC_wrong_trx_nr() runs on BSC_OML_CT {
485 f_init_oml(testcasename());
486
487 var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
488 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 250, 255));
489 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
490
491 f_oml_send_exp_nack(pdu, NM_NACK_TRXNR_UNKN);
492}
493
494/* test behavior for wrong TS number in object instance */
495testcase TC_wrong_ts_nr() runs on BSC_OML_CT {
496 f_init_oml(testcasename());
497
498 var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
499 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 250));
500 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
501
502 f_oml_send_exp_nack(pdu, NM_NACK_OBJINST_UNKN);
503}
504
505/* RADIO CARRIER: Test OPSTART with SET BTS ATTRIBUTES; expect ACK */
506testcase TC_radio_carrier_opstart() runs on BSC_OML_CT {
507 f_init_oml(testcasename());
508
509 var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
510 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 255));
511
512 f_oml_radio_attr(0);
513 f_oml_opstart(obj_class, obj_inst);
514}
515
516/* RADIO CARRIER: Test OPSTART without SET BTS ATTRIBUTES; expect NACK */
517testcase TC_radio_carrier_opstart_noattr() runs on BSC_OML_CT {
518 f_init_oml(testcasename());
519
520 var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
521 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 255));
522
523 /* we are *not* setting any attributes here */
524 f_oml_opstart(obj_class, obj_inst, exp_fail := true);
525}
526
527
528/* BTS: Test OPSTART after SET BTS ATTRIBUTES; expect ACK */
529testcase TC_bts_opstart() runs on BSC_OML_CT {
530 f_init_oml(testcasename());
531
532 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
533 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
534
Pau Espin Pedrol006d1952020-10-16 14:18:43 +0200535 alt {
536 [] OML.receive(tr_OML_SwActivatedRep(NM_OC_BTS, ts_OML_ObjectInstance(g_bts_nr, 255, 255))) {
537 setverdict(pass);
538 }
539 [] OML.receive { repeat; }
540 }
541
Pau Espin Pedrol6c864ec2021-06-25 13:52:23 +0200542 f_oml_bts_setattr();
Pau Espin Pedrold0ec1492020-10-16 14:54:14 +0200543 f_oml_opstart(obj_class, obj_inst, false, NM_OPSTATE_ENABLED);
Harald Welteed0c1562019-02-07 20:26:29 +0100544}
545
546
547/* BTS: Test OPSTART without SET BTS ATTRIBUTES; expect NACK */
548testcase TC_bts_opstart_noattr() runs on BSC_OML_CT {
549 f_init_oml(testcasename());
550
551 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
552 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
553
554 /* we are *not* setting any attributes here */
555 f_oml_opstart(obj_class, obj_inst, exp_fail := true);
556}
557
558/* CHANNEL: Test OPSTART after SET CHANNEL ATTRIBUTES; expect ACK */
559testcase TC_ts_opstart() runs on BSC_OML_CT {
560 f_init_oml(testcasename());
561
562 var OML_FOM_ObjectClass obj_class := NM_OC_CHANNEL;
563 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 1));
564
565 f_oml_ts_attr(trx_nr := 0, ts_nr := 1);
566 f_oml_opstart(obj_class, obj_inst);
567}
568
569
570/* CHANNEL: Test OPSTART without SET CHANNEL ATTRIBUTES; expect NACK */
571testcase TC_ts_opstart_noattr() runs on BSC_OML_CT {
572 f_init_oml(testcasename());
573
574 var OML_FOM_ObjectClass obj_class := NM_OC_CHANNEL;
575 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 1));
576
577 /* we are *not* setting any attributes here */
578 f_oml_opstart(obj_class, obj_inst, exp_fail := true);
579}
580
581/* Ensure the initial Event State Change Reports after OML connect match our expectation */
582testcase TC_initial_state_reports() runs on BSC_OML_CT {
583 f_init_oml(testcasename());
584
585 interleave {
586 [] OML.receive(tr_OML_StateChgEvtRep(NM_OC_SITE_MANAGER, ts_OML_ObjectInstance(255, 255, 255),
587 NM_OPSTATE_ENABLED, NM_AVSTATE_OK));
588 [] OML.receive(tr_OML_StateChgEvtRep(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
589 NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY));
590 [] OML.receive(tr_OML_StateChgEvtRep(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
591 NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY));
592 }
593}
594
Vadim Yanitskiyb9a7bbf2020-12-08 19:27:51 +0100595/* Make sure that the IUT sends RSL Connect NACK when the remote is not reachable. */
596testcase TC_ipa_rsl_connect_nack() runs on BSC_OML_CT {
597 timer T := 2.0;
598
599 f_init_oml(testcasename());
600
601 /* Most likely, nobody is listening to this port */
602 OML.send(ts_OML_IPA_RslConnect(0, 65535));
603
604 T.start;
605 alt {
606 [] OML.receive(tr_OML_IPA_MsgType(NM_MT_IPACC_RSL_CONNECT_NACK)) {
607 setverdict(pass);
608 }
609 [] OML.receive(tr_OML_IPA_MsgType(NM_MT_IPACC_RSL_CONNECT_ACK)) {
610 setverdict(fail, "RSL Connect ACK is not expected");
611 }
612 [] OML.receive { repeat; }
613 [] T.timeout {
614 setverdict(fail, "Timeout waiting for RSL Connect NACK");
615 }
616 }
617}
618
Harald Welteed0c1562019-02-07 20:26:29 +0100619
620control {
621 execute( TC_wrong_mdisc() );
622 execute( TC_wrong_msgtype() );
623 execute( TC_short_length() );
624 execute( TC_long_length() );
625 execute( TC_wrong_placement() );
626 execute( TC_wrong_seq() );
627 execute( TC_wrong_obj_class() );
628 execute( TC_wrong_bts_nr() );
629 execute( TC_wrong_trx_nr() );
630 execute( TC_radio_carrier_opstart_noattr() );
631 execute( TC_bts_opstart() );
632 execute( TC_bts_opstart_noattr() );
633 execute( TC_ts_opstart() );
634 execute( TC_ts_opstart_noattr() );
635 execute( TC_initial_state_reports() );
Vadim Yanitskiyb9a7bbf2020-12-08 19:27:51 +0100636 execute( TC_ipa_rsl_connect_nack() );
Harald Welteed0c1562019-02-07 20:26:29 +0100637}
638
639/* BTS:
640 * - Evt: Disabled/Locked
641 * - SW ACT
642 * - Evt: Disabled/Dependency
643 * - SET BTS ATTR
644 * - Opstart
645 * - Chg Adm State Unlocked
646 * - Evt: Disabled/Dependency/Unlocked
647 * - Evt: Enabled/0 (after last channel unlocked?)
648 */
649
650/* Radio Carrier:
651 * - Evt: Disabled/Offline after SW ACT
652 * - Set Radio Carrier Attributes ? (->NACL)
653 * - Evt: Disabled/Dependency
654 * - Set Radio Carrier Attributes ?
655 * - Opstart
656 * - Chg Adm State Unlocked
657 * - Evt:
658 */
659
660/* Baseband Transceiver:
661 * - Evt: Disabled/Locked
662 * - SW Activation
663 * - Evt: Disabled/Dependency after SW ACT
664 * - IPA RSL Connect
665 * - Opstart
666 * - Chg Admin Unlocked
667 * - Evt: Disabled/Dependency/Unlocked
668 */
669
670/* Channel:
671 * - Evt: Not Installed/Locked
672 * - Evt: Disabled/Dependency (after SW ACT Rep on BB Transc)
673 * - Set Channel Attr
674 * - Opstart
675 * - Evt: Disabled/Offline
676 * - Chg Admin Unlocked
677 * - Evt: Disabled/OK/Unlocked
678 * - Evt: Enabled/OK (after BB TRANSC Opstart)
679 */
680
681};