module BTS_Tests_OML {

/* Integration Tests for OsmoBTS A-bis OML (Organization & Maintenance Link)
 *
 * (C) 2019 by Harald Welte <laforge@gnumonks.org>
 * 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
 */

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;

const integer NUM_TRX := 8;

type record of uint16_t ArfcnList;

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_InterfLevBoundaries mp_interf_bound := { 85, 91, 97, 103, 109, 115 };
	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;
};

/* BSC side OML component */
type component BSC_OML_CT {
	/* IPA emulation component underneath OML */
	var IPA_Emulation_CT vc_IPA_OML;
	/* Port for OML */
	port IPA_OML_PT OML;
	var uint8_t g_bts_nr := 0;

	/* global test case guard timer */
	timer T_oml_guard := 60.0;
};

private altstep as_Tguard() runs on BSC_OML_CT {
	[] T_oml_guard.timeout {
		setverdict(fail, "Timeout of T_guard");
		mtc.stop;
		}
}

private altstep as_SwAct() runs on BSC_OML_CT {
	var OML_PDU rx;
	[] OML.receive(tr_OML_SwActReq(?, ?, ?, ?)) -> value rx {
		var OML_FOM_ObjectClass obj_class := rx.u.fom.hdr.obj_class;
		var OML_FOM_ObjectInstance obj_inst := rx.u.fom.hdr.obj_inst;

		/* acknowledge the activate request */
		OML.send(f_OML_make_ack(rx));
		var octetstring file_id := ''O;
		var octetstring sw_desc := ''O;

		/* Request activation of software and check for ACK */
		OML.send(ts_OML_ActivateSw(obj_class, obj_inst, file_id, sw_desc));
		interleave {
		[] OML.receive(tr_OML_ActivateSwACK(obj_class, obj_inst, file_id, sw_desc));
		[] OML.receive(tr_OML_SwActivatedRep(obj_class, obj_inst));
		}
		repeat;
		}
}

private altstep as_IPA_evt() runs on BSC_OML_CT {
	var ASP_IPA_Event evt;
	[] OML.receive(ASP_IPA_Event:?) -> value evt {
		log("Ignoring ", evt);
		repeat;
		}
}

function f_init_oml(charstring id) runs on BSC_OML_CT {
	vc_IPA_OML := IPA_Emulation_CT.create(id & "-OML-IPA");
	map(vc_IPA_OML:IPA_PORT, system:IPA_CODEC_PT);
	connect(vc_IPA_OML:IPA_OML_PORT, self:OML);
	vc_IPA_OML.start(IPA_Emulation.main_server(mp_oml_ip, mp_oml_port));

	T_oml_guard.start;
	activate(as_Tguard());

	OML.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP));
	//OML.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK));

	activate(as_SwAct());
	activate(as_IPA_evt());
}


/* Perform an "OPSTART" procedure with the speciifed MO" */
private function f_oml_opstart(template (value) OML_FOM_ObjectClass obj_class,
				template (value) OML_FOM_ObjectInstance obj_inst,
				boolean exp_fail := false)
runs on BSC_OML_CT {
	OML.send(ts_OML_Opstart(obj_class, obj_inst));
	alt {
	[not exp_fail] OML.receive(tr_OML_OpstartACK(obj_class, obj_inst)) {
		setverdict(pass);
		}
	[not exp_fail] OML.receive(tr_OML_OpstartNACK(obj_class, obj_inst)) {
		setverdict(fail, "Unexpected OPSTART NACK for ", obj_class, " ", obj_inst);
		}
	[exp_fail] OML.receive(tr_OML_OpstartACK(obj_class, obj_inst)) {
		setverdict(fail, "Unexpected OPSTART ACK for ", obj_class, " ", obj_inst);
		}
	[exp_fail] OML.receive(tr_OML_OpstartNACK(obj_class, obj_inst)) {
		setverdict(pass);
		}
	[] OML.receive { repeat; }
	}
}

/* Perform a "CHANGE ADMINISTRATIVE STATE" procedure with the speciifed MO" */
private function f_oml_chg_adm_st(template (value) OML_FOM_ObjectClass obj_class,
				  template (value) OML_FOM_ObjectInstance obj_inst,
				  template (value) OML_FOM_AdministrativeState adm_st,
				  boolean exp_fail := false)
runs on BSC_OML_CT {
	OML.send(ts_OML_ChangeAdmState(obj_class, obj_inst, adm_st));
	alt {
	[not exp_fail] OML.receive(tr_OML_ChangeAdmStateACK(obj_class, obj_inst, adm_st)) {
		setverdict(pass);
		}
	[not exp_fail] OML.receive(tr_OML_ChangeAdmStateNACK(obj_class, obj_inst)) {
		setverdict(fail, "Unexpected CHANGE ADM STATE NACK for ", obj_class, " ", obj_inst);
		}
	[exp_fail] OML.receive(tr_OML_ChangeAdmStateACK(obj_class, obj_inst, adm_st)) {
		setverdict(fail, "Unexpected CHANGE ADM STATE ACK for ", obj_class, " ", obj_inst);
		}
	[exp_fail] OML.receive(tr_OML_ChangeAdmStateNACK(obj_class, obj_inst)) {
		setverdict(pass);
		}
	[] OML.receive { repeat; }
	}
}

/* Perform a "SET RADIO CARRIER ATTRIBUTES" procedure with the BTS */
private function f_oml_radio_attr(uint8_t trx_nr)
runs on BSC_OML_CT {
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, trx_nr, 255));
	var OML_PDU cmd := valueof(ts_OML_SetRadioAttr(obj_inst, 0, {mp_arfcn[trx_nr]}));
	var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
	var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
	var OML_PDU rx;

	OML.send(cmd);
	alt {
	[] OML.receive(exp_ack) -> value rx {
		setverdict(pass);
		}
	[] OML.receive(exp_nack) -> value rx {
		setverdict(fail, "SET RADIO CARRIER ATTRIBUTES NACK ", exp_nack);
		}
	[] OML.receive(tr_OML_MsgType(NM_MT_SET_RADIO_ATTR_ACK, NM_OC_RADIO_CARRIER, obj_inst, omit)) {
		setverdict(fail, "SET RADIO CARRIER ATTRIBUTES ACK without IEs");
		}
	[] OML.receive { repeat; }
	}
}

/* Perform a "SET CHANNEL ATTRIBUTES" procedure with the BTS */
private function f_oml_ts_attr(uint8_t trx_nr, uint8_t ts_nr)
runs on BSC_OML_CT {
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, trx_nr, ts_nr));
	var OML_PDU cmd := valueof(ts_OML_SetChanAttr(obj_inst, NM_CHANC_TCHFull, tsc := 7));
	var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
	var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
	var OML_PDU rx;

	OML.send(cmd);
	alt {
	[] OML.receive(exp_ack) -> value rx {
		setverdict(pass);
		}
	[] OML.receive(exp_nack) -> value rx {
		setverdict(fail, "SET CHANNEL ATTRIBUTES NACK ", exp_nack);
		}
	[] OML.receive(tr_OML_MsgType(NM_MT_SET_CHAN_ATTR_ACK, NM_OC_CHANNEL, obj_inst, omit)) {
		setverdict(fail, "SET CHANNEL ATTRIBUTES ACK without IEs");
		}
	[] OML.receive { repeat; }
	}

}

/* Perform a "SET BTS ATTRIBUTES" procedure with the BTS */
private function f_oml_bts_attr()
runs on BSC_OML_CT {
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
	var template (value) OML_FOM_IE_List ies := {
		ts_OML_IE(NM_ATT_INTERF_BOUND, OML_FOM_IE_Body:{interf_bound:=mp_interf_bound}),
		ts_OML_IE(NM_ATT_BCCH_ARFCN, OML_FOM_IE_Body:{bcch_arfcn:=mp_arfcn[0]}),
		ts_OML_IE(NM_ATT_CONN_FAIL_CRIT, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(2, '0120'O)}),
		ts_OML_IE(NM_ATT_T200, OML_FOM_IE_Body:{t200 := mp_t200}),
		ts_OML_IE(NM_ATT_MAX_TA, OML_FOM_IE_Body:{max_ta := mp_max_ta}),
		ts_OML_IE(NM_ATT_OVERL_PERIOD, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(1, '0a'O)}),
		ts_OML_IE(NM_ATT_CCCH_L_T, OML_FOM_IE_Body:{load_threshold := mp_load_threshold}),
		ts_OML_IE(NM_ATT_CCCH_L_I_P, OML_FOM_IE_Body:{load_ind_period := mp_load_ind_period}),
		ts_OML_IE(NM_ATT_RACH_B_THRESH, OML_FOM_IE_Body:{rach_b_thresh := mp_rach_b_thresh}),
		ts_OML_IE(NM_ATT_LDAVG_SLOTS,  OML_FOM_IE_Body:{loadavg_slots := mp_loadavg_slots}),
		ts_OML_IE(NM_ATT_BTS_AIR_TIMER, OML_FOM_IE_Body:{air_timer := mp_air_timer}),
		ts_OML_IE(NM_ATT_NY1, OML_FOM_IE_Body:{ny1 := mp_ny1}),
		ts_OML_IE(NM_ATT_BSIC, OML_FOM_IE_Body:{bsic := mp_bsic})
		//ts_OML_IE(NM_ATT_IPACC_CGI, ...)
		};
	var OML_PDU cmd := valueof(ts_OML_SetBtsAttr(obj_inst, ies));
	var template OML_PDU exp_ack := f_OML_make_ack_exp(cmd);
	var template OML_PDU exp_nack := f_OML_make_nack_exp(cmd, ?);
	var OML_PDU rx;

	OML.send(cmd);
	alt {
	[] OML.receive(exp_ack) -> value rx {
		setverdict(pass);
		}
	[] OML.receive(exp_nack) -> value rx {
		setverdict(fail, "SET BTS ATTRIBUTES NACK ", exp_nack);
		}

	[] OML.receive(tr_OML_MsgType(NM_MT_SET_BTS_ATTR_ACK, NM_OC_BTS, obj_inst, omit)) {
		setverdict(fail, "SET BTS ATTRIBUTES ACK without IEs");
		}
	[] OML.receive { repeat; }
	}
}

/* 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) runs on BSC_OML_CT
{
	timer T := 5.0;

	OML.send(tx);
	T.start;
	alt {
	[] OML.receive {
		setverdict(fail, err_msg);
		}
	[] T.timeout {
		setverdict(pass);
		}
	}
}

private function f_oml_exp_rx(template OML_PDU exp_rx, charstring err_msg) runs on BSC_OML_CT
{
	timer T := 5.0;
	T.start;
	alt {
	[] OML.receive(exp_rx) {
		setverdict(pass);
		}
	[] OML.receive { repeat; }
	[] T.timeout {
		setverdict(fail, "Timeout waiting for ", err_msg);
		}
	}
}

/* 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) runs on BSC_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.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) runs on BSC_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.send(tx);
	T.start;
	alt {
	[] OML.receive(exp_ack) -> value rx {
		setverdict(fail, "Unexpected ACK ", rx);
		}
	[] OML.receive(exp_nack) -> value rx {
		setverdict(pass);
		}
	[] OML.receive { repeat; }
	[] T.timeout {
		setverdict(fail, "Timeout waiting for NACK ", exp_nack);
		}
	}
}






testcase TC_oml_selftest() runs on BSC_OML_CT {
	const octetstring state_chg_bts := '8080000d610100ffff'O & '2401'O & '07000107'O & '0401'O;
	const octetstring set_attr_bts := '80800033410100ffff19555b61676d7318060e00020110331e2424a83421a81f3f2500010a0c1e0b642a0a2b03e80a80230a08007b0920'O
	const octetstring set_attr_radio := '8080000c44020000ff2d00050002007b'O;
	const octetstring set_attr_ts0 := '8080000947030000000d074000'O;
	const octetstring ipa_rsl_connect := '1080000a0d636f6d2e697061636365737300e0040000ff8500810bbb'O;

	log(dec_OML_PDU(state_chg_bts));
	log(dec_OML_PDU(set_attr_bts));
	log(dec_OML_PDU(set_attr_radio));
	log(dec_OML_PDU(set_attr_ts0));
	log(dec_OML_PDU(ipa_rsl_connect));
};

testcase TC_oml_nothing() runs on BSC_OML_CT {
	f_init_oml(testcasename());
	f_sleep(100.0);
}

/* test behavior for unsupported message discriminator */
testcase TC_wrong_mdisc() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_PDU mmi_pdu := {
		mdisc := ABIS_OM_MDISC_MMI,
		placement := ABIS_OM_PLACEMENT_ONLY,
		sequence := 0,
		u := {
			other := '01020304'O
		}
	};

	f_oml_send_exp_fail_rep(mmi_pdu, "Unexpected response to MMI message");
}

/* send a message of unknown/unsupported type */
testcase TC_wrong_msgtype() runs on BSC_OML_CT {
	f_init_oml(testcasename());
	var OML_PDU tx := valueof(ts_OML_MsgType(NM_MT_ESTABLISH_TEI, NM_OC_BTS,
						 ts_OML_ObjectInstance(0, 255, 255), omit));
	f_oml_send_exp_fail_rep(tx, "ESTABLISH_TEI");
}

/* send message shorter than OML header length indicates */
testcase TC_short_length() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	/* Send "Change Adm State (Locked) to BTS, but with length 09 instead of 07 */
	OML.send('80800009690100ffff0401'O);

	template OML_PDU exp_fail := tr_OML_FailureEvtRep(NM_OC_BTS,
							  ts_OML_ObjectInstance(0, 255, 255),
							  ?, ?, ?);
	f_oml_exp_rx(exp_fail, "Failure Event Report");
}

/* send message longer than OML header length indicates */
testcase TC_long_length() runs on BSC_OML_CT {
	f_init_oml(testcasename());
	/* Send "Change Adm State (Locked) to BTS, but with two extra bytes at the end */
	OML.send('80800007690100ffff04010402'O);

	template OML_PDU exp :=
		tr_OML_ChangeAdmStateACK(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
					 NM_STATE_LOCKED);
	f_oml_exp_rx(exp, "Change ADM State ACK");
}

/* test behavior for unsupported placement (!= ONLY) */
testcase TC_wrong_placement() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_BTS
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));

	var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));

	pdu.placement := ABIS_OM_PLACEMENT_FIRST;
	f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_FIRST");

	pdu.placement := ABIS_OM_PLACEMENT_MIDDLE;
	f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_MIDDLE");

	pdu.placement := ABIS_OM_PLACEMENT_LAST;
	f_oml_send_exp_fail_rep(pdu, "Unexpected response to PLACEMENT_LAST");
}

/* test behavior for sequence != 0 (invalid if mdisc == ONLY) */
testcase TC_wrong_seq() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
	var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));

	OML.clear;

	pdu.sequence := 23;
	f_oml_send_exp_fail_rep(pdu, "Unexpected response to sequence != 0");
}

/* test behavior for unsupported obj_class */
testcase TC_wrong_obj_class() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));
	var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));
	pdu.u.fom.hdr.obj_class := NM_OC_NULL;

	/* NM_NACK_OBJCLASS_INVAL */
	f_oml_send_exp_nack(pdu, NM_NACK_OBJCLASS_NOTSUPP);
}

/* test behavior for wrong BTS number in object instance */
testcase TC_wrong_bts_nr() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(250, 255, 255));
	var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));

	f_oml_send_exp_nack(pdu, NM_NACK_BTSNR_UNKN);
}

/* test behavior for wrong TRX number in object instance */
testcase TC_wrong_trx_nr() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 250, 255));
	var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));

	f_oml_send_exp_nack(pdu, NM_NACK_TRXNR_UNKN);
}

/* test behavior for wrong TS number in object instance */
testcase TC_wrong_ts_nr() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 250));
	var OML_PDU pdu := valueof(ts_OML_ChangeAdmState(obj_class, obj_inst, NM_STATE_LOCKED));

	f_oml_send_exp_nack(pdu, NM_NACK_OBJINST_UNKN);
}

/* RADIO CARRIER: Test OPSTART with SET BTS ATTRIBUTES; expect ACK */
testcase TC_radio_carrier_opstart() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 255));

	f_oml_radio_attr(0);
	f_oml_opstart(obj_class, obj_inst);
}

/* RADIO CARRIER: Test OPSTART without SET BTS ATTRIBUTES; expect NACK */
testcase TC_radio_carrier_opstart_noattr() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_RADIO_CARRIER;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 255));

	/* we are *not* setting any attributes here */
	f_oml_opstart(obj_class, obj_inst, exp_fail := true);
}


/* BTS: Test OPSTART after SET BTS ATTRIBUTES; expect ACK */
testcase TC_bts_opstart() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));

	f_oml_bts_attr();
	f_oml_opstart(obj_class, obj_inst);
}


/* BTS: Test OPSTART without SET BTS ATTRIBUTES; expect NACK */
testcase TC_bts_opstart_noattr() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_BTS;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 255, 255));

	/* we are *not* setting any attributes here */
	f_oml_opstart(obj_class, obj_inst, exp_fail := true);
}

/* CHANNEL: Test OPSTART after SET CHANNEL ATTRIBUTES; expect ACK */
testcase TC_ts_opstart() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_CHANNEL;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 1));

	f_oml_ts_attr(trx_nr := 0, ts_nr := 1);
	f_oml_opstart(obj_class, obj_inst);
}


/* CHANNEL: Test OPSTART without SET CHANNEL ATTRIBUTES; expect NACK */
testcase TC_ts_opstart_noattr() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	var OML_FOM_ObjectClass obj_class := NM_OC_CHANNEL;
	var OML_FOM_ObjectInstance obj_inst := valueof(ts_OML_ObjectInstance(g_bts_nr, 0, 1));

	/* we are *not* setting any attributes here */
	f_oml_opstart(obj_class, obj_inst, exp_fail := true);
}

/* Ensure the initial Event State Change Reports after OML connect match our expectation */
testcase TC_initial_state_reports() runs on BSC_OML_CT {
	f_init_oml(testcasename());

	interleave {
	[] OML.receive(tr_OML_StateChgEvtRep(NM_OC_SITE_MANAGER, ts_OML_ObjectInstance(255, 255, 255),
					     NM_OPSTATE_ENABLED, NM_AVSTATE_OK));
	[] OML.receive(tr_OML_StateChgEvtRep(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
					     NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY));
	[] OML.receive(tr_OML_StateChgEvtRep(NM_OC_BTS, ts_OML_ObjectInstance(0, 255, 255),
					     NM_OPSTATE_DISABLED, NM_AVSTATE_DEPENDENCY));
	}
}


control {
	execute( TC_wrong_mdisc() );
	execute( TC_wrong_msgtype() );
	execute( TC_short_length() );
	execute( TC_long_length() );
	execute( TC_wrong_placement() );
	execute( TC_wrong_seq() );
	execute( TC_wrong_obj_class() );
	execute( TC_wrong_bts_nr() );
	execute( TC_wrong_trx_nr() );
	execute( TC_radio_carrier_opstart_noattr() );
	execute( TC_bts_opstart() );
	execute( TC_bts_opstart_noattr() );
	execute( TC_ts_opstart() );
	execute( TC_ts_opstart_noattr() );
	execute( TC_initial_state_reports() );
}

/* 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)
 */

};
