Add more SI scheduling testing code, towards a real test suite

This commit is contained in:
Harald Welte 2017-07-16 00:00:43 +02:00
parent 8c5b325483
commit bdc5dbd701
2 changed files with 231 additions and 27 deletions

View File

@ -8,6 +8,10 @@ module GSM_Types {
import from General_Types all;
import from Osmocom_Types all;
type integer GsmArfcn (0..1023);
type integer UmtsArfcn (0..16383);
type integer UmtsScramblingCode (0..511);
/* Table 10.4.1 of Section 10.4 / 3GPP TS 44.018 */
type enumerated RrMessageType {
ADDITIONAL_ASSIGNMENT ('00111011'B),

View File

@ -10,10 +10,32 @@ module Test {
const octetstring si2 := '59061a00000000000000000000000000000000ffe50400'O;
const octetstring si3 := '49061b000062f22404d2490301275d40e50400392b2b2b'O;
const octetstring si4 := '31061c62f22404d25d40e504002b2b2b2b2b2b2b2b2b2b'O;
const octetstring c_si2bis := '550602bfe809b3ff00000000000000000000007900002b'O;
const octetstring c_si2ter := '010603bf66b0aa0a00000002000000000000002b2b2b2b'O;
const octetstring c_si2quater := '050607a8a0364aa698d72ff424feee0506d5e7fff02043'O;
type component dummy_CT {
port GSMTAP_PT GSMTAP;
port TELNETasp_PT BSCVTY;
var boolean initialized := false;
var SystemInformationConfig si_cfg := {
bcch_extended := false,
si1_present := true,
si2bis_present := false,
si2ter_present := false,
si2quater_present := false,
si7_present := false,
si8_present := false,
si9_present := false,
si13_present := false,
si13alt_present := false,
si15_present := false,
si16_present := false,
si17_present := false,
si2n_present := false,
si21_present := false,
si22_present := false
};
};
testcase TC_si1() runs on dummy_CT {
@ -21,6 +43,7 @@ module Test {
log("SI: ", dec_SystemInformation(si2));
log("SI: ", dec_SystemInformation(si3));
log("SI: ", dec_SystemInformation(si4));
setverdict(pass);
}
template GsmtapHeader t_GsmtapHeader := {
@ -345,6 +368,9 @@ module Test {
si_per_tc[i] := {};
}
/* flush all previous/buffered elements */
pt.clear
T.start;
alt {
[] pt.receive(t_recvfrom(GSMTAP_CHANNEL_BCCH)) -> value rf {
@ -362,36 +388,140 @@ module Test {
return si_per_tc;
}
testcase TC_gsmtap() runs on dummy_CT {
var SystemInformationVectorPerTc si_per_tc;
var SystemInformationConfig si_cfg := {
bcch_extended := false,
si1_present := true,
si2bis_present := false,
si2ter_present := false,
si2quater_present := false,
si7_present := false,
si8_present := false,
si9_present := false,
si13_present := false,
si13alt_present := false,
si15_present := false,
si16_present := false,
si17_present := false,
si2n_present := false,
si21_present := false,
si22_present := false
};
function f_init() runs on dummy_CT {
if (initialized) {
return;
}
/* GSMTAP initialization */
map(self:GSMTAP, system:GSMTAP);
IPL4_GSMTAP_CtrlFunct.f_IPL4_listen(GSMTAP, "0.0.0.0", GSMTAP_PORT, {udp := {}});
/* VTY initialization */
map(self:BSCVTY, system:BSCVTY);
f_vty_set_prompts(BSCVTY)
initialized := true;
}
testcase TC_si_default() runs on dummy_CT {
var SystemInformationVectorPerTc si_per_tc;
f_init();
si_per_tc := f_gsmtap_sample_si(GSMTAP);
log("SI per TC: ", si_per_tc);
f_validate_si_scheduling(si_cfg, si_per_tc);
setverdict(pass);
}
testcase TC_si_sched_2bis() runs on dummy_CT {
var SystemInformationVectorPerTc si_per_tc;
f_init();
/* Enable SI2bis + validate scheduling */
f_vty_enter_cfg_bts(BSCVTY, 0);
f_vty_si_static(BSCVTY, 0, "2bis", c_si2bis);
f_vty_si_resend(BSCVTY, 0);
f_vty_transceive(BSCVTY, "do write terminal");
si_cfg.si2bis_present := true;
si_per_tc := f_gsmtap_sample_si(GSMTAP);
f_validate_si_scheduling(si_cfg, si_per_tc);
/* cleanup */
f_vty_si_computed(BSCVTY, 0, "2bis");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si2bis_present := false;
setverdict(pass);
}
testcase TC_si_sched_2ter() runs on dummy_CT {
var SystemInformationVectorPerTc si_per_tc;
f_init();
/* Enable SI2ter + validate scheduling */
f_vty_enter_cfg_bts(BSCVTY, 0);
f_vty_si_static(BSCVTY, 0, "2ter", c_si2ter);
f_vty_transceive(BSCVTY, "write terminal");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si2ter_present := true;
si_per_tc := f_gsmtap_sample_si(GSMTAP);
f_validate_si_scheduling(si_cfg, si_per_tc);
/* cleanup */
f_vty_si_computed(BSCVTY, 0, "2ter");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si2ter_present := false;
setverdict(pass);
}
testcase TC_si_sched_2ter_2bis() runs on dummy_CT {
var SystemInformationVectorPerTc si_per_tc;
f_init();
/* Enable SI2bis + SI2ter + validate scheduling */
f_vty_enter_cfg_bts(BSCVTY, 0);
f_vty_si_static(BSCVTY, 0, "2bis", c_si2bis);
f_vty_si_static(BSCVTY, 0, "2ter", c_si2ter);
f_vty_transceive(BSCVTY, "write terminal");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si2bis_present := true;
si_cfg.si2ter_present := true;
si_per_tc := f_gsmtap_sample_si(GSMTAP);
f_validate_si_scheduling(si_cfg, si_per_tc);
/* cleanup */
f_vty_si_computed(BSCVTY, 0, "2bis");
f_vty_si_computed(BSCVTY, 0, "2ter");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si2bis_present := false;
si_cfg.si2ter_present := false;
setverdict(pass);
}
testcase TC_si_sched_2quater() runs on dummy_CT {
var SystemInformationVectorPerTc si_per_tc;
f_init();
/* Enable SI2quater + validate scheduling */
f_vty_si2q_add_uarfcn(BSCVTY, 0, 23, 42);
f_vty_transceive(BSCVTY, "write terminal");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si2quater_present := true;
si_per_tc := f_gsmtap_sample_si(GSMTAP);
f_validate_si_scheduling(si_cfg, si_per_tc);
/* cleanup */
f_vty_si2q_del_uarfcn(BSCVTY, 0, 23, 42);
f_vty_si_resend(BSCVTY, 0);
si_cfg.si2quater_present := false;
setverdict(pass);
}
testcase TC_si_sched_13() runs on dummy_CT {
var SystemInformationVectorPerTc si_per_tc;
f_init();
/* Enable SI2ter + validate scheduling */
f_vty_enter_cfg_bts(BSCVTY, 0);
f_vty_gprs_mode(BSCVTY, 0, "gprs");
f_vty_transceive(BSCVTY, "write terminal");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si13_present := true;
si_per_tc := f_gsmtap_sample_si(GSMTAP);
f_validate_si_scheduling(si_cfg, si_per_tc);
/* cleanup */
f_vty_gprs_mode(BSCVTY, 0, "none");
f_vty_si_resend(BSCVTY, 0);
si_cfg.si13_present := false;
setverdict(pass);
}
/* permitted prompts on VTY */
@ -442,8 +572,9 @@ module Test {
[] pt.receive(NORMAL_PROMPT) { };
[] pt.receive(ENABLE_PROMPT) { };
[] pt.receive(config_pattern) { };
/* FIXME: "% Unknown command" and the like! */
[] pt.receive(charstring:?) -> value rx { buf := buf & rx; repeat };
[] T.timeout { setverdict(fail, "Timeout"); return ""};
[] T.timeout { setverdict(fail, "VTY Timeout for prompt"); return ""};
}
T.stop;
return buf;
@ -455,26 +586,95 @@ module Test {
return f_vty_wait_for_prompt(pt);
}
type integer BtsNr (0..255);
type integer BtsTrxNr (0..255);
type integer BtsTimeslotNr (0..7);
type charstring BtsGprsMode ("none", "gprs", "egrps");
/* enter the'confiugration' mode of the VTY */
function f_vty_enter_config(TELNETasp_PT pt) {
f_vty_transceive(pt, "enable");
f_vty_transceive(pt, "configure terminal")
}
testcase TC_telnet() runs on dummy_CT {
function f_vty_enter_cfg_network(TELNETasp_PT pt) {
f_vty_enter_config(pt);
f_vty_transceive(pt, "network")
}
map(self:BSCVTY, system:BSCVTY);
f_vty_set_prompts(BSCVTY)
function f_vty_enter_cfg_bts(TELNETasp_PT pt, BtsNr bts := 0) {
f_vty_enter_cfg_network(pt);
f_vty_transceive(pt, "bts " & int2str(bts));
}
function f_vty_enter_cfg_trx(TELNETasp_PT pt, BtsNr bts := 0, BtsTrxNr trx := 0) {
f_vty_enter_cfg_bts(pt, bts);
f_vty_transceive(pt, "trx " & int2str(trx));
}
function f_vty_enter_cfg_ts(TELNETasp_PT pt, BtsNr bts := 0, BtsTrxNr trx := 0, BtsTimeslotNr ts) {
f_vty_enter_cfg_trx(pt, bts, trx);
f_vty_transceive(pt, "timeslot " & int2str(ts));
}
function f_vty_si_static(TELNETasp_PT pt, BtsNr bts, charstring si, octetstring bytes) {
f_vty_enter_cfg_bts(pt, bts);
f_vty_transceive(pt, "system-information " & si & " mode static");
f_vty_transceive(pt, "system-information " & si & " static " & hex2str(oct2hex(bytes)));
f_vty_transceive(pt, "end");
}
function f_vty_si_computed(TELNETasp_PT pt, BtsNr bts, charstring si) {
f_vty_enter_cfg_bts(pt, bts);
f_vty_transceive(pt, "system-information " & si & " mode computed");
f_vty_transceive(pt, "end");
}
function f_vty_si_resend(TELNETasp_PT pt, BtsNr bts := 0) {
f_vty_transceive(pt, "bts " & int2str(bts) & " resend-system-information");
/* wait for 2s until changes propagate */
timer T := 2.0;
T.start;
T.timeout;
}
function f_vty_gprs_mode(TELNETasp_PT pt, integer bts, BtsGprsMode mode) {
f_vty_enter_cfg_bts(pt, bts);
f_vty_transceive(pt, "gprs mode " & mode);
f_vty_transceive(pt, "end");
}
function f_vty_si2q_add_uarfcn(TELNETasp_PT pt, BtsNr bts, UmtsArfcn uarfcn, UmtsScramblingCode sc, integer diversity := 0) {
f_vty_enter_cfg_bts(pt, bts);
f_vty_transceive(pt, "si2quater neighbor-list add uarfcn " & int2str(uarfcn) & " " & int2str(sc) & " " & int2str(diversity));
f_vty_transceive(pt, "end");
}
function f_vty_si2q_del_uarfcn(TELNETasp_PT pt, BtsNr bts, UmtsArfcn uarfcn, UmtsScramblingCode sc) {
f_vty_enter_cfg_bts(pt, bts);
f_vty_transceive(pt, "si2quater neighbor-list del uarfcn " & int2str(uarfcn) & " " & int2str(sc));
f_vty_transceive(pt, "end");
}
testcase TC_telnet() runs on dummy_CT {
f_init();
f_vty_transceive(BSCVTY, "show network")
f_vty_enter_config(BSCVTY)
f_vty_transceive(BSCVTY, "network")
f_vty_transceive(BSCVTY, "bts 0")
f_vty_transceive(BSCVTY, "end")
setverdict(pass);
}
control {
execute(TC_si1());
execute(TC_gsmtap());
execute(TC_telnet());
execute(TC_si_default());
execute(TC_si_sched_2bis());
execute(TC_si_sched_2ter());
execute(TC_si_sched_2ter_2bis());
execute(TC_si_sched_2quater());
execute(TC_si_sched_13());
}
}