blob: bfa253bde2fe91248c416e6a1c3a89539110bbb5 [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
26
Benny Prijono5dcb38d2005-11-21 01:55:47 +000027static pjsip_msg *create_msg0(pj_pool_t *pool);
Benny Prijono3818c932005-11-22 01:06:33 +000028static pjsip_msg *create_msg1(pj_pool_t *pool);
29
30#define STATUS_PARTIAL 1
31#define STATUS_SYNTAX_ERROR 2
32
33#define FLAG_DETECT_ONLY 1
34#define FLAG_PARSE_ONLY 4
35#define FLAG_PRINT_ONLY 8
36
37static int flag = FLAG_PARSE_ONLY;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000038
39struct test_msg
40{
41 char msg[1024];
42 pjsip_msg *(*creator)(pj_pool_t *pool);
43 pj_size_t len;
Benny Prijono3818c932005-11-22 01:06:33 +000044 int expected_status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000045} test_array[] =
46{
Benny Prijono3818c932005-11-22 01:06:33 +000047{
48 /* 'Normal' message with all headers. */
49 "INVITE sip:user@foo SIP/2.0\n"
50 "From: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=1234578901234567890\r"
51 "To: Fellow User <sip:user@foo.bar.domain.com>\r\n"
52 "Call-ID: 12345678901234567890@bar\r\n"
53 "Content-Length: 0\r\n"
54 "CSeq: 123456 INVITE\n"
55 "Contact: <sip:joe@bar> ; q=0.5;expires=3600,sip:user@host;q=0.500\r"
56 " ,sip:user2@host2\n"
57 "Content-Type: text/html ; charset=ISO-8859-4\r"
58 "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n"
59 " <sip:server10.biloxi.com;lr>\r"
60 "Record-Route: <sip:server10.biloxi.com>,\r\n"
61 " <sip:bigbox3.site3.atlanta.com;lr>\n"
62 "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1\n"
63 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n"
64 " ;received=192.0.2.1\r\n"
65 "Via: SIP/2.0/UDP 10.2.1.1, SIP/2.0/TCP 192.168.1.1\n"
66 "Organization: \r"
67 "Max-Forwards: 70\n"
68 "X-Header: \r\n"
69 "\r\n",
70 &create_msg0,
71 PJ_SUCCESS
72},
73{
74 /* Typical response message. */
75 "SIP/2.0 200 OK\r\n"
76 "Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
77 "Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
78 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
79 "Route: <sip:proxy.sipprovider.com>\r\n"
80 "Route: <sip:proxy.supersip.com:5060>\r\n"
81 "Max-Forwards: 70\r\n"
82 "To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
83 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
84 "Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
85 "CSeq: 314159 INVITE\r\n"
86 "Contact: <sips:bob@192.0.2.4>\r\n"
87 "Content-Type: application/sdp\r\n"
88 "Content-Length: 150\r\n"
89 "\r\n"
90 "v=0\r\n"
91 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
92 "s=-\r\n"
93 "t=0 0\r\n"
94 "c=IN IP4 pc33.atlanta.com\r\n"
95 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
96 "a=rtpmap:0 PCMU/8000\r\n",
97 &create_msg1,
98 PJ_SUCCESS
99}
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000100};
101
Benny Prijono3818c932005-11-22 01:06:33 +0000102static pj_highprec_t detect_len, parse_len, print_len;
103static pj_timestamp detect_time, parse_time, print_time;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000104
105static pj_status_t test_entry( pj_pool_t *pool, struct test_msg *entry )
106{
107 pjsip_msg *parsed_msg, *ref_msg;
108 pj_status_t status = PJ_SUCCESS;
109 int len;
110 pj_str_t str1, str2;
111 pjsip_hdr *hdr1, *hdr2;
112 pj_timestamp t1, t2;
Benny Prijono3818c932005-11-22 01:06:33 +0000113 pjsip_parser_err_report err_list;
114 pj_size_t msg_size;
115 char msgbuf1[PJSIP_MAX_PKT_LEN];
116 char msgbuf2[PJSIP_MAX_PKT_LEN];
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000117
118 enum { BUFLEN = 512 };
Benny Prijono3818c932005-11-22 01:06:33 +0000119
120 entry->len = pj_native_strlen(entry->msg);
121
122 if (flag & FLAG_PARSE_ONLY)
123 goto parse_msg;
124 if (flag & FLAG_PRINT_ONLY)
125 goto print_msg;
126
127 /* Detect message. */
128 detect_len = detect_len + entry->len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000129 pj_get_timestamp(&t1);
Benny Prijono3818c932005-11-22 01:06:33 +0000130 status = pjsip_find_msg(entry->msg, entry->len, PJ_FALSE, &msg_size);
131 if (status != PJ_SUCCESS) {
132 if (status!=PJSIP_EPARTIALMSG ||
133 entry->expected_status!=STATUS_PARTIAL)
134 {
135 app_perror(" error: unable to detect message", status);
136 return -5;
137 }
138 }
139 if (msg_size != entry->len) {
140 PJ_LOG(3,("", " error: size mismatch"));
141 return -6;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000142 }
143 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000144 pj_sub_timestamp(&t2, &t1);
145 pj_add_timestamp(&detect_time, &t2);
146
147 if (flag & FLAG_PARSE_ONLY)
148 return PJ_SUCCESS;
149
150 /* Parse message. */
151parse_msg:
152 parse_len = parse_len + entry->len;
153 pj_get_timestamp(&t1);
154 pj_list_init(&err_list);
155 parsed_msg = pjsip_parse_msg(pool, entry->msg, entry->len, &err_list);
156 if (parsed_msg == NULL) {
157 if (entry->expected_status != STATUS_SYNTAX_ERROR) {
158 status = -10;
159 if (err_list.next != &err_list) {
160 PJ_LOG(3,("", " Syntax error in line %d col %d",
161 err_list.next->line, err_list.next->col));
162 }
163 goto on_return;
164 }
165 }
166 pj_get_timestamp(&t2);
167 pj_sub_timestamp(&t2, &t1);
168 pj_add_timestamp(&parse_time, &t2);
169
170 if (flag & FLAG_PARSE_ONLY)
171 return PJ_SUCCESS;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000172
173 /* Create reference message. */
174 ref_msg = entry->creator(pool);
175
176 /* Create buffer for comparison. */
177 str1.ptr = pj_pool_alloc(pool, BUFLEN);
178 str2.ptr = pj_pool_alloc(pool, BUFLEN);
179
180 /* Compare message type. */
181 if (parsed_msg->type != ref_msg->type) {
182 status = -20;
183 goto on_return;
184 }
185
186 /* Compare request or status line. */
187 if (parsed_msg->type == PJSIP_REQUEST_MSG) {
188 pjsip_method *m1 = &parsed_msg->line.req.method;
189 pjsip_method *m2 = &ref_msg->line.req.method;
190
Benny Prijono3818c932005-11-22 01:06:33 +0000191 if (pjsip_method_cmp(m1, m2) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000192 status = -30;
193 goto on_return;
194 }
Benny Prijono3818c932005-11-22 01:06:33 +0000195 status = pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,
196 parsed_msg->line.req.uri,
197 ref_msg->line.req.uri);
198 if (status != PJ_SUCCESS) {
199 app_perror(" error: request URI mismatch", status);
200 status = -31;
201 goto on_return;
202 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000203 } else {
Benny Prijono3818c932005-11-22 01:06:33 +0000204 if (parsed_msg->line.status.code != ref_msg->line.status.code) {
205 PJ_LOG(3,("", " error: status code mismatch"));
206 status = -32;
207 goto on_return;
208 }
209 if (pj_strcmp(&parsed_msg->line.status.reason,
210 &ref_msg->line.status.reason) != 0)
211 {
212 PJ_LOG(3,("", " error: status text mismatch"));
213 status = -33;
214 goto on_return;
215 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000216 }
217
218 /* Compare headers. */
219 hdr1 = parsed_msg->hdr.next;
220 hdr2 = ref_msg->hdr.next;
221
222 while (hdr1 != &parsed_msg->hdr && hdr2 != &ref_msg->hdr) {
223 len = hdr1->vptr->print_on(hdr1, str1.ptr, BUFLEN);
224 if (len < 1) {
225 status = -40;
226 goto on_return;
227 }
Benny Prijono3818c932005-11-22 01:06:33 +0000228 str1.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000229 str1.slen = len;
230
231 len = hdr2->vptr->print_on(hdr2, str2.ptr, BUFLEN);
232 if (len < 1) {
233 status = -50;
234 goto on_return;
235 }
Benny Prijono3818c932005-11-22 01:06:33 +0000236 str2.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000237 str2.slen = len;
238
239 if (pj_strcmp(&str1, &str2) != 0) {
240 status = -60;
Benny Prijono3818c932005-11-22 01:06:33 +0000241 PJ_LOG(3,("", " error: header string mismatch:\n"
242 " h1='%s'\n"
243 " h2='%s'\n",
244 str1.ptr, str2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000245 goto on_return;
246 }
247
248 hdr1 = hdr1->next;
249 hdr2 = hdr2->next;
250 }
251
252 if (hdr1 != &parsed_msg->hdr || hdr2 != &ref_msg->hdr) {
253 status = -70;
254 goto on_return;
255 }
256
Benny Prijono3818c932005-11-22 01:06:33 +0000257 /* Compare body? */
258 if (parsed_msg->body==NULL && ref_msg->body==NULL)
259 goto print_msg;
260
261 /* Compare msg body length. */
262 if (parsed_msg->body->len != ref_msg->body->len) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000263 status = -80;
264 goto on_return;
265 }
Benny Prijono3818c932005-11-22 01:06:33 +0000266
267 /* Compare msg body content type. */
268 if (pj_strcmp(&parsed_msg->body->content_type.type,
269 &ref_msg->body->content_type.type) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000270 status = -90;
271 goto on_return;
272 }
Benny Prijono3818c932005-11-22 01:06:33 +0000273 if (pj_strcmp(&parsed_msg->body->content_type.subtype,
274 &ref_msg->body->content_type.subtype) != 0) {
275 status = -100;
276 goto on_return;
277 }
278
279 /* Compare body content. */
280 str1.slen = parsed_msg->body->print_body(parsed_msg->body,
281 msgbuf1, sizeof(msgbuf1));
282 if (str1.slen < 1) {
283 status = -110;
284 goto on_return;
285 }
286 str1.ptr = msgbuf1;
287
288 str2.slen = ref_msg->body->print_body(ref_msg->body,
289 msgbuf2, sizeof(msgbuf2));
290 if (str2.slen < 1) {
291 status = -120;
292 goto on_return;
293 }
294 str2.ptr = msgbuf2;
295
296 if (pj_strcmp(&str1, &str2) != 0) {
297 status = -140;
298 goto on_return;
299 }
300
301 /* Print message. */
302print_msg:
303 print_len = print_len + entry->len;
304 pj_get_timestamp(&t1);
305 len = pjsip_msg_print(parsed_msg, msgbuf1, PJSIP_MAX_PKT_LEN);
306 if (len < 1) {
307 status = -150;
308 goto on_return;
309 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000310 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000311 pj_sub_timestamp(&t2, &t1);
312 pj_add_timestamp(&print_time, &t2);
313
314
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000315 status = PJ_SUCCESS;
316
317on_return:
318 return status;
319}
320
321
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000322static pjsip_msg *create_msg0(pj_pool_t *pool)
323{
324
325 pjsip_msg *msg;
326 pjsip_name_addr *name_addr;
327 pjsip_url *url;
328 pjsip_fromto_hdr *fromto;
329 pjsip_cid_hdr *cid;
330 pjsip_clen_hdr *clen;
331 pjsip_cseq_hdr *cseq;
332 pjsip_contact_hdr *contact;
333 pjsip_ctype_hdr *ctype;
334 pjsip_routing_hdr *routing;
335 pjsip_via_hdr *via;
336 pjsip_generic_string_hdr *generic;
337 pj_str_t str;
338
339 msg = pjsip_msg_create(pool, PJSIP_REQUEST_MSG);
340
341 /* "INVITE sip:user@foo SIP/2.0\n" */
342 pjsip_method_set(&msg->line.req.method, PJSIP_INVITE_METHOD);
343 url = pjsip_url_create(pool, 0);
344 msg->line.req.uri = (pjsip_uri*)url;
345 pj_strdup2(pool, &url->user, "user");
346 pj_strdup2(pool, &url->host, "foo");
347
348 /* "From: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=1234578901234567890\r" */
349 fromto = pjsip_from_hdr_create(pool);
350 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
351 pj_strdup2(pool, &fromto->tag, "1234578901234567890");
352 name_addr = pjsip_name_addr_create(pool);
353 fromto->uri = (pjsip_uri*)name_addr;
354 pj_strdup2(pool, &name_addr->display, "Hi I'm Joe");
355 url = pjsip_url_create(pool, 0);
356 name_addr->uri = (pjsip_uri*)url;
357 pj_strdup2(pool, &url->user, "joe.user");
358 pj_strdup2(pool, &url->host, "bar.otherdomain.com");
359
360 /* "To: Fellow User <sip:user@foo.bar.domain.com>\r\n" */
361 fromto = pjsip_to_hdr_create(pool);
362 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
363 name_addr = pjsip_name_addr_create(pool);
364 fromto->uri = (pjsip_uri*)name_addr;
365 pj_strdup2(pool, &name_addr->display, "Fellow User");
366 url = pjsip_url_create(pool, 0);
367 name_addr->uri = (pjsip_uri*)url;
368 pj_strdup2(pool, &url->user, "user");
369 pj_strdup2(pool, &url->host, "foo.bar.domain.com");
370
371 /* "Call-ID: 12345678901234567890@bar\r\n" */
372 cid = pjsip_cid_hdr_create(pool);
373 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
374 pj_strdup2(pool, &cid->id, "12345678901234567890@bar");
375
376 /* "Content-Length: 0\r\n" */
377 clen = pjsip_clen_hdr_create(pool);
378 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
379 clen->len = 0;
380
381 /* "CSeq: 123456 INVITE\n" */
382 cseq = pjsip_cseq_hdr_create(pool);
383 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
384 cseq->cseq = 123456;
385 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
386
387 /* "Contact: <sip:joe@bar>;q=0.5;expires=3600*/
388 contact = pjsip_contact_hdr_create(pool);
389 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
390 contact->q1000 = 500;
391 contact->expires = 3600;
392 name_addr = pjsip_name_addr_create(pool);
393 contact->uri = (pjsip_uri*)name_addr;
394 url = pjsip_url_create(pool, 0);
395 name_addr->uri = (pjsip_uri*)url;
396 pj_strdup2(pool, &url->user, "joe");
397 pj_strdup2(pool, &url->host, "bar");
398
399 /*, sip:user@host;q=0.500\r" */
400 contact = pjsip_contact_hdr_create(pool);
401 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
402 contact->q1000 = 500;
Benny Prijono3818c932005-11-22 01:06:33 +0000403 name_addr = pjsip_name_addr_create(pool);
404 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000405 url = pjsip_url_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000406 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000407 pj_strdup2(pool, &url->user, "user");
408 pj_strdup2(pool, &url->host, "host");
409
410 /* " ,sip:user2@host2\n" */
411 contact = pjsip_contact_hdr_create(pool);
412 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
Benny Prijono3818c932005-11-22 01:06:33 +0000413 name_addr = pjsip_name_addr_create(pool);
414 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000415 url = pjsip_url_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000416 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000417 pj_strdup2(pool, &url->user, "user2");
418 pj_strdup2(pool, &url->host, "host2");
419
420 /* "Content-Type: text/html; charset=ISO-8859-4\r" */
421 ctype = pjsip_ctype_hdr_create(pool);
422 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
423 pj_strdup2(pool, &ctype->media.type, "text");
424 pj_strdup2(pool, &ctype->media.subtype, "html");
425 pj_strdup2(pool, &ctype->media.param, ";charset=ISO-8859-4");
426
427 /* "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n" */
428 routing = pjsip_route_hdr_create(pool);
429 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
430 url = pjsip_url_create(pool, 0);
431 routing->name_addr.uri = (pjsip_uri*)url;
432 pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
433 url->lr_param = 1;
434
435 /* " <sip:server10.biloxi.com;lr>\r" */
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, "server10.biloxi.com");
441 url->lr_param = 1;
442
443 /* "Record-Route: <sip:server10.biloxi.com>,\r\n" */
444 routing = pjsip_rr_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 = 0;
450
451 /* " <sip:bigbox3.site3.atlanta.com;lr>\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, "bigbox3.site3.atlanta.com");
457 url->lr_param = 1;
458
459 /* "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1\n" */
460 via = pjsip_via_hdr_create(pool);
461 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
462 pj_strdup2(pool, &via->transport, "SCTP");
463 pj_strdup2(pool, &via->sent_by.host, "bigbox3.site3.atlanta.com");
464 pj_strdup2(pool, &via->branch_param, "z9hG4bK77ef4c2312983.1");
465
466 /* "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n"
467 " ;received=192.0.2.1\r\n" */
468 via = pjsip_via_hdr_create(pool);
469 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
470 pj_strdup2(pool, &via->transport, "UDP");
471 pj_strdup2(pool, &via->sent_by.host, "pc33.atlanta.com");
472 pj_strdup2(pool, &via->branch_param, "z9hG4bKnashds8");
473 pj_strdup2(pool, &via->recvd_param, "192.0.2.1");
474
475
476 /* "Via: SIP/2.0/UDP 10.2.1.1, */
477 via = pjsip_via_hdr_create(pool);
478 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
479 pj_strdup2(pool, &via->transport, "UDP");
480 pj_strdup2(pool, &via->sent_by.host, "10.2.1.1");
481
482
483 /*SIP/2.0/TCP 192.168.1.1\n" */
484 via = pjsip_via_hdr_create(pool);
485 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
486 pj_strdup2(pool, &via->transport, "TCP");
487 pj_strdup2(pool, &via->sent_by.host, "192.168.1.1");
488
489 /* "Organization: \r" */
490 str.ptr = "Organization";
491 str.slen = 12;
492 generic = pjsip_generic_string_hdr_create(pool, &str);
493 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
494 generic->hvalue.ptr = NULL;
495 generic->hvalue.slen = 0;
496
497 /* "Max-Forwards: 70\n" */
498 str.ptr = "Max-Forwards";
499 str.slen = 12;
500 generic = pjsip_generic_string_hdr_create(pool, &str);
501 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
502 str.ptr = "70";
503 str.slen = 2;
504 generic->hvalue = str;
505
506 /* "X-Header: \r\n" */
507 str.ptr = "X-Header";
508 str.slen = 8;
509 generic = pjsip_generic_string_hdr_create(pool, &str);
510 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
511 str.ptr = NULL;
512 str.slen = 0;
513 generic->hvalue = str;
514
515 return msg;
516}
Benny Prijono3818c932005-11-22 01:06:33 +0000517
518static pjsip_msg *create_msg1(pj_pool_t *pool)
519{
520 pjsip_via_hdr *via;
521 pjsip_route_hdr *route;
522 pjsip_name_addr *name_addr;
523 pjsip_url *url;
524 pjsip_max_forwards_hdr *max_fwd;
525 pjsip_to_hdr *to;
526 pjsip_from_hdr *from;
527 pjsip_contact_hdr *contact;
528 pjsip_ctype_hdr *ctype;
529 pjsip_cid_hdr *cid;
530 pjsip_clen_hdr *clen;
531 pjsip_cseq_hdr *cseq;
532 pjsip_msg *msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG);
533 pjsip_msg_body *body;
534
535 //"SIP/2.0 200 OK\r\n"
536 msg->line.status.code = 200;
537 msg->line.status.reason = pj_str("OK");
538
539 //"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
540 via = pjsip_via_hdr_create(pool);
541 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
542 via->transport = pj_str("SCTP");
543 via->sent_by.host = pj_str("server10.biloxi.com");
544 via->branch_param = pj_str("z9hG4bKnashds8");
545 via->rport_param = 0;
546 via->recvd_param = pj_str("192.0.2.1");
547
548 //"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
549 via = pjsip_via_hdr_create(pool);
550 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
551 via->transport = pj_str("UDP");
552 via->sent_by.host = pj_str("bigbox3.site3.atlanta.com");
553 via->branch_param = pj_str("z9hG4bK77ef4c2312983.1");
554 via->recvd_param = pj_str("192.0.2.2");
555
556 //"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
557 via = pjsip_via_hdr_create(pool);
558 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
559 via->transport = pj_str("UDP");
560 via->sent_by.host = pj_str("pc33.atlanta.com");
561 via->branch_param = pj_str("z9hG4bK776asdhds");
562 via->recvd_param = pj_str("192.0.2.3");
563
564 //"Route: <sip:proxy.sipprovider.com>\r\n"
565 route = pjsip_route_hdr_create(pool);
566 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
567 url = pjsip_url_create(pool, PJ_FALSE);
568 route->name_addr.uri = (pjsip_uri*)url;
569 url->host = pj_str("proxy.sipprovider.com");
570
571 //"Route: <sip:proxy.supersip.com:5060>\r\n"
572 route = pjsip_route_hdr_create(pool);
573 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
574 url = pjsip_url_create(pool, PJ_FALSE);
575 route->name_addr.uri = (pjsip_uri*)url;
576 url->host = pj_str("proxy.supersip.com");
577 url->port = 5060;
578
579 //"Max-Forwards: 70\r\n"
580 max_fwd = pjsip_max_forwards_hdr_create(pool);
581 pjsip_msg_add_hdr(msg, (pjsip_hdr*)max_fwd);
582 max_fwd->ivalue = 70;
583
584 //"To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
585 to = pjsip_to_hdr_create(pool);
586 pjsip_msg_add_hdr(msg, (pjsip_hdr*)to);
587 name_addr = pjsip_name_addr_create(pool);
588 name_addr->display = pj_str("Bob");
589 to->uri = (pjsip_uri*)name_addr;
590 url = pjsip_url_create(pool, PJ_FALSE);
591 name_addr->uri = (pjsip_uri*)url;
592 url->user = pj_str("bob");
593 url->host = pj_str("biloxi.com");
594 to->tag = pj_str("a6c85cf");
595
596 //"From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
597 from = pjsip_from_hdr_create(pool);
598 pjsip_msg_add_hdr(msg, (pjsip_hdr*)from);
599 name_addr = pjsip_name_addr_create(pool);
600 name_addr->display = pj_str("Alice");
601 from->uri = (pjsip_uri*)name_addr;
602 url = pjsip_url_create(pool, PJ_FALSE);
603 name_addr->uri = (pjsip_uri*)url;
604 url->user = pj_str("alice");
605 url->host = pj_str("atlanta.com");
606 from->tag = pj_str("1928301774");
607
608 //"Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
609 cid = pjsip_cid_hdr_create(pool);
610 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
611 cid->id = pj_str("a84b4c76e66710@pc33.atlanta.com");
612
613 //"CSeq: 314159 INVITE\r\n"
614 cseq = pjsip_cseq_hdr_create(pool);
615 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
616 cseq->cseq = 314159;
617 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
618
619 //"Contact: <sips:bob@192.0.2.4>\r\n"
620 contact = pjsip_contact_hdr_create(pool);
621 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
622 name_addr = pjsip_name_addr_create(pool);
623 contact->uri = (pjsip_uri*)name_addr;
624 url = pjsip_url_create(pool, PJ_TRUE);
625 name_addr->uri = (pjsip_uri*)url;
626 url->user = pj_str("bob");
627 url->host = pj_str("192.0.2.4");
628
629 //"Content-Type: application/sdp\r\n"
630 ctype = pjsip_ctype_hdr_create(pool);
631 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
632 ctype->media.type = pj_str("application");
633 ctype->media.subtype = pj_str("sdp");
634
635 //"Content-Length: 150\r\n"
636 clen = pjsip_clen_hdr_create(pool);
637 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
638 clen->len = 150;
639
640 // Body
641 body = pj_pool_zalloc(pool, sizeof(*body));
642 msg->body = body;
643 body->content_type.type = pj_str("application");
644 body->content_type.subtype = pj_str("sdp");
645 body->data =
646 "v=0\r\n"
647 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
648 "s=-\r\n"
649 "t=0 0\r\n"
650 "c=IN IP4 pc33.atlanta.com\r\n"
651 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
652 "a=rtpmap:0 PCMU/8000\r\n";
653 body->len = pj_native_strlen(body->data);
654 body->print_body = &pjsip_print_text_body;
655
656 return msg;
657}
658
659/*****************************************************************************/
660
661pj_status_t msg_test(void)
662{
663 pj_status_t status;
664 pj_pool_t *pool;
665 int i, loop;
666 pj_timestamp zero;
667 pj_time_val elapsed;
668 pj_highprec_t avg_detect, avg_parse, avg_print, kbytes;
669
670 PJ_LOG(3,("", " simple test.."));
671 for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
672 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
673 status = test_entry( pool, &test_array[i] );
674 pjsip_endpt_destroy_pool(endpt, pool);
675
676 if (status != PJ_SUCCESS)
677 return status;
678 }
679
680 PJ_LOG(3,("", " benchmarking.."));
681 detect_len = parse_len = print_len = 0;
682 zero.u64 = detect_time.u64 = parse_time.u64 = print_time.u64 = 0;
683
684 for (loop=0; loop<LOOP; ++loop) {
685 for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
686 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
687 status = test_entry( pool, &test_array[i] );
688 pjsip_endpt_destroy_pool(endpt, pool);
689
690 if (status != PJ_SUCCESS)
691 return status;
692 }
693 }
694
695 kbytes = detect_len;
696 pj_highprec_mod(kbytes, 1000000);
697 pj_highprec_div(kbytes, 100000);
698 elapsed = pj_elapsed_time(&zero, &detect_time);
699 avg_detect = pj_elapsed_usec(&zero, &detect_time);
700 pj_highprec_mul(avg_detect, AVERAGE_MSG_LEN);
701 pj_highprec_div(avg_detect, detect_len);
702 avg_detect = 1000000 / avg_detect;
703
704 PJ_LOG(3,("", " %u.%u MB detected in %d.%03ds (avg=%d msg detection/sec)",
705 (unsigned)(detect_len/1000000), (unsigned)kbytes,
706 elapsed.sec, elapsed.msec,
707 (unsigned)avg_detect));
708
709 kbytes = parse_len;
710 pj_highprec_mod(kbytes, 1000000);
711 pj_highprec_div(kbytes, 100000);
712 elapsed = pj_elapsed_time(&zero, &parse_time);
713 avg_parse = pj_elapsed_usec(&zero, &parse_time);
714 pj_highprec_mul(avg_parse, AVERAGE_MSG_LEN);
715 pj_highprec_div(avg_parse, parse_len);
716 avg_parse = 1000000 / avg_parse;
717
718 PJ_LOG(3,("", " %u.%u MB parsed in %d.%03ds (avg=%d msg parsing/sec)",
719 (unsigned)(parse_len/1000000), (unsigned)kbytes,
720 elapsed.sec, elapsed.msec,
721 (unsigned)avg_parse));
722
723 kbytes = print_len;
724 pj_highprec_mod(kbytes, 1000000);
725 pj_highprec_div(kbytes, 100000);
726 elapsed = pj_elapsed_time(&zero, &print_time);
727 avg_print = pj_elapsed_usec(&zero, &print_time);
728 pj_highprec_mul(avg_print, AVERAGE_MSG_LEN);
729 pj_highprec_div(avg_print, print_len);
730 avg_print = 1000000 / avg_print;
731
732 PJ_LOG(3,("", " %u.%u MB printed in %d.%03ds (avg=%d msg print/sec)",
733 (unsigned)(print_len/1000000), (unsigned)kbytes,
734 elapsed.sec, elapsed.msec,
735 (unsigned)avg_print));
736
737 return status;
738}
739
740/*****************************************************************************/