attempt to fix a race condition in BSC test's f_ts_dyn_mode_get

Add two helper functions which retry a VTY command until the
result matches a regular expression or a configurable timeout
expires.

Use these functions in BSC test's f_ts_dyn_mode_get, which has
seen sporadic failures due to a race condition during channel
reconfiguration, in order to hopefully close this race.

Change-Id: I308ddb06e440c165fe1e73fe2c1fb78be2e1d510
Related: OS#3690
diff --git a/library/Osmocom_VTY_Functions.ttcn b/library/Osmocom_VTY_Functions.ttcn
index 86f58f1..4f795ad 100644
--- a/library/Osmocom_VTY_Functions.ttcn
+++ b/library/Osmocom_VTY_Functions.ttcn
@@ -1,5 +1,6 @@
 module Osmocom_VTY_Functions {
 	import from TELNETasp_PortType all;
+	import from Osmocom_Types all;
 
 	modulepar {
 		charstring mp_prompt_prefix := "OpenBSC";
@@ -153,5 +154,27 @@
 	}
 }
 
+function f_vty_transceive_match_regex(TELNETasp_PT pt, charstring cmd, charstring regex, integer groupno) return charstring
+{
+	var charstring resp := f_vty_transceive_ret(pt, cmd);
+	return regexp(resp, regex, groupno);
+}
+
+function f_vty_transceive_match_regexp_retry(TELNETasp_PT pt, charstring cmd, charstring regex,
+					     integer groupno, integer num_attempts, float retry_delay) return charstring
+{
+	 while (num_attempts > 0) {
+		var charstring ret := f_vty_transceive_match_regex(pt, cmd, regex, groupno);
+		if (ret != "") {
+			return ret;
+		}
+		f_sleep(retry_delay);
+		num_attempts := num_attempts - 1;
+	}
+
+	setverdict(fail, "No matching VTY response for regular expression '", regex,
+		   "' after ", num_attempts, " attempts." );
+	mtc.stop;
+}
 
 }