BSC_Tests: Add whole bunch of new assignment tests

Change-Id: Ia7304f2e2265c2ebd92575a9403b082579397656
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index 41e3a84..77f3ef8 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -411,6 +411,7 @@
 	[] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentComplete)) {
 		setverdict(fail, "AoIP BSC cannot accept ASSIGNMENT without AoIP Transport IE");
 		}
+	/* TODO: Actually expect GSM0808_CAUSE_REQ_A_IF_TYPE_NOT_SUPP */
 	[] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentFail)) {
 		setverdict(pass);
 		}
@@ -418,6 +419,118 @@
 	}
 }
 
+/* Run everything required up to sending a caller-specified assignment command and expect response */
+function f_assignment_exp(PDU_BSSAP ass_cmd, template PDU_BSSAP exp, charstring fail_text)
+runs on test_CT {
+	var BSSAP_N_CONNECT_ind rx_c_ind;
+	var RSL_Message rx_rsl;
+	var DchanTuple dt;
+
+	f_init();
+	f_bssap_reset();
+
+	dt := f_est_dchan('23'O, 23, '00000000'O);
+	/* send assignment without AoIP IEs */
+	BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ass_cmd));
+	alt {
+	[] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentComplete)) {
+		if (ischosen(exp.pdu.bssmap.assignmentComplete)) {
+			setverdict(pass);
+		} else {
+			setverdict(fail, fail_text);
+		}
+		}
+	[] BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_AssignmentFail)) {
+		if (ischosen(exp.pdu.bssmap.assignmentFailure)) {
+			setverdict(pass);
+		} else {
+			setverdict(fail, fail_text);
+		}
+		}
+	[] BSSAP.receive { repeat; }
+	}
+}
+testcase TC_assignment_csd() runs on test_CT {
+	var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
+	var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
+	var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
+	ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCSD);
+	//exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);
+	f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for CSD");
+}
+
+testcase TC_assignment_ctm() runs on test_CT {
+	var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
+	var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
+	var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
+	ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCTM);
+	//exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);
+	f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for Speech+CTM");
+}
+
+testcase TC_assignment_sign() runs on test_CT {
+	var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, omit);
+	var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
+	var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
+
+	ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeSIGNAL);
+	f_assignment_exp(ass_cmd, exp_compl, "BSC failed SIGNALLING assignment");
+}
+
+testcase TC_assignment_fr_a5_0() runs on test_CT {
+	var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
+	var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
+	var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
+	const OCT8 kc := '0001020304050607'O;
+
+	ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
+	ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
+							valueof(ts_BSSMAP_IE_EncrInfo(kc, '01'O));
+	f_assignment_exp(ass_cmd, exp_compl, "BSC failed TCH/F FR A5/0 assignment");
+}
+
+testcase TC_assignment_fr_a5_1() runs on test_CT {
+	var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
+	var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
+	var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
+	const OCT8 kc := '0001020304050607'O;
+
+	ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
+	ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
+							valueof(ts_BSSMAP_IE_EncrInfo(kc, '02'O));
+	f_assignment_exp(ass_cmd, exp_compl, "BSC failed TCH/F FR A5/1 assignment");
+}
+
+
+testcase TC_assignment_fr_a5_3() runs on test_CT {
+	var template PDU_BSSAP exp_compl := tr_BSSMAP_AssignmentComplete(omit, ?);
+	var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
+	var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
+	const OCT8 kc := '0001020304050607'O;
+
+	ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
+	ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
+							valueof(ts_BSSMAP_IE_EncrInfo(kc, '08'O));
+	f_assignment_exp(ass_cmd, exp_compl, "BSC failed TCH/F FR A5/3 assignment");
+}
+
+testcase TC_assignment_fr_a5_4() runs on test_CT {
+	var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;
+	var BSSMAP_IE_AoIP_TransportLayerAddress tla := valueof(ts_BSSMAP_IE_AoIP_TLA4('01020304'O, 2342));
+	var PDU_BSSAP ass_cmd := valueof(ts_BSSMAP_AssignmentReq(omit, tla));
+	const OCT8 kc := '0001020304050607'O;
+	const OCT16 kc128 := kc & kc;
+
+	ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);
+	ass_cmd.pdu.bssmap.assignmentRequest.encryptionInformation :=
+							valueof(ts_BSSMAP_IE_EncrInfo(kc, '10'O));
+	ass_cmd.pdu.bssmap.assignmentRequest.kC128 := valueof(ts_BSSMAP_IE_Kc128(kc128));
+	/* TODO: expect GSM0808_CAUSE_CIPHERING_ALGORITHM_NOT_SUPPORTED cause value */
+	f_assignment_exp(ass_cmd, exp_fail, "BSC accepted TCH/F FR A5/4 assignment");
+}
+
+
+
 
 type record DchanTuple {
 	integer sccp_conn_id,
@@ -1013,7 +1126,7 @@
 	}
 }
 
-/* Verify PCH load */
+/* Verify Paging Counter */
 testcase TC_paging_counter() runs on test_CT {
 	var BSSMAP_FIELD_CellIdentificationList cid_list;
 	timer T := 4.0;
@@ -1126,6 +1239,13 @@
 
 	execute( TC_outbound_connect() );
 	execute( TC_assignment_cic_only() );
+	execute( TC_assignment_csd() );
+	execute( TC_assignment_ctm() );
+	execute( TC_assignment_sign() );
+	execute( TC_assignment_fr_a5_0() );
+	execute( TC_assignment_fr_a5_1() );
+	execute( TC_assignment_fr_a5_3() );
+	execute( TC_assignment_fr_a5_4() );
 
 	execute( TC_rll_est_ind_inact_lchan() );
 	execute( TC_rll_est_ind_inval_sapi1() );