ns: Add test for SNS Size NSEI IE

Related: OS#5208
Change-Id: Ia01211935cf09acf5eb7e27ba998af63fe6c6d49
diff --git a/ns/NS_Tests.ttcn b/ns/NS_Tests.ttcn
index 722f8ec..3ebdbf3 100644
--- a/ns/NS_Tests.ttcn
+++ b/ns/NS_Tests.ttcn
@@ -67,6 +67,9 @@
 			}
 		}
 	};
+	NsIEI ns_iei_num_ipv4_ep := NS_IEI_NUM_IPv4_EP;
+	NsIEI ns_iei_num_ipv6_ep := NS_IEI_NUM_IPv6_EP;
+	NsIEI ns_iei_nsei := NS_IEI_NSEI;
 }
 
 type component RAW_Test_CT extends RAW_NS_CT {
@@ -559,6 +562,53 @@
 /* 48.016 SNS test cases */
 
 /* do a succesful SNS configuration */
+function f_send_expect(in integer NSCP_IDX, in template (omit) PDU_NS pdu,
+		       in NsCause c) runs on RAW_Test_CT {
+	log("Expected cause: ", c);
+	NSCP[NSCP_IDX].send(pdu);
+	f_ns_exp(tr_SNS_SIZE_ACK(g_nsconfig.nsei, c), NSCP_IDX);
+}
+
+function f_set_num_of_ip_endpoints(inout template (omit) PDU_NS base, AddressFamily af) runs on RAW_Test_CT {
+	const integer NUM_IP := 1;
+	if (af == AF_INET) {
+		base.pDU_SNS_Size.numberOfIP4_Endpoints :=
+			{iEI := int2oct(enum2int(ns_iei_num_ipv4_ep), 1),
+			 numberOfIP_Endpoints := int2oct(NUM_IP, 2)};
+	} else {
+		base.pDU_SNS_Size.numberOfIP4_Endpoints :=
+			{iEI := int2oct(enum2int(ns_iei_num_ipv6_ep), 1),
+			 numberOfIP_Endpoints := int2oct(NUM_IP, 2)};
+	}
+}
+
+/* Send SNS Size PDUs with invalid IEs */
+testcase TC_sns_sgsn_sns_size_syntactically_wrong_NSEI() runs on RAW_Test_CT {
+	f_init_vty();
+	f_init_ns_codec(mp_nsconfig);
+	const integer IDX := 0;
+	/* Assumption: No connections to other NSEs for SUT and testcomponent */
+	const integer sgsn_ip4_endpoints := lengthof(mp_nsconfig.nsvc);
+	const integer ip4_endpoints := lengthof(mp_nsconfig.nsvc);
+	const integer num_of_nsvcs := sgsn_ip4_endpoints * ip4_endpoints;
+	/* Template that would be accepted, only missing the number of IP endpoints
+	 * (since there are no ternary operators in TTCN-3...) */
+	var template (omit) PDU_NS ts_base_SNS_SIZE_configured :=
+		ts_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := num_of_nsvcs,
+			    num_v4 := omit, num_v6 := omit);
+	var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[IDX];
+
+	f_set_num_of_ip_endpoints(ts_base_SNS_SIZE_configured, g_nsconfig.nsvc[0].provider.ip.address_family);
+	/* Syntactical error here: length of 1 (has to be >=2) */
+	ts_base_SNS_SIZE_configured.pDU_SNS_Size.nSEI_NS :=
+		{iEI := int2oct(enum2int(ns_iei_nsei), 1), ext := '0'B, lengthIndicator := {length1 := 1},
+		 nSEI := int2oct(g_nsconfig.nsei, 2)};
+	const NsCause cause := NS_CAUSE_INVALID_ESSENTIAL_IE;
+	f_send_expect(IDX, ts_base_SNS_SIZE_configured, cause);
+	setverdict(pass);
+	f_clean_ns_codec();
+}
+
 testcase TC_sns_bss_config_success() runs on RAW_Test_CT {
 	f_init_vty();
 	f_init_ns_codec(mp_nsconfig);
@@ -1098,6 +1148,7 @@
 			execute( TC_sns_sgsn_add_change_del() );
 			execute( TC_sns_sgsn_size_correct_port() );
 			execute( TC_sns_sgsn_size_after_success() );
+			execute( TC_sns_sgsn_sns_size_syntactically_wrong_NSEI() );
 		}
 	}
 }