aboutsummaryrefslogtreecommitdiffstats
path: root/library/Osmocom_CTRL_Functions.ttcn
diff options
context:
space:
mode:
Diffstat (limited to 'library/Osmocom_CTRL_Functions.ttcn')
-rw-r--r--library/Osmocom_CTRL_Functions.ttcn150
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);
+ }
+ }
+
}