diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn index c89eeb1cb..12e1a3a06 100644 --- a/bts/BTS_Tests.ttcn +++ b/bts/BTS_Tests.ttcn @@ -3595,6 +3595,79 @@ testcase TC_pcu_time_ind() runs on test_CT { setverdict(pass); } +/* test for periodic RTS_REQ; check number of FN expired and number of RTS_IND per SAPI */ +testcase TC_pcu_rts_req() runs on test_CT { + var PCUIF_send_data pcu_sd; + var integer first_fn, last_fn; + var integer num_rts_pdtch := 0; + var integer num_rts_ptcch := 0; + var float test_duration := 5.0; + timer T; + + f_init_pcu_test(); + f_TC_pcu_act_req(0, 0, 7, true); + + PCU.clear; + T.start(test_duration); + alt { + [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(0, 0, 7, PCU_IF_SAPI_PDTCH, ?, ?))) + -> value pcu_sd { + num_rts_pdtch := num_rts_pdtch + 1; + if (not isbound(first_fn)) { + first_fn := pcu_sd.data.u.rts_req.fn; + } + last_fn := pcu_sd.data.u.rts_req.fn; + repeat; + } + [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(0, 0, 7, PCU_IF_SAPI_PTCCH, ?, ?))) + -> value pcu_sd { + num_rts_ptcch := num_rts_ptcch + 1; + if (not isbound(first_fn)) { + first_fn := pcu_sd.data.u.rts_req.fn; + } + last_fn := pcu_sd.data.u.rts_req.fn; + repeat; + } + [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ)) -> value pcu_sd { + setverdict(fail, "Received unexpected PCUIF_RTS_REQ: ", pcu_sd.data); + repeat; + } + [] PCU.receive { + repeat; + } + [] T.timeout {} + } + var integer fn_expired := last_fn - first_fn; + log(fn_expired, " fn expired with num_rts_pdtch=", num_rts_pdtch, + ", num_rts_ptcch=", num_rts_ptcch); + + /* verify the number of frames expired matches our expectation */ + const float c_GSM_FN_DURATION_MS := 4.61538; + var float fn_expected := test_duration * 1000.0 / c_GSM_FN_DURATION_MS; + var template integer t_fn_expected := f_tolerance(float2int(fn_expected), 1, 100000, 10); + if (not match(fn_expired, t_fn_expected)) { + setverdict(fail, "Number of TDMA Frames (", fn_expired, ") not matching ", t_fn_expected); + } + + /* PTCCH is in pos. 12 + 38 of 52-multiframe, but four slots/bursts required per block */ + var float ptcch_expected := int2float(fn_expired) / 52.0 * 0.5; + var template integer t_ptcch_exp := f_tolerance(float2int(ptcch_expected), 1, 100000, 1); + if (not match(num_rts_ptcch, t_ptcch_exp)) { + setverdict(fail, "Number of RTS.ind for PTCCH (", num_rts_ptcch, ") not matching ", + t_ptcch_exp); + } + + /* We have 12 PDTCH blocks every 52-multiframe */ + var float pdtch_expected := int2float(fn_expired) / 52.0 * 12.0; + var template integer t_pdtch_exp := f_tolerance(float2int(pdtch_expected), 1, 100000, 2); + if (not match(num_rts_pdtch, t_pdtch_exp)) { + setverdict(fail, "Number of RTS.ind for PDTCH (", num_rts_pdtch, ") not matching ", + t_pdtch_exp); + } + + setverdict(pass); +} + /* test for generating Abis side OML ALERT from the PCU */ testcase TC_pcu_oml_alert() runs on test_CT { var PCUIF_send_data pcu_sd; @@ -4921,6 +4994,7 @@ control { execute( TC_pcu_ext_rach_content() ); execute( TC_pcu_paging_from_rsl() ); execute( TC_pcu_time_ind() ); + execute( TC_pcu_rts_req() ); execute( TC_pcu_oml_alert() ); } else { log("PCU socket path not available, skipping PCU tests");