module Selftest {

import from General_Types all;
import from Osmocom_Types all;
import from GSM_Types all;
import from IPL4asp_Types all;
import from IPL4asp_PortType all;

import from BSSAP_Types all;
//import from BSSAP_Adapter all;
import from BSSAP_CodecPort all;
import from BSSMAP_Templates all;
import from IPA_Emulation all;
import from IPA_Types all;
import from RSL_Types all;

import from Osmocom_CTRL_Functions all;
import from Osmocom_CTRL_Types all;

import from MobileL3_CommonIE_Types all;
import from L3_Templates all;
import from GSM_RR_Types all;


type component IPA_selftest_CT {
	/* upper end of IPA_Emulation */
	port IPA_RSL_PT IPA_RSL;
	port IPA_CTRL_PT IPA_CTRL;
	port IPA_SP_PT IPA_SP;

	var IPA_Emulation_CT vc_IPA;

	/* raw IP port */
	port IPL4asp_PT IP;
	var ConnectionId g_ip_conn_id := -1;
}


function f_ipa_srv_init() runs on IPA_selftest_CT {
	vc_IPA := IPA_Emulation_CT.create("IPA_Emulation");
	map(vc_IPA:IPA_PORT, system: IPA_CODEC_PT);
	connect(vc_IPA:IPA_RSL_PORT, self:IPA_RSL);
	connect(vc_IPA:IPA_CTRL_PORT, self:IPA_CTRL);
	vc_IPA.start(IPA_Emulation.main_server("127.0.0.1", 55555));
}

function f_ipa_wait_up() runs on IPA_selftest_CT {
	interleave {
	[] IPA_RSL.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP));
	[] IPA_CTRL.receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP));
	}
}

function f_tcp_client_init() runs on IPA_selftest_CT {
	var Result res;
	map(self:IP, system:IP);
	res := IPL4asp_PortType.f_IPL4_connect(IP, "127.0.0.1", 55555, "", -1,-1, {tcp:={}});
	g_ip_conn_id := res.connId;
}


template ASP_Send ts_ASP_Send(ConnectionId id, template octetstring tx) := {
	connId := id,
	proto := omit,
	msg := tx
}

testcase TC_ipa_fragment() runs on IPA_selftest_CT {
	var integer i;
	var octetstring tx_buf;
	var RSL_Message rsl;

	f_ipa_srv_init();
	f_tcp_client_init();
	f_ipa_wait_up();

	rsl := valueof(ts_RSL_CHAN_RQD('23'O, 2342));
	tx_buf := enc_PDU_IPA(valueof(ts_PDU_IPA(IPAC_PROTO_RSL_TRX0, enc_RSL_Message(rsl))));
	/* send in rapid sequence to fill multiple messages in one TCP segment */
	for (i := 0; i < 10; i := i+1) {
		IP.send(ts_ASP_Send(g_ip_conn_id, tx_buf));
	}
	timer T:= 1.0;
	T.start;
	T.timeout;

	for (i := 0; i < 10; i := i+1) {
		IPA_RSL.receive(tr_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0, rsl));
	}
	setverdict(pass);
}


control {
	execute( TC_ipa_fragment() );
}


}
