blob: e9e3b312231cd1e22d69d6de65f2147956c3a4ec [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
20import from RSPRO all;
21import from RSRES all;
22import from RSPRO_Types all;
23import from RSPRO_Server all;
24import from REMSIM_Tests all;
25
26modulepar {
27 integer mp_bank_id := 1;
28 integer mp_num_slots := 8;
29}
30
31/* We implement a RSPRO server to simulate the remsim-server and a
32 RSPRO client to simulate a remsim-client connecting to bankd */
33type component bankd_test_CT extends rspro_server_CT, rspro_client_CT {
34}
35
36private function f_init(boolean start_client := false) runs on bankd_test_CT {
37 var ComponentIdentity srv_comp_id := valueof(ts_CompId(remsimServer, "ttcn-server"));
38
39 f_rspro_srv_init(0, mp_server_ip, mp_server_port, srv_comp_id);
40
41 if (start_client) {
42 f_init_client(0);
43 }
44}
45
46private function f_init_client(integer i := 0) runs on rspro_client_CT {
47 var ComponentIdentity clnt_comp_id := valueof(ts_CompId(remsimClient, "ttcn-client"));
48 f_rspro_init(rspro[0], mp_bankd_ip, mp_bankd_port, clnt_comp_id, 0);
49 rspro[0].rspro_client_slot := { clientId := 23+i, slotNr := 0 };
50}
51
52
53
54/* Test if the bankd disconnects the TCP/IPA session if we don't respond to connectBankReq */
55testcase TC_connectBankReq_timeout() runs on bankd_test_CT {
56 timer T := 20.0;
57 f_init();
58
59 f_rspro_srv_exp(tr_RSPRO_ConnectBankReq(?, ?, ?));
60 T.start;
61 alt {
62 [] RSPRO_SRV[0].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_DOWN}) {
63 setverdict(pass);
64 }
65 [] RSPRO_SRV[0].receive { repeat; }
66 [] T.timeout {
67 setverdict(fail, "Timeout waiting for disconnect");
68 }
69 }
70}
71
72/* accept an inbound connection from bankd to simulated server */
73testcase TC_connectBankReq() runs on bankd_test_CT {
74 f_init();
75
76 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
77 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
78}
79
80/* attempt to create a mapping */
81testcase TC_createMapping() runs on bankd_test_CT {
82 f_init();
83 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +010084 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +010085 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
86 var ClientSlot cs := { clientId := 23, slotNr := 42 };
87 f_rspro_srv_create_slotmap(cs, bs);
88 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
89}
90
91/* attempt to create a mapping for a slot that already has a mapping */
92testcase TC_createMapping_busySlot() runs on bankd_test_CT {
93 f_init();
94 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +010095 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +010096 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
97 var ClientSlot cs := { clientId := 23, slotNr := 42 };
Harald Weltebca0ecd2019-12-04 21:53:29 +010098 /* create the mapping the first time */
Harald Weltefaa42922019-03-04 18:31:11 +010099 f_rspro_srv_create_slotmap(cs, bs);
Harald Weltebca0ecd2019-12-04 21:53:29 +0100100 /* re-create the mapping a second time */
101 f_rspro_srv_create_slotmap(cs, bs);
Harald Weltefaa42922019-03-04 18:31:11 +0100102 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
103}
104
105/* attempt to create a mapping for an out-of-range slot number */
106testcase TC_createMapping_invalidSlot() runs on bankd_test_CT {
107 f_init();
108 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100109 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100110 var BankSlot bs := { bankId := mp_bank_id, slotNr := 200 };
111 var ClientSlot cs := { clientId := 23, slotNr := 42 };
112 f_rspro_srv_create_slotmap(cs, bs, exp_res := illegalSlotId);
113 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
114}
115
116/* attempt to create a mapping for an invalid bankID */
117testcase TC_createMapping_invalidBank() runs on bankd_test_CT {
118 f_init();
119 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100120 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100121 var BankSlot bs := { bankId := 200, slotNr := 0 };
122 var ClientSlot cs := { clientId := 23, slotNr := 42 };
123 f_rspro_srv_create_slotmap(cs, bs, exp_res := illegalBankId);
124 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
125}
126
127/* attempt to remove a non-existant mapping */
128testcase TC_removeMapping_unknownMap() runs on bankd_test_CT {
129 f_init();
130 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100131 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100132 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
133 var ClientSlot cs := { clientId := 23, slotNr := 42 };
134 f_rspro_srv_remove_slotmap(cs, bs, exp_res := unknownSlotmap);
135 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
136}
137
138/* add and then remove a mapping, expect both to be successful */
139testcase TC_removeMapping() runs on bankd_test_CT {
140 f_init();
141 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100142 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100143 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
144 var ClientSlot cs := { clientId := 23, slotNr := 42 };
145 f_rspro_srv_create_slotmap(cs, bs);
146 f_rspro_srv_remove_slotmap(cs, bs);
147 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
148}
149
150/* connect from client to bankd without specifying a clientId */
151testcase TC_clientConnect_missingSlot() runs on bankd_test_CT {
152 f_init_client(0);
153 RSPRO[0].send(ts_RSPRO_ConnectClientReq(rspro[0].rspro_id, omit));
154 f_rspro_exp(tr_RSPRO_ConnectClientRes(?, ResultCode:illegalClientId), 0);
155 f_rspro_exp_disconnect(0);
156 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
157}
158
159/* connect from client to bankd using a clientId for which bankd has no map */
160testcase TC_clientConnect_unknown() runs on bankd_test_CT {
161 f_init_client(0);
162 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
163 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
164}
165
166/* connect from client to bankd using a clientSlot for which bankd has no map */
167
168
169/* first connect client, then later add matching mapping from server */
170testcase TC_clientConnect_createMapping() runs on bankd_test_CT {
171 f_init_client(0);
172 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
173
174 f_init();
175 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
176
177 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
178 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
179 f_sleep(10.0);
180 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
181}
182
183
184/* first add mapping, then connect matching client */
185testcase TC_createMapping_clientConnect() runs on bankd_test_CT {
186 /* FIXME: this would only be done in f_init_client(), but we need it before */
187 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
188
189 f_init();
190 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100191 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100192
193 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
194 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
195
196 f_sleep(1.0);
197
198 f_init_client(0);
199 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
200 /* FIXME: how to determine that bank correctly mapped us */
201 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
202}
203
Harald Weltebeba4e52019-12-04 22:09:12 +0100204/* first add mapping, then connect client, then change mapping (expect disconnect) */
205testcase TC_createMapping_connectClient_changeMapping() runs on bankd_test_CT {
206 /* FIXME: this would only be done in f_init_client(), but we need it before */
207 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
208
209 f_init();
210 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
211 f_rspro_srv_reset_state(ok);
212
213 /* create slotmap */
214 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
215 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
216
217 f_sleep(1.0);
218
219 /* connect client */
220 f_init_client(0);
221 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
222 /* FIXME: how to determine that bank correctly mapped us */
223
224 /* create another mapping for the same bank-slot */
225 var ClientSlot cs := { clientId := 987, slotNr := 654 };
226 f_rspro_srv_create_slotmap(cs, bs);
227
228 /* expect client to be disconnected */
229 timer T := 5.0;
230 T.start;
231 alt {
232 [] RSPRO[0].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_DOWN}) {
233 setverdict(pass);
234 }
235 [] RSPRO[0].receive {
236 setverdict(fail, "Unexpected RSPRO on client connection");
237 }
238 [] T.timeout {
239 setverdict(fail, "Timeout waiting for client being disconnected");
240 }
241 }
242 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
243}
244
245/* first add mapping, then connect client, then re-crete mapping (expect no disconnect) */
246testcase TC_createMapping_connectClient_recreateMapping() runs on bankd_test_CT {
247 /* FIXME: this would only be done in f_init_client(), but we need it before */
248 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
249
250 f_init();
251 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
252 f_rspro_srv_reset_state(ok);
253
254 /* create slotmap */
255 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
256 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
257
258 f_sleep(1.0);
259
260 /* connect client */
261 f_init_client(0);
262 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
263 /* FIXME: how to determine that bank correctly mapped us */
264
265 /* re-create same mapping for the same bank-slot */
266 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
267
268 /* expect client not to be disconnected */
269 timer T := 5.0;
270 T.start;
271 alt {
272 [] RSPRO[0].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_DOWN}) {
273 setverdict(fail, "Unexpected client disconnect");
274 }
275 [] RSPRO[0].receive {
276 repeat;
277 }
278 [] T.timeout {
279 setverdict(pass);
280 }
281 }
282 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
283}
284
Harald Weltefaa42922019-03-04 18:31:11 +0100285
286
287/* add mapping, connect matching client, disconnect + reconnect */
288testcase TC_createMapping_clientReconnect() runs on bankd_test_CT {
289 /* FIXME: this would only be done in f_init_client(), but we need it before */
290 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
291
292 f_init();
293 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100294 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100295
296 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
297 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
298
299 f_sleep(1.0);
300
301 f_init_client(0);
302 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
303 /* TODO: works only with empty slot, as setAtrReq isn't handled */
304 /* FIXME: how to determine that bank correctly mapped us */
305 f_sleep(5.0);
306 f_rspro_fini(rspro[0], 0);
307
308 f_init_client(0);
309 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
310 /* FIXME: how to determine that bank correctly mapped us */
311 f_sleep(5.0);
312 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
313}
314
315
316
317/* remove mapping while client is connected */
318testcase TC_removeMapping_connected() runs on bankd_test_CT {
319 f_init_client(0);
320 f_rspro_connect_client(0, tr_Status_ok_or_nocard);
321 /* TODO: works only with empty slot, as setAtrReq isn't handled */
322
323 f_init();
324 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
325
326 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
327 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
328 /* FIXME: how to determine that bank correctly mapped us */
329 f_sleep(5.0);
330 f_rspro_srv_remove_slotmap(rspro[0].rspro_client_slot, bs);
331 f_rspro_exp_disconnect(0);
332 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
333}
334
335/* first add mapping, then connect matching client and exchange some TPDUs */
336testcase TC_createMapping_exchangeTPDU() runs on bankd_test_CT {
337 /* FIXME: this would only be done in f_init_client(), but we need it before */
338 rspro[0].rspro_client_slot := { clientId := 23+0, slotNr := 0 };
339
340 f_init();
341 as_connectBankReq(bid := mp_bank_id, nslots := mp_num_slots);
Harald Welted14ad4c2019-12-04 21:30:29 +0100342 f_rspro_srv_reset_state(ok);
Harald Weltefaa42922019-03-04 18:31:11 +0100343
344 var BankSlot bs := { bankId := mp_bank_id, slotNr := 0 };
345 f_rspro_srv_create_slotmap(rspro[0].rspro_client_slot, bs);
346
347 f_sleep(1.0);
348
349 f_init_client(0);
350 f_rspro_connect_client(0, ok);
351 /* FIXME: how to determine that bank correctly mapped us */
352 f_rspro_exp(tr_RSPRO_SetAtrReq(rspro[0].rspro_client_slot, ?));
353
354 var TpduFlags f := {tpduHeaderPresent:=true, finalPart:=true, procByteContinueTx:=false,
355 procByteContinueRx:=false};
356 for (var integer i := 0; i < 10; i:=i+1) {
357 f_rspro_xceive_mdm2card(0, bs, 'A0A40000023F00'O, f);
358 }
359 Misc_Helpers.f_shutdown(__BFILE__, __LINE__, pass);
360}
361
362
363
364control {
365 execute( TC_connectBankReq_timeout() );
366 execute( TC_connectBankReq() );
367
368 execute( TC_createMapping() );
369 execute( TC_createMapping_busySlot() );
370 execute( TC_createMapping_invalidSlot() );
371 execute( TC_createMapping_invalidBank() );
372
373 execute( TC_removeMapping_unknownMap() );
374 execute( TC_removeMapping() );
375
376 execute( TC_clientConnect_missingSlot() );
377 execute( TC_clientConnect_unknown() );
378 execute( TC_clientConnect_createMapping() );
379 execute( TC_createMapping_clientConnect() );
380 execute( TC_createMapping_clientReconnect() );
381 execute( TC_removeMapping_connected() );
382
Harald Weltebeba4e52019-12-04 22:09:12 +0100383 execute( TC_createMapping_connectClient_changeMapping() );
384 execute( TC_createMapping_connectClient_recreateMapping() );
385
Harald Weltefaa42922019-03-04 18:31:11 +0100386 execute( TC_createMapping_exchangeTPDU() );
387}
388
389
390
391
392
393}