osmo-ttcn3-hacks/cbc/SABP_Selftest.ttcn

181 lines
40 KiB
Plaintext
Raw Normal View History

module SABP_Selftest {
/* This is testing the SABP code, specifically re-creating the SABP messages from within
* the TCP stream using SABP_Adapter.f_APER_getMsgLen() for the various possible APER
* length determinant cases */
import from Osmocom_Types all;
import from SABP_Adapter all;
import from SABP_Templates all;
import from IPL4asp_Types all;
import from IPL4asp_PortType all;
modulepar {
charstring mp_bind_ip := "127.0.0.1";
integer mp_bind_port := 12345;
}
type component test_CT extends SABP_Adapter_CT {
port IPL4asp_PT TCP;
var integer g_tcp_conn_id;
timer Tguard := 10.0;
}
template (value) ASP_Send ts_AS(integer conn_id, octetstring msg) := {
connId := conn_id,
proto := omit,
msg := msg
}
private altstep as_Tguard() runs on test_CT {
[] Tguard.timeout {
setverdict(fail, "Tguard timeout");
mtc.stop;
}
}
private function f_init() runs on test_CT {
var IPL4asp_Types.Result res;
var ASP_Event asp_evt;
activate(as_Tguard());
Tguard.start;
f_bind(mp_bind_ip, mp_bind_port, 0);
map(self:TCP, system:TCP);
res := f_IPL4_connect(TCP, mp_bind_ip, mp_bind_port, "", -1, 0, { tcp:={} });
if (not ispresent(res.connId)) {
setverdict(fail, "Could not connect to SABP TCP port");
mtc.stop;
}
g_tcp_conn_id := res.connId;
SABP[0].receive(ASP_Event:{connOpened:=?}) -> value asp_evt {
g_sabp_conn_id[0] := asp_evt.connOpened.connId;
}
}
/* send a given input octetstring 'stream' in chunks of 'chunk_size', spaced at 'delay' intervals */
private function tcp_send_segmented(octetstring stream, integer chunk_size := 1, float delay := 0.05)
runs on test_CT {
var integer i;
for (i := 0; i < lengthof(stream); i := i+chunk_size) {
var integer size := chunk_size;
if (lengthof(stream) - i < chunk_size) {
size := lengthof(stream) - i;
}
TCP.send(ts_AS(g_tcp_conn_id, substr(stream, i, size)));
f_sleep(delay);
}
}
/* a simple SABP-RESTART message with single-byte length dteerminant (shorter than 128 byte) */
const octetstring c_restart := '00044010000001000F0009000062F22400230042'O;
/* test whether a message with 1-byte length determinant is parsed */
testcase TC_1byte_len() runs on test_CT {
f_init();
TCP.send(ts_AS(g_tcp_conn_id, c_restart));
f_sabp_exp(tr_SABP_Restart(?));
setverdict(pass);
}
/* test whether a message with 1-byte length determinant is parsed if each byte is received separately */
testcase TC_1byte_len_bytewise() runs on test_CT {
f_init();
tcp_send_segmented(c_restart, 1, 0.05);
f_sabp_exp(tr_SABP_Restart(?));
setverdict(pass);
}
/* send three concatenated RESTART in one segment */
testcase TC_1byte_len_chained() runs on test_CT {
var octetstring chain := c_restart & c_restart & c_restart;
f_init();
TCP.send(ts_AS(g_tcp_conn_id, chain));
f_sabp_exp(tr_SABP_Restart(?));
f_sabp_exp(tr_SABP_Restart(?));
f_sabp_exp(tr_SABP_Restart(?));
setverdict(pass);
}
/* SABP write-replace with length determinant encoded over two bytes ('8093'O) */
const octetstring c_wrepl := '00000080930000080006000211120007000240C0000F0010000113F0030282EC0613F0030282EC070001400100000D0002012A000900020000000400010100000056029F01B4D90D064297D9EC37E8FE96B3C9A0303BDD68341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D168341A8D46A3D10012'O;
/* test whether a message with 2-byte length determinant is parsed */
testcase TC_2byte_len() runs on test_CT {
f_init();
TCP.send(ts_AS(g_tcp_conn_id, c_wrepl));
f_sabp_exp(tr_SABP_Write(?, ?));
f_sabp_send(ts_SABP_Reset({ { pLMNidentity := '09F107'O, lac := '0000'O, sac := '0000'O } }));
setverdict(pass);
}
/* test whether a message with 2-byte length determinant is parsed if each byte is received separately */
testcase TC_2byte_len_bytewise() runs on test_CT {
f_init();
tcp_send_segmented(c_wrepl, 1, 0.05);
f_sabp_exp(tr_SABP_Write(?, ?));
setverdict(pass);
}
/* send three concatenated WRITE-REPLACE in one segment */
testcase TC_2byte_len_chained() runs on test_CT {
var octetstring chain := c_wrepl & c_wrepl & c_wrepl;
f_init();
TCP.send(ts_AS(g_tcp_conn_id, chain));
f_sabp_exp(tr_SABP_Write(?, ?));
f_sabp_exp(tr_SABP_Write(?, ?));
f_sabp_exp(tr_SABP_Write(?, ?));
setverdict(pass);
}
/* send three concatenated WRITE-REPLACE in segments of 10 bytes */
testcase TC_2byte_len_chained_bytewise() runs on test_CT {
var octetstring chain := c_wrepl & c_wrepl & c_wrepl;
f_init();
tcp_send_segmented(chain, 10, 0.05);
f_sabp_exp(tr_SABP_Write(?, ?));
f_sabp_exp(tr_SABP_Write(?, ?));
f_sabp_exp(tr_SABP_Write(?, ?));
setverdict(pass);
}
/* SABP write-replace with length determinant encoded over multiple chunks ('Cx'O case) */
const octetstring c_chunked := '000000C1000007000600020002000700020002000F00C109C462F2241000004262F2242000000062F2242000000162F2242000000262F2242000000362F2242000000462F2242000000562F2242000000662F2242000000762F2242000000862F2242000000962F2242000000A62F2242000000B62F2242000000C62F2242000000D62F2242000000E62F2242000000F62F2242000001062F2242000001162F2242000001262F2242000001362F2242000001462F2242000001562F2242000001662F2242000001762F2242000001862F2242000001962F2242000001A62F2242000001B62F2242000001C62F2242000001D62F2242000001E62F2242000001F62F2242000002062F2242000002162F2242000002262F2242000002362F2242000002462F2242000002562F2242000002662F2242000002762F2242000002862F2242000002962F2242000002A62F2242000002B62F2242000002C62F2242000002D62F2242000002E62F2242000002F62F2242000003062F2242000003162F2242000003262F2242000003362F2242000003462F2242000003562F2242000003662F2242000003762F2242000003862F2242000003962F2242000003A62F2242000003B62F2242000003C62F2242000003D62F2242000003E62F2242000003F62F2242000004062F2242000004162F2242000004262F2242000004362F2242000004462F2242000004562F2242000004662F2242000004762F2242000004862F2242000004962F2242000004A62F2242000004B62F2242000004C62F2242000004D62F2242000004E62F2242000004F62F2242000005062F2242000005162F2242000005262F2242000005362F2242000005462F2242000005562F2242000005662F2242000005762F2242000005862F2242000005962F2242000005A62F2242000005B62F2242000005C62F2242000005D62F2242000005E62F2242000005F62F2242000006062F2242000006162F2242000006262F2242000006362F2242000006462F2242000006562F2242000006662F2242000006762F2242000006862F2242000006962F2242000006A62F2242000006B62F2242000006C62F2242000006D62F2242000006E62F2242000006F62F2242000007062F2242000007162F2242000007262F2242000007362F2242000007462F2242000007562F2242000007662F2242000007762F2242000007862F2242000007962F2242000007A62F2242000007B62F2242000007C62F2242000007D62F2242000007E62F2242000007F62F2242000008062F2242000008162F2242000008262F2242000008362F2242000008462F2242000008562F2242000008662F2242000008762F2242000008862F2242000008962F2242000008A62F2242000008B62F2242000008C62F2242000008D62F2242000008E62F2242000008F62F2242000009062F2242000009162F2242000009262F2242000009362F2242000009462F2242000009562F2242000009662F2242000009762F2242000009862F2242000009962F2242000009A62F2242000009B62F2242000009C62F2242000009D62F2242000009E62F2242000009F62F224200000A062F224200000A162F224200000A262F224200000A362F224200000A462F224200000A562F224200000A662F224200000A762F224200000A862F224200000A962F224200000AA62F224200000AB62F224200000AC62F224200000AD62F224200000AE62F224200000AF62F224200000B062F224200000B162F224200000B262F224200000B362F224200000B462F224200000B562F224200000B662F224200000B762F224200000B862F224200000B962F224200000BA62F224200000BB62F224200000BC62F224200000BD62F224200000BE62F224200000BF62F224200000C062F224200000C162F224200000C262F224200000C362F224200000C462F224200000C562F224200000C662F224200000C762F224200000C862F224200000C962F224200000CA62F224200000CB62F224200000CC62F224200000CD62F224200000CE62F224200000CF62F224200000D062F224200000D162F224200000D262F224200000D362F224200000D462F224200000D562F224200000D662F224200000D762F224200000D862F224200000D962F224200000DA62F224200000DB62F224200000DC62F224200000DD62F224200000DE62F224200000DF62F224200000E062F224200000E162F224200000E262F224200000E362F224200000E462F224200000E562F224200000E662F224200000E762F224200000E862F224200000E962F224200000EA62F224200000EB62F224200000EC62F224200000ED62F224200000EE62F224200000EF62F224200000F062F224200000F162F224200000F262F224200000F362F224200000F462F224200000F562F224200000F662F224200000F762F224200000F862F224200000F962F224200000FA62F224200000FB62F224200000FC62F224200000FD62F224200000FE62F224200000FF62F2242000010062F2242000010162F2242000010262F2242000010362F2242000010462F2242000010562F2242000010662F2242000010762F2242000010862F2242000010962F2242000010A62F2242000010B62F2242000010C62F2242000010D62F2242000010E62F2242000010F62F2242000011062F2242000011162F2242000011262F2242000011362F2242000011462F2242000011562F2242000011662F2242000011762F2242000011862F2242000011962F2242000011A62F2242000011B62F2242000011C62F224200
/* test whether a message with chnked length determinant is parsed */
testcase TC_chunked_len() runs on test_CT {
f_init();
TCP.send(ts_AS(g_tcp_conn_id, c_chunked));
f_sabp_exp(tr_SABP_Write(?, ?));
setverdict(pass);
}
/* test whether a message with chunked length determinant is parsed if each byte is received separately */
testcase TC_chunked_len_bytewise() runs on test_CT {
f_init();
tcp_send_segmented(c_chunked, 100, 0.05);
f_sabp_exp(tr_SABP_Write(?, ?));
setverdict(pass);
}
control {
execute( TC_1byte_len() );
execute( TC_1byte_len_bytewise() );
execute( TC_1byte_len_chained() );
execute( TC_2byte_len() );
execute( TC_2byte_len_bytewise() );
execute( TC_2byte_len_chained() );
execute( TC_2byte_len_chained_bytewise() );
execute( TC_chunked_len() );
execute( TC_chunked_len_bytewise() );
}
}