blob: d5858ec873530880e150e5716fa011da440f8bed [file] [log] [blame]
Harald Welte00a067f2017-09-13 23:27:17 +02001module MGCP_Test {
2 import from MGCP_Types all;
Harald Welte3c6ebb92017-09-16 00:56:57 +08003 import from SDP_Types all;
4 import from MGCP_CodecPort all;
5 import from MGCP_CodecPort_CtrlFunct all;
6 import from IPL4asp_Types all;
Harald Welte00a067f2017-09-13 23:27:17 +02007
8 type component dummy_CT {
Harald Welte3c6ebb92017-09-16 00:56:57 +08009 port MGCP_CODEC_PT MGCP;
10 var boolean initialized := false;
11 var ConnectionId g_conn_id := -1;
Harald Weltee1e18c52017-09-17 16:23:07 +080012 var integer g_trans_id;
Harald Welte00a067f2017-09-13 23:27:17 +020013 };
14
Harald Weltee1e18c52017-09-17 16:23:07 +080015 function get_next_trans_id() runs on dummy_CT return MgcpTransId {
16 var MgcpTransId tid := int2str(g_trans_id);
17 g_trans_id := g_trans_id + 1;
18 return tid;
19 }
20
Harald Welte3c6ebb92017-09-16 00:56:57 +080021 modulepar {
22 PortNumber mp_local_udp_port := 2727;
23 charstring mp_local_ip := "127.0.0.1";
24 PortNumber mp_remote_udp_port := 2427;
25 charstring mp_remote_ip := "127.0.0.1";
26 }
27
28 private function f_init()runs on dummy_CT {
29 var Result res;
30 if (initialized == true) {
31 return;
32 }
33 initialized := true;
34
Harald Weltee1e18c52017-09-17 16:23:07 +080035 g_trans_id := float2int(rnd()*65535.0);
Harald Welte3c6ebb92017-09-16 00:56:57 +080036 map(self:MGCP, system:MGCP_CODEC_PT);
37 res := f_IPL4_connect(MGCP, mp_remote_ip, mp_remote_udp_port, mp_local_ip, mp_local_udp_port, 0, { udp := {} });
38 g_conn_id := res.connId;
39 }
40
41 /* 3.2.2.6 Connection Mode (sendonly, recvonly, sendrecv, confrnce, inactive, loopback,
42 * conttest, netwloop, netwtest) */
43 template MgcpParameter t_MgcpParConnMode(template MgcpConnectionMode mode) := { "M", mode };
44
45 /* 3.2.2.2 CallId: maximum 32 hex chars */
46 template MgcpParameter ts_MgcpParCallId(MgcpCallId cid) := {
47 code := "C",
48 val := hex2str(cid)
49 };
50
51 /* 3.2.2.18 RequestIdentifier: Maximum 32 hex chars */
52 template MgcpParameter ts_MgcpParReqId(MgcpRequestId rid) := {
53 code := "X",
54 val := hex2str(rid)
55 };
56
57 /* 3.2.2.10: LocalConnectionOptions (codec, packetization, bandwidth, ToS, eco, gain, silence, ...) */
58 template MgcpParameter t_MgcpParLocConnOpt(template charstring lco) := { "L", lco };
59
60 /* 3.2.2.5: ConnectionId: maximum 32 hex chars */
61 template MgcpParameter ts_MgcpParConnectionId(MgcpConnectionId cid) := {
62 code := "I",
63 val := hex2str(cid)
64 };
65
66 /* osmo-bsc_mgcp implements L/C/M/X only, osmo-mgw adds 'I' */
67 /* SDP: osmo-bsc_mgcp implements Tx of v,o,s,c,t,m,a */
68
69 template MgcpCommandLine t_MgcpCmdLine(template charstring verb, template MgcpTransId trans_id, template charstring ep) := {
70 verb := verb,
71 trans_id := trans_id,
72 ep := ep,
73 ver := "1.0"
74 };
75
76 template MgcpCommand ts_CRCX(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, template SDP_Message sdp := omit) := {
77 line := t_MgcpCmdLine("CRCX", trans_id, ep),
78 params := {
79 t_MgcpParConnMode(mode),
80 ts_MgcpParCallId(call_id),
81 //t_MgcpParReqId(omit),
82 t_MgcpParLocConnOpt("p: 20")
83 },
84 sdp := sdp
85 }
86
Harald Welte00a067f2017-09-13 23:27:17 +020087 testcase TC_selftest() runs on dummy_CT {
88 const charstring c_auep := "AUEP 158663169 ds/e1-1/2@172.16.6.66 MGCP 1.0\r\n";
89 const charstring c_mdcx3 := "MDCX 18983215 1@mgw MGCP 1.0\r\n";
90 const charstring c_mdcx3_ret := "200 18983215 OK\r\n" &
91 "I: 1\n" &
92 "\n" &
93 "v=0\r\n" &
94 "o=- 1 23 IN IP4 0.0.0.0\r\n" &
95 "s=-\r\n" &
96 "c=IN IP4 0.0.0.0\r\n" &
97 "t=0 0\r\n" &
98 "m=audio 0 RTP/AVP 126\r\n" &
99 "a=rtpmap:126 AMR/8000\r\n" &
100 "a=ptime:20\r\n";
101 const charstring c_mdcx4 := "MDCX 18983216 1@mgw MGCP 1.0\r\n" &
102 "M: sendrecv\r" &
103 "C: 2\r\n" &
104 "I: 1\r\n" &
105 "L: p:20, a:AMR, nt:IN\r\n" &
106 "\n" &
107 "v=0\r\n" &
108 "o=- 1 23 IN IP4 0.0.0.0\r\n" &
Harald Welte2871d0b2017-09-14 22:42:12 +0800109 "s=-\r\n" &
Harald Welte00a067f2017-09-13 23:27:17 +0200110 "c=IN IP4 0.0.0.0\r\n" &
111 "t=0 0\r\n" &
112 "m=audio 4441 RTP/AVP 99\r\n" &
113 "a=rtpmap:99 AMR/8000\r\n" &
114 "a=ptime:40\r\n";
Harald Welte3c6ebb92017-09-16 00:56:57 +0800115 const charstring c_crcx510_ret := "510 23 FAIL\r\n"
Harald Welte00a067f2017-09-13 23:27:17 +0200116
117 log(c_auep);
118 log(dec_MgcpCommand(c_auep));
119
120 log(c_mdcx3);
121 log(dec_MgcpCommand(c_mdcx3));
122
123 log(c_mdcx3_ret);
124 log(dec_MgcpResponse(c_mdcx3_ret));
125
126 log(c_mdcx4);
127 log(dec_MgcpCommand(c_mdcx4));
Harald Welte3c6ebb92017-09-16 00:56:57 +0800128
129 log(ts_CRCX("23", "42@mgw", "sendrecv", '1234'H));
130 log(enc_MgcpCommand(valueof(ts_CRCX("23", "42@mgw", "sendrecv", '1234'H))));
131
132 log(c_crcx510_ret);
133 log(dec_MgcpResponse(c_crcx510_ret));
134 log(dec_MgcpMessage(c_crcx510_ret));
135 }
136
137 testcase TC_crcx() runs on dummy_CT {
138 var MGCP_RecvFrom mrf;
139 timer T := 5.0;
140
141 f_init();
142
143 var MgcpMessage msg := { command := valueof(ts_CRCX("23", "42@mgw", "sendrecv", '1234'H)) };
144 MGCP.send(t_MGCP_Send(g_conn_id, msg));
145 T.start;
146 alt {
147 [] MGCP.receive(MGCP_RecvFrom:?) -> value mrf { log(mrf); }
148 [] MGCP.receive { repeat; }
149 [] T.timeout { setverdict(fail); }
150 }
151 T.stop;
Harald Welte00a067f2017-09-13 23:27:17 +0200152 }
153
154 control {
155 execute(TC_selftest());
Harald Welte3c6ebb92017-09-16 00:56:57 +0800156 execute(TC_crcx());
Harald Welte00a067f2017-09-13 23:27:17 +0200157 }
158}