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
	};
	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);
	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 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) 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);
	g_pars_MME[0].start_fn := refers(f_mme_create_and_delete);
	g_pars_MME[0].exp_cbs_msg := valueof(msg);
	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_bsc_and_mme() );
}

}
