From 89b4eff2432ff94e827f9877f68a27403277b79e Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Fri, 25 Nov 2022 17:35:12 +0000 Subject: [PATCH] BSC_Tests: add OML tests for bts_setup_ramp The current BSC_Tests are using osmo-bts-omldummy to keep OML out of the test context. Add a new test file and component for OML tests. Change-Id: I0934ea26db359b0a6649c613f01de134a3a372ee --- bsc/BSC_Tests.cfg | 1 + bsc/BSC_Tests_OML.ttcn | 374 +++++++++++++++++++++++++++++++++++++++++ bsc/gen_links.sh | 1 + bsc/regen_makefile.sh | 1 + 4 files changed, 377 insertions(+) create mode 100644 bsc/BSC_Tests_OML.ttcn diff --git a/bsc/BSC_Tests.cfg b/bsc/BSC_Tests.cfg index 576584676..5ac91b6fd 100644 --- a/bsc/BSC_Tests.cfg +++ b/bsc/BSC_Tests.cfg @@ -18,6 +18,7 @@ BSC_Tests.control BSC_Tests_LCLS.control BSC_Tests_CBSP.control +#BSC_Tests_OML.control #BSC_Tests.TC_chan_act_noreply #BSC_Tests.TC_chan_act_ack_noest #BSC_Tests.TC_chan_act_ack_est_ind_noreply diff --git a/bsc/BSC_Tests_OML.ttcn b/bsc/BSC_Tests_OML.ttcn new file mode 100644 index 000000000..feacd1e4d --- /dev/null +++ b/bsc/BSC_Tests_OML.ttcn @@ -0,0 +1,374 @@ +module BSC_Tests_OML { + +/* Integration Tests for OsmoBSC A-bis OML (Organization & Maintenance Link) + * + * (C) 2019 by Harald Welte + * (C) 2022 by sysmocom - s.f.m.c. GmbH + * Author: Alexander Couzens + * All rights reserved. + * + * Released under the terms of GNU General Public License, Version 2 or + * (at your option) any later version. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* The tests only require a BSC with VTY and OML to be present. */ + +import from General_Types all; +import from Osmocom_Types all; +import from AbisOML_Types all; +import from IPA_Emulation all; +import from IPA_Types all; +import from Misc_Helpers all; +import from Osmocom_VTY_Functions all; +import from TELNETasp_PortType all; + +import from BSC_Tests all; + +const integer NUM_TRX := 8; + +type record of uint16_t ArfcnList; +type record length(3) of IPA_CCM_Parameters IPA_CCM_Parameters_multiple; + +modulepar { + charstring mp_oml_ip := "127.0.0.1"; + integer mp_oml_port := 3002; + ArfcnList mp_arfcn := { 100, 101, 102, 103, 104, 105, 106, 107 }; + OML_FOM_T200 mp_t200 := { + sdcch_5ms := 30, + facch_f_5ms := 36, + facch_h_5ms := 36, + sacch_tch_sapi0_10ms := 168, + sacch_sdcch_10ms := 52, + sdcch_sapi3_5ms := 33, + sacch_rch_sapi3_10ms := 168 + }; + uint8_t mp_max_ta := 63; + uint8_t mp_load_threshold := 10; + uint8_t mp_load_ind_period := 1; + uint8_t mp_rach_b_thresh := 90; + uint16_t mp_loadavg_slots := 1000; + uint8_t mp_air_timer := 100; + uint8_t mp_ny1 := 10; + uint8_t mp_bsic := 63; + + IPA_CCM_Parameters_multiple mp_ccm_pars := { + { + ser_nr := "", + name := "", + location1 := "", + location2 := "", + equip_version := "", + sw_version := "", + ip_addr := "", + mac_addr := "", + unit_id := "1234/0/0", + osmo_rand := "" + }, + { + ser_nr := "", + name := "", + location1 := "", + location2 := "", + equip_version := "", + sw_version := "", + ip_addr := "", + mac_addr := "", + unit_id := "1235/0/0", + osmo_rand := "" + }, + { + ser_nr := "", + name := "", + location1 := "", + location2 := "", + equip_version := "", + sw_version := "", + ip_addr := "", + mac_addr := "", + unit_id := "1236/0/0", + osmo_rand := "" + } + }; +}; + +/* BSC side OML component */ +type component BTS_OML_CT { + /* IPA client */ + var IPA_Client client[3]; + + /* Port for OML */ + port IPA_OML_PT OML[3]; + + /* VTY */ + port TELNETasp_PT BSCVTY; + + /* As rxed by Get Attributes Response NM_ATT_MANUF_ID IE, see f_oml_getattr() */ + var bitstring g_bts_features[3]; + + /* global test case guard timer */ + timer T_oml_guard := 60.0; +}; + +private altstep as_Tguard() runs on BTS_OML_CT { + [] T_oml_guard.timeout { + setverdict(fail, "Timeout of T_guard"); + mtc.stop; + } +} + +private altstep as_IPA_evt(integer idx := 0) runs on BTS_OML_CT { + var ASP_IPA_Event evt; + [] OML[idx].receive(ASP_IPA_Event:?) -> value evt { + log("Ignoring ", evt); + repeat; + } +} + +function f_init_vty() runs on BTS_OML_CT { + if (BSCVTY.checkstate("Mapped")) { + /* skip initialization if already executed once */ + return; + } + map(self:BSCVTY, system:BSCVTY); + f_vty_set_prompts(BSCVTY); + f_vty_transceive(BSCVTY, "enable"); + + f_vty_enter_config(BSCVTY); + f_vty_transceive(BSCVTY, "bsc"); + f_vty_transceive(BSCVTY, "no bts-setup-ramping"); + f_vty_transceive(BSCVTY, "end"); +} + +function f_init_oml(charstring id, integer num_instance := 1) runs on BTS_OML_CT { + activate(as_Tguard()); + for (var uint8_t idx := 0; idx < num_instance; idx := idx + 1) { + client[idx].id := id & "-" & int2str(idx); + client[idx].vc_IPA := IPA_Emulation_CT.create(id & "-IPA-" & int2str(idx)) alive; + client[idx].ccm_pars := mp_ccm_pars[idx]; + + map(client[idx].vc_IPA:IPA_PORT, system:IPA); + connect(client[idx].vc_IPA:IPA_OML_PORT, self:OML[idx]); + client[idx].vc_IPA.start(IPA_Emulation.main_client(mp_oml_ip, mp_oml_port, "", 10000 + idx, client[idx].ccm_pars)); + + T_oml_guard.start; + + OML[idx].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)); + OML[idx].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK)); + + activate(as_IPA_evt(idx)); + } +} + +function f_oml_send_swact(integer idx := 0) runs on BTS_OML_CT +{ + OML[idx].send(ts_OML_SwActivatedRep(NM_OC_SITE_MANAGER, {255, 255, 255})); + OML[idx].send(ts_OML_SwActivatedRep(NM_OC_BTS, {0, 255, 255})); + OML[idx].send(ts_OML_SwActivatedRep(NM_OC_BASEB_TRANSC, {0, 0, 255})); + OML[idx].send(ts_OML_SwActivatedRep(NM_OC_RADIO_CARRIER, {0, 0, 255})); + for (var uint8_t i := 0; i < 8; i := i + 1) { + OML[idx].send(ts_OML_SwActivatedRep(NM_OC_CHANNEL, {0, 0, i})); + } +} + +function f_oml_send_state_chg_evt_rep( + integer idx, + template (value) OML_FOM_OperationalState opstate, + template (value) OML_FOM_AvailabilityStatus avstate) runs on BTS_OML_CT +{ + OML[idx].send(ts_OML_StateChgEvtRep(NM_OC_SITE_MANAGER, {255, 255, 255}, opstate, avstate)); + OML[idx].send(ts_OML_StateChgEvtRep(NM_OC_BTS, {0, 255, 255}, opstate, avstate)); + OML[idx].send(ts_OML_StateChgEvtRep(NM_OC_BASEB_TRANSC, {0, 0, 255}, opstate, avstate)); + OML[idx].send(ts_OML_StateChgEvtRep(NM_OC_RADIO_CARRIER, {0, 0, 255}, opstate, avstate)); + for (var uint8_t i := 0; i < 8; i := i + 1) { + OML[idx].send(ts_OML_StateChgEvtRep(NM_OC_CHANNEL, {0, 0, i}, opstate, avstate)); + } +} + + +/* Send an OML message and expect no response at all */ +private function f_oml_send_exp_no_resp(template (value) OML_PDU tx, charstring err_msg, + float tout := 5.0, integer idx := 0) runs on BTS_OML_CT +{ + timer T := tout; + + OML[idx].send(tx); + T.start; + alt { + [] OML[idx].receive { + setverdict(fail, err_msg); + } + [] T.timeout { + setverdict(pass); + } + } +} + +private function f_oml_exp_rx(template OML_PDU exp_rx, charstring err_msg, integer idx := 0) + runs on BTS_OML_CT return OML_PDU +{ + var OML_PDU rx; + timer T := 5.0; + + T.start; + alt { + [] OML[idx].receive(exp_rx) -> value rx { + setverdict(pass); + } + [] OML[idx].receive { repeat; } + [] T.timeout { + setverdict(fail, "Timeout waiting for ", err_msg); + } + } + return rx; +} + +/* Send an OML message and expect a failure event report in response */ +private function f_oml_send_exp_fail_rep(template (value) OML_PDU tx, charstring err_msg, + template OML_FOM_EventType evt := ?, + template OML_FOM_Severity severity := ?, + template OML_FOM_ProbableCause cause := ?, + float tout := 5.0, integer idx := 0) runs on BTS_OML_CT +{ + var template OML_FOM_ObjectClass obj_class := ?; + var template OML_FOM_ObjectInstance obj_inst := ?; + if (ischosen(tx.u.fom)) { + obj_class := tx.u.fom.hdr.obj_class; + obj_inst := tx.u.fom.hdr.obj_inst; + } + var template OML_PDU exp_fail := tr_OML_FailureEvtRep(obj_class,obj_inst, evt, severity, cause); + + OML[idx].send(tx); + f_oml_exp_rx(exp_fail, "Failure Event Report"); +} + +/* Send an OML message and expect it to be NACKed with specified cause */ +private function f_oml_send_exp_nack(template (value) OML_PDU tx, template OML_FOM_NackCause exp_cause, + float tout := 5.0, integer idx := 0) runs on BTS_OML_CT +{ + timer T := 5.0; + + var template OML_PDU exp_nack := f_OML_make_nack_exp(valueof(tx), exp_cause); + var template OML_PDU exp_ack := f_OML_make_ack_exp(valueof(tx)); + var OML_PDU rx; + + OML[idx].send(tx); + T.start; + alt { + [] OML[idx].receive(exp_ack) -> value rx { + setverdict(fail, "Unexpected ACK ", rx); + } + [] OML[idx].receive(exp_nack) -> value rx { + setverdict(pass); + } + [] OML[idx].receive { repeat; } + [] T.timeout { + setverdict(fail, "Timeout waiting for NACK ", exp_nack); + } + } +} + +testcase TC_oml_nothing() runs on BTS_OML_CT { + f_init_oml(testcasename()); + f_sleep(40.0); + setverdict(pass); +} + +/* Test bts setup ramping. + * Enable bts setup ramping (limit how many BTS will be setuped within a time interval. + * 1. Send 3x BTS to configure + * 2. Wait until BTS0 and BTS1 is configured (need both to be sure, when the bts setup ramp interval got restartet). + * 3. BTS2 must setup within a time window (it should be 10 seconds, but have -+ 3 seconds to be on the save side). + */ +testcase TC_oml_bts_setup_ramp() runs on BTS_OML_CT { + var template (value) OML_PDU ts_nm_site_change_event := ts_OML_StateChgEvtRep(NM_OC_SITE_MANAGER, {255, 255, 255}, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE); + var template OML_PDU tr_nm_site_op_start := tr_OML_Opstart(NM_OC_SITE_MANAGER, {255, 255, 255}); + + f_init_vty(); + + f_vty_enter_config(BSCVTY); + f_vty_transceive(BSCVTY, "bsc"); + f_vty_transceive(BSCVTY, "bts-setup-ramping"); + f_vty_transceive(BSCVTY, "bts-setup-ramping-step-size 1"); + f_vty_transceive(BSCVTY, "bts-setup-ramping-step-interval 10"); + f_vty_transceive(BSCVTY, "end"); + + f_init_oml(testcasename(), 3); + + f_oml_send_swact(0); + f_oml_send_swact(1); + f_oml_send_swact(2); + f_sleep(1.0); + OML[0].send(ts_nm_site_change_event); + OML[1].send(ts_nm_site_change_event); + OML[2].send(ts_nm_site_change_event); + OML[0].receive(tr_nm_site_op_start); + + /* OML[2]: we expect at least no OP start for 7 seconds */ + timer T_no_op := 7.0; + /* OML[2] we expect at least the OP start within 13 seconds */ + timer T_op := 13.0; + alt { + [] OML[1].receive(tr_nm_site_op_start) { T_no_op.start; T_op.start; repeat; } + [] OML[2].receive(tr_nm_site_op_start) { + if (T_no_op.running) { + setverdict(fail, "OP Start came to early. T_no_op is still running"); + } else if (T_op.running) { + setverdict(pass); + } else { + setverdict(fail, "OP Start came far too early."); + } + } + [] T_op.timeout { setverdict(fail, "Timeout. No OP Start PDU for OML[2]."); } + } +} + +control { + /* execute( TC_oml_nothing() ); */ + execute( TC_oml_bts_setup_ramp() ); +} + +/* BTS: + * - Evt: Disabled/Locked + * - SW ACT + * - Evt: Disabled/Dependency + * - SET BTS ATTR + * - Opstart + * - Chg Adm State Unlocked + * - Evt: Disabled/Dependency/Unlocked + * - Evt: Enabled/0 (after last channel unlocked?) + */ + +/* Radio Carrier: + * - Evt: Disabled/Offline after SW ACT + * - Set Radio Carrier Attributes ? (->NACL) + * - Evt: Disabled/Dependency + * - Set Radio Carrier Attributes ? + * - Opstart + * - Chg Adm State Unlocked + * - Evt: + */ + +/* Baseband Transceiver: + * - Evt: Disabled/Locked + * - SW Activation + * - Evt: Disabled/Dependency after SW ACT + * - IPA RSL Connect + * - Opstart + * - Chg Admin Unlocked + * - Evt: Disabled/Dependency/Unlocked + */ + +/* Channel: + * - Evt: Not Installed/Locked + * - Evt: Disabled/Dependency (after SW ACT Rep on BB Transc) + * - Set Channel Attr + * - Opstart + * - Evt: Disabled/Offline + * - Chg Admin Unlocked + * - Evt: Disabled/OK/Unlocked + * - Evt: Enabled/OK (after BB TRANSC Opstart) + */ + +}; diff --git a/bsc/gen_links.sh b/bsc/gen_links.sh index f316509c2..538824daf 100755 --- a/bsc/gen_links.sh +++ b/bsc/gen_links.sh @@ -72,6 +72,7 @@ FILES+="CBSP_Types.ttcn CBSP_Templates.ttcn " FILES+="CBSP_CodecPort.ttcn CBSP_CodecPort_CtrlFunct.ttcn CBSP_CodecPort_CtrlFunctdef.cc CBSP_Adapter.ttcn " FILES+="StatsD_Types.ttcn StatsD_CodecPort.ttcn StatsD_CodecPort_CtrlFunct.ttcn StatsD_CodecPort_CtrlFunctdef.cc StatsD_Checker.ttcn " FILES+="BSSAP_LE_CodecPort.ttcn BSSAP_LE_Emulation.ttcn BSSAP_LE_Types.ttcn BSSAP_LE_Adapter.ttcn BSSLAP_Types.ttcn BSSMAP_LE_Templates.ttcn " +FILES+="AbisOML_Types.ttcn" gen_links $DIR $FILES diff --git a/bsc/regen_makefile.sh b/bsc/regen_makefile.sh index 9e69befa2..fc53e3044 100755 --- a/bsc/regen_makefile.sh +++ b/bsc/regen_makefile.sh @@ -27,6 +27,7 @@ export CPPFLAGS_TTCN3=" -DIPA_EMULATION_CTRL -DIPA_EMULATION_MGCP -DIPA_EMULATION_RSL + -DIPA_EMULATION_OML -DIPA_EMULATION_SCCP -DRAN_EMULATION_BSSAP -DRAN_EMULATION_CTRL