bts: Add TC_sms_cb_cmd_cbch_sdcch{4,8}_default_only
Add a most basic CBCH DEFAULT message test: Ensure *only* the default message is sent if a default is set. Related: OS#4011 Change-Id: Iab03fa88b759759a493516d43090c4df63f7b06f
This commit is contained in:
parent
e0026c3fb5
commit
88e5dffd19
|
@ -97,10 +97,15 @@ private function f_cbch_block_nr2rsl(uint2_t nr) return uint2_t {
|
|||
mtc.stop;
|
||||
}
|
||||
|
||||
private function f_cbch_fn2tb(uint32_t fn) return integer
|
||||
{
|
||||
return (fn/51) mod 8; /* TS 05.02 Section 6.5.4 */
|
||||
}
|
||||
|
||||
/* Verify the CBCH TB scheduling rules of TS 05.02 Section 6.5.4 */
|
||||
private function f_cbch_fn_verify(uint32_t fn, CBCH_Block cb)
|
||||
{
|
||||
var integer tb := (fn/51) mod 8; /* TS 05.02 Section 6.5.4 */
|
||||
var integer tb := f_cbch_fn2tb(fn);
|
||||
if (cb.block_type.seq_nr == 15 /* null */) {
|
||||
/* always permitted */
|
||||
return;
|
||||
|
@ -115,12 +120,8 @@ private function f_cbch_fn_verify(uint32_t fn, CBCH_Block cb)
|
|||
}
|
||||
}
|
||||
|
||||
/* shared function doing the heavy lifting for most CBCH tests */
|
||||
private function f_TC_smscb(CbchTestPars pars) runs on test_CT {
|
||||
var L1ctlDlMessage dl;
|
||||
var boolean cmd_seen_once := false;
|
||||
var integer i, j;
|
||||
timer T := 5.0;
|
||||
private function f_smscb_setup(inout CbchTestPars pars) runs on test_CT {
|
||||
var integer i;
|
||||
|
||||
f_cbch_compute_exp_blocks(pars);
|
||||
|
||||
|
@ -153,6 +154,24 @@ private function f_TC_smscb(CbchTestPars pars) runs on test_CT {
|
|||
valueof(ts_RSL_IE_CbCmdType(msg.rsl_cb_cmd, rsl_last_block));
|
||||
RSL_CCHAN.send(ts_RSL_UD(ts_RSL_SMSCB_CMD(cmd_type, msg.payload)));
|
||||
}
|
||||
}
|
||||
|
||||
private function f_smscb_cleanup() runs on test_CT {
|
||||
/* reset timeslot 0 channel combination to default */
|
||||
f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"},
|
||||
"phys_chan_config CCCH+SDCCH4");
|
||||
f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"},
|
||||
"phys_chan_config SDCCH8");
|
||||
}
|
||||
|
||||
/* shared function doing the heavy lifting for most CBCH tests */
|
||||
private function f_TC_smscb(CbchTestPars pars) runs on test_CT {
|
||||
var L1ctlDlMessage dl;
|
||||
var integer i, j;
|
||||
timer T := 5.0 * int2float(lengthof(pars.msgs));
|
||||
|
||||
f_smscb_setup(pars);
|
||||
|
||||
T.start;
|
||||
/* Expect this to show up exactly once on the basic CBCH (four blocks) */
|
||||
alt {
|
||||
|
@ -202,11 +221,57 @@ private function f_TC_smscb(CbchTestPars pars) runs on test_CT {
|
|||
}
|
||||
}
|
||||
|
||||
/* reset timeslot 0 channel combination to default */
|
||||
f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 0"},
|
||||
"phys_chan_config CCCH+SDCCH4");
|
||||
f_vty_config2(BSCVTY, {"network", "bts 0", "trx 0", "timeslot 6"},
|
||||
"phys_chan_config SDCCH8");
|
||||
f_smscb_cleanup();
|
||||
Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
|
||||
}
|
||||
|
||||
private function f_TC_smscb_default_only(CbchTestPars pars) runs on test_CT {
|
||||
var L1ctlDlMessage dl;
|
||||
timer T := 5.0;
|
||||
|
||||
f_smscb_setup(pars);
|
||||
|
||||
/* ensure whatever initial NULL messages have all been drained */
|
||||
f_sleep(5.0);
|
||||
L1CTL.clear;
|
||||
|
||||
T.start;
|
||||
alt {
|
||||
[] L1CTL.receive(tr_L1CTL_DATA_IND(t_RslChanNr_CBCH(0))) -> value dl {
|
||||
var integer tb := f_cbch_fn2tb(dl.dl_info.frame_nr);
|
||||
log("CBCH: ", dl);
|
||||
var CBCH_Block cb := dec_CBCH_Block(dl.payload.data_ind.payload);
|
||||
/* detect the proper CBCH messages; check frame number */
|
||||
f_cbch_fn_verify(dl.dl_info.frame_nr, cb);
|
||||
if (tb >= 4) {
|
||||
/* skip extended CBCH for now */
|
||||
repeat;
|
||||
}
|
||||
if (not match(cb, tr_CBCH_Block)) {
|
||||
setverdict(fail, "Illegal CBCH Block received: ", cb);
|
||||
} else {
|
||||
var uint4_t rx_seq_nr := cb.block_type.seq_nr;
|
||||
var template CBCH_Block tr;
|
||||
if (rx_seq_nr < lengthof(pars.msgs[0].blocks)) {
|
||||
var CbchBlock b := pars.msgs[0].blocks[rx_seq_nr];
|
||||
tr := tr_CBCH_Block(b.seq_nr, b.is_last, b.payload);
|
||||
} else {
|
||||
tr := tr_CBCH_Block(15, ?, ?);
|
||||
}
|
||||
if (match(cb, tr)) {
|
||||
setverdict(pass); /* FIXME: check that all blocks are received? */
|
||||
repeat;
|
||||
} else {
|
||||
setverdict(fail, "Unexpected CBCH block ", cb, ", expected ", tr);
|
||||
}
|
||||
}
|
||||
}
|
||||
[] L1CTL.receive { repeat; }
|
||||
[] T.timeout {}
|
||||
}
|
||||
|
||||
f_smscb_cleanup();
|
||||
/* don't shut down; some tests still want to continue */
|
||||
}
|
||||
|
||||
private const CbchTestMsgs msgs_1m_1b_norm := {
|
||||
|
@ -260,6 +325,13 @@ private const CbchTestMsgs msgs_3m_4b_norm := {
|
|||
omit }
|
||||
}
|
||||
|
||||
private const CbchTestMsgs msgs_1m_3b_default := {
|
||||
{ RSL_CB_CMD_DEFAULT, 2, '001000320f1141660c344dd3cba09a0c000000000000'O &
|
||||
'000102030405060708090a0b0c0d0e0f101213141516'O &
|
||||
'101112131415161718191a1b1c1d1e1f202223242526'O,
|
||||
omit }
|
||||
}
|
||||
|
||||
/* transmit single-block SMSCB COMMAND */
|
||||
testcase TC_sms_cb_cmd_sdcch4_1block() runs on test_CT {
|
||||
var CbchTestPars pars := {
|
||||
|
@ -356,6 +428,25 @@ testcase TC_sms_cb_cmd_sdcch8_schedule() runs on test_CT {
|
|||
f_TC_smscb(pars);
|
||||
}
|
||||
|
||||
/* set a DEFAULT message; verify it gets transmitted all the time */
|
||||
testcase TC_sms_cb_cmd_sdcch4_default_only() runs on test_CT {
|
||||
var CbchTestPars pars := {
|
||||
use_sdcch4 := true,
|
||||
msgs := msgs_1m_3b_default
|
||||
};
|
||||
f_TC_smscb_default_only(pars);
|
||||
Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
|
||||
}
|
||||
testcase TC_sms_cb_cmd_sdcch8_default_only() runs on test_CT {
|
||||
var CbchTestPars pars := {
|
||||
use_sdcch4 := true,
|
||||
msgs := msgs_1m_3b_default
|
||||
};
|
||||
f_TC_smscb_default_only(pars);
|
||||
Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
|
||||
}
|
||||
|
||||
|
||||
/* SMSCB TODO:
|
||||
* multiple SMS BC CMD at the same time: Ensure all of them are sent exactly once
|
||||
* extended CBCH vs. normal CBCH
|
||||
|
@ -369,6 +460,7 @@ control {
|
|||
execute( TC_sms_cb_cmd_sdcch4_4block() );
|
||||
execute( TC_sms_cb_cmd_sdcch4_multi() );
|
||||
execute( TC_sms_cb_cmd_sdcch4_schedule() );
|
||||
execute( TC_sms_cb_cmd_sdcch4_default_only() );
|
||||
if (false) { /* FIXME: SDCCH/8 support broken, needs trxcon + L1CTL work */
|
||||
execute( TC_sms_cb_cmd_sdcch8_1block() );
|
||||
execute( TC_sms_cb_cmd_sdcch8_2block() );
|
||||
|
@ -376,6 +468,7 @@ control {
|
|||
execute( TC_sms_cb_cmd_sdcch8_4block() );
|
||||
execute( TC_sms_cb_cmd_sdcch8_multi() );
|
||||
execute( TC_sms_cb_cmd_sdcch8_schedule() );
|
||||
execute( TC_sms_cb_cmd_sdcch8_default_only() );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue