gprs_gb: Add NS CodecPort + Emulation; Add NS selftests
diff --git a/gprs_gb/Test.ttcn b/gprs_gb/Test.ttcn
index 33d43bf..8939cad 100644
--- a/gprs_gb/Test.ttcn
+++ b/gprs_gb/Test.ttcn
@@ -2,15 +2,16 @@
 
 	import from BSSGP_Helper_Functions all;
 	import from BSSGP_Types all;
+	import from NS_Types all;
 
 	type component dummy_CT {
 	}
 
-	function f_assert_prepr(in octetstring a, in octetstring b) {
-		log ("Input: ", a);
-		log ("Expected: ", b);
+	function f_bssgp_assert_prepr(in octetstring a, in octetstring b) {
+		log("BSSGP Input: ", a);
+		log("BSSGP Expected: ", b);
 		var octetstring a_preprocessed := f_BSSGP_expand_len(a);
-		log ("Preprocessed: ", a_preprocessed);
+		log("BSSGP Preprocessed: ", a_preprocessed);
 
 		if (a_preprocessed != b) {
 			setverdict(fail);
@@ -19,15 +20,15 @@
 		}
 	}
 
-	function f_dec_and_log(in octetstring inp) {
-		log("Input: ", inp);
+	function f_bssgp_dec_and_log(in octetstring inp) {
+		log("BSSGP Input: ", inp);
 		var octetstring inp_p := f_BSSGP_expand_len(inp);
-		log ("Preprocessed: ", inp_p);
+		log("BSSGP Preprocessed: ", inp_p);
 		var BssgpPdu dec := dec_BssgpPdu(inp_p);
-		log("Decoded: ", dec);
+		log("BSSGP Decoded: ", dec);
 	}
 
-	testcase TC_selftest() runs on dummy_CT {
+	testcase TC_selftest_bssgp() runs on dummy_CT {
 		const octetstring c_bvc_reset_pcu := '2204820000078108088832f44000c80051e0'O;
 		const octetstring c_bvc_reset_q := '2204820000078100'O;
 		const octetstring c_status_pcu := '4107810515882204820000078103'O;
@@ -45,35 +46,75 @@
 		const octetstring c_gmm_mo_att_cpl := '01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;
 
 		/* single byte length to two byte length */
-		f_assert_prepr('04058101'O, '0405000101'O);
-		f_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
+		f_bssgp_assert_prepr('04058101'O, '0405000101'O);
+		f_bssgp_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
 		/* two byte length to two byte length */
-		f_assert_prepr('0405000101'O, '0405000101'O);
+		f_bssgp_assert_prepr('0405000101'O, '0405000101'O);
 		/* special case: DL-UD + UL-UD */
-		f_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
-		f_assert_prepr('01aabbccddeeffaa29822342'O, '01aabbccddeeffaa2900022342'O);
+		f_bssgp_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
+		f_bssgp_assert_prepr('01aabbccddeeffaa29822342'O, '01aabbccddeeffaa2900022342'O);
 		/* multiple TLVs */
-		f_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
-		f_assert_prepr('230080'O, '23000000'O);
+		f_bssgp_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
+		f_bssgp_assert_prepr('230080'O, '23000000'O);
 
-		f_dec_and_log(c_bvc_reset_pcu);
-		f_dec_and_log(c_bvc_reset_q);
-		f_dec_and_log(c_status_pcu);
-		f_dec_and_log(c_reset_ack_q);
-		f_dec_and_log(c_reset_ack_pcu);
-		f_dec_and_log(c_unblock_pcu);
-		f_dec_and_log(c_unblock_ack_q);
-		f_dec_and_log(c_fc_bvc_pcu);
-		f_dec_and_log(c_fc_bvc_ack_q);
-		f_dec_and_log(c_gmm_mo_att_req);
-		f_dec_and_log(c_gmm_mt_ac_req);
-		f_dec_and_log(c_gmm_mo_ac_resp);
-		f_dec_and_log(c_gmm_mt_att_acc);
-		f_dec_and_log(c_gmm_mt_det_req);
-		f_dec_and_log(c_gmm_mo_att_cpl);
+		f_bssgp_dec_and_log(c_bvc_reset_pcu);
+		f_bssgp_dec_and_log(c_bvc_reset_q);
+		f_bssgp_dec_and_log(c_status_pcu);
+		f_bssgp_dec_and_log(c_reset_ack_q);
+		f_bssgp_dec_and_log(c_reset_ack_pcu);
+		f_bssgp_dec_and_log(c_unblock_pcu);
+		f_bssgp_dec_and_log(c_unblock_ack_q);
+		f_bssgp_dec_and_log(c_fc_bvc_pcu);
+		f_bssgp_dec_and_log(c_fc_bvc_ack_q);
+		f_bssgp_dec_and_log(c_gmm_mo_att_req);
+		f_bssgp_dec_and_log(c_gmm_mt_ac_req);
+		f_bssgp_dec_and_log(c_gmm_mo_ac_resp);
+		f_bssgp_dec_and_log(c_gmm_mt_att_acc);
+		f_bssgp_dec_and_log(c_gmm_mt_det_req);
+		f_bssgp_dec_and_log(c_gmm_mo_att_cpl);
+	}
+
+	function f_ns_assert_prepr(in octetstring a, in octetstring b) {
+		log("NS Input: ", a);
+		log("NS Expected: ", b);
+		var octetstring a_preprocessed := f_NS_expand_len(a);
+		log("NS Preprocessed: ", a_preprocessed);
+
+		if (a_preprocessed != b) {
+			setverdict(fail);
+		} else {
+			setverdict(pass);
+		}
+	}
+
+	function f_ns_dec_and_log(in octetstring inp) {
+		log("NS Input: ", inp);
+		var octetstring inp_p := f_NS_expand_len(inp);
+		log("NS Preprocessed: ", inp_p);
+		var NsPdu dec := dec_NsPdu(inp_p);
+		log("NS Decoded: ", dec);
+	}
+
+	testcase TC_selftest_ns() runs on dummy_CT {
+		const octetstring c_ns_reset_pcu := '000000c4271e813d'O;
+
+		/* single byte length to two byte length */
+		f_ns_assert_prepr('04058101'O, '0405000101'O);
+		f_ns_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
+		/* two byte length to two byte length */
+		f_ns_assert_prepr('0405000101'O, '0405000101'O);
+		/* special case: NS-UNITDATA */
+		f_ns_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
+		/* multiple TLVs */
+		f_ns_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
+		/* zero-length */
+		f_ns_assert_prepr('230080'O, '23000000'O);
+
+		f_ns_dec_and_log(c_ns_reset_pcu);
 	}
 
 	control {
-		execute(TC_selftest());
+		execute(TC_selftest_bssgp());
+		execute(TC_selftest_ns());
 	}
 };