module SMLC_Tests {

/* Integration Tests for OsmoSMLC
 * (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
 * 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
 *
 * This test suite tests OsmoSMLC while emulating both multiple BTS + MS as
 * well as the MSC. See README for more details.
 *
 * There are test cases that run in so-called 'handler mode' and test cases
 * that run directly on top of the BSSAP and RSL CodecPorts.  The "handler mode"
 * tests abstract the multiplexing/demultiplexing of multiple SCCP connections
 * and/or RSL channels and are hence suitable for higher-level test cases, while
 * the "raw" tests directly on top of the CodecPorts are more suitable for lower-
 * level testing.
 */

import from Misc_Helpers all;
import from General_Types all;
import from Osmocom_Types all;

import from BSSAP_LE_Adapter all;
import from BSSAP_LE_CodecPort all;
import from BSSAP_LE_Types all;
import from BSSAP_LE_Emulation all;
import from BSSMAP_LE_Templates all;
import from BSSLAP_Types all;

import from BSSAP_Types all;
import from BSSMAP_Templates all;

import from Osmocom_CTRL_Functions all;
import from Osmocom_CTRL_Types all;
import from Osmocom_CTRL_Adapter all;

import from Osmocom_VTY_Functions all;
import from TELNETasp_PortType all;

import from SCCP_Templates all;

import from SCCPasp_Types all;

import from BSC_ConnectionHandler all;

const integer NUM_BSC := 1;

/* Default list of counters for 'smlc' */
const CounterNameVals counternames_bsc := {
	{ "foo:bar", 0 }
};

type component test_CT extends CTRL_Adapter_CT {
	var BSSAP_LE_Adapter g_bssap_le[NUM_BSC];
	port BSSAP_LE_CODEC_PT BSSAP_LE;

	port TELNETasp_PT SMLCVTY;

	/* are we initialized yet */
	var boolean g_initialized := false;

	/*Configure T(tias) over VTY, seconds */
	var integer g_smlc_sccp_timer_ias :=  7 * 60;
	/*Configure T(tiar) over VTY, seconds */
	var integer g_smlc_sccp_timer_iar := 15 * 60;

	/* global test case guard timer (actual timeout value is set in f_init()) */
	timer T_guard := 30.0;

	var CounterNameValsList g_ctr_smlc;
	var CounterNameValsList g_ctr_bsc;

}

type record of BSSAP_LE_Configuration BSSAP_LE_Configurations;

modulepar {
	/* IP address at which the SMLC can be reached */
	charstring mp_smlc_ip := "127.0.0.1";
	/* port number to which to establish the IPA CTRL connection */
	integer mp_smlc_ctrl_port := 4272;
	/* IP address at which the test binds */
	charstring mp_test_ip := "127.0.0.1";

	BSSAP_LE_Configurations mp_bssap_le_cfg := {
		{
			sccp_service_type := "mtp3_itu",
			sctp_addr := { 23908, "127.0.0.1", 2905, "127.0.0.1" },
			own_pc := 187,	/* 0.23.3 first BSC emulation */
			own_ssn := 250, /* BSC side SSN */
			peer_pc := 190, /* 0.23.6 osmo-smlc */
			peer_ssn := 252,	/* SMLC side SSN */
			sio := '83'O,
			rctx := 1
		}
	};
}

private function f_gen_test_hdlr_pars(integer bssap_le_idx := 0) return TestHdlrParams {

	var TestHdlrParams pars := valueof(t_def_TestHdlrPars);
	return pars;
}

/* Convenience functions for rate counters using g_ctr_bsc. */

private function f_ctrs_smlc_init(integer bscs_count := NUM_BSC, CounterNameVals counternames := counternames_bsc) runs on test_CT {
	g_ctr_bsc := f_counter_name_vals_get_n(IPA_CTRL, "bsc", bscs_count, counternames);
	log("initial msc rate counters: ", g_ctr_bsc);
}

private function f_ctrs_smlc_add(integer msc_nr, charstring countername, integer val := 1) runs on test_CT {
	f_counter_name_vals_list_add(g_ctr_bsc, msc_nr, countername, val);
}

/*  f_ctrs_smlc_init();
 *  f_do_thing(on_msc := 0);
 *  f_do_thing(on_msc := 0);
 *  f_do_other(on_msc := 1);
 *  f_ctrs_smlc_add(0, "thing", 2);
 *  f_ctrs_smlc_add(1, "other");
 *  f_ctrs_smlc_verify();
 */
private function f_ctrs_smlc_verify() runs on test_CT {
	log("verifying msc rate counters: ", g_ctr_bsc);
	f_counter_name_vals_expect_n(IPA_CTRL, "bsc", g_ctr_bsc);
}

/* convenience: f_ctrs_smlc_add() and f_ctrs_smlc_verify() in one call.
 *  f_ctrs_smlc_init();
 *  f_do_thing(on_msc := 0);
 *  f_do_thing(on_msc := 0);
 *  f_do_thing(on_msc := 0);
 *  f_ctrs_smlc_expect(0, "thing", 3);
 */
private function f_ctrs_smlc_expect(integer msc_nr, charstring countername, integer val := 1) runs on test_CT {
	f_ctrs_smlc_add(msc_nr, countername, val);
	f_ctrs_smlc_verify();
}

private function f_shutdown_helper() runs on test_CT {
	all component.stop;
	setverdict(pass);
	mtc.stop;
}

/* global altstep for global guard timer */
altstep as_Tguard() runs on test_CT {
	[] T_guard.timeout {
			setverdict(fail, "Timeout of T_guard");
			mtc.stop;
		}
}

/* global initialization function
 * \param nr_bts Number of BTSs we should start/bring up
 * \param handler_mode Start an RSL_Emulation_CT component (true) or not (false).
 * \param nr_msc Number of virtual MSCs to bring up to connect to osmo-bsc.
 */
function f_init(integer nr_bsc := NUM_BSC, float guard_timeout := 30.0) runs on test_CT {
	var integer bssap_le_idx;

	if (g_initialized) {
		return;
	}
	g_initialized := true;

	T_guard.start(guard_timeout);
	activate(as_Tguard());

	f_init_vty("VirtBSC");

	for (bssap_le_idx := 0; bssap_le_idx < nr_bsc; bssap_le_idx := bssap_le_idx+1) {
		f_bssap_le_adapter_init(g_bssap_le[bssap_le_idx], mp_bssap_le_cfg[bssap_le_idx], "VirtBSC", BSC_BssapLeOps);
		f_bssap_le_adapter_start(g_bssap_le[bssap_le_idx]);
	}
}

function f_init_vty(charstring id := "foo") runs on test_CT {
	if (SMLCVTY.checkstate("Mapped")) {
		/* skip initialization if already executed once */
		return;
	}
	map(self:SMLCVTY, system:SMLCVTY);
	f_vty_set_prompts(SMLCVTY);
	f_vty_transceive(SMLCVTY, "enable");
	f_cs7_inst_0_cfg(SMLCVTY, {"sccp-timer ias " & int2str(g_smlc_sccp_timer_ias),
			  "sccp-timer iar " & int2str(g_smlc_sccp_timer_iar)});
}

type function void_fn(charstring id) runs on BSC_ConnHdlr;

private function f_connect_handler(inout BSC_ConnHdlr vc_conn, integer bssap_le_idx := 0) runs on test_CT {
	connect(vc_conn:BSSAP_LE, g_bssap_le[bssap_le_idx].vc_BSSAP_LE:CLIENT);
	connect(vc_conn:BSSAP_LE_PROC, g_bssap_le[bssap_le_idx].vc_BSSAP_LE:PROC);
}

function f_start_handler(void_fn fn, template (omit) TestHdlrParams pars := omit)
runs on test_CT return BSC_ConnHdlr {
	var charstring id := testcasename();
	var BSC_ConnHdlr vc_conn;
	var integer bssap_le_idx := 0;
	if (isvalue(pars)) {
		bssap_le_idx := valueof(pars).bssap_le_idx;
	}
	vc_conn := BSC_ConnHdlr.create(id);
	f_connect_handler(vc_conn, bssap_le_idx);
	/* Emit a marker to appear in the SUT's own logging output */
	f_logp(SMLCVTY, testcasename() & "() start");
	vc_conn.start(f_handler_init(fn, id, pars));
	return vc_conn;
}

private function f_handler_init(void_fn fn, charstring id, template (omit) TestHdlrParams pars := omit)
runs on BSC_ConnHdlr {
	if (isvalue(pars)) {
		g_pars := valueof(pars);
	}
	fn.apply(id);
}

type record of charstring Commands;

private function f_cs7_inst_0_cfg(TELNETasp_PT pt, Commands cmds := {})
{
	f_vty_enter_cfg_cs7_inst(pt, 0);
	for (var integer i := 0; i < sizeof(cmds); i := i+1) {
		f_vty_transceive(pt, cmds[i]);
	}
	f_vty_transceive(pt, "end");
}

template (value) PDU_BSSAP_LE ts_BSSMAP_LE_BSSLAP(template (value) BSSLAP_PDU bsslap)
	:= ts_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, data := enc_BSSLAP_PDU(valueof(bsslap)));

template PDU_BSSAP_LE tr_BSSMAP_LE_BSSLAP(template BSSLAP_PDU bsslap)
	:= tr_BSSMAP_LE_ConnInfo(BSSMAP_LE_PROT_BSSLAP, data := enc_BSSLAP_PDU(valueof(bsslap)));

/* BSC sends Perform Location Request that already contains a TA Layer 3 BSSLAP APDU */
private function f_tc_smlc_location_request_with_ta_l3(charstring id) runs on BSC_ConnHdlr {
	f_sleep(1.0);

	f_BscConnHdlr_init();
	f_bssap_le_register_imsi(g_pars.imsi, omit);

	var uint16_t cell_id := 42;
	var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));

	BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,
			valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi,
					enc_BSSLAP_PDU(valueof(ts_BSSLAP_TA_Layer3(23)))))));
	BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);

	/* SMLC got the TA from the BSC, now responds with geo information data. */
	/* TODO: implement GAD coding in ttcn */
	/* Expecting geo:
	 * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1)
	 * 0... .... = Sign of latitude: North (0)
	 * .010 0001 0000 1001 1100 1001 = Degrees of latitude: 2165193 (23.23000 degrees)
	 * 0001 1110 0010 1010 0101 0011 = Degrees of longitude: 1976915 (42.42000 degrees)
	 * .100 1010 = Uncertainty code: 74 (11552.7 m)
	 * [Location OSM URI: https://www.openstreetmap.org/?mlat=23.23000&mlon=42.42000&zoom=12]
	 */
	var octetstring geo := '102109C91E2A534A'O;
	BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit));

	f_sleep(2.0);
	setverdict(pass);
}
testcase TC_smlc_location_request_with_ta_l3() runs on test_CT {
	var BSC_ConnHdlr vc_conn;
	var TestHdlrParams pars := f_gen_test_hdlr_pars();

	f_init();
	f_sleep(1.0);

	pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;
	pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;

	vc_conn := f_start_handler(refers(f_tc_smlc_location_request_with_ta_l3), pars);
	vc_conn.done;
}

/* BSC sends Perform Location Request without BSSLAP APDU, SMLC needs to request TA */
private function f_tc_smlc_location_request_without_ta_l3(charstring id) runs on BSC_ConnHdlr {
	f_sleep(1.0);

	f_BscConnHdlr_init();
	f_bssap_le_register_imsi(g_pars.imsi, omit);

	var uint16_t cell_id := 42;
	var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));

	BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,
			valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));
	BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);

	/* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */
	BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));

	/* BSC figures out the TA and sends it back to the SMLC */

	BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_TA_Resp(cell_id, 23)));

	/* SMLC got the TA from the BSC, now responds with geo information data. */
	/* TODO: implement GAD coding in ttcn */
	/* Expecting geo:
	 * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1)
	 * 0... .... = Sign of latitude: North (0)
	 * .010 0001 0000 1001 1100 1001 = Degrees of latitude: 2165193 (23.23000 degrees)
	 * 0001 1110 0010 1010 0101 0011 = Degrees of longitude: 1976915 (42.42000 degrees)
	 * .100 1010 = Uncertainty code: 74 (11552.7 m)
	 * [Location OSM URI: https://www.openstreetmap.org/?mlat=23.23000&mlon=42.42000&zoom=12]
	 */
	var octetstring geo := '102109C91E2A534A'O;
	BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit));

	f_sleep(2.0);
	setverdict(pass);
}
testcase TC_smlc_location_request_without_ta_l3() runs on test_CT {
	var BSC_ConnHdlr vc_conn;
	var TestHdlrParams pars := f_gen_test_hdlr_pars();

	f_init(1);
	f_sleep(1.0);

	pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;
	pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;

	vc_conn := f_start_handler(refers(f_tc_smlc_location_request_without_ta_l3), pars);
	vc_conn.done;
}

/* BSC sends Perform Location Request, halfway the BSC indicates handover via BSSLAP Reset */
private function f_tc_smlc_location_request_bsslap_reset(charstring id) runs on BSC_ConnHdlr {
	f_sleep(1.0);

	f_BscConnHdlr_init();
	f_bssap_le_register_imsi(g_pars.imsi, omit);

	var uint16_t cell_id := 1;
	var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(1, cell_id));

	BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,
			valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));
	BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);

	/* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */
	BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));

	/* BSC reports a Handover via a BSSLAP Reset */
	BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_Reset(17, 42,
		valueof(ts_BSSLAP_IE_ChanDesc),
		BSSLAP_CAUSE_INTRA_BSS_HO)));

	/* SMLC got the TA from the BSC via BSSLAP Reset, now responds with geo information data. */
	/* TODO: implement GAD coding in ttcn */
	/* Expecting geo:
	 * 0001 .... = Location estimate: Ellipsoid point with uncertainty Circle (1)
	 * 0... .... = Sign of latitude: North (0)
	 * .000 1011 0011 1000 1011 0100 = Degrees of latitude: 735412 (7.89012 degrees)
	 * 0000 0110 0101 0100 0110 1011 = Degrees of longitude: 414827 (8.90122 degrees)
	 * .101 0001 = Uncertainty code: 81 (22522.4 m)
	 * [Location OSM URI: https://www.openstreetmap.org/?mlat=7.89012&mlon=8.90122&zoom=12]
	 */
	var octetstring geo := '100B38B406546B51'O;
	BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(geo, omit));

	f_sleep(2.0);
	setverdict(pass);
}
testcase TC_smlc_location_request_bsslap_reset() runs on test_CT {
	var BSC_ConnHdlr vc_conn;
	var TestHdlrParams pars := f_gen_test_hdlr_pars();

	f_init(1);
	f_sleep(1.0);

	pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;
	pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;

	vc_conn := f_start_handler(refers(f_tc_smlc_location_request_bsslap_reset), pars);
	vc_conn.done;
}

/* BSC sends Perform Location Request, halfway the BSC aborts the request because of inter-BSC HO */
private function f_tc_smlc_location_request_abort(charstring id) runs on BSC_ConnHdlr {
	f_sleep(1.0);

	f_BscConnHdlr_init();
	f_bssap_le_register_imsi(g_pars.imsi, omit);

	var uint16_t cell_id := 42;
	var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));

	BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,
			valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));
	BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);

	/* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */
	BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));

	/* BSC aborts */
	BSSAP_LE.send(ts_BSSMAP_LE_PerfLocAbort(BSSMAP_LE_LCS_CAUSE_INTER_BSC_HO));

	var PDU_BSSAP_LE bssap_le;
	timer nothing := 7.0;
	nothing.start;
	alt {
		[] BSSAP_LE.receive(tr_BSSAP_LE_BSSMAP) -> value(bssap_le) {
			log("unexpected bssap_le: ", bssap_le);
			setverdict(fail, "No more messages expected from SMLC");
			mtc.stop;
		}
		[] nothing.timeout {
			setverdict(pass);
			break;
		}
	}

	f_sleep(2.0);
	setverdict(pass);
}
testcase TC_smlc_location_request_abort() runs on test_CT {
	var BSC_ConnHdlr vc_conn;
	var TestHdlrParams pars := f_gen_test_hdlr_pars();

	f_init(1);
	f_sleep(1.0);

	pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;
	pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;

	vc_conn := f_start_handler(refers(f_tc_smlc_location_request_abort), pars);
	vc_conn.done;
}

/* BSC sends Perform Location Request, SMLC asks for TA, halfway the BSC aborts the TA request */
private function f_tc_smlc_location_request_bsslap_abort(charstring id) runs on BSC_ConnHdlr {
	f_sleep(1.0);

	f_BscConnHdlr_init();
	f_bssap_le_register_imsi(g_pars.imsi, omit);

	var uint16_t cell_id := 42;
	var BSSMAP_IE_CellIdentifier cell_ident := valueof(ts_CellID_LAC_CI(23, cell_id));

	BSSAP_LE.send(ts_BSSAP_LE_Conn_Req(g_pars.sccp_addr_smlc, g_pars.sccp_addr_bsc,
			valueof(ts_BSSMAP_LE_PerfLocReq(BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC_LOC, cell_ident, g_pars.imsi))));
	BSSAP_LE.receive(BSSAP_LE_Conn_Prim:CONN_PRIM_CONF_IND);

	/* SMLC wants to ask the TA from the SMLC explicitly in a BSSLAP TA Request message */
	BSSAP_LE.receive(tr_BSSMAP_LE_BSSLAP(tr_BSSLAP_TA_Req));

	/* BSC aborts the TA Request */
	BSSAP_LE.send(ts_BSSMAP_LE_BSSLAP(ts_BSSLAP_Abort(BSSLAP_CAUSE_SUPERV_TIMER_EXPIRED)));

	/* Expect response without location, just an LCS Cause indicating abort */
	BSSAP_LE.receive(tr_BSSMAP_LE_PerfLocResp(omit, BSSMAP_LE_LCS_CAUSE_REQUEST_ABORTED));

	f_sleep(2.0);
	setverdict(pass);
}
testcase TC_smlc_location_request_bsslap_abort() runs on test_CT {
	var BSC_ConnHdlr vc_conn;
	var TestHdlrParams pars := f_gen_test_hdlr_pars();

	f_init(1);
	f_sleep(1.0);

	pars.sccp_addr_bsc := g_bssap_le[0].sccp_addr_own;
	pars.sccp_addr_smlc := g_bssap_le[0].sccp_addr_peer;

	vc_conn := f_start_handler(refers(f_tc_smlc_location_request_bsslap_abort), pars);
	vc_conn.done;
}

control {
	execute( TC_smlc_location_request_with_ta_l3() );
	execute( TC_smlc_location_request_without_ta_l3() );
	execute( TC_smlc_location_request_bsslap_reset() );
	execute( TC_smlc_location_request_bsslap_abort() );
	execute( TC_smlc_location_request_abort() );
}

}
