module CBC_Tests {

import from Osmocom_Types all;
import from Socket_API_Definitions all;

import from BSSAP_Types all;
import from BSSMAP_Templates all;
import from CBSP_Types all;
import from CBSP_Templates all;
import from CBSP_Adapter all;
import from CBSP_CodecPort all;

import from SABP_Types all;
import from SABP_Templates all;
import from SABP_IEs all;
import from SABP_PDU_Descriptions all;

import from SBC_AP_IEs all;
import from SBC_AP_Constants all;
import from SBC_AP_PDU_Contents all;
import from SBC_AP_PDU_Descriptions all;
import from SBC_AP_Types all;
import from SBC_AP_Templates all;
import from SBC_AP_CodecPort all;
import from SBC_AP_Adapter all;

import from HTTP_Adapter all;
import from HTTPmsg_Types all;
import from ECBE_Types all;

import from CBS_Message all;
import from ECBE_Components all;
import from BSC_ConnectionHandler all;
import from MME_ConnectionHandler all;

modulepar {
	charstring mp_cbc_host := "127.0.0.1";
	integer mp_cbc_cbsp_port := 48049;
	integer mp_cbc_sbcap_port := c_SBC_AP_PORT;
	integer mp_cbc_ecbe_port := 12345;
	integer mp_local_cbsp_port := 15000;
	integer mp_local_sbcap_port := 16000;
};

const integer MAX_BSC := 3;
const integer MAX_MME := 3;

type component test_CT extends CBSP_Adapter_CT, http_CT {
	var integer g_num_bsc;
	var integer g_num_mme;
	var BSC_ConnHdlr g_vc_conn_BSC[MAX_BSC];
	var MME_ConnHdlr g_vc_conn_MME[MAX_MME];
	var BSC_ConnHdlrPars g_pars_BSC[MAX_BSC];
	var MME_ConnHdlrPars g_pars_MME[MAX_MME];
};

private function f_shutdown_helper() runs on test_CT {
	/* Wait for all BSC cons to terminate */
	for (var integer i := 0; i < g_num_bsc; i := i + 1) {
		g_vc_conn_BSC[i].done;
	}
	/* Wait for all MME cons to terminate */
	for (var integer i := 0; i < g_num_mme; i := i + 1) {
		g_vc_conn_MME[i].done;
	}
	all component.stop;
	setverdict(pass);
	mtc.stop;
}

/*
 * BSC Conn Handler:
 */
private function f_BSC_ConnHdlr_start_fn_void() runs on BSC_ConnHdlr {
	log("Default start_fn() function called!");
}
private function f_init_pars_bsc(integer bsc_cbsp_port, charstring cbc_host, integer cbc_cbsp_port)
		runs on test_CT return BSC_ConnHdlrPars {
	var BSC_ConnHdlrPars pars := {
		bsc_cbsp_port := bsc_cbsp_port,
		cbc_host := cbc_host,
		cbc_cbsp_port := cbc_cbsp_port,
		start_fn := refers(f_BSC_ConnHdlr_start_fn_void),
		exp_cbs_msg := omit,
		cell_list_success := omit
	};
	return pars;
}

private function f_init_bsc(integer idx, charstring id) runs on test_CT return BSC_ConnHdlr {
	var BSC_ConnHdlr vc_conn;
	id := id & "-BSC" & int2str(idx);
	vc_conn := BSC_ConnHdlr.create(id) alive;
	g_pars_BSC[idx] := f_init_pars_bsc(mp_local_cbsp_port + idx, mp_cbc_host, mp_cbc_cbsp_port);
	return vc_conn;
}

private function f_start_bsc(integer idx, charstring id, BSC_ConnHdlrPars pars)
		runs on test_CT {
	id := id & "-BSC" & int2str(idx);
	g_vc_conn_BSC[idx] := f_init_bsc(idx, id);
	g_vc_conn_BSC[idx].start(f_BSC_ConnHdlr_main(id, pars));
}

/*
 * MME Conn Handler:
 */
private function f_MME_ConnHdlr_start_fn_void() runs on MME_ConnHdlr {
	log("Default start_fn() function called!");
}
private function f_init_pars_mme(integer mme_sbcap_port, charstring cbc_host, integer cbc_sbcap_port)
		runs on test_CT return MME_ConnHdlrPars {
	var MME_ConnHdlrPars pars := {
		mme_sbcap_port := mme_sbcap_port,
		cbc_host := cbc_host,
		cbc_sbcap_port := cbc_sbcap_port,
		start_fn := refers(f_MME_ConnHdlr_start_fn_void),
		exp_cbs_msg := omit,
		write_replace_warning_ind_cause := omit,
		bcast_cell_id_list := omit
	};
	return pars;
}

private function f_init_mme(integer idx, charstring id) runs on test_CT return MME_ConnHdlr {
	var MME_ConnHdlr vc_conn;
	id := id & "-MME" & int2str(idx);
	vc_conn := MME_ConnHdlr.create(id) alive;
	g_pars_MME[idx] := f_init_pars_mme(mp_local_sbcap_port + idx, mp_cbc_host, mp_cbc_sbcap_port);
	return vc_conn;
}

private function f_start_mme(integer idx, charstring id, MME_ConnHdlrPars pars)
		runs on test_CT {
	id := id & "-MME" & int2str(idx);
	g_vc_conn_MME[idx] := f_init_mme(idx, id);
	g_vc_conn_MME[idx].start(f_MME_ConnHdlr_main(id, pars));
}

private function f_init(integer num_bsc := 0, integer num_mme := 0) runs on test_CT {
	f_http_init(mp_cbc_host, mp_cbc_ecbe_port);

	g_num_bsc := num_bsc;
	for (var integer i := 0; i < g_num_bsc; i := i + 1) {
		g_vc_conn_BSC[i] := f_init_bsc(i, testcasename());
	}

	g_num_mme := num_mme;
	for (var integer i := 0; i < g_num_mme; i := i + 1) {
		g_vc_conn_MME[i] := f_init_mme(i, testcasename());
	}
}

function f_start() runs on test_CT {
	for (var integer i := 0; i < g_num_bsc; i := i + 1) {
		f_start_bsc(i, testcasename(), g_pars_BSC[i]);
	}
	for (var integer i := 0; i < g_num_mme; i := i + 1) {
		f_start_mme(i, testcasename(), g_pars_MME[i]);
	}
	f_sleep(2.0); /* wait all conns connected */
}

/* test whether or not we receive a valid KEEP-ALIVE from the CBC */
private function f_bsc_TC_rx_keepalive() runs on BSC_ConnHdlr {
	var CBSP_PDU rx;
	var CBSP_IE ie;
	rx := f_cbsp_exp(tr_CBSP_KEEP_ALIVE(?));
	f_cbsp_find_ie(rx, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, ie);
}
testcase TC_rx_keepalive() runs on test_CT {

	f_init(num_bsc := 1);
	g_pars_BSC[0].start_fn := refers(f_bsc_TC_rx_keepalive);
	f_start();
	f_shutdown_helper();
}

/* test whether CBC terminates connection if KEEP-ALIVE is not answered by BSC */
private function f_bsc_TC_rx_keepalive_timeout() runs on BSC_ConnHdlr {
	var CBSP_PDU rx;
	var CBSP_IE ie;
	var integer ka_rep_per_s;

	rx := f_cbsp_exp(tr_CBSP_KEEP_ALIVE(?));
	f_cbsp_find_ie(rx, CBSP_IEI_KEEP_ALIVE_REP_PERIOD, ie);

	/* sleep for longer than the keep-alive period */
	ka_rep_per_s := f_cbsp_period2s(ie.body.keep_alive_rep_period);
	f_sleep(int2float(ka_rep_per_s + 5));

	/* expect the CBSP connection to be closed */
	CBSP[0].receive(PortEvent:{connClosed:=?})
}
testcase TC_rx_keepalive_timeout() runs on test_CT {
	f_init(num_bsc := 1);
	g_pars_BSC[0].start_fn := refers(f_bsc_TC_rx_keepalive_timeout);
	f_start();
	f_shutdown_helper();
}

private const BSSMAP_FIELD_CellIdentificationList cil_BSS := {
	cIl_allInBSS := ''O
};
private function f_bsc_TC_write_replace() runs on BSC_ConnHdlr {
	f_cbsp_handle_write(g_pars.exp_cbs_msg);
	f_sleep(100.0);
}
testcase TC_write_replace() runs on test_CT {
	var CBS_Message msg := {
		msg_id := 42,
		ser_nr := 16752,
		old_ser_nr := omit,
		cell_list := cil_BSS,
		channel_ind := 0,
		category := CBSP_CATEG_NORMAL,
		rep_period := 5,
		num_bcast_req := 3,
		dcs := 1,
		content := {
			{ '00'O, 1 }
		}
	};

	f_init(num_bsc := 1);
	g_pars_BSC[0].exp_cbs_msg := msg;
	g_pars_BSC[0].start_fn := refers(f_bsc_TC_write_replace);
	f_start();
	f_shutdown_helper();
}

testcase TC_selftest() runs on test_CT {
	const octetstring c_load_q := '0700000d0400080000f110012345671200'O;
	const octetstring c_load_q_compl := '0800000f0a000a0000f1100123456700001200'O;
	const octetstring c_reset := '1000000b0400080000f11001234567'O;
	const octetstring c_reset_compl := '1100000b0400080000f11001234567'O;
	const octetstring c_msg_sts_q := '0a0000130e022b0200000400080000f110012345671200'O;
	const octetstring c_msg_sts_q_fail := '0c0000140e022b0200000900090000f11001234567021200'O;
	const octetstring c_kill := '040000110e00000200000400080000f11001234567'O;
	const octetstring c_kill_fail := '060000120e00000200000900090000f1100123456702'O;
	const octetstring c_write_repl := '010000c70e022b0300300400080000f110012345671200050006000407000613020c400107f4f29c9e769f5de337b90c921d1b8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d100'O;
	const octetstring c_write_repl_compl := '020000130e022b0300300400080000f110012345671200'O;
	const octetstring c_write_repl_fail := '030000140e022b0300300900090000f110012345670d1200'O;
	const octetstring c_msg_s_q := '0a0000130e022b0200900400080000f110012345671200'O;
	const octetstring c_msg_s_q_compl := '0b0000160e022b02009008000b0000f110012345670008001200'O;
	const octetstring c_kill_compl := '050000160e022b02008008000b0000f110012345670006001200'O;

	log(dec_CBSP_PDU(c_load_q));
	log(dec_CBSP_PDU(c_load_q_compl));
	log(dec_CBSP_PDU(c_reset));
	log(dec_CBSP_PDU(c_reset_compl));
	log(dec_CBSP_PDU(c_msg_sts_q));
	log(dec_CBSP_PDU(c_msg_sts_q_fail));
	log(dec_CBSP_PDU(c_kill));
	log(dec_CBSP_PDU(c_kill_fail));
	log(dec_CBSP_PDU(c_write_repl));
	log(dec_CBSP_PDU(c_write_repl_compl));
	log(dec_CBSP_PDU(c_write_repl_fail));
	log(dec_CBSP_PDU(c_msg_s_q));
	log(dec_CBSP_PDU(c_msg_s_q_compl));
	log(dec_CBSP_PDU(c_kill_compl));
}

testcase TC_selftest_sabp() runs on test_CT {
	const octetstring c_write := '00000080930000080006000211120007000240c0000f0010000113f0030282ec0613f0030282ec070001400100000d0002012a000900020000000400010100000056029f01b4d90d064297d9ec37e8fe96b3c9a0303bdd68341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d168341a8d46a3d10012'O;

	log(dec_SABP_PDU(c_write));
	log(enc_SABP_PDU(dec_SABP_PDU(c_write)));

	var template (value) Service_Areas_List sa_list := {
		ts_SabpSai('62F224'O, '0023'O, '0042'O)
	};
	var template (value) SABP_PDU tx;

	tx := ts_SABP_Write(int2bit(1, 16), int2bit(1, 16), sa_list, 23, 42, '00000000'B, '01011010'B);
	log("Write: ", enc_SABP_PDU(valueof(tx)))

	var Service_Areas_List sa_list2 := { valueof(ts_SabpSai('62F224'O, '1000'O, '0042'O)) };
	for (var integer i := 0; i < 2500; i := i+1) {
		sa_list2 := sa_list2 & {valueof(ts_SabpSai('62F224'O, '2000'O, int2oct(i,2))) };
	}
	tx := ts_SABP_Write(int2bit(2, 16), int2bit(2, 16), sa_list2, 23, 42, '00000000'B, '01011010'B);
	log("Write: ", enc_SABP_PDU(valueof(tx)))

	tx := ts_SABP_Restart(sa_list);
	log("Restart: ", enc_SABP_PDU(valueof(tx)));
}

private function f_bsc_create_and_delete() runs on BSC_ConnHdlr {
	var template (omit) BSSMAP_FIELD_CellIdentificationList cell_list_success := omit;
	if (ispresent(g_pars.cell_list_success)) {
		cell_list_success := g_pars.cell_list_success;
	}
	f_cbsp_handle_write(g_pars.exp_cbs_msg, 0, cell_list_success);
	f_cbsp_handle_kill(0, g_pars.exp_cbs_msg.msg_id, g_pars.exp_cbs_msg.ser_nr,
			   exp_list:=cell_list_success, tx_list:=cell_list_success,
			   tx_fail_list:=omit, tx_compl_list:=omit,
			   channel_ind:=g_pars.exp_cbs_msg.channel_ind);
}

private function f_mme_create_and_delete() runs on MME_ConnHdlr {
	f_sbcap_handle_write_replace_warn_req(g_pars.exp_cbs_msg, 0);
	if (ispresent(g_pars.write_replace_warning_ind_cause) and
	    ispresent(g_pars.bcast_cell_id_list)) {
		f_sbcap_tx_write_replace_warn_ind(0, g_pars.exp_cbs_msg,
						  g_pars.write_replace_warning_ind_cause,
						  g_pars.bcast_cell_id_list)
	}
	f_sbcap_handle_stop_warn_req(0, g_pars.exp_cbs_msg);
}

function f_create_and_delete(CBS_Message msg)
runs on test_CT {
	var EcbeCbcMessage ecbe := f_cbs2ecbe(msg, "TTCN-3");
	f_ecbe_tx_post_cbs(ecbe);
	f_ecbe_rx_resp(201);

	f_sleep(2.0);

	f_ecbe_tx_delete_cbs(msg.msg_id);
	f_ecbe_rx_resp(200);
}

private template (value) CBS_Message t_CBSmsg(uint16_t msg_id, uint16_t ser_nr) := {
	msg_id := msg_id,
	ser_nr := ser_nr,
	old_ser_nr := omit,
	cell_list := cil_BSS,
	channel_ind := 0,
	category := CBSP_CATEG_NORMAL,
	rep_period := 5,
	num_bcast_req := 3,
	dcs := 1,
	content := {
		{ '00'O, 1 }
	}
};

/* specify a variety of different Cell Identifier formats to extend test coverage */
testcase TC_ecbe_create_delete_cgi() runs on test_CT {
	f_init(num_bsc := 1);
	var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;
	var template (value) CBS_Message msg := t_CBSmsg(43, 16752);

	cell_list_success := ts_BSSMAP_CIL_CGI({
		ts_BSSMAP_CI_CGI('901'H, '70'H, 23, 42),
		ts_BSSMAP_CI_CGI('901'H, '70'H, 24, 42),
		ts_BSSMAP_CI_CGI('901'H, '70'H, 24, 43)
	});
	g_pars_BSC[0].start_fn := refers(f_bsc_create_and_delete);
	g_pars_BSC[0].exp_cbs_msg := valueof(msg);
	g_pars_BSC[0].cell_list_success := valueof(cell_list_success);
	f_start();
	f_create_and_delete(valueof(msg));
	f_shutdown_helper();
}
testcase TC_ecbe_create_delete_lac_ci() runs on test_CT {
	f_init(num_bsc := 1);
	var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;
	var template (value) CBS_Message msg := t_CBSmsg(44, 16752);
	cell_list_success := ts_BSSMAP_CIL_LAC_CI({
		ts_BSSMAP_CI_LAC_CI(10001, 50001),
		ts_BSSMAP_CI_LAC_CI(10002, 50002),
		ts_BSSMAP_CI_LAC_CI(10003, 50003)
	});
	g_pars_BSC[0].start_fn := refers(f_bsc_create_and_delete);
	g_pars_BSC[0].exp_cbs_msg := valueof(msg);
	g_pars_BSC[0].cell_list_success := valueof(cell_list_success);
	f_start();
	f_create_and_delete(valueof(msg));
	f_shutdown_helper();
}
testcase TC_ecbe_create_delete_lac() runs on test_CT {
	f_init(num_bsc := 1);
	var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;
	var template (value) CBS_Message msg := t_CBSmsg(45, 16752);
	cell_list_success := ts_BSSMAP_CIL_LAC({
		ts_BSSMAP_CI_LAC(10001),
		ts_BSSMAP_CI_LAC(10002),
		ts_BSSMAP_CI_LAC(10003)
	});
	g_pars_BSC[0].start_fn := refers(f_bsc_create_and_delete);
	g_pars_BSC[0].exp_cbs_msg := valueof(msg);
	g_pars_BSC[0].cell_list_success := valueof(cell_list_success);
	f_start();
	f_create_and_delete(valueof(msg));
	f_shutdown_helper();
}
testcase TC_ecbe_create_delete_ci() runs on test_CT {
	f_init(num_bsc := 1);
	var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;
	var template (value) CBS_Message msg := t_CBSmsg(46, 16752);
	cell_list_success := ts_BSSMAP_CIL_CI({
		ts_BSSMAP_CI_CI(50001),
		ts_BSSMAP_CI_CI(50002),
		ts_BSSMAP_CI_CI(50003)
	});
	g_pars_BSC[0].start_fn := refers(f_bsc_create_and_delete);
	g_pars_BSC[0].exp_cbs_msg := valueof(msg);
	g_pars_BSC[0].cell_list_success := valueof(cell_list_success);
	f_start();
	f_create_and_delete(valueof(msg));
	f_shutdown_helper();
}
testcase TC_ecbe_create_delete_lai() runs on test_CT {
	f_init(num_bsc := 1);
	var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;
	var template (value) CBS_Message msg := t_CBSmsg(47, 16752);
	cell_list_success := ts_BSSMAP_CIL_LAI({
		ts_BSSMAP_CI_LAI('901'H, '70'H, 25),
		ts_BSSMAP_CI_LAI('901'H, '70'H, 26),
		ts_BSSMAP_CI_LAI('901'H, '70'H, 27)
	});
	g_pars_BSC[0].start_fn := refers(f_bsc_create_and_delete);
	g_pars_BSC[0].exp_cbs_msg := valueof(msg);
	g_pars_BSC[0].cell_list_success := valueof(cell_list_success);
	f_start();
	f_create_and_delete(valueof(msg));
	f_shutdown_helper();
}

/* Create and delete message with MME available. MME reports
 * Write-Replace-Warning-Indication and Stop-Warning-Indication to CBC
 */
testcase TC_ecbe_create_delete_mme_indication() runs on test_CT {
	var template (value) CellId_Broadcast_List bcast_cell_id_li;
	var template (value) CBS_Message msg := t_CBSmsg(48, 16752);

	f_init(num_bsc := 0, num_mme := 1);

	bcast_cell_id_li := {
		ts_SBCAP_CellId_Broadcast_List_Item(ts_SBCAP_ECGI(f_enc_mcc_mnc('901'H, '70'H), 1234)),
		ts_SBCAP_CellId_Broadcast_List_Item(ts_SBCAP_ECGI(f_enc_mcc_mnc('901'H, '70'H), 5678))
	};
	g_pars_MME[0].start_fn := refers(f_mme_create_and_delete);
	g_pars_MME[0].exp_cbs_msg := valueof(msg);
	g_pars_MME[0].write_replace_warning_ind_cause := SBC_AP_Cause_message_accepted;
	g_pars_MME[0].bcast_cell_id_list := valueof(bcast_cell_id_li);
	f_start();
	f_create_and_delete(valueof(msg));
	f_shutdown_helper();
}

/* Create and delete message with both BSC and MME available */
testcase TC_ecbe_create_delete_bsc_and_mme() runs on test_CT {
	f_init(num_bsc := 1, num_mme := 1);
	var template (value) BSSMAP_FIELD_CellIdentificationList cell_list_success;
	var template (value) CellId_Broadcast_List bcast_cell_id_li;
	var template (value) CBS_Message msg := t_CBSmsg(43, 16752);

	cell_list_success := ts_BSSMAP_CIL_CGI({
		ts_BSSMAP_CI_CGI('901'H, '70'H, 23, 42),
		ts_BSSMAP_CI_CGI('901'H, '70'H, 24, 42),
		ts_BSSMAP_CI_CGI('901'H, '70'H, 24, 43)
	});
	g_pars_BSC[0].start_fn := refers(f_bsc_create_and_delete);
	g_pars_BSC[0].exp_cbs_msg := valueof(msg);
	g_pars_BSC[0].cell_list_success := valueof(cell_list_success);

	bcast_cell_id_li := {
		ts_SBCAP_CellId_Broadcast_List_Item(ts_SBCAP_ECGI(f_enc_mcc_mnc('901'H, '70'H), 1234))
	};
	g_pars_MME[0].start_fn := refers(f_mme_create_and_delete);
	g_pars_MME[0].exp_cbs_msg := valueof(msg);
	g_pars_MME[0].write_replace_warning_ind_cause := SBC_AP_Cause_message_accepted;
	g_pars_MME[0].bcast_cell_id_list := valueof(bcast_cell_id_li);
	f_start();
	f_create_and_delete(valueof(msg));
	f_shutdown_helper();
}

control {
	execute( TC_rx_keepalive() );
	execute( TC_rx_keepalive_timeout() );
	execute( TC_ecbe_create_delete_cgi() );
	execute( TC_ecbe_create_delete_lac_ci() );
	execute( TC_ecbe_create_delete_lac() );
	execute( TC_ecbe_create_delete_ci() );
	execute( TC_ecbe_create_delete_lai() );
	execute( TC_ecbe_create_delete_mme_indication() );
	execute( TC_ecbe_create_delete_bsc_and_mme() );
}

}
