blob: 84d46a4c6e21761bba9a69db38f328c5f5712cc0 [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
105 OML.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP));
106 //OML.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_ID_ACK));
107
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,
116 boolean exp_fail := false)
117runs on BSC_OML_CT {
118 OML.send(ts_OML_Opstart(obj_class, obj_inst));
119 alt {
120 [not exp_fail] OML.receive(tr_OML_OpstartACK(obj_class, obj_inst)) {
121 setverdict(pass);
122 }
123 [not exp_fail] OML.receive(tr_OML_OpstartNACK(obj_class, obj_inst)) {
124 setverdict(fail, "Unexpected OPSTART NACK for ", obj_class, " ", obj_inst);
125 }
126 [exp_fail] OML.receive(tr_OML_OpstartACK(obj_class, obj_inst)) {
127 setverdict(fail, "Unexpected OPSTART ACK for ", obj_class, " ", obj_inst);
128 }
129 [exp_fail] OML.receive(tr_OML_OpstartNACK(obj_class, obj_inst)) {
130 setverdict(pass);
131 }
132 [] OML.receive { repeat; }
133 }
134}
135
136/* Perform a "CHANGE ADMINISTRATIVE STATE" procedure with the speciifed MO" */
137private function f_oml_chg_adm_st(template (value) OML_FOM_ObjectClass obj_class,
138 template (value) OML_FOM_ObjectInstance obj_inst,
139 template (value) OML_FOM_AdministrativeState adm_st,
140 boolean exp_fail := false)
141runs on BSC_OML_CT {
142 OML.send(ts_OML_ChangeAdmState(obj_class, obj_inst, adm_st));
143 alt {
144 [not exp_fail] OML.receive(tr_OML_ChangeAdmStateACK(obj_class, obj_inst, adm_st)) {
145 setverdict(pass);
146 }
147 [not exp_fail] OML.receive(tr_OML_ChangeAdmStateNACK(obj_class, obj_inst)) {
148 setverdict(fail, "Unexpected CHANGE ADM STATE NACK for ", obj_class, " ", obj_inst);
149 }
150 [exp_fail] OML.receive(tr_OML_ChangeAdmStateACK(obj_class, obj_inst, adm_st)) {
151 setverdict(fail, "Unexpected CHANGE ADM STATE ACK for ", obj_class, " ", obj_inst);
152 }
153 [exp_fail] OML.receive(tr_OML_ChangeAdmStateNACK(obj_class, obj_inst)) {
154 setverdict(pass);
155 }
156 [] OML.receive { repeat; }
157 }
158}
159
160/* Perform a "SET RADIO CARRIER ATTRIBUTES" procedure with the BTS */
161private function f_oml_radio_attr(uint8_t trx_nr)
162runs on BSC_OML_CT {
163 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, trx_nr, 255));
164 var OML_PDU cmd := valueof(ts_OML_SetRadioAttr(obj_inst, 0, {mp_arfcn[trx_nr]}));
165 var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
166 var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
167 var OML_PDU rx;
168
169 OML.send(cmd);
170 alt {
171 [] OML.receive(exp_ack) -> value rx {
172 setverdict(pass);
173 }
174 [] OML.receive(exp_nack) -> value rx {
175 setverdict(fail, "SET RADIO CARRIER ATTRIBUTES NACK ", exp_nack);
176 }
177 [] OML.receive(tr_OML_MsgType(NM_MT_SET_RADIO_ATTR_ACK, NM_OC_RADIO_CARRIER, obj_inst, omit)) {
178 setverdict(fail, "SET RADIO CARRIER ATTRIBUTES ACK without IEs");
179 }
180 [] OML.receive { repeat; }
181 }
182}
183
184/* Perform a "SET CHANNEL ATTRIBUTES" procedure with the BTS */
185private function f_oml_ts_attr(uint8_t trx_nr, uint8_t ts_nr)
186runs on BSC_OML_CT {
187 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, trx_nr, ts_nr));
188 var OML_PDU cmd := valueof(ts_OML_SetChanAttr(obj_inst, NM_CHANC_TCHFull, tsc := 7));
189 var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
190 var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
191 var OML_PDU rx;
192
193 OML.send(cmd);
194 alt {
195 [] OML.receive(exp_ack) -> value rx {
196 setverdict(pass);
197 }
198 [] OML.receive(exp_nack) -> value rx {
199 setverdict(fail, "SET CHANNEL ATTRIBUTES NACK ", exp_nack);
200 }
201 [] OML.receive(tr_OML_MsgType(NM_MT_SET_CHAN_ATTR_ACK, NM_OC_CHANNEL, obj_inst, omit)) {
202 setverdict(fail, "SET CHANNEL ATTRIBUTES ACK without IEs");
203 }
204 [] OML.receive { repeat; }
205 }
206
207}
208
209/* Perform a "SET BTS ATTRIBUTES" procedure with the BTS */
210private function f_oml_bts_attr()
211runs on BSC_OML_CT {
212 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
213 var template (value) OML_FOM_IE_List ies := {
214 ts_OML_IE(NM_ATT_INTERF_BOUND, OML_FOM_IE_Body:{interf_bound:=mp_interf_bound}),
215 ts_OML_IE(NM_ATT_BCCH_ARFCN, OML_FOM_IE_Body:{bcch_arfcn:=mp_arfcn[0]}),
216 ts_OML_IE(NM_ATT_CONN_FAIL_CRIT, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(2, '0120'O)}),
217 ts_OML_IE(NM_ATT_T200, OML_FOM_IE_Body:{t200 := mp_t200}),
218 ts_OML_IE(NM_ATT_MAX_TA, OML_FOM_IE_Body:{max_ta := mp_max_ta}),
219 ts_OML_IE(NM_ATT_OVERL_PERIOD, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(1, '0a'O)}),
220 ts_OML_IE(NM_ATT_CCCH_L_T, OML_FOM_IE_Body:{load_threshold := mp_load_threshold}),
221 ts_OML_IE(NM_ATT_CCCH_L_I_P, OML_FOM_IE_Body:{load_ind_period := mp_load_ind_period}),
222 ts_OML_IE(NM_ATT_RACH_B_THRESH, OML_FOM_IE_Body:{rach_b_thresh := mp_rach_b_thresh}),
223 ts_OML_IE(NM_ATT_LDAVG_SLOTS, OML_FOM_IE_Body:{loadavg_slots := mp_loadavg_slots}),
224 ts_OML_IE(NM_ATT_BTS_AIR_TIMER, OML_FOM_IE_Body:{air_timer := mp_air_timer}),
225 ts_OML_IE(NM_ATT_NY1, OML_FOM_IE_Body:{ny1 := mp_ny1}),
226 ts_OML_IE(NM_ATT_BSIC, OML_FOM_IE_Body:{bsic := mp_bsic})
227 //ts_OML_IE(NM_ATT_IPACC_CGI, ...)
228 };
229 var OML_PDU cmd := valueof(ts_OML_SetBtsAttr(obj_inst, ies));
230 var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
231 var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
232 var OML_PDU rx;
233
234 OML.send(cmd);
235 alt {
236 [] OML.receive(exp_ack) -> value rx {
237 setverdict(pass);
238 }
239 [] OML.receive(exp_nack) -> value rx {
240 setverdict(fail, "SET BTS ATTRIBUTES NACK ", exp_nack);
241 }
242
243 [] OML.receive(tr_OML_MsgType(NM_MT_SET_BTS_ATTR_ACK, NM_OC_BTS, obj_inst, omit)) {
244 setverdict(fail, "SET BTS ATTRIBUTES ACK without IEs");
245 }
246 [] OML.receive { repeat; }
247 }
248}
249
250/* Send an OML message and expect no response at all */
251private function f_oml_send_exp_no_resp(template (value) OML_PDU tx, charstring err_msg,
252 float tout := 5.0) runs on BSC_OML_CT
253{
254 timer T := 5.0;
255
256 OML.send(tx);
257 T.start;
258 alt {
259 [] OML.receive {
260 setverdict(fail, err_msg);
261 }
262 [] T.timeout {
263 setverdict(pass);
264 }
265 }
266}
267
268private function f_oml_exp_rx(template OML_PDU exp_rx, charstring err_msg) runs on BSC_OML_CT
269{
270 timer T := 5.0;
271 T.start;
272 alt {
273 [] OML.receive(exp_rx) {
274 setverdict(pass);
275 }
276 [] OML.receive { repeat; }
277 [] T.timeout {
278 setverdict(fail, "Timeout waiting for ", err_msg);
279 }
280 }
281}
282
283/* Send an OML message and expect a failure event report in response */
284private function f_oml_send_exp_fail_rep(template (value) OML_PDU tx, charstring err_msg,
285 template OML_FOM_EventType evt := ?,
286 template OML_FOM_Severity severity := ?,
287 template OML_FOM_ProbableCause cause := ?,
288 float tout := 5.0) runs on BSC_OML_CT
289{
290 var template OML_FOM_ObjectClass obj_class := ?;
291 var template OML_FOM_ObjectInstance obj_inst := ?;
292 if (ischosen(tx.u.fom)) {
293 obj_class := tx.u.fom.hdr.obj_class;
294 obj_inst := tx.u.fom.hdr.obj_inst;
295 }
296 var template OML_PDU exp_fail := tr_OML_FailureEvtRep(obj_class,obj_inst, evt, severity, cause);
297
298 OML.send(tx);
299 f_oml_exp_rx(exp_fail, "Failure Event Report");
300}
301
302/* Send an OML message and expect it to be NACKed with specified cause */
303private function f_oml_send_exp_nack(template (value) OML_PDU tx, template OML_FOM_NackCause exp_cause,
304 float tout := 5.0) runs on BSC_OML_CT
305{
306 timer T := 5.0;
307
308 var template OML_PDU exp_nack := f_OML_make_nack_exp(valueof(tx), exp_cause);
309 var template OML_PDU exp_ack := f_OML_make_ack_exp(valueof(tx));
310 var OML_PDU rx;
311
312 OML.send(tx);
313 T.start;
314 alt {
315 [] OML.receive(exp_ack) -> value rx {
316 setverdict(fail, "Unexpected ACK ", rx);
317 }
318 [] OML.receive(exp_nack) -> value rx {
319 setverdict(pass);
320 }
321 [] OML.receive { repeat; }
322 [] T.timeout {
323 setverdict(fail, "Timeout waiting for NACK ", exp_nack);
324 }
325 }
326}
327
328
329
330
331
332
333testcase TC_oml_selftest() runs on BSC_OML_CT {
334 const octetstring state_chg_bts := '8080000d610100ffff'O & '2401'O & '07000107'O & '0401'O;
335 const octetstring set_attr_bts := '80800033410100ffff19555b61676d7318060e00020110331e2424a83421a81f3f2500010a0c1e0b642a0a2b03e80a80230a08007b0920'O
336 const octetstring set_attr_radio := '8080000c44020000ff2d00050002007b'O;
337 const octetstring set_attr_ts0 := '8080000947030000000d074000'O;
338 const octetstring ipa_rsl_connect := '1080000a0d636f6d2e697061636365737300e0040000ff8500810bbb'O;
339
340 log(dec_OML_PDU(state_chg_bts));
341 log(dec_OML_PDU(set_attr_bts));
342 log(dec_OML_PDU(set_attr_radio));
343 log(dec_OML_PDU(set_attr_ts0));
344 log(dec_OML_PDU(ipa_rsl_connect));
345};
346
347testcase TC_oml_nothing() runs on BSC_OML_CT {
348 f_init_oml(testcasename());
349 f_sleep(100.0);
350}
351
352/* test behavior for unsupported message discriminator */
353testcase TC_wrong_mdisc() runs on BSC_OML_CT {
354 f_init_oml(testcasename());
355
356 var OML_PDU mmi_pdu := {
357 mdisc := ABIS_OM_MDISC_MMI,
358 placement := ABIS_OM_PLACEMENT_ONLY,
359 sequence := 0,
360 u := {
361 other := '01020304'O
362 }
363 };
364
365 f_oml_send_exp_fail_rep(mmi_pdu, "Unexpected response to MMI message");
366}
367
368/* send a message of unknown/unsupported type */
369testcase TC_wrong_msgtype() runs on BSC_OML_CT {
370 f_init_oml(testcasename());
371 var OML_PDU tx := valueof(ts_OML_MsgType(NM_MT_ESTABLISH_TEI, NM_OC_BTS,
372 ts_OML_ObjectInstance(0, 255, 255), omit));
373 f_oml_send_exp_fail_rep(tx, "ESTABLISH_TEI");
374}
375
376/* send message shorter than OML header length indicates */
377testcase TC_short_length() runs on BSC_OML_CT {
378 f_init_oml(testcasename());
379
380 /* Send "Change Adm State (Locked) to BTS, but with length 09 instead of 07 */
381 OML.send('80800009690100ffff0401'O);
382
383 template OML_PDU exp_fail := tr_OML_FailureEvtRep(NM_OC_BTS,
384 ts_OML_ObjectInstance(0, 255, 255),
385 ?, ?, ?);
386 f_oml_exp_rx(exp_fail, "Failure Event Report");
387}
388
389/* send message longer than OML header length indicates */
390testcase TC_long_length() runs on BSC_OML_CT {
391 f_init_oml(testcasename());
392 /* Send "Change Adm State (Locked) to BTS, but with two extra bytes at the end */
393 OML.send('80800007690100ffff04010402'O);
394
395 template OML_PDU exp :=
396 tr_OML_ChangeAdmStateACK(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
397 NM_STATE_LOCKED);
398 f_oml_exp_rx(exp, "Change ADM State ACK");
399}
400
401/* test behavior for unsupported placement (!= ONLY) */
402testcase TC_wrong_placement() runs on BSC_OML_CT {
403 f_init_oml(testcasename());
404
405 var OML_FOM_ObjectClass obj_class := NM_OC_BTS
406 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
407
408 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
409
410 pdu.placement := ABIS_OM_PLACEMENT_FIRST;
411 f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_FIRST");
412
413 pdu.placement := ABIS_OM_PLACEMENT_MIDDLE;
414 f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_MIDDLE");
415
416 pdu.placement := ABIS_OM_PLACEMENT_LAST;
417 f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_LAST");
418}
419
420/* test behavior for sequence != 0 (invalid if mdisc == ONLY) */
421testcase TC_wrong_seq() runs on BSC_OML_CT {
422 f_init_oml(testcasename());
423
424 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
425 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
426 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
427
428 OML.clear;
429
430 pdu.sequence := 23;
431 f_oml_send_exp_fail_rep(pdu, "Unexpected response to sequence != 0");
432}
433
434/* test behavior for unsupported obj_class */
435testcase TC_wrong_obj_class() runs on BSC_OML_CT {
436 f_init_oml(testcasename());
437
438 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
439 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
440 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
441 pdu.u.fom.hdr.obj_class := NM_OC_NULL;
442
443 /* NM_NACK_OBJCLASS_INVAL */
444 f_oml_send_exp_nack(pdu, NM_NACK_OBJCLASS_NOTSUPP);
445}
446
447/* test behavior for wrong BTS number in object instance */
448testcase TC_wrong_bts_nr() runs on BSC_OML_CT {
449 f_init_oml(testcasename());
450
451 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
452 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(250, 255, 255));
453 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
454
455 f_oml_send_exp_nack(pdu, NM_NACK_BTSNR_UNKN);
456}
457
458/* test behavior for wrong TRX number in object instance */
459testcase TC_wrong_trx_nr() runs on BSC_OML_CT {
460 f_init_oml(testcasename());
461
462 var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
463 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 250, 255));
464 var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
465
466 f_oml_send_exp_nack(pdu, NM_NACK_TRXNR_UNKN);
467}
468
469/* test behavior for wrong TS number in object instance */
470testcase TC_wrong_ts_nr() runs on BSC_OML_CT {
471 f_init_oml(testcasename());
472
473 var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
474 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 250));
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_OBJINST_UNKN);
478}
479
480/* RADIO CARRIER: Test OPSTART with SET BTS ATTRIBUTES; expect ACK */
481testcase TC_radio_carrier_opstart() 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, 0, 255));
486
487 f_oml_radio_attr(0);
488 f_oml_opstart(obj_class, obj_inst);
489}
490
491/* RADIO CARRIER: Test OPSTART without SET BTS ATTRIBUTES; expect NACK */
492testcase TC_radio_carrier_opstart_noattr() 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, 255));
497
498 /* we are *not* setting any attributes here */
499 f_oml_opstart(obj_class, obj_inst, exp_fail := true);
500}
501
502
503/* BTS: Test OPSTART after SET BTS ATTRIBUTES; expect ACK */
504testcase TC_bts_opstart() runs on BSC_OML_CT {
505 f_init_oml(testcasename());
506
507 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
508 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
509
510 f_oml_bts_attr();
511 f_oml_opstart(obj_class, obj_inst);
512}
513
514
515/* BTS: Test OPSTART without SET BTS ATTRIBUTES; expect NACK */
516testcase TC_bts_opstart_noattr() runs on BSC_OML_CT {
517 f_init_oml(testcasename());
518
519 var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
520 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
521
522 /* we are *not* setting any attributes here */
523 f_oml_opstart(obj_class, obj_inst, exp_fail := true);
524}
525
526/* CHANNEL: Test OPSTART after SET CHANNEL ATTRIBUTES; expect ACK */
527testcase TC_ts_opstart() runs on BSC_OML_CT {
528 f_init_oml(testcasename());
529
530 var OML_FOM_ObjectClass obj_class := NM_OC_CHANNEL;
531 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 1));
532
533 f_oml_ts_attr(trx_nr := 0, ts_nr := 1);
534 f_oml_opstart(obj_class, obj_inst);
535}
536
537
538/* CHANNEL: Test OPSTART without SET CHANNEL ATTRIBUTES; expect NACK */
539testcase TC_ts_opstart_noattr() runs on BSC_OML_CT {
540 f_init_oml(testcasename());
541
542 var OML_FOM_ObjectClass obj_class := NM_OC_CHANNEL;
543 var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 1));
544
545 /* we are *not* setting any attributes here */
546 f_oml_opstart(obj_class, obj_inst, exp_fail := true);
547}
548
549/* Ensure the initial Event State Change Reports after OML connect match our expectation */
550testcase TC_initial_state_reports() runs on BSC_OML_CT {
551 f_init_oml(testcasename());
552
553 interleave {
554 [] OML.receive(tr_OML_StateChgEvtRep(NM_OC_SITE_MANAGER, ts_OML_ObjectInstance(255, 255, 255),
555 NM_OPSTATE_ENABLED, NM_AVSTATE_OK));
556 [] OML.receive(tr_OML_StateChgEvtRep(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
557 NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY));
558 [] OML.receive(tr_OML_StateChgEvtRep(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
559 NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY));
560 }
561}
562
563
564control {
565 execute( TC_wrong_mdisc() );
566 execute( TC_wrong_msgtype() );
567 execute( TC_short_length() );
568 execute( TC_long_length() );
569 execute( TC_wrong_placement() );
570 execute( TC_wrong_seq() );
571 execute( TC_wrong_obj_class() );
572 execute( TC_wrong_bts_nr() );
573 execute( TC_wrong_trx_nr() );
574 execute( TC_radio_carrier_opstart_noattr() );
575 execute( TC_bts_opstart() );
576 execute( TC_bts_opstart_noattr() );
577 execute( TC_ts_opstart() );
578 execute( TC_ts_opstart_noattr() );
579 execute( TC_initial_state_reports() );
580}
581
582/* BTS:
583 * - Evt: Disabled/Locked
584 * - SW ACT
585 * - Evt: Disabled/Dependency
586 * - SET BTS ATTR
587 * - Opstart
588 * - Chg Adm State Unlocked
589 * - Evt: Disabled/Dependency/Unlocked
590 * - Evt: Enabled/0 (after last channel unlocked?)
591 */
592
593/* Radio Carrier:
594 * - Evt: Disabled/Offline after SW ACT
595 * - Set Radio Carrier Attributes ? (->NACL)
596 * - Evt: Disabled/Dependency
597 * - Set Radio Carrier Attributes ?
598 * - Opstart
599 * - Chg Adm State Unlocked
600 * - Evt:
601 */
602
603/* Baseband Transceiver:
604 * - Evt: Disabled/Locked
605 * - SW Activation
606 * - Evt: Disabled/Dependency after SW ACT
607 * - IPA RSL Connect
608 * - Opstart
609 * - Chg Admin Unlocked
610 * - Evt: Disabled/Dependency/Unlocked
611 */
612
613/* Channel:
614 * - Evt: Not Installed/Locked
615 * - Evt: Disabled/Dependency (after SW ACT Rep on BB Transc)
616 * - Set Channel Attr
617 * - Opstart
618 * - Evt: Disabled/Offline
619 * - Chg Admin Unlocked
620 * - Evt: Disabled/OK/Unlocked
621 * - Evt: Enabled/OK (after BB TRANSC Opstart)
622 */
623
624};