BTS: add a testcase for PDCH interference reports

Change-Id: I39e70524ad3d2ee51b537c8f786b7754a02949b1
Related: SYS#5313, OS#1569, OS#1866
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index c9553a3..e855405 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -5838,6 +5838,61 @@
 	setverdict(pass);
 }
 
+/* Verify periodic interference reports on PDCH */
+testcase TC_pcu_interf_ind() runs on test_CT {
+	var template PCUIF_Message tr_interf_ind;
+	var template PCUIF_interf ts_interf;
+	var integer interf_ind_num := 0;
+	var PCUIF_send_data sd;
+	timer T;
+
+	f_init_with_pcuif();
+	f_TC_pcu_act_req(0, 0, 7, true);
+
+	/* We need trxcon for NOPE indications */
+	f_init_l1ctl();
+	f_l1_tune(L1CTL);
+
+	/* Expect -120 .. -90 dBm on TS7 of BTS0/TRX0 */
+	ts_interf := { 0, 0, 0, 0, 0, 0, 0, (90..120) };
+	tr_interf_ind := tr_PCUIF_INTERF_IND(
+		bts_nr := 0,
+		trx_nr := 0,
+		fn := ?,
+		interf := ts_interf
+	);
+
+	/* 4 SACCH periods => 4 reports (plus some guard time) */
+	var float Tval := int2float(4 * 480) / 1000.0 + 0.5;
+
+	/* Let it some time to stabilize */
+	f_sleep(0.5);
+	PCU.clear;
+
+	T.start(Tval);
+	alt {
+	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_interf_ind)) -> value sd {
+		/* Check TDMA frame number period */
+		if (sd.data.u.interf_ind.fn mod 104 != 0) {
+			setverdict(fail, "Odd TDMA frame number := ",
+				   sd.data.u.interf_ind.fn);
+		}
+		interf_ind_num := interf_ind_num + 1;
+		if (interf_ind_num < 4)
+			{ repeat; }
+		}
+	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_INTERF_IND(0, 0))) -> value sd {
+		setverdict(fail, "Received unexpected interference report: ", sd.data);
+		}
+	[] PCU.receive { repeat; }
+	[] T.timeout {
+		setverdict(fail, "Timeout waiting for interference reports");
+		}
+	}
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
 /***********************************************************************
  * Osmocom Style Dynamic Timeslot Support
  ***********************************************************************/
@@ -7492,6 +7547,7 @@
 		execute( TC_pcu_socket_nsvc_ipv4() );
 		execute( TC_pcu_socket_nsvc_ipv6() );
 		execute( TC_pcu_socket_two_nsvc() );
+		execute( TC_pcu_interf_ind() );
 	} else {
 		log("PCU socket path not available, skipping PCU tests");
 	}