bts: Test AMR in TC_speech_rtp_tch{h,f}()

Related: SYS#5987
Requires: osmocom-bb.git Ib80be434c06d07b3611bd18ae25dff8b14a7aad9 (trxcon)
Change-Id: I8cf7792a00b0a858f6a02bf5cb0d283484b820eb
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 646e5bf..68e5cf1 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -47,6 +47,8 @@
 import from RSL_Emulation all;
 import from RTP_Emulation all;
 
+import from AMR_Types all;
+
 import from IPL4asp_Types all;
 import from TRXC_Types all;
 import from TRXC_CodecPort all;
@@ -2542,6 +2544,28 @@
 	g_first_meas_res := true;
 }
 
+private function get_start_amr_ft() runs on ConnHdlr return integer {
+	var integer start_nth;
+	if (g_pars.mr_conf.icmi) {
+		start_nth := 0; /* FIXME: implement 3GPP TS 45.009 3.4.3 */
+	} else {
+		start_nth := g_pars.mr_conf.start_mode;
+	}
+
+	var integer n := 0;
+	for (var integer i:= 7; i >= 0; i := i - 1) {
+		if (g_pars.mr_conf.amr_codec_modes[i] == '1'B) {
+			if (n == start_nth) {
+				return 7 - i;
+			}
+			n := n + 1;
+		}
+	}
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+			        log2str("mr_conf is wrong! ", g_pars.mr_conf));
+	return 0;
+}
+
 /* Initialize and start the RTP emulation component for a ConnHdlr */
 friend function f_rtpem_activate(inout octetstring payload,
 				 RtpemConfig cfg := c_RtpemDefaultCfg,
@@ -2566,7 +2590,19 @@
 		{ payload_len := 15; hdr := '00'O; }
 	case (tr_RSL_ChanMode(RSL_CHRT_TCH_F, RSL_CMOD_SP_GSM2)) /* TCH/EFS */
 		{ payload_len := 31; hdr := 'C0'O; }
-	case else { /* FIXME: also handle TCH/AFS and TCH/AHS */
+	case (tr_RSL_ChanMode(RSL_CHRT_TCH_F, RSL_CMOD_SP_GSM3)) /* TCH/AFS */
+		{
+			var integer amr_ft := get_start_amr_ft();
+			payload_len := f_amrft_payload_len(amr_ft) + 2;
+			hdr := enc_RTP_AMR_Hdr(valueof(ts_RTP_AMR_Hdr(amr_ft, amr_ft, '1'B)));
+		}
+	case (tr_RSL_ChanMode(RSL_CHRT_TCH_H, RSL_CMOD_SP_GSM3)) /* TCH/AHS */
+		{
+			var integer amr_ft := get_start_amr_ft();
+			payload_len := f_amrft_payload_len(amr_ft) + 2;
+			hdr := enc_RTP_AMR_Hdr(valueof(ts_RTP_AMR_Hdr(amr_ft, amr_ft, '1'B)));
+		}
+	case else {
 		setverdict(fail, "Unhandled RSL channel mode := ", g_pars.chan_mode);
 		Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 		}
@@ -8147,7 +8183,11 @@
 	vc_conn := f_start_handler(refers(f_TC_speech_rtp), pars);
 	vc_conn.done;
 
-	/* TODO: also test V3 (AMR codec) */
+	/* TS1, TCH/F, V3 (AMR codec) */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1), ts_RSL_ChanMode(RSL_CHRT_TCH_F, RSL_CMOD_SP_GSM3)));
+	pars.mr_conf := valueof(ts_RSL_MultirateCfg(false, 0, '00000100'B /* 5,90k */));
+	vc_conn := f_start_handler(refers(f_TC_speech_rtp), pars);
+	vc_conn.done;
 
 	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 }
@@ -8162,7 +8202,11 @@
 	vc_conn := f_start_handler(refers(f_TC_speech_rtp), pars);
 	vc_conn.done;
 
-	/* TODO: also test V3 (AMR codec) */
+	/* TS1, TCH/H0, V3 (AMR codec) */
+	pars := valueof(t_Pars(ts_RslChanNr_Lm(5, 0), ts_RSL_ChanMode(RSL_CHRT_TCH_H, RSL_CMOD_SP_GSM3)));
+	pars.mr_conf := valueof(ts_RSL_MultirateCfg(false, 0, '00000100'B /* 5,90k */));
+	vc_conn := f_start_handler(refers(f_TC_speech_rtp), pars);
+	vc_conn.done;
 
 	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 }