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