blob: f49f1256fef09103d3d473c67126eb1305617c44 [file] [log] [blame]
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001/* $Id$ */
2/*
3 * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include "test.h"
20#include <pjsip_core.h>
21#include <pjlib.h>
22
Benny Prijono3818c932005-11-22 01:06:33 +000023#define POOL_SIZE 8000
24#define LOOP 10000
25#define AVERAGE_MSG_LEN 800
Benny Prijono85598d92006-01-07 18:44:25 +000026#define THIS_FILE "msg_test.c"
Benny Prijono3818c932005-11-22 01:06:33 +000027
Benny Prijono5dcb38d2005-11-21 01:55:47 +000028static pjsip_msg *create_msg0(pj_pool_t *pool);
Benny Prijono3818c932005-11-22 01:06:33 +000029static pjsip_msg *create_msg1(pj_pool_t *pool);
30
31#define STATUS_PARTIAL 1
32#define STATUS_SYNTAX_ERROR 2
33
34#define FLAG_DETECT_ONLY 1
35#define FLAG_PARSE_ONLY 4
36#define FLAG_PRINT_ONLY 8
37
Benny Prijonocec5f4a2005-11-22 23:51:50 +000038static int flag = 0;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000039
40struct test_msg
41{
42 char msg[1024];
43 pjsip_msg *(*creator)(pj_pool_t *pool);
44 pj_size_t len;
Benny Prijono3818c932005-11-22 01:06:33 +000045 int expected_status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000046} test_array[] =
47{
Benny Prijono3818c932005-11-22 01:06:33 +000048{
49 /* 'Normal' message with all headers. */
50 "INVITE sip:user@foo SIP/2.0\n"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000051 "From: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r"
Benny Prijono3818c932005-11-22 01:06:33 +000052 "To: Fellow User <sip:user@foo.bar.domain.com>\r\n"
53 "Call-ID: 12345678901234567890@bar\r\n"
54 "Content-Length: 0\r\n"
55 "CSeq: 123456 INVITE\n"
56 "Contact: <sip:joe@bar> ; q=0.5;expires=3600,sip:user@host;q=0.500\r"
57 " ,sip:user2@host2\n"
58 "Content-Type: text/html ; charset=ISO-8859-4\r"
59 "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n"
60 " <sip:server10.biloxi.com;lr>\r"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000061 "Record-Route: <sip:server10.biloxi.com>,\r\n" /* multiple routes+folding*/
Benny Prijono3818c932005-11-22 01:06:33 +000062 " <sip:bigbox3.site3.atlanta.com;lr>\n"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000063 "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n"
64 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n" /* folding. */
Benny Prijono3818c932005-11-22 01:06:33 +000065 " ;received=192.0.2.1\r\n"
66 "Via: SIP/2.0/UDP 10.2.1.1, SIP/2.0/TCP 192.168.1.1\n"
67 "Organization: \r"
68 "Max-Forwards: 70\n"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000069 "X-Header: \r\n" /* empty header */
70 "P-Associated-URI:\r\n" /* empty header without space */
Benny Prijono3818c932005-11-22 01:06:33 +000071 "\r\n",
72 &create_msg0,
73 PJ_SUCCESS
74},
75{
76 /* Typical response message. */
77 "SIP/2.0 200 OK\r\n"
78 "Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
79 "Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
80 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
81 "Route: <sip:proxy.sipprovider.com>\r\n"
82 "Route: <sip:proxy.supersip.com:5060>\r\n"
83 "Max-Forwards: 70\r\n"
84 "To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
85 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
86 "Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
87 "CSeq: 314159 INVITE\r\n"
88 "Contact: <sips:bob@192.0.2.4>\r\n"
89 "Content-Type: application/sdp\r\n"
90 "Content-Length: 150\r\n"
91 "\r\n"
92 "v=0\r\n"
93 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
94 "s=-\r\n"
95 "t=0 0\r\n"
96 "c=IN IP4 pc33.atlanta.com\r\n"
97 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
98 "a=rtpmap:0 PCMU/8000\r\n",
99 &create_msg1,
100 PJ_SUCCESS
101}
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000102};
103
Benny Prijono3818c932005-11-22 01:06:33 +0000104static pj_highprec_t detect_len, parse_len, print_len;
105static pj_timestamp detect_time, parse_time, print_time;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000106
107static pj_status_t test_entry( pj_pool_t *pool, struct test_msg *entry )
108{
109 pjsip_msg *parsed_msg, *ref_msg;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000110 static pjsip_msg *print_msg;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000111 pj_status_t status = PJ_SUCCESS;
112 int len;
113 pj_str_t str1, str2;
114 pjsip_hdr *hdr1, *hdr2;
115 pj_timestamp t1, t2;
Benny Prijono3818c932005-11-22 01:06:33 +0000116 pjsip_parser_err_report err_list;
117 pj_size_t msg_size;
118 char msgbuf1[PJSIP_MAX_PKT_LEN];
119 char msgbuf2[PJSIP_MAX_PKT_LEN];
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000120 enum { BUFLEN = 512 };
Benny Prijono3818c932005-11-22 01:06:33 +0000121
122 entry->len = pj_native_strlen(entry->msg);
123
124 if (flag & FLAG_PARSE_ONLY)
125 goto parse_msg;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000126
127 if (flag & FLAG_PRINT_ONLY) {
128 if (print_msg == NULL)
129 print_msg = entry->creator(pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000130 goto print_msg;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000131 }
Benny Prijono3818c932005-11-22 01:06:33 +0000132
133 /* Detect message. */
134 detect_len = detect_len + entry->len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000135 pj_get_timestamp(&t1);
Benny Prijono3818c932005-11-22 01:06:33 +0000136 status = pjsip_find_msg(entry->msg, entry->len, PJ_FALSE, &msg_size);
137 if (status != PJ_SUCCESS) {
138 if (status!=PJSIP_EPARTIALMSG ||
139 entry->expected_status!=STATUS_PARTIAL)
140 {
141 app_perror(" error: unable to detect message", status);
142 return -5;
143 }
144 }
145 if (msg_size != entry->len) {
Benny Prijono85598d92006-01-07 18:44:25 +0000146 PJ_LOG(3,(THIS_FILE, " error: size mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000147 return -6;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000148 }
149 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000150 pj_sub_timestamp(&t2, &t1);
151 pj_add_timestamp(&detect_time, &t2);
152
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000153 if (flag & FLAG_DETECT_ONLY)
Benny Prijono3818c932005-11-22 01:06:33 +0000154 return PJ_SUCCESS;
155
156 /* Parse message. */
157parse_msg:
158 parse_len = parse_len + entry->len;
159 pj_get_timestamp(&t1);
160 pj_list_init(&err_list);
161 parsed_msg = pjsip_parse_msg(pool, entry->msg, entry->len, &err_list);
162 if (parsed_msg == NULL) {
163 if (entry->expected_status != STATUS_SYNTAX_ERROR) {
164 status = -10;
165 if (err_list.next != &err_list) {
Benny Prijono85598d92006-01-07 18:44:25 +0000166 PJ_LOG(3,(THIS_FILE, " Syntax error in line %d col %d",
Benny Prijono3818c932005-11-22 01:06:33 +0000167 err_list.next->line, err_list.next->col));
168 }
169 goto on_return;
170 }
171 }
172 pj_get_timestamp(&t2);
173 pj_sub_timestamp(&t2, &t1);
174 pj_add_timestamp(&parse_time, &t2);
175
176 if (flag & FLAG_PARSE_ONLY)
177 return PJ_SUCCESS;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000178
179 /* Create reference message. */
180 ref_msg = entry->creator(pool);
181
182 /* Create buffer for comparison. */
183 str1.ptr = pj_pool_alloc(pool, BUFLEN);
184 str2.ptr = pj_pool_alloc(pool, BUFLEN);
185
186 /* Compare message type. */
187 if (parsed_msg->type != ref_msg->type) {
188 status = -20;
189 goto on_return;
190 }
191
192 /* Compare request or status line. */
193 if (parsed_msg->type == PJSIP_REQUEST_MSG) {
194 pjsip_method *m1 = &parsed_msg->line.req.method;
195 pjsip_method *m2 = &ref_msg->line.req.method;
196
Benny Prijono3818c932005-11-22 01:06:33 +0000197 if (pjsip_method_cmp(m1, m2) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000198 status = -30;
199 goto on_return;
200 }
Benny Prijono3818c932005-11-22 01:06:33 +0000201 status = pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,
202 parsed_msg->line.req.uri,
203 ref_msg->line.req.uri);
204 if (status != PJ_SUCCESS) {
205 app_perror(" error: request URI mismatch", status);
206 status = -31;
207 goto on_return;
208 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000209 } else {
Benny Prijono3818c932005-11-22 01:06:33 +0000210 if (parsed_msg->line.status.code != ref_msg->line.status.code) {
Benny Prijono85598d92006-01-07 18:44:25 +0000211 PJ_LOG(3,(THIS_FILE, " error: status code mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000212 status = -32;
213 goto on_return;
214 }
215 if (pj_strcmp(&parsed_msg->line.status.reason,
216 &ref_msg->line.status.reason) != 0)
217 {
Benny Prijono85598d92006-01-07 18:44:25 +0000218 PJ_LOG(3,(THIS_FILE, " error: status text mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000219 status = -33;
220 goto on_return;
221 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000222 }
223
224 /* Compare headers. */
225 hdr1 = parsed_msg->hdr.next;
226 hdr2 = ref_msg->hdr.next;
227
228 while (hdr1 != &parsed_msg->hdr && hdr2 != &ref_msg->hdr) {
229 len = hdr1->vptr->print_on(hdr1, str1.ptr, BUFLEN);
230 if (len < 1) {
231 status = -40;
232 goto on_return;
233 }
Benny Prijono3818c932005-11-22 01:06:33 +0000234 str1.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000235 str1.slen = len;
236
237 len = hdr2->vptr->print_on(hdr2, str2.ptr, BUFLEN);
238 if (len < 1) {
239 status = -50;
240 goto on_return;
241 }
Benny Prijono3818c932005-11-22 01:06:33 +0000242 str2.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000243 str2.slen = len;
244
245 if (pj_strcmp(&str1, &str2) != 0) {
246 status = -60;
Benny Prijono85598d92006-01-07 18:44:25 +0000247 PJ_LOG(3,(THIS_FILE, " error: header string mismatch:\n"
Benny Prijono3818c932005-11-22 01:06:33 +0000248 " h1='%s'\n"
249 " h2='%s'\n",
250 str1.ptr, str2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000251 goto on_return;
252 }
253
254 hdr1 = hdr1->next;
255 hdr2 = hdr2->next;
256 }
257
258 if (hdr1 != &parsed_msg->hdr || hdr2 != &ref_msg->hdr) {
259 status = -70;
260 goto on_return;
261 }
262
Benny Prijono3818c932005-11-22 01:06:33 +0000263 /* Compare body? */
264 if (parsed_msg->body==NULL && ref_msg->body==NULL)
265 goto print_msg;
266
267 /* Compare msg body length. */
268 if (parsed_msg->body->len != ref_msg->body->len) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000269 status = -80;
270 goto on_return;
271 }
Benny Prijono3818c932005-11-22 01:06:33 +0000272
273 /* Compare msg body content type. */
274 if (pj_strcmp(&parsed_msg->body->content_type.type,
275 &ref_msg->body->content_type.type) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000276 status = -90;
277 goto on_return;
278 }
Benny Prijono3818c932005-11-22 01:06:33 +0000279 if (pj_strcmp(&parsed_msg->body->content_type.subtype,
280 &ref_msg->body->content_type.subtype) != 0) {
281 status = -100;
282 goto on_return;
283 }
284
285 /* Compare body content. */
286 str1.slen = parsed_msg->body->print_body(parsed_msg->body,
287 msgbuf1, sizeof(msgbuf1));
288 if (str1.slen < 1) {
289 status = -110;
290 goto on_return;
291 }
292 str1.ptr = msgbuf1;
293
294 str2.slen = ref_msg->body->print_body(ref_msg->body,
295 msgbuf2, sizeof(msgbuf2));
296 if (str2.slen < 1) {
297 status = -120;
298 goto on_return;
299 }
300 str2.ptr = msgbuf2;
301
302 if (pj_strcmp(&str1, &str2) != 0) {
303 status = -140;
304 goto on_return;
305 }
306
307 /* Print message. */
308print_msg:
309 print_len = print_len + entry->len;
310 pj_get_timestamp(&t1);
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000311 if (flag && FLAG_PRINT_ONLY)
312 ref_msg = print_msg;
313 len = pjsip_msg_print(ref_msg, msgbuf1, PJSIP_MAX_PKT_LEN);
Benny Prijono3818c932005-11-22 01:06:33 +0000314 if (len < 1) {
315 status = -150;
316 goto on_return;
317 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000318 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000319 pj_sub_timestamp(&t2, &t1);
320 pj_add_timestamp(&print_time, &t2);
321
322
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000323 status = PJ_SUCCESS;
324
325on_return:
326 return status;
327}
328
329
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000330static pjsip_msg *create_msg0(pj_pool_t *pool)
331{
332
333 pjsip_msg *msg;
334 pjsip_name_addr *name_addr;
335 pjsip_url *url;
336 pjsip_fromto_hdr *fromto;
337 pjsip_cid_hdr *cid;
338 pjsip_clen_hdr *clen;
339 pjsip_cseq_hdr *cseq;
340 pjsip_contact_hdr *contact;
341 pjsip_ctype_hdr *ctype;
342 pjsip_routing_hdr *routing;
343 pjsip_via_hdr *via;
344 pjsip_generic_string_hdr *generic;
345 pj_str_t str;
346
347 msg = pjsip_msg_create(pool, PJSIP_REQUEST_MSG);
348
349 /* "INVITE sip:user@foo SIP/2.0\n" */
350 pjsip_method_set(&msg->line.req.method, PJSIP_INVITE_METHOD);
351 url = pjsip_url_create(pool, 0);
352 msg->line.req.uri = (pjsip_uri*)url;
353 pj_strdup2(pool, &url->user, "user");
354 pj_strdup2(pool, &url->host, "foo");
355
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000356 /* "From: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r" */
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000357 fromto = pjsip_from_hdr_create(pool);
358 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000359 pj_strdup2(pool, &fromto->tag, "123457890123456");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000360 name_addr = pjsip_name_addr_create(pool);
361 fromto->uri = (pjsip_uri*)name_addr;
362 pj_strdup2(pool, &name_addr->display, "Hi I'm Joe");
363 url = pjsip_url_create(pool, 0);
364 name_addr->uri = (pjsip_uri*)url;
365 pj_strdup2(pool, &url->user, "joe.user");
366 pj_strdup2(pool, &url->host, "bar.otherdomain.com");
367
368 /* "To: Fellow User <sip:user@foo.bar.domain.com>\r\n" */
369 fromto = pjsip_to_hdr_create(pool);
370 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
371 name_addr = pjsip_name_addr_create(pool);
372 fromto->uri = (pjsip_uri*)name_addr;
373 pj_strdup2(pool, &name_addr->display, "Fellow User");
374 url = pjsip_url_create(pool, 0);
375 name_addr->uri = (pjsip_uri*)url;
376 pj_strdup2(pool, &url->user, "user");
377 pj_strdup2(pool, &url->host, "foo.bar.domain.com");
378
379 /* "Call-ID: 12345678901234567890@bar\r\n" */
380 cid = pjsip_cid_hdr_create(pool);
381 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
382 pj_strdup2(pool, &cid->id, "12345678901234567890@bar");
383
384 /* "Content-Length: 0\r\n" */
385 clen = pjsip_clen_hdr_create(pool);
386 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
387 clen->len = 0;
388
389 /* "CSeq: 123456 INVITE\n" */
390 cseq = pjsip_cseq_hdr_create(pool);
391 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
392 cseq->cseq = 123456;
393 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
394
395 /* "Contact: <sip:joe@bar>;q=0.5;expires=3600*/
396 contact = pjsip_contact_hdr_create(pool);
397 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
398 contact->q1000 = 500;
399 contact->expires = 3600;
400 name_addr = pjsip_name_addr_create(pool);
401 contact->uri = (pjsip_uri*)name_addr;
402 url = pjsip_url_create(pool, 0);
403 name_addr->uri = (pjsip_uri*)url;
404 pj_strdup2(pool, &url->user, "joe");
405 pj_strdup2(pool, &url->host, "bar");
406
407 /*, sip:user@host;q=0.500\r" */
408 contact = pjsip_contact_hdr_create(pool);
409 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
410 contact->q1000 = 500;
Benny Prijono3818c932005-11-22 01:06:33 +0000411 name_addr = pjsip_name_addr_create(pool);
412 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000413 url = pjsip_url_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000414 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000415 pj_strdup2(pool, &url->user, "user");
416 pj_strdup2(pool, &url->host, "host");
417
418 /* " ,sip:user2@host2\n" */
419 contact = pjsip_contact_hdr_create(pool);
420 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
Benny Prijono3818c932005-11-22 01:06:33 +0000421 name_addr = pjsip_name_addr_create(pool);
422 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000423 url = pjsip_url_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000424 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000425 pj_strdup2(pool, &url->user, "user2");
426 pj_strdup2(pool, &url->host, "host2");
427
428 /* "Content-Type: text/html; charset=ISO-8859-4\r" */
429 ctype = pjsip_ctype_hdr_create(pool);
430 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
431 pj_strdup2(pool, &ctype->media.type, "text");
432 pj_strdup2(pool, &ctype->media.subtype, "html");
433 pj_strdup2(pool, &ctype->media.param, ";charset=ISO-8859-4");
434
435 /* "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n" */
436 routing = pjsip_route_hdr_create(pool);
437 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
438 url = pjsip_url_create(pool, 0);
439 routing->name_addr.uri = (pjsip_uri*)url;
440 pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
441 url->lr_param = 1;
442
443 /* " <sip:server10.biloxi.com;lr>\r" */
444 routing = pjsip_route_hdr_create(pool);
445 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
446 url = pjsip_url_create(pool, 0);
447 routing->name_addr.uri = (pjsip_uri*)url;
448 pj_strdup2(pool, &url->host, "server10.biloxi.com");
449 url->lr_param = 1;
450
451 /* "Record-Route: <sip:server10.biloxi.com>,\r\n" */
452 routing = pjsip_rr_hdr_create(pool);
453 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
454 url = pjsip_url_create(pool, 0);
455 routing->name_addr.uri = (pjsip_uri*)url;
456 pj_strdup2(pool, &url->host, "server10.biloxi.com");
457 url->lr_param = 0;
458
459 /* " <sip:bigbox3.site3.atlanta.com;lr>\n" */
460 routing = pjsip_rr_hdr_create(pool);
461 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
462 url = pjsip_url_create(pool, 0);
463 routing->name_addr.uri = (pjsip_uri*)url;
464 pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
465 url->lr_param = 1;
466
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000467 /* "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n" */
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000468 via = pjsip_via_hdr_create(pool);
469 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
470 pj_strdup2(pool, &via->transport, "SCTP");
471 pj_strdup2(pool, &via->sent_by.host, "bigbox3.site3.atlanta.com");
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000472 pj_strdup2(pool, &via->branch_param, "z9hG4bK77ef4c230");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000473
474 /* "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n"
475 " ;received=192.0.2.1\r\n" */
476 via = pjsip_via_hdr_create(pool);
477 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
478 pj_strdup2(pool, &via->transport, "UDP");
479 pj_strdup2(pool, &via->sent_by.host, "pc33.atlanta.com");
480 pj_strdup2(pool, &via->branch_param, "z9hG4bKnashds8");
481 pj_strdup2(pool, &via->recvd_param, "192.0.2.1");
482
483
484 /* "Via: SIP/2.0/UDP 10.2.1.1, */
485 via = pjsip_via_hdr_create(pool);
486 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
487 pj_strdup2(pool, &via->transport, "UDP");
488 pj_strdup2(pool, &via->sent_by.host, "10.2.1.1");
489
490
491 /*SIP/2.0/TCP 192.168.1.1\n" */
492 via = pjsip_via_hdr_create(pool);
493 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
494 pj_strdup2(pool, &via->transport, "TCP");
495 pj_strdup2(pool, &via->sent_by.host, "192.168.1.1");
496
497 /* "Organization: \r" */
498 str.ptr = "Organization";
499 str.slen = 12;
500 generic = pjsip_generic_string_hdr_create(pool, &str);
501 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
502 generic->hvalue.ptr = NULL;
503 generic->hvalue.slen = 0;
504
505 /* "Max-Forwards: 70\n" */
506 str.ptr = "Max-Forwards";
507 str.slen = 12;
508 generic = pjsip_generic_string_hdr_create(pool, &str);
509 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
510 str.ptr = "70";
511 str.slen = 2;
512 generic->hvalue = str;
513
514 /* "X-Header: \r\n" */
515 str.ptr = "X-Header";
516 str.slen = 8;
517 generic = pjsip_generic_string_hdr_create(pool, &str);
518 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
519 str.ptr = NULL;
520 str.slen = 0;
521 generic->hvalue = str;
522
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000523 /* P-Associated-URI:\r\n */
524 str.ptr = "P-Associated-URI";
525 str.slen = 16;
526 generic = pjsip_generic_string_hdr_create(pool, &str);
527 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
528 str.ptr = NULL;
529 str.slen = 0;
530 generic->hvalue = str;
531
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000532 return msg;
533}
Benny Prijono3818c932005-11-22 01:06:33 +0000534
535static pjsip_msg *create_msg1(pj_pool_t *pool)
536{
537 pjsip_via_hdr *via;
538 pjsip_route_hdr *route;
539 pjsip_name_addr *name_addr;
540 pjsip_url *url;
541 pjsip_max_forwards_hdr *max_fwd;
542 pjsip_to_hdr *to;
543 pjsip_from_hdr *from;
544 pjsip_contact_hdr *contact;
545 pjsip_ctype_hdr *ctype;
546 pjsip_cid_hdr *cid;
547 pjsip_clen_hdr *clen;
548 pjsip_cseq_hdr *cseq;
549 pjsip_msg *msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG);
550 pjsip_msg_body *body;
551
552 //"SIP/2.0 200 OK\r\n"
553 msg->line.status.code = 200;
554 msg->line.status.reason = pj_str("OK");
555
556 //"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
557 via = pjsip_via_hdr_create(pool);
558 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
559 via->transport = pj_str("SCTP");
560 via->sent_by.host = pj_str("server10.biloxi.com");
561 via->branch_param = pj_str("z9hG4bKnashds8");
562 via->rport_param = 0;
563 via->recvd_param = pj_str("192.0.2.1");
564
565 //"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
566 via = pjsip_via_hdr_create(pool);
567 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
568 via->transport = pj_str("UDP");
569 via->sent_by.host = pj_str("bigbox3.site3.atlanta.com");
570 via->branch_param = pj_str("z9hG4bK77ef4c2312983.1");
571 via->recvd_param = pj_str("192.0.2.2");
572
573 //"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
574 via = pjsip_via_hdr_create(pool);
575 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
576 via->transport = pj_str("UDP");
577 via->sent_by.host = pj_str("pc33.atlanta.com");
578 via->branch_param = pj_str("z9hG4bK776asdhds");
579 via->recvd_param = pj_str("192.0.2.3");
580
581 //"Route: <sip:proxy.sipprovider.com>\r\n"
582 route = pjsip_route_hdr_create(pool);
583 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
584 url = pjsip_url_create(pool, PJ_FALSE);
585 route->name_addr.uri = (pjsip_uri*)url;
586 url->host = pj_str("proxy.sipprovider.com");
587
588 //"Route: <sip:proxy.supersip.com:5060>\r\n"
589 route = pjsip_route_hdr_create(pool);
590 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
591 url = pjsip_url_create(pool, PJ_FALSE);
592 route->name_addr.uri = (pjsip_uri*)url;
593 url->host = pj_str("proxy.supersip.com");
594 url->port = 5060;
595
596 //"Max-Forwards: 70\r\n"
597 max_fwd = pjsip_max_forwards_hdr_create(pool);
598 pjsip_msg_add_hdr(msg, (pjsip_hdr*)max_fwd);
599 max_fwd->ivalue = 70;
600
601 //"To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
602 to = pjsip_to_hdr_create(pool);
603 pjsip_msg_add_hdr(msg, (pjsip_hdr*)to);
604 name_addr = pjsip_name_addr_create(pool);
605 name_addr->display = pj_str("Bob");
606 to->uri = (pjsip_uri*)name_addr;
607 url = pjsip_url_create(pool, PJ_FALSE);
608 name_addr->uri = (pjsip_uri*)url;
609 url->user = pj_str("bob");
610 url->host = pj_str("biloxi.com");
611 to->tag = pj_str("a6c85cf");
612
613 //"From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
614 from = pjsip_from_hdr_create(pool);
615 pjsip_msg_add_hdr(msg, (pjsip_hdr*)from);
616 name_addr = pjsip_name_addr_create(pool);
617 name_addr->display = pj_str("Alice");
618 from->uri = (pjsip_uri*)name_addr;
619 url = pjsip_url_create(pool, PJ_FALSE);
620 name_addr->uri = (pjsip_uri*)url;
621 url->user = pj_str("alice");
622 url->host = pj_str("atlanta.com");
623 from->tag = pj_str("1928301774");
624
625 //"Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
626 cid = pjsip_cid_hdr_create(pool);
627 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
628 cid->id = pj_str("a84b4c76e66710@pc33.atlanta.com");
629
630 //"CSeq: 314159 INVITE\r\n"
631 cseq = pjsip_cseq_hdr_create(pool);
632 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
633 cseq->cseq = 314159;
634 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
635
636 //"Contact: <sips:bob@192.0.2.4>\r\n"
637 contact = pjsip_contact_hdr_create(pool);
638 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
639 name_addr = pjsip_name_addr_create(pool);
640 contact->uri = (pjsip_uri*)name_addr;
641 url = pjsip_url_create(pool, PJ_TRUE);
642 name_addr->uri = (pjsip_uri*)url;
643 url->user = pj_str("bob");
644 url->host = pj_str("192.0.2.4");
645
646 //"Content-Type: application/sdp\r\n"
647 ctype = pjsip_ctype_hdr_create(pool);
648 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
649 ctype->media.type = pj_str("application");
650 ctype->media.subtype = pj_str("sdp");
651
652 //"Content-Length: 150\r\n"
653 clen = pjsip_clen_hdr_create(pool);
654 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
655 clen->len = 150;
656
657 // Body
658 body = pj_pool_zalloc(pool, sizeof(*body));
659 msg->body = body;
660 body->content_type.type = pj_str("application");
661 body->content_type.subtype = pj_str("sdp");
662 body->data =
663 "v=0\r\n"
664 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
665 "s=-\r\n"
666 "t=0 0\r\n"
667 "c=IN IP4 pc33.atlanta.com\r\n"
668 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
669 "a=rtpmap:0 PCMU/8000\r\n";
670 body->len = pj_native_strlen(body->data);
671 body->print_body = &pjsip_print_text_body;
672
673 return msg;
674}
675
676/*****************************************************************************/
677
Benny Prijono0ca04b62005-12-30 23:50:15 +0000678int msg_test(void)
Benny Prijono3818c932005-11-22 01:06:33 +0000679{
680 pj_status_t status;
681 pj_pool_t *pool;
682 int i, loop;
683 pj_timestamp zero;
684 pj_time_val elapsed;
685 pj_highprec_t avg_detect, avg_parse, avg_print, kbytes;
686
Benny Prijono85598d92006-01-07 18:44:25 +0000687 PJ_LOG(3,(THIS_FILE, " simple test.."));
Benny Prijono3818c932005-11-22 01:06:33 +0000688 for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
689 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
690 status = test_entry( pool, &test_array[i] );
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000691 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000692
693 if (status != PJ_SUCCESS)
694 return status;
695 }
696
Benny Prijono85598d92006-01-07 18:44:25 +0000697 PJ_LOG(3,(THIS_FILE, " benchmarking.."));
Benny Prijono3818c932005-11-22 01:06:33 +0000698 detect_len = parse_len = print_len = 0;
699 zero.u64 = detect_time.u64 = parse_time.u64 = print_time.u64 = 0;
700
701 for (loop=0; loop<LOOP; ++loop) {
702 for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
703 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
704 status = test_entry( pool, &test_array[i] );
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000705 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000706
707 if (status != PJ_SUCCESS)
708 return status;
709 }
710 }
711
712 kbytes = detect_len;
713 pj_highprec_mod(kbytes, 1000000);
714 pj_highprec_div(kbytes, 100000);
715 elapsed = pj_elapsed_time(&zero, &detect_time);
716 avg_detect = pj_elapsed_usec(&zero, &detect_time);
717 pj_highprec_mul(avg_detect, AVERAGE_MSG_LEN);
718 pj_highprec_div(avg_detect, detect_len);
719 avg_detect = 1000000 / avg_detect;
720
Benny Prijono85598d92006-01-07 18:44:25 +0000721 PJ_LOG(3,(THIS_FILE,
722 " %u.%u MB detected in %d.%03ds (avg=%d msg detection/sec)",
723 (unsigned)(detect_len/1000000), (unsigned)kbytes,
724 elapsed.sec, elapsed.msec,
725 (unsigned)avg_detect));
Benny Prijono3818c932005-11-22 01:06:33 +0000726
727 kbytes = parse_len;
728 pj_highprec_mod(kbytes, 1000000);
729 pj_highprec_div(kbytes, 100000);
730 elapsed = pj_elapsed_time(&zero, &parse_time);
731 avg_parse = pj_elapsed_usec(&zero, &parse_time);
732 pj_highprec_mul(avg_parse, AVERAGE_MSG_LEN);
733 pj_highprec_div(avg_parse, parse_len);
734 avg_parse = 1000000 / avg_parse;
735
Benny Prijono85598d92006-01-07 18:44:25 +0000736 PJ_LOG(3,(THIS_FILE,
737 " %u.%u MB parsed in %d.%03ds (avg=%d msg parsing/sec)",
738 (unsigned)(parse_len/1000000), (unsigned)kbytes,
739 elapsed.sec, elapsed.msec,
740 (unsigned)avg_parse));
Benny Prijono3818c932005-11-22 01:06:33 +0000741
742 kbytes = print_len;
743 pj_highprec_mod(kbytes, 1000000);
744 pj_highprec_div(kbytes, 100000);
745 elapsed = pj_elapsed_time(&zero, &print_time);
746 avg_print = pj_elapsed_usec(&zero, &print_time);
747 pj_highprec_mul(avg_print, AVERAGE_MSG_LEN);
748 pj_highprec_div(avg_print, print_len);
749 avg_print = 1000000 / avg_print;
750
Benny Prijono85598d92006-01-07 18:44:25 +0000751 PJ_LOG(3,(THIS_FILE,
752 " %u.%u MB printed in %d.%03ds (avg=%d msg print/sec)",
753 (unsigned)(print_len/1000000), (unsigned)kbytes,
754 elapsed.sec, elapsed.msec,
755 (unsigned)avg_print));
Benny Prijono3818c932005-11-22 01:06:33 +0000756
757 return status;
758}
759
760/*****************************************************************************/