gbproxy: Test for SGSN-INVOKE-TRACE

Change-Id: I1e46e5c403712eb7972c57e6b6f6eb0850b96ae3
diff --git a/gbproxy/GBProxy_Tests.ttcn b/gbproxy/GBProxy_Tests.ttcn
index 9e11fc8..48d2805 100644
--- a/gbproxy/GBProxy_Tests.ttcn
+++ b/gbproxy/GBProxy_Tests.ttcn
@@ -1841,6 +1841,46 @@
 	f_cleanup();
 }
 
+private altstep as_bssgp_g_pcu_count(integer pcu_idx, template (present) PDU_BSSGP exp_rx, inout ro_integer roi)
+runs on GlobalTest_CT {
+[] G_PCU[pcu_idx].receive(exp_rx) from g_pcu[pcu_idx].vc_BSSGP {
+	if (ro_integer_contains(roi, pcu_idx)) {
+		setverdict(fail, "Received multiple on same SIG BVC");
+	}
+	roi := roi & { pcu_idx };
+	repeat;
+	}
+}
+/* send a INVOKE-TRACE from SGSN and expect to receive a copy on each NSE */
+testcase TC_trace() runs on GlobalTest_CT
+{
+	var BSSGP_ConnHdlr vc_conn;
+	f_init();
+	f_global_init();
+
+	var template (value) PDU_BSSGP pdu_tx := ts_BSSGP_INVOKE_TRACE('23'O, '4321'O);
+	var template (present) PDU_BSSGP exp_rx := ts_BSSGP_INVOKE_TRACE('23'O, '4321'O);
+
+	var ro_default defaults := {};
+	for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
+		activate(as_bssgp_g_pcu_count(i, exp_rx, g_roi));
+	}
+	G_SGSN[0].send(pdu_tx);
+	f_sleep(2.0);
+	for (var integer i := 0; i < lengthof(defaults); i := i+1) {
+		deactivate(defaults[i]);
+	}
+
+	for (var integer i := 0; i < lengthof(g_pcu); i := i+1) {
+		if (not ro_integer_contains(g_roi, i)) {
+			setverdict(fail, "Failed to receive TRACE on PCU index ", i);
+		}
+	}
+	setverdict(pass);
+
+	f_cleanup();
+}
+
 private function f_block_ptp_bvc_from_pcu(integer pcu_idx, integer bvc_idx) runs on test_CT
 {
 	var BSSGP_BVC_CT bvc_ct := g_pcu[pcu_idx].vc_BSSGP_BVC[bvc_idx];
@@ -2072,6 +2112,7 @@
 	execute( TC_radio_status() );
 	execute( TC_suspend() );
 	execute( TC_resume() );
+	execute( TC_trace() );
 	execute( TC_bvc_block_ptp() );
 	execute( TC_bvc_unblock_ptp() );
 	execute( TC_bvc_reset_ptp_from_bss() );