PCU_Tests: test NACC procedure with UTRAN and E-UTRAN cell

When the PacketCellChangeNotification proposes an UTRAN or E-UTRAN cell,
then the PCU will not provide system information. Instead it will directly
conclude the NACC procedure with a PacketCellChangeContinue message.

Related: OS#6044
Change-Id: Idae86a458fd44ac81bab183ed1865b1c1bdbfd66
diff --git a/library/RLCMAC_CSN1_Templates.ttcn b/library/RLCMAC_CSN1_Templates.ttcn
index ef8c952..a4f59f0 100644
--- a/library/RLCMAC_CSN1_Templates.ttcn
+++ b/library/RLCMAC_CSN1_Templates.ttcn
@@ -180,6 +180,99 @@
 		}
 	};
 
+	/* TS 44.060 sec 11.2.3a */
+	template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF_UTRAN(uint5_t tfi,
+						uint14_t uarfcn,
+						uint10_t scrambling_code,
+						template (value) CCNMeasReport ccn_meas_rep := ccn_meas_rep_def)
+	:= {
+		msg_type := PACKET_CELL_CHANGE_NOTIFICATION,
+		u := {
+			cell_chg_notif := {
+				gtfi := {
+					is_dl_tfi := false,
+					tfi := tfi
+				},
+				u := {
+					u10 := {
+						tag := '10'B,
+						utran_target_cell := {
+							fdd_presence := '1'B,
+							fdd := {
+							    arfcn := uarfcn,
+							    bandwidth_presence := '0'B,
+							    bandwidth := omit,
+							    scrambling_code := scrambling_code
+							},
+							tdd_presence := '0'B,
+							tdd := omit,
+							reporting_quantity := 1
+						}
+					}
+				},
+				ba_psi3_presence := '0'B,
+				ba_used := '0'B,
+				psi3_change_mark := omit,
+				pmo_used := '0'B,
+				pccn_sending := '0'B,
+				ccn_meas_rep := ccn_meas_rep,
+				rel_additions := omit
+			}
+		}
+	};
+
+	/* TS 44.060 sec 11.2.3a */
+	template (value) RlcmacUlCtrlMsg ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF_EUTRAN(uint5_t tfi,
+						uint16_t earfcn,
+						uint9_t phys_layer_cell_id,
+						template (value) CCNMeasReport ccn_meas_rep := ccn_meas_rep_def)
+	:= {
+		msg_type := PACKET_CELL_CHANGE_NOTIFICATION,
+		u := {
+			cell_chg_notif := {
+				gtfi := {
+					is_dl_tfi := false,
+					tfi := tfi
+				},
+				u := {
+					u110 := {
+						tag := '110'B,
+						arfcn_bsic_presence := '0'B,
+						arfcn := omit,
+						bsic := omit,
+
+						utran_target_cell_presence := '0'B,
+						utran_target_cell := omit,
+
+						eutran_target_cell_presence := '1'B,
+						eutran_target_cell := {
+							earfcn := earfcn,
+							meas_bandwidth_presence := '0'B,
+							meas_bandwidth := omit,
+							phys_layer_cell_id := phys_layer_cell_id,
+							reporting_quantity := 1
+						},
+						eutran_ccn_meas_rep_presence := '1'B,
+						eutran_ccn_meas_rep := {
+							utran_ba_used := 0,
+							n_eutran := 1,
+							cells := {{frequency_list_index := 1,
+								   cell_identity := phys_layer_cell_id,
+								   reporting_quantity := 1}}
+						}
+					}
+				},
+				ba_psi3_presence := '0'B,
+				ba_used := '0'B,
+				psi3_change_mark := omit,
+				pmo_used := '0'B,
+				pccn_sending := '0'B,
+				ccn_meas_rep := ccn_meas_rep,
+				rel_additions := omit
+			}
+		}
+	};
+
 	/* TS 44.060 sec 11.2.2a */
 	template RlcmacDlCtrlMsg tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE(template GlobalTfi tfi := ?)
 	:= {
diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn
index 440d133..76926ae 100644
--- a/pcu/PCU_Tests.ttcn
+++ b/pcu/PCU_Tests.ttcn
@@ -5332,11 +5332,71 @@
 	}
 }
 
+private function f_outbound_nacc_success_no_si(inout GprsMS ms, PCUIF_info_ind info_ind,
+					       boolean exp_rac_ci_query := true, boolean exp_si_query := true,
+					       boolean skip_final_ctrl_ack := false,
+					       boolean use_old_ctrl_iface := false,
+					       template (value) RlcmacUlCtrlMsg cell_chg_notif)
+runs on RAW_PCU_Test_CT {
+	var template RlcmacDlCtrlMsg cell_chg_cont;
+	var RlcmacDlBlock dl_block;
+	var uint32_t sched_fn;
+
+	/* Start NACC from MS side */
+	f_ms_tx_ul_block(ms, ts_RLC_UL_CTRL_ACK(cell_chg_notif), 0, nr := f_ms_tx_TsTrxBtsNum(ms));
+
+	/* Obtain a Downlink block and make sure it is a PacketCellChangeContine. We also make sure that this
+	 * PacketCellChangeContine message does not contain any ARFCN/BSIC. */
+	f_rx_rlcmac_dl_block(dl_block, sched_fn);
+	cell_chg_cont := tr_RlcMacDlCtrl_PKT_CELL_CHG_CONTINUE
+	cell_chg_cont.u.cell_chg_continue.arfcn_bsic_presence := '0'B
+	if (not match(dl_block, tr_RLCMAC_DL_CTRL(?, cell_chg_cont))) {
+		setverdict(fail, "Rx unexpected DL block: ", dl_block);
+		f_shutdown(__BFILE__, __LINE__);
+	}
+
+	/* PKT CELL CHG CONTINUE ACK/NACK sets poll+rrbp requesting PACKET CONTROL ACK */
+	if (not skip_final_ctrl_ack and dl_block.ctrl.mac_hdr.rrbp_valid) {
+		sched_fn := f_rrbp_ack_fn(sched_fn, dl_block.ctrl.mac_hdr.rrbp);
+		f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), sched_fn);
+	}
+}
+
+/* Start NACC from MS side, propose an UTRAN cell */
+private function f_outbound_nacc_success_utran(inout GprsMS ms, PCUIF_info_ind info_ind,
+					       boolean exp_rac_ci_query := true, boolean exp_si_query := true,
+					       boolean skip_final_ctrl_ack := false,
+					       boolean use_old_ctrl_iface := false)
+runs on RAW_PCU_Test_CT {
+	var template (value) RlcmacUlCtrlMsg cell_chg_notif;
+	var uint14_t req_uarfcn := 1234;
+	var uint10_t req_scrambling_code := 456;
+
+	/* Start NACC from MS side */
+	cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF_UTRAN(ms.ul_tbf.tfi, req_uarfcn, req_scrambling_code);
+	f_outbound_nacc_success_no_si(ms, info_ind, exp_rac_ci_query, exp_si_query, skip_final_ctrl_ack, use_old_ctrl_iface, cell_chg_notif);
+}
+
+/* Start NACC from MS side, propose an E-UTRAN cell */
+private function f_outbound_nacc_success_eutran(inout GprsMS ms, PCUIF_info_ind info_ind,
+						boolean exp_rac_ci_query := true, boolean exp_si_query := true,
+						boolean skip_final_ctrl_ack := false,
+						boolean use_old_ctrl_iface := false)
+runs on RAW_PCU_Test_CT {
+	var template (value) RlcmacUlCtrlMsg cell_chg_notif;
+	var uint16_t req_earfcn := 1234;
+	var uint9_t phys_layer_cell_id := 456;
+
+	/* Start NACC from MS side */
+	cell_chg_notif := ts_RlcMacUlCtrl_PKT_CELL_CHG_NOTIF_EUTRAN(ms.ul_tbf.tfi, req_earfcn, phys_layer_cell_id);
+	f_outbound_nacc_success_no_si(ms, info_ind, exp_rac_ci_query, exp_si_query, skip_final_ctrl_ack, use_old_ctrl_iface, cell_chg_notif);
+}
+
 /* Start NACC from MS side, propose a GERAN cell */
-private function f_outbound_nacc_success(inout GprsMS ms, PCUIF_info_ind info_ind,
-					 boolean exp_rac_ci_query := true, boolean exp_si_query := true,
-					 boolean skip_final_ctrl_ack := false,
-					 boolean use_old_ctrl_iface := false)
+private function f_outbound_nacc_success_geran(inout GprsMS ms, PCUIF_info_ind info_ind,
+					       boolean exp_rac_ci_query := true, boolean exp_si_query := true,
+					       boolean skip_final_ctrl_ack := false,
+					       boolean use_old_ctrl_iface := false)
 runs on RAW_PCU_Test_CT {
 	var template (value) RlcmacUlCtrlMsg cell_chg_notif;
 	var template RlcmacDlCtrlMsg cell_chg_cont;
@@ -5381,8 +5441,14 @@
 	}
 }
 
+type enumerated f_TC_nacc_outbound_success_ran_type {
+	NACC_RAN_GERAN,
+	NACC_RAN_UTRAN,
+	NACC_RAN_EUTRAN
+}
+
 /* Verify PCU handles outbound Network Assisted Cell Change Cell Change (NACC, TS 44.060 sec 8.8). */
-testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
+function f_TC_nacc_outbound_success(f_TC_nacc_outbound_success_ran_type ran_type) runs on RAW_PCU_Test_CT {
 	var PollFnCtx pollctx;
 	var GprsMS ms;
 	var PCUIF_info_ind info_ind := valueof(ts_PCUIF_INFO_default);
@@ -5415,11 +5481,29 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
 
 	/* Start NACC from MS side */
-	f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
+	if (ran_type == NACC_RAN_GERAN) {
+		f_outbound_nacc_success_geran(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
+	} else if (ran_type == NACC_RAN_UTRAN) {
+		f_outbound_nacc_success_utran(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
+	} else if (ran_type == NACC_RAN_EUTRAN) {
+		f_outbound_nacc_success_eutran(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
+	}
 
 	f_shutdown(__BFILE__, __LINE__, final := true);
 }
 
+testcase TC_nacc_outbound_success() runs on RAW_PCU_Test_CT {
+	 f_TC_nacc_outbound_success(NACC_RAN_GERAN);
+}
+
+testcase TC_nacc_outbound_success_utran() runs on RAW_PCU_Test_CT {
+	 f_TC_nacc_outbound_success(NACC_RAN_UTRAN);
+}
+
+testcase TC_nacc_outbound_success_eutran() runs on RAW_PCU_Test_CT {
+	 f_TC_nacc_outbound_success(NACC_RAN_EUTRAN);
+}
+
 /* Verify Pkt Cell Change Continue is retransmitted if not CTRL ACKed */
 testcase TC_nacc_outbound_success_no_ctrl_ack() runs on RAW_PCU_Test_CT {
 	var PollFnCtx pollctx;
@@ -5456,7 +5540,8 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
 
 	/* Start NACC from MS side, avoid sending final CTRL ACK */
-	f_outbound_nacc_success(ms, info_ind, skip_final_ctrl_ack := true, use_old_ctrl_iface := use_old_ctrl_iface);
+	f_outbound_nacc_success_geran(ms, info_ind, skip_final_ctrl_ack := true,
+				      use_old_ctrl_iface := use_old_ctrl_iface);
 
 	/* Wait until we receive something non-dummy */
 	dl_block := f_skip_dummy(0, sched_fn);
@@ -5510,10 +5595,10 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
 
 	/* Start NACC from MS side */
-	f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
+	f_outbound_nacc_success_geran(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
 
 	/* First NACC procedure is done, let's try to start a new one now that previous queries are cached: */
-	f_outbound_nacc_success(ms, info_ind, false, false, use_old_ctrl_iface := use_old_ctrl_iface);
+	f_outbound_nacc_success_geran(ms, info_ind, false, false, use_old_ctrl_iface := use_old_ctrl_iface);
 
 	f_shutdown(__BFILE__, __LINE__, final := true);
 }
@@ -5557,14 +5642,14 @@
 	f_ms_tx_ul_block(ms, ts_RLCMAC_CTRL_ACK(ms.tlli), pollctx.fn, nr := pollctx.tstrxbts);
 
 	/* Start NACC from MS side */
-	f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
+	f_outbound_nacc_success_geran(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
 
 	/* CTRL client should have disconnected from us */
 	f_ipa_ctrl_wait_link_down();
 	/* wait for cache entries to time out */
 	f_sleep(2.0);
 	/* First NACC procedure is done, let's try to start a new one now that previous queries have timed out: */
-	f_outbound_nacc_success(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
+	f_outbound_nacc_success_geran(ms, info_ind, use_old_ctrl_iface := use_old_ctrl_iface);
 
 	f_shutdown(__BFILE__, __LINE__, final := true);
 }
@@ -7224,6 +7309,8 @@
 
 	execute( TC_pcuif_info_ind_subsequent() );
 	execute( TC_nacc_outbound_success() );
+	execute( TC_nacc_outbound_success_utran() );
+	execute( TC_nacc_outbound_success_eutran() );
 	execute( TC_nacc_outbound_success_no_ctrl_ack() );
 	execute( TC_nacc_outbound_success_twice() );
 	execute( TC_nacc_outbound_success_twice_nocache() );