Harald Welte has submitted this change and it was merged. ( 
https://gerrit.osmocom.org/9904 )

Change subject: BTS_Tests: Ensure mtc.stop is called after setverdict(fail, ...)
......................................................................

BTS_Tests: Ensure mtc.stop is called after setverdict(fail, ...)

This will prevent subsequent failures from overwriting the verdict so we
can easily see the root cause of the test failure.

Change-Id: Iba59a69127e845cadbe9aaa1dabd87ff5ce8b43b
---
M bts/BTS_Tests.ttcn
1 file changed, 74 insertions(+), 40 deletions(-)

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



diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index aee081e..4f0f0ef 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -257,7 +257,7 @@
                }
        [] pt.receive(t_SD_PCUIF(pcu_conn_id, tr_PCUIF_INFO_IND(?, ?, ?))) -> 
value sd {
                setverdict(fail, "Invalid PCU Version/BTS Number received");
-               self.stop;
+               mtc.stop;
                }
 }

@@ -276,7 +276,7 @@
        [] as_pcu_info_ind(pt, pcu_conn_id, pcu_last_info);
        [] T.timeout {
                setverdict(fail, "Timeout waiting for PCU INFO_IND");
-               self.stop;
+               mtc.stop;
                }
        }
 }
@@ -316,7 +316,7 @@
        [] RSL_CCHAN.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP});
        [] T.timeout {
                setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_UP");
-               self.stop;
+               mtc.stop;
                }
        }
        f_sleep(0.5);   /* workaround for OS#3000 */
@@ -389,7 +389,7 @@
 private altstep as_Tguard() runs on ConnHdlr {
        [] g_Tguard.timeout {
                setverdict(fail, "Tguard timeout");
-               self.stop;
+               mtc.stop;
        }
 }

@@ -404,7 +404,7 @@
                                                        "", -1, -1, {udp:={}}, 
{});
        if (not ispresent(res.connId)) {
                setverdict(fail, "Could not connect to trx-control interface of 
trxcon, check your configuration");
-               self.stop;
+               mtc.stop;
        }
        g_bb_trxc_conn_id := res.connId;
 }
@@ -455,14 +455,14 @@
                }
        [] T.timeout {
                setverdict(fail, "Timeout expecting " & id);
-               self.stop;
+               mtc.stop;
                }
        [not ignore_other] as_l1_sacch();
        [not ignore_other] as_meas_res();
        [not ignore_other] as_l1_dcch();
        [not ignore_other] RSL.receive {
                setverdict(fail, "Unexpected RSL message received");
-               self.stop;
+               mtc.stop;
                }
        [ignore_other] RSL.receive { repeat; }
        }
@@ -550,6 +550,7 @@
        alt {
        [] RSL.receive(tr_RSL_CHAN_ACT_ACK(g_chan_nr)) {
                setverdict(fail, "Unexpected CHAN ACT ACK on double 
activation");
+               mtc.stop;
                }
        [] RSL.receive(tr_RSL_CHAN_ACT_NACK(g_chan_nr)) {
                setverdict(pass);
@@ -577,6 +578,7 @@
                }
        [] T.timeout {
                setverdict(fail, "Timeout expecting RF_CHAN_REL_ACK");
+               mtc.stop;
                }
        }
 }
@@ -594,6 +596,7 @@
        alt {
        [] RSL.receive(tr_RSL_CHAN_ACT_ACK(g_chan_nr)) {
                setverdict(fail, "Unexpected CHAN ACT ACK");
+               mtc.stop;
                }
        [] RSL.receive(tr_RSL_CHAN_ACT_NACK(g_chan_nr)) {
                setverdict(pass);
@@ -667,6 +670,7 @@
        alt {
        [not exp] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr, 
tr_RslLinkID_SACCH(0))) {
                setverdict(fail, "Received SACCH when not expecting it");
+               mtc.stop;
                }
        [not exp] T_sacch.timeout {
                setverdict(pass);
@@ -676,6 +680,7 @@
                }
        [exp] T_sacch.timeout {
                setverdict(fail, "Timeout waiting for SACCH on ", g_chan_nr);
+               mtc.stop;
                }
        [] L1CTL.receive { repeat; }
        [] RSL.receive { repeat; }
@@ -740,7 +745,7 @@
        [] L1CTL.receive { repeat; }
        [] T_sacch.timeout {
                setverdict(fail, "Timeout waiting for SACCH ", l3_exp);
-               self.stop;
+               mtc.stop;
                }
        }
 }
@@ -986,7 +991,7 @@
                var GsmFrameNumber fn := f_L1CTL_RACH(L1CTL, oct2int(ra));
                if (fn == fn_last) {
                        setverdict(fail, "Two RACH in same FN?!?");
-                       self.stop;
+                       mtc.stop;
                }
                fn_last := fn;

@@ -998,12 +1003,12 @@
                        }
                [] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CHAN_RQD(?, ?, ?))) {
                        setverdict(fail, "Unexpected CHAN RQD");
-                       self.stop;
+                       mtc.stop;
                        }
                [] RSL_CCHAN.receive { repeat; }
                [] T.timeout {
                        setverdict(fail, "Timeout waiting for CHAN RQD");
-                       self.stop;
+                       mtc.stop;
                        }
                }
        }
@@ -1024,7 +1029,7 @@
                var GsmFrameNumber fn := f_L1CTL_RACH(L1CTL, oct2int(ra));
                if (fn == fn_last) {
                        setverdict(fail, "Two RACH in same FN?!?");
-                       self.stop;
+                       mtc.stop;
                }
                fn_last := fn;
        }
@@ -1055,7 +1060,7 @@
                                                        "", -1, -1, {udp:={}}, 
{});
        if (not ispresent(res.connId)) {
                setverdict(fail, "Could not connect to trx-control interface of 
trxcon, check your configuration");
-               self.stop;
+               mtc.stop;
        }
        g_bb_trxc_conn_id := res.connId;
 }
@@ -1079,6 +1084,7 @@
                }
        [not expect_pass] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CHAN_RQD(ra, fn))) 
{
                setverdict(fail, "RACH passed but was expected to be dropped: 
", toffs256);
+               mtc.stop;
                }
        [] RSL_CCHAN.receive { repeat; }
        [not expect_pass] T.timeout {
@@ -1086,6 +1092,7 @@
                }
        [expect_pass] T.timeout {
                setverdict(fail, "Timeout waiting for CHAN RQD");
+               mtc.stop;
                }
        }
 }
@@ -1287,16 +1294,16 @@
                        repeat;
                } else {
                        setverdict(fail, "Received unspecific MEAS RES ", rsl);
-                       self.stop;
+                       mtc.stop;
                }
                }
        [] RSL.receive(tr_RSL_MEAS_RES(?)) -> value rsl {
                setverdict(fail, "Received unexpected MEAS RES ", rsl);
-               self.stop;
+               mtc.stop;
                }
        [g_Tmeas_exp.running] g_Tmeas_exp.timeout {
                setverdict(fail, "Didn't receive expected measurement result")
-               self.stop;
+               mtc.stop;
                }
 }

@@ -1312,7 +1319,7 @@
        case (RSL_ALG_ID_A5_7) { return 7; }
        case else {
                setverdict(fail, "Unknwon Algorithm ID");
-               self.stop;
+               mtc.stop;
                }
        }
 }
@@ -1328,7 +1335,7 @@
        case (RSL_ALG_ID_A5_7) { return '110'B; }
        case else {
                setverdict(fail, "Unknwon Algorithm ID");
-               self.stop;
+               mtc.stop;
                }
        }
 }
@@ -1405,12 +1412,13 @@
        [] as_l1_dcch();
        [] L1CTL.receive { repeat; }
        [g_Tmeas_exp.running] T.timeout {
-               /* as_meas_res() would have done setverdict(fail) / self.stop 
in case
+               /* as_meas_res() would have done setverdict(fail) / mtc.stop in 
case
                 * of any earlier errors, so if we reach this timeout, we're 
good */
                setverdict(pass);
                }
        [] T.timeout {
                setverdict(fail, "No MEAS RES received at all");
+               mtc.stop;
                }
        }
        f_rsl_chan_deact();
@@ -1494,6 +1502,7 @@
        [] RSL.receive { repeat };
        [] T.timeout {
                setverdict(fail, "No CONN FAIL IND received");
+               mtc.stop;
                }
        }
        f_rsl_chan_deact();
@@ -1639,6 +1648,7 @@
                        }
                [not cfg.exp_overload]  
RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_PAGING_LOAD_IND(0))) {
                        setverdict(fail, "Unexpected PCH Overload");
+                       mtc.stop;
                        }
                [cfg.exp_load_ind] 
RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_PAGING_LOAD_IND)) {
                        log("Rx LOAD_IND");
@@ -1664,6 +1674,7 @@
        [] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_PAGING_LOAD_IND)) { repeat; }
        [] T_wait.timeout {
                setverdict(fail, "Waiting for empty paging queue");
+               mtc.stop;
                }
        [] as_rsl_res_ind();
        }
@@ -1830,7 +1841,7 @@
                if (not match(rr, tr_IMM_ASS(42, ?, 5, ?, ?))) {
                        /* FIXME: Why are we seeing paging requests on 
PCH/AGCH? */
                        //setverdict(fail, "Unexpected IMM-ASS values on AGCH: 
", rr);
-                       //self.stop;
+                       //mtc.stop;
                } else {
                        num_rx := num_rx+1;
                }
@@ -1843,6 +1854,7 @@
        log("AGCH test: " & res_str);
        if (num_rx + num_del != num_tx) {
                setverdict(fail, "RX + DEL != TX ?!?: " & res_str);
+               mtc.stop
        }
        rx_ratio := int2float(num_rx) / int2float(num_tx);
        if (rx_ratio < exp_pass*0.8 or rx_ratio > exp_pass*1.2) {
@@ -1850,6 +1862,7 @@
        } else {
                setverdict(pass);
        }
+       f_shutdown();
 }

 /* send a long burst of 1000 IMM.ASS with 20ms spacing (50 per s); expect 75% 
of them to be deleted */
@@ -1903,6 +1916,7 @@
 function f_ensure_si_vec_contains(SystemInformationVectorPerTc arr, integer 
tc, RrMessageType key, boolean ext_bcch := false) {
        if (not f_si_vecslot_contains(arr[tc], key, ext_bcch)) {
                setverdict(fail, "No ", key, " in TC=", tc, "!");
+               mtc.stop;
        }
 }

@@ -1922,7 +1936,7 @@
        var integer count := 0;
        if (sizeof(arr) < m) {
                setverdict(fail, "Error: Insufficient SI in array");
-               self.stop;
+               mtc.stop;
        }
        for (var integer i:= 0; i < m; i := i + 1) {
                var integer fn_mod51 := arr[i].frame_number mod 51;
@@ -1944,6 +1958,7 @@
 function f_ensure_si_vec_contains_n_of_m(SystemInformationVectorPerTc arr, 
integer tc, RrMessageType key, boolean ext_bcch := false, integer n, integer m) 
{
        if (not f_si_vecslot_contains_n_of_m(arr[tc], key, ext_bcch, n, m)) {
                setverdict(fail, "Not ", n, "/", m, " of ", key, " in TC=", tc, 
"!");
+               mtc.stop;
        }
 }

@@ -1965,6 +1980,7 @@
 function f_ensure_si_vec_contains_only(SystemInformationVectorPerTc arr, 
integer tc, RrMessageType key, boolean ext_bcch := false) {
        if (not f_si_vecslot_contains_only(arr[tc], key, ext_bcch)) {
                setverdict(fail, "Not all ", key, " in TC=", tc, "!");
+               mtc.stop;
        }
 }

@@ -1994,6 +2010,7 @@
        for (i := 0; i < sizeof(si_per_tc); i := i + 1) {
                if (sizeof(si_per_tc[i]) == 0) {
                        setverdict(fail, "No SI messages for TC=", i);
+                       mtc.stop;
                }
        }
        if (cfg.si1_present) {
@@ -2076,6 +2093,7 @@
                }
                if (f_si_vec_contains(si_per_tc, 
SYSTEM_INFORMATION_TYPE_13alt)) {
                        setverdict(fail, "Cannot have SI13alt and SI13");
+                       mtc.stop;
                }
        }
        if (cfg.si16_present or cfg.si17_present) {
@@ -2086,6 +2104,7 @@
                }
                if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_22)) {
                        setverdict(fail, "Cannot have SI16/SI17 and SI22!");
+                       mtc.stop;
                }
                if (not cfg.bcch_extended) {
                        testcase.stop("Error: SI16/SI17 requires BCCH Extd!");
@@ -2131,6 +2150,7 @@
                }
                if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_13)) {
                        setverdict(fail, "Cannot have SI13alt and SI13");
+                       mtc.stop;
                }
                if (not cfg.bcch_extended) {
                        f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, 
SYSTEM_INFORMATION_TYPE_13alt, false, 1, 4);
@@ -2162,6 +2182,7 @@
                        f_ensure_si_vec_contains_n_of_m(si_per_tc, 4, 
SYSTEM_INFORMATION_TYPE_21, true, 1, 4);
                        if (f_si_vecslot_contains(si_per_tc[4], 
SYSTEM_INFORMATION_TYPE_21)) {
                                setverdict(fail, "Cannot have SI21 on BCCH Norm 
if BCCH Extd enabled!");
+                               mtc.stop;
                        }
                }
        }
@@ -2176,6 +2197,7 @@
                if (f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_16) or
                    f_si_vec_contains(si_per_tc, SYSTEM_INFORMATION_TYPE_17)) {
                        setverdict(fail, "Cannot have SI16/SI17 and SI22!");
+                       mtc.stop;
                }
                if (not cfg.bcch_extended) {
                        testcase.stop("Error: SI22 requires BCCH Extd!");
@@ -2337,12 +2359,14 @@
                }
        [] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_ERROR_REPORT(?))) {
                setverdict(fail, "Wrong cause in RSL ERR REP");
+               mtc.stop;
                }
        [] RSL_CCHAN.receive {
                repeat;
                }
        [] T.timeout {
                setverdict(fail, "Timeout waiting for RSL ERR REP");
+               mtc.stop;
                }
        }
 }
@@ -2489,7 +2513,7 @@
        alt {
        [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(bts_nr))) {
                setverdict(fail, "PCU RTS.req before PDCH active?");
-               self.stop;
+               mtc.stop;
                }
        [] PCU.receive { repeat; }
        [] T.timeout { }
@@ -2507,15 +2531,16 @@
        [not exp_success] PCU.receive(t_SD_PCUIF(g_pcu_conn_id,
                                                 tr_PCUIF_RTS_REQ(bts_nr, 
trx_nr, ts_nr))) {
                setverdict(fail, "Unexpected RTS.req for supposedly failing 
activation");
-               self.stop;
+               mtc.stop;
                }
        [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ)) {
                setverdict(fail, "RTS.req for wrong TRX/TS");
-               self.stop;
+               mtc.stop;
                }
        [] PCU.receive { repeat; }
        [exp_success] T.timeout {
                setverdict(fail, "Timeout waiting for PCU RTS.req");
+               mtc.stop;
                }
        [not exp_success] T.timeout {
                setverdict(pass);
@@ -2536,7 +2561,7 @@
        alt {
        [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(bts_nr, 
trx_nr, ts_nr))) {
                setverdict(fail, "Received unexpected PCU RTS.req");
-               self.stop;
+               mtc.stop;
                }
        [] PCU.receive { repeat; }
        [] T.timeout {
@@ -2607,7 +2632,7 @@
        [] PCU.receive { repeat; }
        [] T.timeout {
                setverdict(fail, "Timeout waiting for SI13");
-               self.stop;
+               mtc.stop;
                }
        }
 }
@@ -2641,6 +2666,7 @@
        [] PCU.receive { repeat; }
        [] T.timeout {
                setverdict(fail, "Timeout waiting for RTS.ind");
+               mtc.stop;
                }
        }
 }
@@ -2714,6 +2740,7 @@
        [] L1CTL.receive { repeat; }
        [] T.timeout {
                setverdict(fail, "Timeout waiting for PCU-originated AGCH block 
on Um");
+               mtc.stop;
                }
        }
 }
@@ -2738,6 +2765,7 @@
        [] L1CTL.receive { repeat; }
        [] T.timeout {
                setverdict(fail, "Timeout waiting for PCU-originated AGCH block 
on Um");
+               mtc.stop;
                }
        }
 }
@@ -2754,7 +2782,7 @@
                var GsmFrameNumber fn := f_L1CTL_RACH(L1CTL, oct2int(ra));
                if (fn == fn_last) {
                        setverdict(fail, "Two RACH in same FN?!?");
-                       self.stop;
+                       mtc.stop;
                }
                fn_last := fn;

@@ -2766,12 +2794,12 @@
                        }
                [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RACH_IND)) {
                        setverdict(fail, "Unexpected RACH IND");
-                       self.stop;
+                       mtc.stop;
                        }
                [] PCU.receive { repeat; }
                [] T.timeout {
                        setverdict(fail, "Timeout waiting for RACH IND");
-                       self.stop;
+                       mtc.stop;
                        }
                }
        }
@@ -2810,12 +2838,12 @@
                        }
                [] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_PAG_REQ)) {
                        setverdict(fail, "Unexpected PAGING REQ");
-                       self.stop;
+                       mtc.stop;
                        }
                [] PCU.receive { repeat; }
                [] T.timeout {
                        setverdict(fail, "Timeout waiting for PAGING REQ");
-                       self.stop;
+                       mtc.stop;
                        }
                }
        }
@@ -2837,7 +2865,7 @@
        [] PCU.receive(t_SD_PCUIF(pcu_conn_id, tr_PCUIF_INFO_IND(bts_nr, ?))) 
-> value sd {
                if (substr(sd.data.u.info_ind.trx[trx_nr].pdch_mask, 
g_chan_nr.tn, 1) != '1'B) {
                        setverdict(fail, "PCUIF_INFO_IND PDCH_MASK not '1' 
after PDCH ACT");
-                       self.stop;
+                       mtc.stop;
                }
                }
        [] PCU.receive { repeat; }
@@ -2858,7 +2886,7 @@
        [] PCU.receive(t_SD_PCUIF(pcu_conn_id, tr_PCUIF_INFO_IND(bts_nr, ?))) 
-> value sd {
                if (substr(sd.data.u.info_ind.trx[trx_nr].pdch_mask, 
g_chan_nr.tn, 1) != '0'B) {
                        setverdict(fail, "PCUIF_INFO_IND PDCH_MASK not '0' 
after PDCH DEACT");
-                       self.stop;
+                       mtc.stop;
                }
                }
        [] PCU.receive { repeat; }
@@ -3021,7 +3049,7 @@
        [] PCU.receive(t_SD_PCUIF(pcu_conn_id, tr_PCUIF_INFO_IND(bts_nr, ?))) 
-> value sd {
                if (substr(sd.data.u.info_ind.trx[trx_nr].pdch_mask, 
g_chan_nr.tn, 1) != '1'B) {
                        setverdict(fail, "PCUIF_INFO_IND PDCH_MASK not '1' 
after PDCH ACT");
-                       self.stop;
+                       mtc.stop;
                }
                }
        [] PCU.receive { repeat; }
@@ -3044,7 +3072,7 @@
        [] PCU.receive(t_SD_PCUIF(pcu_conn_id, tr_PCUIF_INFO_IND(bts_nr, ?))) 
-> value sd {
                if (substr(sd.data.u.info_ind.trx[trx_nr].pdch_mask, 
g_chan_nr.tn, 1) != '0'B) {
                        setverdict(fail, "PCUIF_INFO_IND PDCH_MASK not '0' 
after PDCH DEACT");
-                       self.stop;
+                       mtc.stop;
                }
                }
        [] PCU.receive { repeat; }
@@ -3130,7 +3158,7 @@
        [] RSL.receive(tr_RSL_IPA_PDCH_ACT_NACK(g_chan_nr, ?));
        [] RSL.receive(tr_RSL_IPA_PDCH_ACT_ACK(g_chan_nr, ?)) {
                setverdict(fail, "Unexpected PDCH ACT ACK");
-               self.stop;
+               mtc.stop;
                }
        [] RSL.receive { repeat; }
        }
@@ -3254,6 +3282,7 @@
                        setverdict(pass);
                } else {
                        setverdict(fail, "Unexpected EST IND with L3 in ", tc);
+                       mtc.stop;
                }
                }
        [tc.l3 == ''O] RSL.receive(tr_RSL_EST_IND_NOL3(g_chan_nr, tc.link_id)) {
@@ -3261,10 +3290,12 @@
                        setverdict(pass);
                } else {
                        setverdict(fail, "Unexpected EST IND without L3 in ", 
tc);
+                       mtc.stop;
                }
                }
        [tc.exp] T.timeout {
                setverdict(fail, "Timeout waiting for EST IND");
+               mtc.stop;
                }
        [not tc.exp] T.timeout {
                setverdict(pass);
@@ -3326,7 +3357,7 @@
        [] L1CTL.receive { repeat; }
        [] T.timeout {
                setverdict(fail, "Timeout waiting for SABM");
-               self.stop;
+               mtc.stop;
                }
        }

@@ -3381,7 +3412,7 @@
        alt {
        [] T.timeout {
                setverdict(fail, "Timeout waiting for LAPDm ", exp);
-               self.stop;
+               mtc.stop;
                }
        [] as_l1_exp_lapdm(exp);
        }
@@ -3397,7 +3428,7 @@
        [l3 == ''O] RSL.receive(tr_RSL_EST_IND_NOL3(g_chan_nr, link_id));
        [] RSL.receive(tr_RSL_ERROR_IND(g_chan_nr, link_id, ?)) {
                setverdict(fail, "Failing due to RSL_ERROR_IND");
-               self.stop;
+               mtc.stop;
                }
        [] RSL.receive { repeat; }
        }
@@ -3613,6 +3644,7 @@
                }
        [] T.timeout {
                setverdict(fail, "Timeout waiting for UNIT_DATA_IND");
+               mtc.stop;
                }
        [] RSL.receive { repeat; }
        }
@@ -3723,12 +3755,13 @@
                lf.ab := dec_LapdmFrameAB(enc);
        } else {
                setverdict(fail, "unsupported frame type");
-               self.stop;
+               mtc.stop;
        }

        /* check if decoder result matches expectation */
        if (not match(lf, exp_match)) {
                setverdict(fail, name, ": decoded LAPDm doesn't match");
+               mtc.stop;
        } else {
                log(name, ": matched");
                setverdict(pass);
@@ -3738,6 +3771,7 @@
        reenc := enc_LapdmFrame(lf);
        if (enc != reenc) {
                setverdict(fail, name, ": re-encoded LAPDm frame doesn't 
match");
+               mtc.stop;
        } else {
                setverdict(pass);
        }

-- 
To view, visit https://gerrit.osmocom.org/9904
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Iba59a69127e845cadbe9aaa1dabd87ff5ce8b43b
Gerrit-Change-Number: 9904
Gerrit-PatchSet: 1
Gerrit-Owner: daniel <[email protected]>
Gerrit-Reviewer: Harald Welte <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Pau Espin Pedrol <[email protected]>

Reply via email to