osmo-ttcn3-hacks[master]: bsc: Testing of dynamic PDCH (both IPA style and Osmocom style)

2018-04-07 Thread Harald Welte

Patch Set 1: Code-Review+2

-- 
To view, visit https://gerrit.osmocom.org/7664
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I7a7a937548a35461d86e93ead79c39a37a59563e
Gerrit-PatchSet: 1
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Owner: Harald Welte 
Gerrit-Reviewer: Harald Welte 
Gerrit-Reviewer: Jenkins Builder
Gerrit-HasComments: No


[MERGED] osmo-ttcn3-hacks[master]: bsc: Testing of dynamic PDCH (both IPA style and Osmocom style)

2018-04-07 Thread Harald Welte
Harald Welte has submitted this change and it was merged.

Change subject: bsc: Testing of dynamic PDCH (both IPA style and Osmocom style)
..


bsc: Testing of dynamic PDCH (both IPA style and Osmocom style)

This adds a set of four new testcases relted to dynamic PDCH switching:
One successful and one unsuccessful for each Osmo + IPA style dynamic
PDCH.

Closes: OS#3099
Change-Id: I7a7a937548a35461d86e93ead79c39a37a59563e
---
M bsc/BSC_Tests.ttcn
M library/RSL_Types.ttcn
2 files changed, 285 insertions(+), 3 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index a70ed53..0dfb708 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -281,7 +281,11 @@
vc_MGCP.start(MGCP_Emulation.main(ops, mgcp_pars, id));
 }
 
-private function f_init_vty(charstring id) runs on test_CT {
+private function f_init_vty(charstring id := "foo") runs on test_CT {
+   if (BSCVTY.checkstate("Mapped")) {
+   /* skip initialization if already executed once */
+   return;
+   }
map(self:BSCVTY, system:BSCVTY);
f_vty_set_prompts(BSCVTY);
f_vty_transceive(BSCVTY, "enable");
@@ -1917,6 +1921,14 @@
vc_conn.done;
 }
 
+/* execute a "bts <0-255> trx <0-255> timeslot <0-7> " command on given Dchan 
*/
+private function f_vty_ts_action(charstring suffix, integer bts_nr, integer 
trx_nr, integer ts_nr)
+runs on test_CT {
+   var charstring cmd := "bts "&int2str(bts_nr)&" trx "&int2str(trx_nr)&
+   " timeslot "&int2str(ts_nr)&" ";
+   f_vty_transceive(BSCVTY, cmd & suffix);
+}
+
 /* execute a "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7>" command 
on given Dchan */
 private function f_vty_ss_action(charstring suffix, integer bts_nr, integer 
trx_nr, RslChannelNr chan_nr)
 runs on MSC_ConnHdlr {
@@ -2145,6 +2157,239 @@
f_shutdown_helper();
 }
 
+/***
+ * IPA style dynamic PDCH
+ ***/
+
+private function f_dyn_ipa_pdch_act(integer bts_nr, integer trx_nr, integer 
ts_nr,
+   template (omit) RSL_Cause nack := omit)
+runs on test_CT {
+   var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(ts_nr));
+   var RSL_Message rsl_unused;
+   /* ask BSC via VTY to activate a given IPA style chan as PDCH */
+   f_vty_ts_action("pdch activate", bts_nr, trx_nr, ts_nr);
+   /* expect the BSC to issue the related RSL command */
+   rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_ACT(chan_nr));
+   if (istemplatekind(nack, "omit")) {
+   /* respond with a related acknowledgement */
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, 
ts_RSL_IE_FrameNumber(2342)));
+   } else {
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_NACK(chan_nr, valueof(nack)));
+   }
+}
+
+private function f_dyn_ipa_pdch_deact(integer bts_nr, integer trx_nr, integer 
ts_nr,
+ template (omit) RSL_Cause nack := omit)
+runs on test_CT {
+   var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(ts_nr));
+   var RSL_Message rsl_unused;
+   /* ask BSC via VTY to activate a given IPA style chan as PDCH */
+   f_vty_ts_action("pdch deactivate", bts_nr, trx_nr, ts_nr);
+   /* expect the BSC to issue the related RSL command */
+   rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_DEACT(chan_nr));
+   if (istemplatekind(nack, "omit")) {
+   /* respond with a related acknowledgement */
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_DEACT_ACK(chan_nr));
+   } else {
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_DEACT_NACK(chan_nr, valueof(nack)));
+   }
+}
+
+private function f_ts_dyn_mode_get(integer bts_nr, integer trx_nr, integer 
ts_nr)
+runs on test_CT return charstring {
+   var charstring cmd, resp;
+   cmd := "show timeslot "&int2str(bts_nr)&" "&int2str(trx_nr)&" 
"&int2str(ts_nr);
+   resp := f_vty_transceive_ret(BSCVTY, cmd);
+   return regexp(resp, "*\((*)\)*", 0);
+}
+
+private function f_ts_dyn_mode_assert(integer bts_nr, integer trx_nr, integer 
ts_nr,
+   template charstring exp)
+runs on test_CT {
+   var charstring mode := f_ts_dyn_mode_get(bts_nr, trx_nr, ts_nr);
+   if (not match(mode, exp)) {
+   setverdict(fail, "Unexpected TS Mode: ", mode);
+   self.stop;
+   }
+}
+
+private function f_ts_set_chcomb(integer bts_nr, integer trx_nr, integer 
ts_nr, charstring chcomb)
+runs on test_CT {
+   f_vty_enter_cfg_ts(BSCVTY, bts_nr, trx_nr, ts_nr);
+   f_vty_transceive(BSCVTY, "phys_chan_config " & chcomb);
+   f_vty_transceive(BSCVTY, "end");
+}
+
+private const charstring TCHF_MODE := "TCH/F mode";
+pri

[PATCH] osmo-ttcn3-hacks[master]: bsc: Testing of dynamic PDCH (both IPA style and Osmocom style)

2018-04-07 Thread Harald Welte

Review at  https://gerrit.osmocom.org/7664

bsc: Testing of dynamic PDCH (both IPA style and Osmocom style)

This adds a set of four new testcases relted to dynamic PDCH switching:
One successful and one unsuccessful for each Osmo + IPA style dynamic
PDCH.

Closes: OS#3099
Change-Id: I7a7a937548a35461d86e93ead79c39a37a59563e
---
M bsc/BSC_Tests.ttcn
M library/RSL_Types.ttcn
2 files changed, 285 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks 
refs/changes/64/7664/1

diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index a70ed53..0dfb708 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -281,7 +281,11 @@
vc_MGCP.start(MGCP_Emulation.main(ops, mgcp_pars, id));
 }
 
-private function f_init_vty(charstring id) runs on test_CT {
+private function f_init_vty(charstring id := "foo") runs on test_CT {
+   if (BSCVTY.checkstate("Mapped")) {
+   /* skip initialization if already executed once */
+   return;
+   }
map(self:BSCVTY, system:BSCVTY);
f_vty_set_prompts(BSCVTY);
f_vty_transceive(BSCVTY, "enable");
@@ -1917,6 +1921,14 @@
vc_conn.done;
 }
 
+/* execute a "bts <0-255> trx <0-255> timeslot <0-7> " command on given Dchan 
*/
+private function f_vty_ts_action(charstring suffix, integer bts_nr, integer 
trx_nr, integer ts_nr)
+runs on test_CT {
+   var charstring cmd := "bts "&int2str(bts_nr)&" trx "&int2str(trx_nr)&
+   " timeslot "&int2str(ts_nr)&" ";
+   f_vty_transceive(BSCVTY, cmd & suffix);
+}
+
 /* execute a "bts <0-255> trx <0-255> timeslot <0-7> sub-slot <0-7>" command 
on given Dchan */
 private function f_vty_ss_action(charstring suffix, integer bts_nr, integer 
trx_nr, RslChannelNr chan_nr)
 runs on MSC_ConnHdlr {
@@ -2145,6 +2157,239 @@
f_shutdown_helper();
 }
 
+/***
+ * IPA style dynamic PDCH
+ ***/
+
+private function f_dyn_ipa_pdch_act(integer bts_nr, integer trx_nr, integer 
ts_nr,
+   template (omit) RSL_Cause nack := omit)
+runs on test_CT {
+   var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(ts_nr));
+   var RSL_Message rsl_unused;
+   /* ask BSC via VTY to activate a given IPA style chan as PDCH */
+   f_vty_ts_action("pdch activate", bts_nr, trx_nr, ts_nr);
+   /* expect the BSC to issue the related RSL command */
+   rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_ACT(chan_nr));
+   if (istemplatekind(nack, "omit")) {
+   /* respond with a related acknowledgement */
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_ACK(chan_nr, 
ts_RSL_IE_FrameNumber(2342)));
+   } else {
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_ACT_NACK(chan_nr, valueof(nack)));
+   }
+}
+
+private function f_dyn_ipa_pdch_deact(integer bts_nr, integer trx_nr, integer 
ts_nr,
+ template (omit) RSL_Cause nack := omit)
+runs on test_CT {
+   var RslChannelNr chan_nr := valueof(t_RslChanNr_Bm(ts_nr));
+   var RSL_Message rsl_unused;
+   /* ask BSC via VTY to activate a given IPA style chan as PDCH */
+   f_vty_ts_action("pdch deactivate", bts_nr, trx_nr, ts_nr);
+   /* expect the BSC to issue the related RSL command */
+   rsl_unused := f_exp_ipa_rx(0, tr_RSL_IPA_PDCH_DEACT(chan_nr));
+   if (istemplatekind(nack, "omit")) {
+   /* respond with a related acknowledgement */
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_DEACT_ACK(chan_nr));
+   } else {
+   f_ipa_tx(0, ts_RSL_IPA_PDCH_DEACT_NACK(chan_nr, valueof(nack)));
+   }
+}
+
+private function f_ts_dyn_mode_get(integer bts_nr, integer trx_nr, integer 
ts_nr)
+runs on test_CT return charstring {
+   var charstring cmd, resp;
+   cmd := "show timeslot "&int2str(bts_nr)&" "&int2str(trx_nr)&" 
"&int2str(ts_nr);
+   resp := f_vty_transceive_ret(BSCVTY, cmd);
+   return regexp(resp, "*\((*)\)*", 0);
+}
+
+private function f_ts_dyn_mode_assert(integer bts_nr, integer trx_nr, integer 
ts_nr,
+   template charstring exp)
+runs on test_CT {
+   var charstring mode := f_ts_dyn_mode_get(bts_nr, trx_nr, ts_nr);
+   if (not match(mode, exp)) {
+   setverdict(fail, "Unexpected TS Mode: ", mode);
+   self.stop;
+   }
+}
+
+private function f_ts_set_chcomb(integer bts_nr, integer trx_nr, integer 
ts_nr, charstring chcomb)
+runs on test_CT {
+   f_vty_enter_cfg_ts(BSCVTY, bts_nr, trx_nr, ts_nr);
+   f_vty_transceive(BSCVTY, "phys_chan_config " & chcomb);
+   f_vty_transceive(BSCVTY, "end");
+}
+
+private const charstring TCHF_MODE := "TCH/F mode";
+private const charstring TCHH_MODE := "TCH/H mode";
+private const charstring PDCH_MODE := "PDCH mode";
+private const charstring NONE_MODE := "NONE mode";
+
+/* Test IPA