blob: a2686d30ff6d497673107b4ca26fa19ae8085c1e [file] [log] [blame]
Harald Weltefaa42922019-03-04 18:31:11 +01001module RemsimBankd_Tests {
2
3/* Integration Tests for osmo-remsim-bankd
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 * This test suite tests osmo-remsim-bankd by attaching to the external interfaces
13 * such as RSPRO for simulated clients + server.
14 */
15
16import from Osmocom_Types all;
17import from IPA_Emulation all;
18import from Misc_Helpers all;
19
Harald Welte90732952019-11-22 00:39:43 +010020import from VPCD_Types all;
21import from VPCD_CodecPort all;
22import from VPCD_Adapter all;
23
Harald Weltefaa42922019-03-04 18:31:11 +010024import from RSPRO all;
25import from RSRES all;
26import from RSPRO_Types all;
27import from RSPRO_Server all;
28import from REMSIM_Tests all;
29
30modulepar {
31 integer mp_bank_id := 1;
32 integer mp_num_slots := 8;
33}
34
35/* We implement a RSPRO server to simulate the remsim-server and a
36 RSPRO client to simulate a remsim-client connecting to bankd */
Harald Welte90732952019-11-22 00:39:43 +010037type component bankd_test_CT extends rspro_server_CT, rspro_client_CT, VPCD_Adapter_CT {
Vadim Yanitskiy0df27dc2021-02-28 17:08:52 +010038 timer g_T_guard := 60.0;
39}
40
41private altstep as_Tguard() runs on bankd_test_CT {
42 [] g_T_guard.timeout {
43 setverdict(fail, "Timeout of T_guard");
44 Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
45 }
Harald Weltefaa42922019-03-04 18:31:11 +010046}
47
48private function f_init(boolean start_client := false) runs on bankd_test_CT {
49 var ComponentIdentity srv_comp_id := valueof(ts_CompId(remsimServer, "ttcn-server"));
50
Vadim Yanitskiy0df27dc2021-02-28 17:08:52 +010051 /* Start the guard timer */
52 g_T_guard.start;
53 activate(as_Tguard());
54
Harald Weltefaa42922019-03-04 18:31:11 +010055 f_rspro_srv_init(0, mp_server_ip, mp_server_port, srv_comp_id);
56
57 if (start_client) {
58 f_init_client(0);
59 }
60}
61
62private function f_init_client(integer i := 0) runs on rspro_client_CT {
63 var ComponentIdentity clnt_comp_id := valueof(ts_CompId(remsimClient, "ttcn-client"));
64 f_rspro_init(rspro[0], mp_bankd_ip, mp_bankd_port, clnt_comp_id, 0);
65 rspro[0].rspro_client_slot := { clientId := 23+i, slotNr := 0 };
66}
67
68
69
70/* Test if the bankd disconnects the TCP/IPA session if we don't respond to connectBankReq */
71testcase TC_connectBankReq_timeout() runs on bankd_test_CT {
72 timer T := 20.0;
73 f_init();
74
75 f_rspro_srv_exp(tr_RSPRO_ConnectBankReq(?, ?, ?));
76 T.start;
77 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +070078 [] RSPRO_SRV[0].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {
Harald Weltefaa42922019-03-04 18:31:11 +010079 setverdict(pass);
80 }
81 [] RSPRO_SRV[0].receive { repeat; }
82 [] T.timeout {
83 setverdict(fail, "Timeout waiting for disconnect");
84 }
85 }
86}
87
88/* accept an inbound connection from bankd to simulated server */
89testcase TC_connectBankReq() runs on bankd_test_CT {
90 f_init();
91
92 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
93 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
94}
95
96/* attempt to create a mapping */
97testcase TC_createMapping() runs on bankd_test_CT {
98 f_init();
99 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100100 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100101 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
102 var ClientSlot cs := { clientId := 23, slotNr := 42 };
103 f_rspro_srv_create_slotmap(cs, bs);
104 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
105}
106
107/* attempt to create a mapping for a slot that already has a mapping */
108testcase TC_createMapping_busySlot() runs on bankd_test_CT {
109 f_init();
110 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100111 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100112 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
113 var ClientSlot cs := { clientId := 23, slotNr := 42 };
Harald Weltebca0ecd2019-12-04 21:53:29 +0100114 /* create the mapping the first time */
Harald Weltefaa42922019-03-04 18:31:11 +0100115 f_rspro_srv_create_slotmap(cs, bs);
Harald Weltebca0ecd2019-12-04 21:53:29 +0100116 /* re-create the mapping a second time */
117 f_rspro_srv_create_slotmap(cs, bs);
Harald Weltefaa42922019-03-04 18:31:11 +0100118 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
119}
120
121/* attempt to create a mapping for an out-of-range slot number */
122testcase TC_createMapping_invalidSlot() runs on bankd_test_CT {
123 f_init();
124 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100125 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100126 var BankSlot bs := { bankId := mp_bank_id, slotNr := 200 };
127 var ClientSlot cs := { clientId := 23, slotNr := 42 };
128 f_rspro_srv_create_slotmap(cs, bs, exp_res := illegalSlotId);
129 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
130}
131
132/* attempt to create a mapping for an invalid bankID */
133testcase TC_createMapping_invalidBank() runs on bankd_test_CT {
134 f_init();
135 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100136 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100137 var BankSlot bs := { bankId := 200, slotNr := 0 };
138 var ClientSlot cs := { clientId := 23, slotNr := 42 };
139 f_rspro_srv_create_slotmap(cs, bs, exp_res := illegalBankId);
140 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
141}
142
143/* attempt to remove a non-existant mapping */
144testcase TC_removeMapping_unknownMap() runs on bankd_test_CT {
145 f_init();
146 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100147 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100148 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
149 var ClientSlot cs := { clientId := 23, slotNr := 42 };
150 f_rspro_srv_remove_slotmap(cs, bs, exp_res := unknownSlotmap);
151 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
152}
153
154/* add and then remove a mapping, expect both to be successful */
155testcase TC_removeMapping() runs on bankd_test_CT {
156 f_init();
157 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100158 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100159 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
160 var ClientSlot cs := { clientId := 23, slotNr := 42 };
161 f_rspro_srv_create_slotmap(cs, bs);
162 f_rspro_srv_remove_slotmap(cs, bs);
163 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
164}
165
166/* connect from client to bankd without specifying a clientId */
167testcase TC_clientConnect_missingSlot() runs on bankd_test_CT {
168 f_init_client(0);
169 RSPRO[0].send(ts_RSPRO_ConnectClientReq(rspro[0].rspro_id, omit));
170 f_rspro_exp(tr_RSPRO_ConnectClientRes(?, ResultCode:illegalClientId), 0);
171 f_rspro_exp_disconnect(0);
172 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
173}
174
175/* connect from client to bankd using a clientId for which bankd has no map */
176testcase TC_clientConnect_unknown() runs on bankd_test_CT {
177 f_init_client(0);
178 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
179 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
180}
181
182/* connect from client to bankd using a clientSlot for which bankd has no map */
183
184
185/* first connect client, then later add matching mapping from server */
186testcase TC_clientConnect_createMapping() runs on bankd_test_CT {
187 f_init_client(0);
188 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
189
190 f_init();
191 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
192
193 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
194 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
195 f_sleep(10.0);
196 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
197}
198
199
200/* first add mapping, then connect matching client */
201testcase TC_createMapping_clientConnect() runs on bankd_test_CT {
202 /* FIXME: this would only be done in f_init_client(), but we need it before */
203 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
204
205 f_init();
206 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100207 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100208
209 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
210 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
211
212 f_sleep(1.0);
213
214 f_init_client(0);
215 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
216 /* FIXME: how to determine that bank correctly mapped us */
217 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
218}
219
Harald Weltebeba4e52019-12-04 22:09:12 +0100220/* first add mapping, then connect client, then change mapping (expect disconnect) */
221testcase TC_createMapping_connectClient_changeMapping() runs on bankd_test_CT {
222 /* FIXME: this would only be done in f_init_client(), but we need it before */
223 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
224
225 f_init();
226 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
227 f_rspro_srv_reset_state(ok);
228
229 /* create slotmap */
230 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
231 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
232
233 f_sleep(1.0);
234
235 /* connect client */
236 f_init_client(0);
237 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
238 /* FIXME: how to determine that bank correctly mapped us */
239
240 /* create another mapping for the same bank-slot */
241 var ClientSlot cs := { clientId := 987, slotNr := 654 };
242 f_rspro_srv_create_slotmap(cs, bs);
243
244 /* expect client to be disconnected */
245 timer T := 5.0;
246 T.start;
247 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +0700248 [] RSPRO[0].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {
Harald Weltebeba4e52019-12-04 22:09:12 +0100249 setverdict(pass);
250 }
251 [] RSPRO[0].receive {
252 setverdict(fail, "Unexpected RSPRO on client connection");
253 }
254 [] T.timeout {
255 setverdict(fail, "Timeout waiting for client being disconnected");
256 }
257 }
258 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
259}
260
261/* first add mapping, then connect client, then re-crete mapping (expect no disconnect) */
262testcase TC_createMapping_connectClient_recreateMapping() runs on bankd_test_CT {
263 /* FIXME: this would only be done in f_init_client(), but we need it before */
264 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
265
266 f_init();
267 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
268 f_rspro_srv_reset_state(ok);
269
270 /* create slotmap */
271 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
272 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
273
274 f_sleep(1.0);
275
276 /* connect client */
277 f_init_client(0);
278 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
279 /* FIXME: how to determine that bank correctly mapped us */
280
281 /* re-create same mapping for the same bank-slot */
282 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
283
284 /* expect client not to be disconnected */
285 timer T := 5.0;
286 T.start;
287 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +0700288 [] RSPRO[0].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {
Harald Weltebeba4e52019-12-04 22:09:12 +0100289 setverdict(fail, "Unexpected client disconnect");
290 }
291 [] RSPRO[0].receive {
292 repeat;
293 }
294 [] T.timeout {
295 setverdict(pass);
296 }
297 }
298 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
299}
300
Harald Weltefaa42922019-03-04 18:31:11 +0100301
302
303/* add mapping, connect matching client, disconnect + reconnect */
304testcase TC_createMapping_clientReconnect() runs on bankd_test_CT {
305 /* FIXME: this would only be done in f_init_client(), but we need it before */
306 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
307
308 f_init();
309 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100310 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100311
312 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
313 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
314
315 f_sleep(1.0);
316
317 f_init_client(0);
318 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
319 /* TODO: works only with empty slot, as setAtrReq isn't handled */
320 /* FIXME: how to determine that bank correctly mapped us */
321 f_sleep(5.0);
322 f_rspro_fini(rspro[0], 0);
323
324 f_init_client(0);
325 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
326 /* FIXME: how to determine that bank correctly mapped us */
327 f_sleep(5.0);
328 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
329}
330
331
332
333/* remove mapping while client is connected */
334testcase TC_removeMapping_connected() runs on bankd_test_CT {
335 f_init_client(0);
336 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
337 /* TODO: works only with empty slot, as setAtrReq isn't handled */
338
339 f_init();
340 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
341
342 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
343 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
344 /* FIXME: how to determine that bank correctly mapped us */
345 f_sleep(5.0);
346 f_rspro_srv_remove_slotmap(rspro[0].rspro_client_slot, bs);
347 f_rspro_exp_disconnect(0);
348 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
349}
350
Harald Welte90732952019-11-22 00:39:43 +0100351private altstep as_vpcd() runs on VPCD_Adapter_CT {
352 [] VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, tr_VPCD_CTRL_ATR)) {
353 f_vpcd_send(ts_VPCD_DATA('3B9F96801FC78031A073BE21136743200718000001A5'O));
354 repeat;
355 }
356 [] VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, tr_VPCD_CTRL_OFF)) {
357 repeat;
358 }
359 [] VPCD.receive(tr_VPCD_Recv(g_vpcd_conn_id, tr_VPCD_CTRL_ON)) {
360 repeat;
361 }
362}
363
364/* transceive a TPDU from modem to card (and back) */
365function f_rspro_xceive_mdm2card_vpcd(integer idx, BankSlot bs, template (value) octetstring data,
366 template (value) TpduFlags flags, template (value) octetstring res) runs on bankd_test_CT return octetstring {
367 var RsproPDU rx;
368 RSPRO[idx].send(ts_RSPRO_TpduModemToCard(rspro[idx].rspro_client_slot, bs, flags, data));
369 f_vpcd_exp(tr_VPCD_DATA(data));
370 f_vpcd_send(ts_VPCD_DATA(res));
371 rx := f_rspro_exp(tr_RSPRO_TpduCardToModem(bs, rspro[idx].rspro_client_slot, ?, ?));
372 if (rx.msg.tpduCardToModem.data != valueof(res)) {
373 setverdict(fail, "Expected ", res, " from card, but got ", rx.msg.tpduCardToModem.data);
374 }
375 return rx.msg.tpduCardToModem.data;
376}
377
378
Harald Weltefaa42922019-03-04 18:31:11 +0100379/* first add mapping, then connect matching client and exchange some TPDUs */
380testcase TC_createMapping_exchangeTPDU() runs on bankd_test_CT {
381 /* FIXME: this would only be done in f_init_client(), but we need it before */
382 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
383
Harald Welte90732952019-11-22 00:39:43 +0100384 VPCD_Adapter.f_connect();
385 activate(as_vpcd());
386 f_sleep(2.0);
387
Harald Weltefaa42922019-03-04 18:31:11 +0100388 f_init();
389 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100390 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100391
392 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
393 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
394
395 f_sleep(1.0);
396
397 f_init_client(0);
398 f_rspro_connect_client(0, ok);
399 /* FIXME: how to determine that bank correctly mapped us */
400 f_rspro_exp(tr_RSPRO_SetAtrReq(rspro[0].rspro_client_slot, ?));
401
402 var TpduFlags f := {tpduHeaderPresent:=true, finalPart:=true, procByteContinueTx:=false,
403 procByteContinueRx:=false};
404 for (var integer i := 0; i < 10; i:=i+1) {
Harald Welte90732952019-11-22 00:39:43 +0100405 f_rspro_xceive_mdm2card_vpcd(0, bs, 'A0A40000023F00'O, f, '9000'O);
Harald Weltefaa42922019-03-04 18:31:11 +0100406 }
407 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
408}
409
410
411
412control {
413 execute( TC_connectBankReq_timeout() );
414 execute( TC_connectBankReq() );
415
416 execute( TC_createMapping() );
417 execute( TC_createMapping_busySlot() );
418 execute( TC_createMapping_invalidSlot() );
419 execute( TC_createMapping_invalidBank() );
420
421 execute( TC_removeMapping_unknownMap() );
422 execute( TC_removeMapping() );
423
424 execute( TC_clientConnect_missingSlot() );
425 execute( TC_clientConnect_unknown() );
426 execute( TC_clientConnect_createMapping() );
427 execute( TC_createMapping_clientConnect() );
428 execute( TC_createMapping_clientReconnect() );
429 execute( TC_removeMapping_connected() );
430
Harald Weltebeba4e52019-12-04 22:09:12 +0100431 execute( TC_createMapping_connectClient_changeMapping() );
432 execute( TC_createMapping_connectClient_recreateMapping() );
433
Harald Weltefaa42922019-03-04 18:31:11 +0100434 execute( TC_createMapping_exchangeTPDU() );
435}
436
437
438
439
440
441}