diff options
Diffstat (limited to 'library/Osmocom_CTRL_Functions.ttcn')
-rw-r--r-- | library/Osmocom_CTRL_Functions.ttcn | 150 |
1 files changed, 139 insertions, 11 deletions
diff --git a/library/Osmocom_CTRL_Functions.ttcn b/library/Osmocom_CTRL_Functions.ttcn index d26dc892..f8788b95 100644 --- a/library/Osmocom_CTRL_Functions.ttcn +++ b/library/Osmocom_CTRL_Functions.ttcn @@ -23,12 +23,14 @@ module Osmocom_CTRL_Functions { import from Osmocom_CTRL_Types all; import from IPA_Emulation all; + type record of charstring charstring_list; + private function f_gen_rand_id() return CtrlId { return int2str(float2int(rnd()*999999999.0)); } /* perform a given GET Operation */ - function f_ctrl_get(IPA_CTRL_PT pt, CtrlVariable variable) return CtrlValue { + function f_ctrl_get(IPA_CTRL_PT pt, CtrlVariable variable, template (omit) charstring on_err := omit) return CtrlValue { timer T := 2.0; var CtrlMessage rx; var CtrlId id := f_gen_rand_id(); @@ -39,8 +41,12 @@ module Osmocom_CTRL_Functions { } [] pt.receive(tr_CtrlMsgTrap) { repeat; } [] pt.receive(tr_CtrlMsgError) -> value rx { - setverdict(fail, "Error in CTRL GET ", variable, ": ", rx.err.reason); - mtc.stop; + if (istemplatekind(on_err, "omit")) { + setverdict(fail, "Error in CTRL GET ", variable, ": ", rx.err.reason); + mtc.stop; + } else { + rx.resp.val := valueof(on_err); + } } [] T.timeout { setverdict(fail, "Timeout waiting for CTRL GET REPLY ", variable); @@ -61,7 +67,7 @@ module Osmocom_CTRL_Functions { [] pt.receive(tr_CtrlMsgSetRepl(id, variable, val)) { } [] pt.receive(tr_CtrlMsgTrap) { repeat; } [] pt.receive(tr_CtrlMsgError) -> value rx { - setverdict(fail, "Error in CTRL GET ", variable, ": ", rx.err.reason); + setverdict(fail, "Error in CTRL SET ", variable, ": ", rx.err.reason); mtc.stop; } [] T.timeout { @@ -117,6 +123,26 @@ module Osmocom_CTRL_Functions { return rx.cmd.val; } + /* Expect a matching SET, optionally answer */ + function f_ctrl_exp_get(IPA_CTRL_PT pt, template CtrlVariable variable, + template (omit) CtrlValue rsp := omit, + float timeout_val := 2.0) { + timer T := timeout_val; + var CtrlMessage rx; + T.start; + alt { + [] pt.receive(tr_CtrlMsgGet(?, variable)) -> value rx { + if (ispresent(rsp)) { + pt.send(ts_CtrlMsgGetRepl(rx.cmd.id, valueof(variable), valueof(rsp))); + } + } + [] T.timeout { + setverdict(fail, "Timeout waiting for GET ", variable); + mtc.stop; + } + } + } + /* Expect a matching GET result */ function f_ctrl_get_exp(IPA_CTRL_PT pt, CtrlVariable variable, template CtrlValue exp) { var charstring ctrl_resp; @@ -133,7 +159,7 @@ module Osmocom_CTRL_Functions { function f_ctrl_get_ratectr_abs(IPA_CTRL_PT pt, CtrlVariable grp, integer instance, CtrlVariable name) return integer { - return str2int(f_ctrl_get(pt, valueof(ts_ctrl_ratectr(grp, instance, name)))); + return str2int(f_ctrl_get(pt, valueof(ts_ctrl_ratectr(grp, instance, name)), on_err := "-1")); } function f_ctrl_get_exp_ratectr_abs(IPA_CTRL_PT pt, CtrlVariable grp, integer instance, @@ -211,10 +237,11 @@ module Osmocom_CTRL_Functions { /* Retrieve the first N instances' rate counter values of the given names */ function f_counter_name_vals_get_n(IPA_CTRL_PT pt, charstring instance_name := "msc", - integer instance_count, CounterNameVals counternames) + integer instance_count, CounterNameVals counternames, + integer start_idx := 0) return CounterNameValsList { var CounterNameValsList valslist; - for (var integer instance_nr := 0; instance_nr < instance_count; instance_nr := instance_nr + 1) { + for (var integer instance_nr := start_idx; instance_nr < start_idx + instance_count; instance_nr := instance_nr + 1) { valslist[instance_nr] := f_counter_name_vals_get(pt, instance_name, instance_nr, counternames); } log("retrieved rate counters: ", instance_name, ": ", valslist); @@ -237,6 +264,22 @@ module Osmocom_CTRL_Functions { } } + /* In a list of one instance's counters, set a specifically named counter to a specific value. */ + function f_counter_name_vals_set(inout CounterNameVals vals, charstring countername, integer val := 1) + { + for (var integer i := 0; i < lengthof(vals); i := i + 1) { + if (vals[i].name == countername) { + vals[i].val := val; + return; + } + } + /* name not found, append */ + vals[lengthof(vals)] := { + name := countername, + val := val + } + } + /* In a list of several instances' counters, increment a specific instance's specifically named counter. */ function f_counter_name_vals_list_add(inout CounterNameValsList vals, integer instance_nr, charstring countername, integer val := 1) @@ -244,18 +287,26 @@ module Osmocom_CTRL_Functions { f_counter_name_vals_add(vals[instance_nr], countername, val); } + /* In a list of several instances' counters, set a specific instance's specifically named counter to a specific + * value. */ + function f_counter_name_vals_list_set(inout CounterNameValsList vals, integer instance_nr, + charstring countername, integer val := 0) + { + f_counter_name_vals_set(vals[instance_nr], countername, val); + } + /* For a specific instance, call f_counter_name_vals_get() and compare with expected counter values. * Set the test verdict accordingly. */ function f_counter_name_vals_expect(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, CounterNameVals vals) { - var CounterNameVals now := f_counter_name_vals_get(pt, instance_name, instance_nr, vals); + var CounterNameVals last := f_counter_name_vals_get(pt, instance_name, instance_nr, vals); for (var integer i := 0; i < lengthof(vals); i := i + 1) { - if (now[i].name != vals[i].name) { + if (last[i].name != vals[i].name) { setverdict(fail, "Internal error"); } - if (now[i].val != vals[i].val) { + if (last[i].val != vals[i].val) { setverdict(fail, "Rate counter mismatch: ", instance_name, " ", instance_nr, - " ", vals[i].name, " is at ", now[i].val, " but expected ", vals[i].val); + " ", vals[i].name, " is at ", last[i].val, " but expected ", vals[i].val); } } setverdict(pass); @@ -269,4 +320,81 @@ module Osmocom_CTRL_Functions { } } + /* For a specific instance, call f_counter_name_vals_get() and indentify counters that have changed with respect + * to 'vals'. Return list of the changed counter names in the order they appear in 'vals'. */ + function f_counter_name_vals_get_changed(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, + CounterNameVals vals) + return charstring_list { + var charstring_list changed := {}; + var CounterNameVals last := f_counter_name_vals_get(pt, instance_name, instance_nr, vals); + for (var integer i := 0; i < lengthof(vals); i := i + 1) { + if (last[i].name != vals[i].name) { + setverdict(fail, "Internal error"); + } + if (last[i].val != vals[i].val) { + changed := changed & { instance_name & "." & int2str(instance_nr) & "." & vals[i].name }; + } + } + return changed; + } + + /* For N instances, call f_counter_name_vals_get() and indentify counters that have changed with respect + * to 'vals'. Return list of the changed counter names in the order they appear in 'vals'. */ + function f_counter_name_vals_get_changed_n(IPA_CTRL_PT pt, charstring instance_name, CounterNameValsList valslist) + return charstring_list { + var charstring_list changed := {}; + for (var integer instance_nr := 0; instance_nr < lengthof(valslist); instance_nr := instance_nr + 1) { + changed := changed & f_counter_name_vals_get_changed(pt, instance_name, instance_nr, valslist[instance_nr]); + } + return changed; + } + + function f_counter_name_vals_expect_changed(IPA_CTRL_PT pt, charstring instance_name, CounterNameValsList valslist, + charstring_list expect_changed) { + var charstring_list changed := f_counter_name_vals_get_changed_n(pt, instance_name, valslist); + f_counter_name_vals_expect_changed_list(changed, expect_changed); + } + + function f_counter_name_vals_expect_changed_list(charstring_list got_list, charstring_list expect_list) { + var charstring unexpected_change := ""; + for (var integer i := 0; i < lengthof(got_list); i := i + 1) { + var boolean found := false; + for (var integer j := 0; j < lengthof(expect_list); j := j + 1) { + if (got_list[i] == expect_list[j]) { + found := true; + break; + } + } + if (not found) { + unexpected_change := unexpected_change & " " & got_list[i]; + } + } + var charstring missing_change := ""; + for (var integer i := 0; i < lengthof(expect_list); i := i + 1) { + var boolean found := false; + for (var integer j := 0; j < lengthof(got_list); j := j + 1) { + if (expect_list[i] == got_list[j]) { + found := true; + break; + } + } + if (not found) { + missing_change := missing_change & " " & expect_list[i]; + } + } + var charstring diff := ""; + if (lengthof(unexpected_change) > 0) { + diff := diff & " Unexpected changes in" & unexpected_change & ";"; + } + if (lengthof(missing_change) > 0) { + diff := diff & " Missing changes in" & missing_change & ";"; + } + if (lengthof(diff) > 0) { + log("ERROR\nExpected: ", expect_list, "\nGot: ", got_list); + setverdict(fail, "Rate counters did not change as expected:" & diff); + } else { + setverdict(pass); + } + } + } |