module MSC_Tests_Iu {

import from General_Types all;
import from Osmocom_Types all;

import from BSC_ConnectionHandler all;
import from MSC_Tests all;

import from Osmocom_VTY_Functions all;

import from GSUP_Emulation all;
import from RAN_Emulation all;

import from RANAP_Templates all;

import from MobileL3_Types all;
import from MobileL3_CommonIE_Types all;
import from MobileL3_SMS_Types all;
import from L3_Templates all;
import from L3_Common all;



testcase TC_iu_lu_imsi_reject() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), 1003, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_imsi_timeout_gsup() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), 1004, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_imsi_auth3g_tmsi() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	f_vty_config(MSCVTY, "network", "authentication required");

	vc_conn := f_start_handler(refers(f_tc_lu_imsi_auth3g_tmsi), 1005, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_cmserv_imsi_unknown() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), 1006, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_mo_call() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), 1007, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_auth_sai_timeout() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	f_vty_config(MSCVTY, "network", "authentication required");

	vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_timeout), 1008, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_auth_sai_err() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	f_vty_config(MSCVTY, "network", "authentication required");

	vc_conn := f_start_handler(refers(f_tc_lu_auth_sai_err), 1009, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

/* Test LU but RNC will send a Iu Release request in the middle */
private function f_tc_iu_lu_release_request(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
	f_init_handler(pars);

	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
	var PDU_DTAP_MT dtap_mt;

	/* tell GSUP dispatcher to send this IMSI to us */
	f_create_gsup_expect(hex2str(g_pars.imsi));

	/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
	f_cl3_or_initial_ue(l3_lu);

	f_sleep(1.0);
	/* send release request in the middle of the LU */
	BSSAP.send(ts_RANAP_IuReleaseRequest(ts_RanapCause_om_intervention));
	alt {
	[] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { repeat; }
	[] BSSAP.receive(tr_RANAP_IuReleaseCommand(?)) {}
	}
	BSSAP.send(ts_RANAP_IuReleaseComplete);
	alt {
	/* See https://osmocom.org/issues/2862 */
	[] BSSAP.receive(tr_RANAP_IuReleaseCommand(?)) {
			setverdict(fail, "Got a second Iu Release Command, only one expected");
			mtc.stop;
			repeat;
		}
	[] BSSAP.receive(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
	}
	setverdict(pass);
}
testcase TC_iu_lu_release_request() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_iu_lu_release_request), 1010, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_disconnect() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_lu_disconnect), 1011, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_by_imei() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_lu_by_imei), 1012, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_imsi_detach_by_imsi() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imsi), 1014, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_imsi_detach_by_tmsi() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_tmsi), 1015, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_imsi_detach_by_imei() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_imsi_detach_by_imei), 1016, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_emerg_call_imei_reject() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_emerg_call_imei_reject), 1017, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_emerg_call_imsi() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_emerg_call_imsi), 1018, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_establish_and_nothing() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_establish_and_nothing), 1027, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_mo_setup_and_nothing() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_mo_setup_and_nothing), 1028, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_mo_crcx_ran_timeout() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_timeout), 1029, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_mo_crcx_ran_reject() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_mo_crcx_ran_reject), 1030, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_mt_crcx_ran_reject() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_mt_crcx_ran_reject), 1031, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_mt_t310() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_mt_t310), 1032, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_gsup_cancel() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_gsup_cancel), 1033, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_mo_release_timeout() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_mo_release_timeout), 1040, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_mo_sms() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_sms), 1042, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_mt_sms() runs on MTC_CT {
	var BSC_ConnHdlrPars pars;
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	pars := f_init_pars(1043, ran_idx := 2, ran_is_geran := false);
	vc_conn := f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms), pars);
	vc_conn.done;
}

testcase TC_iu_lu_and_mt_sms_paging_and_nothing() runs on MTC_CT {
	var BSC_ConnHdlrPars pars;
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	pars := f_init_pars(101843, ran_idx := 2, ran_is_geran := false);
	vc_conn := f_start_handler_with_pars(refers(f_tc_lu_and_mt_sms_paging_and_nothing), pars);
	vc_conn.done;
}

testcase TC_iu_smpp_mo_sms() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	f_vty_config2(MSCVTY, { "smpp", "esme msc_tester"}, "default-route");
	vc_conn := f_start_handler(refers(f_tc_smpp_mo_sms), 1044, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
	f_vty_config2(MSCVTY, { "smpp", "esme msc_tester"}, "no default-route");
}

testcase TC_iu_gsup_mo_sms() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	f_vty_config(MSCVTY, "msc", "sms-over-gsup");
	vc_conn := f_start_handler(refers(f_tc_gsup_mo_sms), 1088, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
	f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
}

testcase TC_iu_gsup_mo_smma() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	f_vty_config(MSCVTY, "msc", "sms-over-gsup");
	vc_conn := f_start_handler(refers(f_tc_gsup_mo_smma), 1089, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
	f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
}

testcase TC_iu_gsup_mt_sms_ack() runs on MTC_CT {
	var BSC_ConnHdlrPars pars;
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	pars := f_init_pars(1090, ran_idx := 2, ran_is_geran := false);
	f_vty_config(MSCVTY, "msc", "sms-over-gsup");
	vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mt_sms_ack), pars);
	vc_conn.done;
	f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
}

testcase TC_iu_gsup_mt_sms_err() runs on MTC_CT {
	var BSC_ConnHdlrPars pars;
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	pars := f_init_pars(1091, ran_idx := 2, ran_is_geran := false);
	f_vty_config(MSCVTY, "msc", "sms-over-gsup");
	vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mt_sms_err), pars);
	vc_conn.done;
	f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
}

testcase TC_iu_gsup_mt_sms_rp_mr() runs on MTC_CT {
	var BSC_ConnHdlrPars pars;
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	pars := f_init_pars(1092, ran_idx := 2, ran_is_geran := false);
	f_vty_config(MSCVTY, "msc", "sms-over-gsup");
	vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mt_sms_rp_mr), pars);
	vc_conn.done;
	f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
}

testcase TC_iu_gsup_mo_mt_sms_rp_mr() runs on MTC_CT {
	var BSC_ConnHdlrPars pars;
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	pars := f_init_pars(1093, ran_idx := 2, ran_is_geran := false);
	f_vty_config(MSCVTY, "msc", "sms-over-gsup");
	vc_conn := f_start_handler_with_pars(refers(f_tc_gsup_mo_mt_sms_rp_mr), pars);
	vc_conn.done;
	f_vty_config(MSCVTY, "msc", "no sms-over-gsup");
}

testcase TC_iu_lu_and_mo_ussd_single_request() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_single_request), 1046, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_mt_ussd_notification() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	vc_conn := f_start_handler(refers(f_tc_lu_and_mt_ussd_notification), 1047, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_mo_ussd_during_mt_call() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_during_mt_call), 1048, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_mo_cc_iu_release() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);

	vc_conn := f_start_handler(refers(f_tc_mo_cc_bssmap_clear), 1043, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_mt_ussd_during_mt_call() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	vc_conn := f_start_handler(refers(f_tc_lu_and_mt_ussd_during_mt_call), 1049, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_mo_ussd_mo_release() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init();
	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_ussd_mo_release), 1050, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
}

testcase TC_iu_lu_and_ss_session_timeout() runs on MTC_CT {
	var BSC_ConnHdlr vc_conn;
	f_init(3);
	f_vty_config(MSCVTY, "msc", "ncss guard-timeout 3");
	vc_conn := f_start_handler(refers(f_tc_lu_and_ss_session_timeout), 1051, ran_idx := 2, ran_is_geran := false);
	vc_conn.done;
	f_vty_config(MSCVTY, "msc", "ncss guard-timeout 0");
}

control {
	execute( TC_iu_lu_imsi_reject() );
	execute( TC_iu_lu_imsi_timeout_gsup() );
	execute( TC_iu_lu_imsi_auth3g_tmsi() );
	execute( TC_iu_cmserv_imsi_unknown() );
	execute( TC_iu_lu_and_mo_call() );
	execute( TC_iu_lu_auth_sai_timeout() );
	execute( TC_iu_lu_auth_sai_err() );
	execute( TC_iu_lu_release_request() );
	execute( TC_iu_lu_disconnect() );
	execute( TC_iu_lu_by_imei() );
	execute( TC_iu_imsi_detach_by_imsi() );
	execute( TC_iu_imsi_detach_by_tmsi() );
	execute( TC_iu_imsi_detach_by_imei() );
	execute( TC_iu_emerg_call_imei_reject() );
	execute( TC_iu_emerg_call_imsi() );
	execute( TC_iu_establish_and_nothing() );
	execute( TC_iu_mo_setup_and_nothing() );
	execute( TC_iu_mo_crcx_ran_timeout() );
	execute( TC_iu_mo_crcx_ran_reject() );
	execute( TC_iu_mt_crcx_ran_reject() );
	execute( TC_iu_gsup_cancel() );
	execute( TC_iu_mo_release_timeout() );
	execute( TC_reset_two_1iu() );

	execute( TC_iu_lu_and_mo_sms() );
	execute( TC_iu_lu_and_mt_sms() );
	execute( TC_iu_lu_and_mt_sms_paging_and_nothing() );
	execute( TC_iu_smpp_mo_sms() );

	execute( TC_iu_gsup_mo_sms() );
	execute( TC_iu_gsup_mo_smma() );
	execute( TC_iu_gsup_mt_sms_ack() );
	execute( TC_iu_gsup_mt_sms_err() );
	execute( TC_iu_gsup_mt_sms_rp_mr() );
	execute( TC_iu_gsup_mo_mt_sms_rp_mr() );

	execute( TC_iu_lu_and_mo_ussd_single_request() );
	execute( TC_iu_lu_and_mt_ussd_notification() );
	execute( TC_iu_lu_and_mo_ussd_during_mt_call() );
	execute( TC_iu_lu_and_mt_ussd_during_mt_call() );
	execute( TC_iu_lu_and_mo_ussd_mo_release() );
	execute( TC_iu_lu_and_ss_session_timeout() );

	/* TODO: Iu + SGsAP related tests, e.g. paging on IuCS */

	/* Run this last: at the time of writing this test crashes the MSC */
	execute( TC_mo_cc_iu_release() );
}


}
