blob: b97dea15e1029ebb46d8eb2818b4e01838a2fa83 [file] [log] [blame]
Harald Weltefaa42922019-03-04 18:31:11 +01001module REMSIM_Tests {
2
3/* Implementation of RSPRO Client in TTCN-3.
4 * (C) 2019 by Harald Welte <laforge@gnumonks.org>
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
13import from IPL4asp_Types all;
14import from RSPRO all;
15import from RSPRO_Types all;
16import from IPA_Types all;
17import from IPA_Emulation all;
18
19
20modulepar {
21 charstring mp_bankd_ip := "127.0.0.1";
22 integer mp_bankd_port := 9999;
23
24 charstring mp_server_ip := "127.0.0.1";
25 integer mp_server_port := 9998;
26
27 integer mp_rsres_port := 9997;
28}
29
30const integer NUM_CLIENT := 3;
31
32type record RSPRO_Client {
33 IPA_Emulation_CT vc_IPA,
34 IPA_CCM_Parameters ccm_pars,
35 charstring id,
36 ComponentIdentity rspro_id,
37
38 ClientSlot rspro_client_slot optional,
39 BankId rspro_bank_id optional,
40 SlotNumber rspro_bank_nslots optional
41};
42
43type component rspro_client_CT {
44 var RSPRO_Client rspro[NUM_CLIENT];
45 port IPA_RSPRO_PT RSPRO[NUM_CLIENT];
46};
47
48private altstep as_ignore_id_ack(integer i := 0) runs on rspro_client_CT {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +070049 [] RSPRO[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK)) { repeat; }
Harald Weltefaa42922019-03-04 18:31:11 +010050}
51
52function f_rspro_init(inout RSPRO_Client clnt, charstring dst_host, integer dst_port,
53 ComponentIdentity rspro_id, integer i)
54runs on rspro_client_CT
55{
56 timer T := 4.0;
57
58 clnt.id := "RSPRO" & int2str(i);
59 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id);
60 clnt.ccm_pars := c_IPA_default_ccm_pars;
61 clnt.ccm_pars.name := "Osmocom TTCN-3 RSPRO client simulator";
62 clnt.rspro_id := rspro_id;
63
64 /* leave it up to the caller to set those */
65 clnt.rspro_client_slot := omit;
66 clnt.rspro_bank_id := omit;
67 clnt.rspro_bank_nslots := omit;
68
69 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
70 connect(clnt.vc_IPA:IPA_RSPRO_PORT, self:RSPRO[i]);
71
72 clnt.vc_IPA.start(IPA_Emulation.main_client(dst_host, dst_port, "", 10000+i, clnt.ccm_pars));
73
74 T.start;
75 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +070076 [] RSPRO[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) { }
Harald Weltefaa42922019-03-04 18:31:11 +010077 [] T.timeout {
78 setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_UP");
79 mtc.stop;
80 }
81 }
82 T.start;
83 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +070084 [] RSPRO[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK)) { }
Harald Weltefaa42922019-03-04 18:31:11 +010085 [] T.timeout {
86 setverdict(fail, "Timeout waiting for ASP_IPA_EVENT_ID_ACK");
87 mtc.stop;
88 }
89 }
90
91
92 activate(as_ignore_id_ack(i));
93}
94
95function f_rspro_fini(inout RSPRO_Client clnt, integer i)
96runs on rspro_client_CT {
97 clnt.vc_IPA.stop;
98 disconnect(clnt.vc_IPA:IPA_RSPRO_PORT, self:RSPRO[i]);
99 unmap(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
100}
101
102
103function f_rspro_exp(template RsproPDU exp, integer i := 0)
104runs on rspro_client_CT return RsproPDU
105{
106 var RsproPDU pdu;
107
108 timer T := 10.0;
109 T.start;
110 alt {
111 [] RSPRO[i].receive(exp) -> value pdu {
112 setverdict(pass);
113 }
114 [] RSPRO[i].receive(RsproPDU:?) -> value pdu {
115 setverdict(fail, "Received unexpected RPSRO", pdu);
116 mtc.stop;
117 }
118 [] RSPRO[i].receive {
119 setverdict(fail, "Received unexpected != RPSRO");
120 mtc.stop;
121 }
122 [] T.timeout {
123 setverdict(fail, "Timeout waiting for ", exp);
124 mtc.stop;
125 }
126 }
127 return pdu;
128}
129
130function f_rspro_exp_disconnect(integer i := 0)
131runs on rspro_client_CT {
132 timer T := 10.0;
133 T.start;
134 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +0700135 [] RSPRO[i].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {
Harald Weltefaa42922019-03-04 18:31:11 +0100136 setverdict(pass);
137 }
138 [] T.timeout {
139 setverdict(fail, "Timeout expecting disconnect");
140 mtc.stop;
141 }
142 }
143}
144
145
146function f_rspro_connect_client(integer i, template ResultCode exp_res := ok) runs on rspro_client_CT
147{
148 select (rspro[i].rspro_id.type_) {
149 case (remsimClient) {
150 RSPRO[i].send(ts_RSPRO_ConnectClientReq(rspro[i].rspro_id, rspro[i].rspro_client_slot));
151 f_rspro_exp(tr_RSPRO_ConnectClientRes(?, exp_res), i);
152 }
153 case (remsimBankd) {
154 var template IpAddress ip := ts_IPv4(mp_bankd_ip);
155 RSPRO[i].send(ts_RSPRO_ConnectBankReq(rspro[i].rspro_id, rspro[i].rspro_bank_id,
156 rspro[i].rspro_bank_nslots,
157 ts_IpPort(ip, mp_bankd_port)));
158 f_rspro_exp(tr_RSPRO_ConnectBankRes(?, exp_res), i);
159 }
160 case else {
161 setverdict(fail, "Unsupported type ", rspro[i].rspro_id.type_);
162 mtc.stop;
163 }
164 }
165}
166
167function f_rspro_connect_clients() runs on rspro_client_CT
168{
169 var integer i;
170
171 for (i := 0; i < NUM_CLIENT; i := i+1) {
172 select (rspro[i].rspro_id.type_) {
173 case (remsimClient) {
174 RSPRO[i].send(ts_RSPRO_ConnectClientReq(rspro[i].rspro_id,
175 rspro[i].rspro_client_slot));
176 }
177 case (remsimBankd) {
178 var template IpAddress ip := ts_IPv4(mp_bankd_ip);
179 RSPRO[i].send(ts_RSPRO_ConnectBankReq(rspro[i].rspro_id, rspro[i].rspro_bank_id,
180 rspro[i].rspro_bank_nslots,
181 ts_IpPort(ip, mp_bankd_port)));
182 }
183 }
184 }
185 for (i := 0; i < NUM_CLIENT; i := i+1) {
186 select (rspro[i].rspro_id.type_) {
187 case (remsimClient) {
188 f_rspro_exp(tr_RSPRO_ConnectClientRes(?, ResultCode:ok), i);
189 }
190 case (remsimBankd) {
191 f_rspro_exp(tr_RSPRO_ConnectBankRes(?, ResultCode:ok), i);
192 }
193 }
194 }
195}
196
197/* transceive a TPDU from modem to card (and back) */
198function f_rspro_xceive_mdm2card(integer idx, BankSlot bs, template (value) octetstring data,
199 template (value) TpduFlags flags) runs on rspro_client_CT return octetstring {
200 var RsproPDU rx;
201 RSPRO[idx].send(ts_RSPRO_TpduModemToCard(rspro[idx].rspro_client_slot, bs, flags, data));
202 rx := f_rspro_exp(tr_RSPRO_TpduCardToModem(bs, rspro[idx].rspro_client_slot, ?, ?));
203 return rx.msg.tpduCardToModem.data;
204}
205
206/* handle an incoming CreateMapping + ACK it */
207altstep as_rspro_create_mapping(integer i, template ClientSlot cslot := ?, template BankSlot bslot := ?,
208 template ResultCode res := ok)
209runs on rspro_client_CT {
210 var RsproPDU rx;
211 [] RSPRO[i].receive(tr_RSPRO_CreateMappingReq(cslot, bslot)) -> value rx {
212 RSPRO[i].send(ts_RSPRO_CreateMappingRes(res));
213 }
214}
215
216/* handle an incoming RemoveMapping + ACK it */
217altstep as_rspro_remove_mapping(integer i, template ClientSlot cslot := ?, template BankSlot bslot := ?,
218 template ResultCode res := ok)
219runs on rspro_client_CT {
220 var RsproPDU rx;
221 [] RSPRO[i].receive(tr_RSPRO_RemoveMappingReq(cslot, bslot)) -> value rx {
222 RSPRO[i].send(ts_RSPRO_RemoveMappingRes(res));
223 }
224}
225
226altstep as_rspro_cfg_client_id(integer i, template ClientSlot cslot := ?,
227 template (value) ResultCode res := ok)
228runs on rspro_client_CT {
229 var RsproPDU rx;
230 [] RSPRO[i].receive(tr_RSPRO_ConfigClientIdReq(cslot)) -> value rx {
231 RSPRO[i].send(ts_RSPRO_ConfigClientIdRes(res));
232 }
233}
234
235altstep as_rspro_cfg_client_bank(integer i, template BankSlot bslot := ?,
236 template IpPort ip_port := ?,
237 template (value) ResultCode res := ok)
238runs on rspro_client_CT {
239 var RsproPDU rx;
240 [] RSPRO[i].receive(tr_RSPRO_ConfigClientBankReq(bslot, ip_port)) -> value rx {
241 RSPRO[i].send(ts_RSPRO_ConfigClientBankRes(res));
242 }
243}
244
245
246
247}