diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2021-12-14 17:25:36 +0100 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2022-01-23 00:13:53 +0100 |
commit | 4d4cd7e7e5680d5a64169504f3a348e18a7151de (patch) | |
tree | eaabbe7fc7f7dd44e47a7ea889159b0df042b62a | |
parent | 6289af1197126cb2bae27d5ae84743689f46268b (diff) |
bsc: properly clean up conn after each test
Make all tests clean up BSSAP conn and RSL link. Now all
f_verify_talloc_count() in f_shutdown_helper() should pass, verifying no
conn or bsc_subscr leaks.
Related: OS#5337
Change-Id: I9396efcabc085d2850244c6468b83c5f3a3ff3a2
-rw-r--r-- | bsc/BSC_Tests.ttcn | 179 |
1 files changed, 163 insertions, 16 deletions
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn index 34d3d036..fe6d1b26 100644 --- a/bsc/BSC_Tests.ttcn +++ b/bsc/BSC_Tests.ttcn @@ -1633,6 +1633,7 @@ testcase TC_assignment_cic_only(integer bssap_idx := 0) runs on test_CT { } [] BSSAP.receive { repeat; } } + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -1711,7 +1712,7 @@ function f_gen_exp_compl(boolean expect_osmux := false, integer bssap_idx := 0) /* 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 { +runs on test_CT return DchanTuple { var BSSAP_N_CONNECT_ind rx_c_ind; var RSL_Message rx_rsl; var DchanTuple dt; @@ -1738,13 +1739,15 @@ runs on test_CT { } [] BSSAP.receive { repeat; } } + return dt; } testcase TC_assignment_csd() runs on test_CT { var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail; var PDU_BSSAP ass_cmd := f_gen_ass_req(); 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"); + var DchanTuple dt := f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for CSD"); + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -1753,7 +1756,8 @@ testcase TC_assignment_ctm() runs on test_CT { var PDU_BSSAP ass_cmd := f_gen_ass_req(); 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"); + var DchanTuple dt := f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for Speech+CTM"); + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -1983,6 +1987,8 @@ private function f_TC_stats_conn_fail(charstring id) runs on MSC_ConnHdlr { {name := "TTCN3.bts.0.chan.rf_fail_sdcch", mtype := "c", min := 1, max := 1} }; f_statsd_expect(expect); + BSSAP.receive(tr_BSSMAP_ClearRequest); + f_perform_clear(); } testcase TC_stats_conn_fail() runs on test_CT { var TestHdlrParams pars := f_gen_test_hdlr_pars(); @@ -2445,6 +2451,7 @@ private function f_TC_tch_dlci_link_id_sapi(charstring id) runs on MSC_ConnHdlr /* Send MT message: BSSAP -> RSL */ f_mt_l3_transceive(RSL, link_id, dlci, l3); } + f_perform_clear(); } testcase TC_tch_dlci_link_id_sapi() runs on test_CT { var TestHdlrParams pars := f_gen_test_hdlr_pars(); @@ -3556,8 +3563,10 @@ testcase TC_paging_resp_unsol() runs on test_CT { /* Expevct a CR with a matching Paging response on the A-Interface */ T.start; alt { - [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(rr_pag_resp))) { + [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(rr_pag_resp))) -> value rx_c_ind { setverdict(pass); + dt.sccp_conn_id := rx_c_ind.connectionId; + BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id)); } [] BSSAP.receive { setverdict(fail, "Received unexpected message on A-Interface!"); @@ -3567,6 +3576,7 @@ testcase TC_paging_resp_unsol() runs on test_CT { } } + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -3738,6 +3748,7 @@ private function f_tc_ciph_mode_a5(charstring id) runs on MSC_ConnHdlr { exp_compl.pdu.bssmap.assignmentComplete.aoIPTransportLayer := omit; f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } testcase TC_ciph_mode_a5_0() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -3826,6 +3837,7 @@ private function f_tc_assignment_aoip_tla_v6(charstring id) runs on MSC_ConnHdlr ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR})); f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } testcase TC_assignment_aoip_tla_v6() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -3848,6 +3860,7 @@ private function f_tc_assignment_fr_a5(charstring id) runs on MSC_ConnHdlr { ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR})); f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } testcase TC_assignment_fr_a5_0() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -3921,6 +3934,7 @@ private function f_tc_assignment_fr_a5_1_codec_missing(charstring id) runs on MS /* Omit: ass_cmd.pdu.bssmap.assignmentRequest.codecList */ f_establish_fully(ass_cmd, exp_fail); + f_perform_clear(); } testcase TC_assignment_fr_a5_1_codec_missing() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -3952,6 +3966,7 @@ private function f_TC_assignment_a5_not_sup(charstring id) runs on MSC_ConnHdlr /* Start ciphering, expect Cipher Mode Reject */ f_cipher_mode(g_pars.encr, exp_fail := true); + f_perform_clear(); } testcase TC_assignment_fr_a5_not_sup() runs on test_CT { var TestHdlrParams pars := f_gen_test_hdlr_pars(); @@ -3983,6 +3998,7 @@ private function f_tc_assignment_sign(charstring id) runs on MSC_ConnHdlr { { name := "TTCN3.bsc.0.assignment.completed", mtype := "c", min := 1, max := 1} }; f_statsd_expect(expect); + f_perform_clear(); } testcase TC_assignment_sign() runs on test_CT { @@ -4125,6 +4141,10 @@ type record CodecListTest { type record of CodecListTest CodecListTests private function f_TC_assignment_codec(charstring id) runs on MSC_ConnHdlr { + f_assignment_codec(id); +} + +private function f_assignment_codec(charstring id, boolean do_perform_clear := true) runs on MSC_ConnHdlr { var PDU_BSSAP ass_cmd := f_gen_ass_req(g_pars.use_osmux); var template PDU_BSSAP exp_compl := f_gen_exp_compl(g_pars.use_osmux); @@ -4179,6 +4199,10 @@ private function f_TC_assignment_codec(charstring id) runs on MSC_ConnHdlr { } } } + + if (do_perform_clear) { + f_perform_clear(); + } } private function f_TC_assignment_codec_fail(charstring id) runs on MSC_ConnHdlr { @@ -4195,6 +4219,7 @@ private function f_TC_assignment_codec_fail(charstring id) runs on MSC_ConnHdlr log("expecting ASS FAIL like this: ", exp_fail); f_establish_fully(ass_cmd, exp_fail); + f_perform_clear(); } const CounterNameVals counternames_bsc_bts_assignment := { @@ -4708,6 +4733,7 @@ private function f_TC_assignment_codec_xr_exhausted_req_hr(charstring id) runs o ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '05'O; ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR})); f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Allow FR only */ @@ -4720,6 +4746,7 @@ private function f_TC_assignment_codec_xr_exhausted_req_fr(charstring id) runs o ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '01'O; ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR})); f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Allow HR only (expect assignment failure) */ @@ -4732,6 +4759,7 @@ private function f_TC_assignment_codec_xr_exhausted_req_hr_fail(charstring id) r ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '05'O; ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR})); f_establish_fully(ass_cmd, exp_fail); + f_perform_clear(); } /* Allow FR only (expect assignment failure) */ @@ -4744,6 +4772,7 @@ private function f_TC_assignment_codec_xr_exhausted_req_fr_fail(charstring id) r ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '01'O; ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR})); f_establish_fully(ass_cmd, exp_fail); + f_perform_clear(); } /* Allow FR and HR, but prefer FR */ @@ -4757,6 +4786,7 @@ private function f_TC_assignment_codec_fr_exhausted_req_fr_hr(charstring id) run ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR, ts_CodecHR})); exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000101'B; /* Expect HR */ f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Allow FR and HR, but prefer HR */ @@ -4770,6 +4800,7 @@ private function f_TC_assignment_codec_fr_exhausted_req_hr_fr(charstring id) run ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR, ts_CodecFR})); exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000101'B; /* Expect HR */ f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Allow FR and HR, but prefer FR */ @@ -4783,6 +4814,7 @@ private function f_TC_assignment_codec_hr_exhausted_req_fr_hr(charstring id) run ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR, ts_CodecHR})); exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000001'B; /* Expect FR */ f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Allow FR and HR, but prefer HR */ @@ -4796,6 +4828,7 @@ private function f_TC_assignment_codec_hr_exhausted_req_hr_fr(charstring id) run ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR, ts_CodecFR})); exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000001'B; /* Expect FR */ f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Request a HR channel while all FR channels are exhausted, this is expected @@ -4921,6 +4954,7 @@ private function f_TC_assignment_codec_req_hr_fr(charstring id) runs on MSC_Conn ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR, ts_CodecFR})); exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000101'B; /* Expect HR */ f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Allow FR and HR, but prefer FR */ @@ -4934,6 +4968,7 @@ private function f_TC_assignment_codec_req_fr_hr(charstring id) runs on MSC_Conn ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR, ts_CodecHR})); exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000001'B; /* Expect FR */ f_establish_fully(ass_cmd, exp_compl); + f_perform_clear(); } /* Request a HR (prefered) or alternatively a FR channel, it is expected that @@ -4984,6 +5019,8 @@ private function f_TC_assignment_sdcch_exhausted_req_signalling(charstring id) r Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION"); } } + + f_perform_clear(); } testcase TC_assignment_sdcch_exhausted_req_signalling() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5046,6 +5083,7 @@ private function f_TC_assignment_sdcch_exhausted_req_voice_tch_forbidden(charstr Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION"); } } + f_perform_clear(); } testcase TC_assignment_sdcch_exhausted_req_voice_tch_forbidden() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5106,6 +5144,8 @@ private function f_tc_classmark(charstring id) runs on MSC_ConnHdlr { f_rsl_send_l3(ts_RRM_CM_CHG(valueof(ts_CM2))); BSSAP.receive(tr_BSSMAP_ClassmarkUpd(?, omit)); setverdict(pass); + + f_perform_clear(); } testcase TC_classmark() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5133,6 +5173,8 @@ private function f_tc_common_id(charstring id) runs on MSC_ConnHdlr { f_vty_transceive_match_regexp_retry(BSCVTY, "show conns", regex, 0, 4, 1.0); setverdict(pass); + + f_perform_clear(); } testcase TC_common_id() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5171,6 +5213,7 @@ private function f_bssap_expect_nothing(float sec := 5.00) runs on MSC_ConnHdlr private function f_tc_unsol_ass_fail(charstring id) runs on MSC_ConnHdlr { f_est_single_l3(ts_RRM_AssignmentFailure('00'O)); f_bssap_expect_nothing(); + f_perform_clear(); } testcase TC_unsol_ass_fail() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5186,6 +5229,7 @@ testcase TC_unsol_ass_fail() runs on test_CT { private function f_tc_unsol_ass_compl(charstring id) runs on MSC_ConnHdlr { f_est_single_l3(ts_RRM_AssignmentComplete('00'O)); f_bssap_expect_nothing(); + f_perform_clear(); } testcase TC_unsol_ass_compl() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5201,6 +5245,7 @@ testcase TC_unsol_ass_compl() runs on test_CT { private function f_tc_unsol_ho_fail(charstring id) runs on MSC_ConnHdlr { f_est_single_l3(ts_RRM_HandoverFailure('00'O)); f_bssap_expect_nothing(); + f_perform_clear(); } testcase TC_unsol_ho_fail() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5221,6 +5266,7 @@ private function f_tc_err_82_short_msg(charstring id) runs on MSC_ConnHdlr { /* send short message */ RSL.send(ts_RSL_DATA_IND(g_chan_nr, valueof(ts_RslLinkID_DCCH(0)), ''O)); f_bssap_expect_nothing(); + f_perform_clear(); } testcase TC_err_82_short_msg() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5243,6 +5289,7 @@ private function f_tc_err_84_unknown_msg(charstring id) runs on MSC_ConnHdlr { [] BSSAP.receive { setverdict(fail, "unexpected BSSAP"); } [] T.timeout { setverdict(fail, "Timeout waiting for RR STATUS"); } } + f_perform_clear(); } testcase TC_err_84_unknown_msg() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5349,6 +5396,8 @@ private function f_tc_ho_int(charstring id) runs on MSC_ConnHdlr { f_chan_act_verify_tsc(chan_act, BTS_TSC[1]); + f_perform_clear(RSL1, RSL1_PROC); + f_sleep(0.5); } @@ -5499,7 +5548,9 @@ private function f_tc_ho_int_radio_link_failure(charstring id) runs on MSC_ConnH RSL1.send(ts_RSL_RF_CHAN_REL_ACK(new_chan_nr)); f_rslem_unregister(0, g_chan_nr, PT := RSL1_PROC); } - [] BSSAP.receive(tr_BSSMAP_ClearComplete) {} + [] BSSAP.receive(tr_BSSMAP_ClearComplete) { + BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ); + } } f_sleep(0.5); @@ -5615,7 +5666,9 @@ private function f_ho_out_of_this_bsc(template (omit) BSSMAP_oldToNewBSSIEs exp_ [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_RRM_RR_RELEASE)); [] RSL.receive(tr_RSL_DEACT_SACCH(g_chan_nr)); [] RSL.receive(tr_RSL_RF_CHAN_REL(g_chan_nr)); - [] BSSAP.receive(tr_BSSMAP_ClearComplete); + [] BSSAP.receive(tr_BSSMAP_ClearComplete) { + BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ); + } } setverdict(pass); } @@ -5722,6 +5775,7 @@ private function f_tc_ho_out_fail_no_msc_response(charstring id) runs on MSC_Con f_mo_l3_transceive(); f_sleep(1.0); + f_perform_clear(); } testcase TC_ho_out_fail_no_msc_response() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5803,6 +5857,7 @@ private function f_tc_ho_out_fail_rr_ho_failure(charstring id) runs on MSC_ConnH setverdict(pass); f_sleep(1.0); + f_perform_clear(); } testcase TC_ho_out_fail_rr_ho_failure() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -5900,6 +5955,7 @@ private function f_tc_ho_out_fail_no_result_after_ho_cmd(charstring id) runs on f_expect_dlcx_conns(); BSSAP.receive(tr_BSSMAP_ClearComplete); + BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ); setverdict(pass); f_sleep(1.0); @@ -6233,6 +6289,7 @@ private function f_tc_ho_in_fail_msc_clears(charstring id) runs on MSC_ConnHdlr f_expect_dlcx_conns(); BSSAP.receive(tr_BSSMAP_ClearComplete); + BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ); setverdict(pass); f_sleep(1.0); @@ -6326,6 +6383,7 @@ private function f_tc_ho_in_fail_msc_clears_after_ho_detect(charstring id) runs f_expect_dlcx_conns(); BSSAP.receive(tr_BSSMAP_ClearComplete); + BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ); f_sleep(1.0); } @@ -6415,6 +6473,7 @@ private function f_tc_ho_in_fail_no_detect(charstring id) runs on MSC_ConnHdlr { f_expect_dlcx_conns(); BSSAP.receive(tr_BSSMAP_ClearComplete); + BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ); f_sleep(1.0); } @@ -6496,6 +6555,7 @@ private function f_tc_ho_in_fail_no_detect2(charstring id) runs on MSC_ConnHdlr }; f_expect_dlcx_conns(); BSSAP.receive(tr_BSSMAP_ClearComplete); + BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ); f_sleep(1.0); } @@ -6711,6 +6771,8 @@ private function f_tc_ho_neighbor_config_1(charstring id) runs on MSC_ConnHdlr { f_probe_for_handover("1.d", "HO to 871-11 still works (verify that this test properly cleans up)", "handover any to arfcn 871 bsic 11", true, expect_target_tsc := BTS_TSC[1]); + + f_perform_clear(); } testcase TC_ho_neighbor_config_1() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -6775,6 +6837,7 @@ private function f_tc_ho_neighbor_config_2(charstring id) runs on MSC_ConnHdlr { f_probe_for_handover("2.b", "HO to bts 2 doesn't work, not listed as neighbor", "handover any to arfcn 871 bsic 12", false); + f_perform_clear(); } testcase TC_ho_neighbor_config_2() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -6826,6 +6889,7 @@ private function f_tc_ho_neighbor_config_3(charstring id) runs on MSC_ConnHdlr { f_probe_for_handover("3.b", "HO to bts 2 works, explicitly listed as neighbor; no ambiguity because bts 3 is not listed as neighbor", "handover any to arfcn 871 bsic 12", true, expect_target_tsc := BTS_TSC[2]); + f_perform_clear(); } testcase TC_ho_neighbor_config_3() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -6880,6 +6944,7 @@ private function f_tc_ho_neighbor_config_4(charstring id) runs on MSC_ConnHdlr { f_probe_for_handover("4.c", "HO to 123-45 triggers inter-BSC HO", "handover any to arfcn 123 bsic 45", true, true); + f_perform_clear(); } testcase TC_ho_neighbor_config_4() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -6930,6 +6995,7 @@ private function f_tc_ho_neighbor_config_5(charstring id) runs on MSC_ConnHdlr { f_probe_for_handover("5.a", "HO to 871-12 triggers inter-BSC HO (ignoring local cells with same ARFCN+BSIC)", "handover any to arfcn 871 bsic 12", true, true); + f_perform_clear(); } testcase TC_ho_neighbor_config_5() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -6973,6 +7039,7 @@ private function f_tc_ho_neighbor_config_6(charstring id) runs on MSC_ConnHdlr { f_probe_for_handover("6.a", "HO to 871-12 is ambiguous = error", "handover any to arfcn 871 bsic 12", false); + f_perform_clear(); } testcase TC_ho_neighbor_config_6() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -7017,6 +7084,7 @@ private function f_tc_ho_neighbor_config_7(charstring id) runs on MSC_ConnHdlr { f_probe_for_handover("7.b", "HO to 123-45 triggers inter-BSC HO", "handover any to arfcn 123 bsic 45", true, true); + f_perform_clear(); } testcase TC_ho_neighbor_config_7() runs on test_CT { var MSC_ConnHdlr vc_conn; @@ -7478,9 +7546,11 @@ testcase TC_dyn_ts_sdcch8_act_deact() runs on test_CT { /* Fill TS0 SDCCH channels (NOTE: only 3 SDCCH/4 channels are available * on CCCH+SDCCH4+CBCH) */ + var DchanTuples sdcch_cleanup := {}; var integer i; for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) { dt := f_est_dchan('23'O, i, '00010203040506'O); + sdcch_cleanup := sdcch_cleanup & { dt }; } /* Now the dyn ts is selected. First PDCH is released, then sdcch chan is activated */ @@ -7512,6 +7582,11 @@ testcase TC_dyn_ts_sdcch8_act_deact() runs on test_CT { f_sleep(1.0); f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE); + /* Clean up SDCCH lchans */ + for (i := 0; i < lengthof(sdcch_cleanup); i := i + 1) { + f_perform_clear_test_ct(sdcch_cleanup[i]); + } + /* clean up config */ f_ts_set_chcomb(0, 0, 6, "PDCH"); @@ -7534,7 +7609,7 @@ testcase TC_dyn_ts_sdcch8_all_subslots_used() runs on test_CT { } f_vty_transceive(BSCVTY, "drop bts connection 0 oml"); - f_init(1); + f_init(1, guard_timeout := 60.0); /* The dyn TS want to activate PDCH mode, ACK that. */ var RslChannelNr chan_nr; @@ -7548,15 +7623,21 @@ testcase TC_dyn_ts_sdcch8_all_subslots_used() runs on test_CT { /* GSM 44.018 Table 9.1.8.2: * RA = '13'O -> Establishment cause = 0001xxxx (MS dual rate capable and asks for "SDCCH"). */ + var DchanTuples chan_cleanup := {}; for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) { - f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O); + chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) }; } /* Only the dyn TS is still available. Its first lchan gets converted to SDCCH8 */ - f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O); + chan_cleanup := chan_cleanup & { f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) }; /* Also occupy the seven other SDCCH of the dyn TS */ for (i := 0; i < 7; i := i+1) { - f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O); + chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) }; + } + + /* Clean up SDCCH lchans */ + for (i := 0; i < lengthof(chan_cleanup); i := i + 1) { + f_perform_clear_test_ct(chan_cleanup[i]); } /* clean up config */ @@ -7602,9 +7683,11 @@ testcase TC_dyn_ts_sdcch8_tch_call_act_deact() runs on test_CT { /* Fill TS0 SDCCH channels (NOTE: only 3 SDCCH/4 channels are available * on CCCH+SDCCH4+CBCH) */ + var DchanTuples chan_cleanup := {}; var OCT1 ra := '43'O; /* RA containing reason=originating speech call*/ for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) { dt := f_est_dchan(ra, i, '00010203040506'O); + chan_cleanup := chan_cleanup & { dt }; } /* Now the dyn ts is selected. First PDCH is released, then TCH chan is activated */ @@ -7636,6 +7719,11 @@ testcase TC_dyn_ts_sdcch8_tch_call_act_deact() runs on test_CT { f_sleep(1.0); f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE); + /* Clean up SDCCH lchans */ + for (i := 0; i < lengthof(chan_cleanup); i := i + 1) { + f_perform_clear_test_ct(chan_cleanup[i]); + } + /* clean up config */ f_ts_reset_chcomb(0); /* TODO: clean up other channels? */ @@ -7672,9 +7760,11 @@ testcase TC_dyn_ts_sdcch8_act_nack() runs on test_CT { /* Fill TS0 SDCCH channels (NOTE: only 3 SDCCH/4 channels are available * on CCCH+SDCCH4+CBCH) */ + var DchanTuples chan_cleanup := {}; var integer i; for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) { dt := f_est_dchan('23'O, i, '00010203040506'O); + chan_cleanup := chan_cleanup & { dt }; } /* Now the dyn ts is selected. First PDCH is released, then sdcch chan is activated */ @@ -7702,6 +7792,11 @@ testcase TC_dyn_ts_sdcch8_act_nack() runs on test_CT { * f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE) */ + /* Clean up SDCCH lchans */ + for (i := 0; i < lengthof(chan_cleanup); i := i + 1) { + f_perform_clear_test_ct(chan_cleanup[i]); + } + /* clean up config */ f_ts_set_chcomb(0, 0, 6, "PDCH"); @@ -7836,6 +7931,15 @@ runs on MSC_ConnHdlr { deactivate(ack_rel_req); } +private function f_perform_clear_test_ct(DchanTuple dt) + runs on test_CT +{ + /* Instruct BSC to clear channel */ + var BssmapCause cause := 0; + BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause))); + f_exp_chan_rel_and_clear(dt, 0); +} + private function f_perform_compl_l3(RSL_DCHAN_PT rsl_pt, RSLEM_PROC_PT rsl_proc_pt, template PDU_ML3_MS_NW l3_info, boolean do_clear := true, boolean expect_bssmap_l3 := true) runs on MSC_ConnHdlr { @@ -8578,6 +8682,7 @@ private function f_TC_assignment_emerg_setup_allow(charstring id) runs on MSC_Co } setverdict(pass); + f_perform_clear(); } /* Test if the EMERGENCY SETUP gets blocked by the BSC if EMERGENCY CALLS are @@ -8600,6 +8705,8 @@ private function f_TC_assignment_emerg_setup_deny(charstring id) runs on MSC_Con setverdict(fail, "timout waiting for RR CHANNEL RELEASE!"); } } + BSSAP.receive(tr_BSSMAP_ClearRequest); + f_perform_clear(); } /* EMERGENCY CALL situation #1, allowed globally and by BTS */ @@ -9087,6 +9194,8 @@ testcase TC_fh_params_assignment_cmd() runs on test_CT { setverdict(fail, "FH disabled, but Mobile Allocation IE is present"); continue; } + + f_perform_clear_test_ct(dt); } /* Give the IUT some time to release all channels */ @@ -9158,6 +9267,8 @@ runs on test_CT { setverdict(fail, "FH enabled, but Mobile Allocation IE is absent"); return; } + + f_perform_clear_test_ct(dt); } testcase TC_fh_params_handover_cmd() runs on test_CT { var FHParamsTrx fhp := f_TC_fh_params_gen(); @@ -9899,6 +10010,8 @@ private function f_TC_refuse_mode_modif_to_vamos(charstring id) runs on MSC_Conn } } T.stop; + + f_perform_clear(); } /* The BSC does *not* indicate BTS_FEAT_VAMOS; make sure that a channel Mode Modify to VAMOS mode is refused by @@ -9948,7 +10061,7 @@ testcase TC_refuse_chan_act_to_vamos() runs on test_CT { private function f_TC_reassignment_codec(charstring id) runs on MSC_ConnHdlr { /* First fully set up a speech lchan */ - f_TC_assignment_codec(id); + f_assignment_codec(id, do_perform_clear := false); /* Trigger re-assignment to another lchan */ var AssignmentState assignment_st := valueof(ts_AssignmentStateInit); @@ -10246,6 +10359,8 @@ testcase TC_imm_ass_post_chan_ack() runs on test_CT { /* First send the Chan Act ACK */ var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr; + var DchanTuple dt; + dt.rsl_chan_nr := chan_nr; var RSL_IE_Body chan_ident_ie; if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) { setverdict(fail, "RSL Channel Identification IE is absent"); @@ -10266,9 +10381,11 @@ testcase TC_imm_ass_post_chan_ack() runs on test_CT { var BSSAP_N_CONNECT_ind rx_c_ind; BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind; + dt.sccp_conn_id := rx_c_ind.connectionId; BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId)); f_sleep(1.0); + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -10291,6 +10408,8 @@ testcase TC_imm_ass_pre_chan_ack() runs on test_CT { chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV)); var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr; + var DchanTuple dt; + dt.rsl_chan_nr := chan_nr; var RSL_IE_Body chan_ident_ie; if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) { setverdict(fail, "RSL Channel Identification IE is absent"); @@ -10311,9 +10430,11 @@ testcase TC_imm_ass_pre_chan_ack() runs on test_CT { var BSSAP_N_CONNECT_ind rx_c_ind; BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind; + dt.sccp_conn_id := rx_c_ind.connectionId; BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId)); f_sleep(1.0); + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -10336,6 +10457,8 @@ testcase TC_imm_ass_pre_ts_ack() runs on test_CT { chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV)); var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr; + var DchanTuple dt; + dt.rsl_chan_nr := chan_nr; var RSL_IE_Body chan_ident_ie; if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) { setverdict(fail, "RSL Channel Identification IE is absent"); @@ -10356,9 +10479,11 @@ testcase TC_imm_ass_pre_ts_ack() runs on test_CT { var BSSAP_N_CONNECT_ind rx_c_ind; BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind; + dt.sccp_conn_id := rx_c_ind.connectionId; BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId)); f_sleep(1.0); + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -10406,6 +10531,8 @@ testcase TC_imm_ass_pre_chan_ack_dyn_ts() runs on test_CT { /* Now activation as SDCCH8 */ chan_nr := valueof(t_RslChanNr_SDCCH8(tn := 6, sub_slot := 0)); + var DchanTuple dt; + dt.rsl_chan_nr := chan_nr; chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV)); var RSL_IE_Body chan_ident_ie; @@ -10428,9 +10555,11 @@ testcase TC_imm_ass_pre_chan_ack_dyn_ts() runs on test_CT { var BSSAP_N_CONNECT_ind rx_c_ind; BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind; + dt.sccp_conn_id := rx_c_ind.connectionId; BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId)); f_sleep(1.0); + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -10483,6 +10612,8 @@ testcase TC_imm_ass_pre_ts_ack_dyn_ts() runs on test_CT { /* Now activation as SDCCH8 */ chan_nr := valueof(t_RslChanNr_SDCCH8(tn := 6, sub_slot := 0)); + var DchanTuple dt; + dt.rsl_chan_nr := chan_nr; chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV)); var RSL_IE_Body chan_ident_ie; @@ -10501,9 +10632,11 @@ testcase TC_imm_ass_pre_ts_ack_dyn_ts() runs on test_CT { var BSSAP_N_CONNECT_ind rx_c_ind; BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind; + dt.sccp_conn_id := rx_c_ind.connectionId; BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId)); f_sleep(1.0); + f_perform_clear_test_ct(dt); f_shutdown_helper(); } @@ -10607,6 +10740,8 @@ private function f_TC_cm_serv_rej(charstring id) runs on MSC_ConnHdlr f_create_chan_and_exp(); /* we should now have a COMPL_L3 at the MSC */ BSSAP.send(ts_PDU_DTAP_MT(ts_CM_SERV_REJ('02'O), '00'O)); + RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_CM_SERV_REJ)); + f_perform_clear(); f_sleep(1.0); } testcase TC_cm_serv_rej() runs on test_CT { @@ -10733,15 +10868,16 @@ testcase TC_ratectr_all_available_allocated() runs on test_CT { var integer i; var integer chreq_total, chreq_nochan; - f_init(1); + f_init(1, guard_timeout := 60.0); f_sleep(1.0); /* Exhaust all dedicated SDCCH lchans. /* GSM 44.018 Table 9.1.8.2: * RA = '13'O -> Establishment cause = 0001xxxx (MS dual rate capable and asks for "SDCCH"). */ + var DchanTuples chan_cleanup := {}; for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) { - f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O); + chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) }; } /* Since only bts 0 is connected, expecting all_allocated to become true for both bts 0 and the "global" bsc @@ -10751,13 +10887,18 @@ testcase TC_ratectr_all_available_allocated() runs on test_CT { /* Also fill up all remaining (TCH) channels */ for (i := 0; i < NUM_TCHF_PER_BTS + NUM_TCHH_PER_BTS; i := i+1) { - f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O); + chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) }; } /* All TCH are now also occupied */ f_all_allocated_expect_counter_change({"all_allocated:sdcch", "all_allocated:static_sdcch", "all_allocated:tch", "all_allocated:static_tch"}); + /* Clean up SDCCH lchans */ + for (i := 0; i < lengthof(chan_cleanup); i := i + 1) { + f_perform_clear_test_ct(chan_cleanup[i]); + } + f_shutdown_helper(); } @@ -10784,8 +10925,9 @@ testcase TC_ratectr_all_available_allocated_dyn() runs on test_CT { /* GSM 44.018 Table 9.1.8.2: * RA = '13'O -> Establishment cause = 0001xxxx (MS dual rate capable and asks for "SDCCH"). */ + var DchanTuples chan_cleanup := {}; for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) { - f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O); + chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) }; } /* The static SDCCH should now be occupied, while still 3x8 dynamic SDCCH potentially remain. So only @@ -10807,7 +10949,7 @@ testcase TC_ratectr_all_available_allocated_dyn() runs on test_CT { /* occupy the remaining TCH, three TCH/F and two TCH/H lchans */ for (i := 0; i < 5; i := i+1) { - f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O); + chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) }; } /* All TCH lchans are now also occupied, both static and dynamic */ @@ -10841,6 +10983,11 @@ testcase TC_ratectr_all_available_allocated_dyn() runs on test_CT { /* Now all channels are occupied except the dyn TS, so expecting only the static counters to increment */ f_all_allocated_expect_counter_change({"all_allocated:static_sdcch", "all_allocated:static_tch"}); + /* Clean up SDCCH lchans */ + for (i := 0; i < lengthof(chan_cleanup); i := i + 1) { + f_perform_clear_test_ct(chan_cleanup[i]); + } + /* clean up config */ f_ts_reset_chcomb(0); |