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 MTP3asp_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 MTP3asp_PT IPA_MTP3;
	port IPA_MGCP_PT IPA_MGCP;
	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_MGCP_PORT, self:IPA_MGCP);
	connect(vc_IPA:IPA_RSL_PORT, self:IPA_RSL);
	connect(vc_IPA:IPA_CTRL_PORT, self:IPA_CTRL);
	connect(vc_IPA:MTP3_SP_PORT, self:IPA_MTP3);
	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() );
}


}
