blob: 7491a0d7b8f5deffe1a449a2b805cc54b05e4882 [file] [log] [blame]
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001/* $Id$ */
2/*
Benny Prijonoa771a512007-02-19 01:13:53 +00003 * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org>
Benny Prijono5dcb38d2005-11-21 01:55:47 +00004 *
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"
Benny Prijono40f2f642006-01-30 18:40:05 +000020#include <pjsip.h>
Benny Prijono5dcb38d2005-11-21 01:55:47 +000021#include <pjlib.h>
22
Benny Prijono3818c932005-11-22 01:06:33 +000023#define POOL_SIZE 8000
Benny Prijonoe93e2872006-06-28 16:46:49 +000024#if defined(PJ_DEBUG) && PJ_DEBUG!=0
25# define LOOP 10000
26#else
27# define LOOP 100000
28#endif
Benny Prijono3818c932005-11-22 01:06:33 +000029#define AVERAGE_MSG_LEN 800
Benny Prijono85598d92006-01-07 18:44:25 +000030#define THIS_FILE "msg_test.c"
Benny Prijono3818c932005-11-22 01:06:33 +000031
Benny Prijono5dcb38d2005-11-21 01:55:47 +000032static pjsip_msg *create_msg0(pj_pool_t *pool);
Benny Prijono3818c932005-11-22 01:06:33 +000033static pjsip_msg *create_msg1(pj_pool_t *pool);
34
35#define STATUS_PARTIAL 1
36#define STATUS_SYNTAX_ERROR 2
37
38#define FLAG_DETECT_ONLY 1
39#define FLAG_PARSE_ONLY 4
40#define FLAG_PRINT_ONLY 8
41
Benny Prijono5dcb38d2005-11-21 01:55:47 +000042struct test_msg
43{
44 char msg[1024];
45 pjsip_msg *(*creator)(pj_pool_t *pool);
46 pj_size_t len;
Benny Prijono3818c932005-11-22 01:06:33 +000047 int expected_status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000048} test_array[] =
49{
Benny Prijono3818c932005-11-22 01:06:33 +000050{
51 /* 'Normal' message with all headers. */
52 "INVITE sip:user@foo SIP/2.0\n"
Benny Prijonob6eab2c2006-07-03 22:08:47 +000053 "from: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r"
Benny Prijono3818c932005-11-22 01:06:33 +000054 "To: Fellow User <sip:user@foo.bar.domain.com>\r\n"
55 "Call-ID: 12345678901234567890@bar\r\n"
56 "Content-Length: 0\r\n"
57 "CSeq: 123456 INVITE\n"
58 "Contact: <sip:joe@bar> ; q=0.5;expires=3600,sip:user@host;q=0.500\r"
59 " ,sip:user2@host2\n"
60 "Content-Type: text/html ; charset=ISO-8859-4\r"
61 "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n"
62 " <sip:server10.biloxi.com;lr>\r"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000063 "Record-Route: <sip:server10.biloxi.com>,\r\n" /* multiple routes+folding*/
Benny Prijono3818c932005-11-22 01:06:33 +000064 " <sip:bigbox3.site3.atlanta.com;lr>\n"
Benny Prijono69f73fe2007-03-19 10:27:13 +000065 "v: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000066 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n" /* folding. */
Benny Prijono3818c932005-11-22 01:06:33 +000067 " ;received=192.0.2.1\r\n"
68 "Via: SIP/2.0/UDP 10.2.1.1, SIP/2.0/TCP 192.168.1.1\n"
69 "Organization: \r"
70 "Max-Forwards: 70\n"
Benny Prijonofa73e3e2006-01-05 23:35:46 +000071 "X-Header: \r\n" /* empty header */
72 "P-Associated-URI:\r\n" /* empty header without space */
Benny Prijono3818c932005-11-22 01:06:33 +000073 "\r\n",
74 &create_msg0,
75 PJ_SUCCESS
76},
77{
78 /* Typical response message. */
79 "SIP/2.0 200 OK\r\n"
Benny Prijono4cf8d1c2007-04-28 15:37:49 +000080 "Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
Benny Prijono3818c932005-11-22 01:06:33 +000081 "Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
82 "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
83 "Route: <sip:proxy.sipprovider.com>\r\n"
84 "Route: <sip:proxy.supersip.com:5060>\r\n"
85 "Max-Forwards: 70\r\n"
86 "To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
87 "From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
88 "Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
89 "CSeq: 314159 INVITE\r\n"
90 "Contact: <sips:bob@192.0.2.4>\r\n"
91 "Content-Type: application/sdp\r\n"
92 "Content-Length: 150\r\n"
93 "\r\n"
94 "v=0\r\n"
95 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
96 "s=-\r\n"
97 "t=0 0\r\n"
98 "c=IN IP4 pc33.atlanta.com\r\n"
99 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
100 "a=rtpmap:0 PCMU/8000\r\n",
101 &create_msg1,
102 PJ_SUCCESS
103}
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000104};
105
Benny Prijonoe93e2872006-06-28 16:46:49 +0000106static struct
107{
108 int flag;
109 pj_highprec_t detect_len, parse_len, print_len;
110 pj_timestamp detect_time, parse_time, print_time;
111} var;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000112
113static pj_status_t test_entry( pj_pool_t *pool, struct test_msg *entry )
114{
Benny Prijonoe960bb52007-01-21 17:53:39 +0000115 pjsip_msg *parsed_msg, *ref_msg = NULL;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000116 static pjsip_msg *print_msg;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000117 pj_status_t status = PJ_SUCCESS;
118 int len;
119 pj_str_t str1, str2;
120 pjsip_hdr *hdr1, *hdr2;
121 pj_timestamp t1, t2;
Benny Prijono3818c932005-11-22 01:06:33 +0000122 pjsip_parser_err_report err_list;
123 pj_size_t msg_size;
124 char msgbuf1[PJSIP_MAX_PKT_LEN];
125 char msgbuf2[PJSIP_MAX_PKT_LEN];
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000126 enum { BUFLEN = 512 };
Benny Prijono3818c932005-11-22 01:06:33 +0000127
128 entry->len = pj_native_strlen(entry->msg);
129
Benny Prijonoe93e2872006-06-28 16:46:49 +0000130 if (var.flag & FLAG_PARSE_ONLY)
Benny Prijono3818c932005-11-22 01:06:33 +0000131 goto parse_msg;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000132
Benny Prijonoe93e2872006-06-28 16:46:49 +0000133 if (var.flag & FLAG_PRINT_ONLY) {
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000134 if (print_msg == NULL)
135 print_msg = entry->creator(pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000136 goto print_msg;
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000137 }
Benny Prijono3818c932005-11-22 01:06:33 +0000138
139 /* Detect message. */
Benny Prijonoe93e2872006-06-28 16:46:49 +0000140 var.detect_len = var.detect_len + entry->len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000141 pj_get_timestamp(&t1);
Benny Prijono3818c932005-11-22 01:06:33 +0000142 status = pjsip_find_msg(entry->msg, entry->len, PJ_FALSE, &msg_size);
143 if (status != PJ_SUCCESS) {
144 if (status!=PJSIP_EPARTIALMSG ||
145 entry->expected_status!=STATUS_PARTIAL)
146 {
147 app_perror(" error: unable to detect message", status);
148 return -5;
149 }
150 }
151 if (msg_size != entry->len) {
Benny Prijono85598d92006-01-07 18:44:25 +0000152 PJ_LOG(3,(THIS_FILE, " error: size mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000153 return -6;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000154 }
155 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000156 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000157 pj_add_timestamp(&var.detect_time, &t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000158
Benny Prijonoe93e2872006-06-28 16:46:49 +0000159 if (var.flag & FLAG_DETECT_ONLY)
Benny Prijono3818c932005-11-22 01:06:33 +0000160 return PJ_SUCCESS;
161
162 /* Parse message. */
163parse_msg:
Benny Prijonoe93e2872006-06-28 16:46:49 +0000164 var.parse_len = var.parse_len + entry->len;
Benny Prijono3818c932005-11-22 01:06:33 +0000165 pj_get_timestamp(&t1);
166 pj_list_init(&err_list);
167 parsed_msg = pjsip_parse_msg(pool, entry->msg, entry->len, &err_list);
168 if (parsed_msg == NULL) {
169 if (entry->expected_status != STATUS_SYNTAX_ERROR) {
170 status = -10;
171 if (err_list.next != &err_list) {
Benny Prijono85598d92006-01-07 18:44:25 +0000172 PJ_LOG(3,(THIS_FILE, " Syntax error in line %d col %d",
Benny Prijono3818c932005-11-22 01:06:33 +0000173 err_list.next->line, err_list.next->col));
174 }
175 goto on_return;
176 }
177 }
178 pj_get_timestamp(&t2);
179 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000180 pj_add_timestamp(&var.parse_time, &t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000181
Benny Prijonoe93e2872006-06-28 16:46:49 +0000182 if (var.flag & FLAG_PARSE_ONLY)
Benny Prijono3818c932005-11-22 01:06:33 +0000183 return PJ_SUCCESS;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000184
185 /* Create reference message. */
186 ref_msg = entry->creator(pool);
187
188 /* Create buffer for comparison. */
Benny Prijonoa1e69682007-05-11 15:14:34 +0000189 str1.ptr = (char*)pj_pool_alloc(pool, BUFLEN);
190 str2.ptr = (char*)pj_pool_alloc(pool, BUFLEN);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000191
192 /* Compare message type. */
193 if (parsed_msg->type != ref_msg->type) {
194 status = -20;
195 goto on_return;
196 }
197
198 /* Compare request or status line. */
199 if (parsed_msg->type == PJSIP_REQUEST_MSG) {
200 pjsip_method *m1 = &parsed_msg->line.req.method;
201 pjsip_method *m2 = &ref_msg->line.req.method;
202
Benny Prijono3818c932005-11-22 01:06:33 +0000203 if (pjsip_method_cmp(m1, m2) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000204 status = -30;
205 goto on_return;
206 }
Benny Prijono3818c932005-11-22 01:06:33 +0000207 status = pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,
208 parsed_msg->line.req.uri,
209 ref_msg->line.req.uri);
210 if (status != PJ_SUCCESS) {
211 app_perror(" error: request URI mismatch", status);
212 status = -31;
213 goto on_return;
214 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000215 } else {
Benny Prijono3818c932005-11-22 01:06:33 +0000216 if (parsed_msg->line.status.code != ref_msg->line.status.code) {
Benny Prijono85598d92006-01-07 18:44:25 +0000217 PJ_LOG(3,(THIS_FILE, " error: status code mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000218 status = -32;
219 goto on_return;
220 }
221 if (pj_strcmp(&parsed_msg->line.status.reason,
222 &ref_msg->line.status.reason) != 0)
223 {
Benny Prijono85598d92006-01-07 18:44:25 +0000224 PJ_LOG(3,(THIS_FILE, " error: status text mismatch"));
Benny Prijono3818c932005-11-22 01:06:33 +0000225 status = -33;
226 goto on_return;
227 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000228 }
229
230 /* Compare headers. */
231 hdr1 = parsed_msg->hdr.next;
232 hdr2 = ref_msg->hdr.next;
233
234 while (hdr1 != &parsed_msg->hdr && hdr2 != &ref_msg->hdr) {
235 len = hdr1->vptr->print_on(hdr1, str1.ptr, BUFLEN);
236 if (len < 1) {
237 status = -40;
238 goto on_return;
239 }
Benny Prijono3818c932005-11-22 01:06:33 +0000240 str1.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000241 str1.slen = len;
242
243 len = hdr2->vptr->print_on(hdr2, str2.ptr, BUFLEN);
244 if (len < 1) {
245 status = -50;
246 goto on_return;
247 }
Benny Prijono3818c932005-11-22 01:06:33 +0000248 str2.ptr[len] = '\0';
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000249 str2.slen = len;
250
251 if (pj_strcmp(&str1, &str2) != 0) {
252 status = -60;
Benny Prijono85598d92006-01-07 18:44:25 +0000253 PJ_LOG(3,(THIS_FILE, " error: header string mismatch:\n"
Benny Prijono3818c932005-11-22 01:06:33 +0000254 " h1='%s'\n"
255 " h2='%s'\n",
256 str1.ptr, str2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000257 goto on_return;
258 }
259
260 hdr1 = hdr1->next;
261 hdr2 = hdr2->next;
262 }
263
264 if (hdr1 != &parsed_msg->hdr || hdr2 != &ref_msg->hdr) {
265 status = -70;
266 goto on_return;
267 }
268
Benny Prijono3818c932005-11-22 01:06:33 +0000269 /* Compare body? */
270 if (parsed_msg->body==NULL && ref_msg->body==NULL)
271 goto print_msg;
272
273 /* Compare msg body length. */
274 if (parsed_msg->body->len != ref_msg->body->len) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000275 status = -80;
276 goto on_return;
277 }
Benny Prijono3818c932005-11-22 01:06:33 +0000278
279 /* Compare msg body content type. */
280 if (pj_strcmp(&parsed_msg->body->content_type.type,
281 &ref_msg->body->content_type.type) != 0) {
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000282 status = -90;
283 goto on_return;
284 }
Benny Prijono3818c932005-11-22 01:06:33 +0000285 if (pj_strcmp(&parsed_msg->body->content_type.subtype,
286 &ref_msg->body->content_type.subtype) != 0) {
287 status = -100;
288 goto on_return;
289 }
290
291 /* Compare body content. */
292 str1.slen = parsed_msg->body->print_body(parsed_msg->body,
293 msgbuf1, sizeof(msgbuf1));
294 if (str1.slen < 1) {
295 status = -110;
296 goto on_return;
297 }
298 str1.ptr = msgbuf1;
299
300 str2.slen = ref_msg->body->print_body(ref_msg->body,
301 msgbuf2, sizeof(msgbuf2));
302 if (str2.slen < 1) {
303 status = -120;
304 goto on_return;
305 }
306 str2.ptr = msgbuf2;
307
308 if (pj_strcmp(&str1, &str2) != 0) {
309 status = -140;
310 goto on_return;
311 }
312
313 /* Print message. */
314print_msg:
Benny Prijonoe93e2872006-06-28 16:46:49 +0000315 var.print_len = var.print_len + entry->len;
Benny Prijono3818c932005-11-22 01:06:33 +0000316 pj_get_timestamp(&t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000317 if (var.flag && FLAG_PRINT_ONLY)
Benny Prijonocec5f4a2005-11-22 23:51:50 +0000318 ref_msg = print_msg;
319 len = pjsip_msg_print(ref_msg, msgbuf1, PJSIP_MAX_PKT_LEN);
Benny Prijono3818c932005-11-22 01:06:33 +0000320 if (len < 1) {
321 status = -150;
322 goto on_return;
323 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000324 pj_get_timestamp(&t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000325 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000326 pj_add_timestamp(&var.print_time, &t2);
Benny Prijono3818c932005-11-22 01:06:33 +0000327
328
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000329 status = PJ_SUCCESS;
330
331on_return:
332 return status;
333}
334
335
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000336static pjsip_msg *create_msg0(pj_pool_t *pool)
337{
338
339 pjsip_msg *msg;
340 pjsip_name_addr *name_addr;
Benny Prijono0c2bc612006-01-10 13:31:40 +0000341 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000342 pjsip_fromto_hdr *fromto;
343 pjsip_cid_hdr *cid;
344 pjsip_clen_hdr *clen;
345 pjsip_cseq_hdr *cseq;
346 pjsip_contact_hdr *contact;
347 pjsip_ctype_hdr *ctype;
348 pjsip_routing_hdr *routing;
349 pjsip_via_hdr *via;
350 pjsip_generic_string_hdr *generic;
351 pj_str_t str;
352
353 msg = pjsip_msg_create(pool, PJSIP_REQUEST_MSG);
354
355 /* "INVITE sip:user@foo SIP/2.0\n" */
356 pjsip_method_set(&msg->line.req.method, PJSIP_INVITE_METHOD);
Benny Prijono40f2f642006-01-30 18:40:05 +0000357 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000358 msg->line.req.uri = (pjsip_uri*)url;
359 pj_strdup2(pool, &url->user, "user");
360 pj_strdup2(pool, &url->host, "foo");
361
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000362 /* "From: Hi I'm Joe <sip:joe.user@bar.otherdomain.com>;tag=123457890123456\r" */
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000363 fromto = pjsip_from_hdr_create(pool);
364 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000365 pj_strdup2(pool, &fromto->tag, "123457890123456");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000366 name_addr = pjsip_name_addr_create(pool);
367 fromto->uri = (pjsip_uri*)name_addr;
368 pj_strdup2(pool, &name_addr->display, "Hi I'm Joe");
Benny Prijono40f2f642006-01-30 18:40:05 +0000369 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000370 name_addr->uri = (pjsip_uri*)url;
371 pj_strdup2(pool, &url->user, "joe.user");
372 pj_strdup2(pool, &url->host, "bar.otherdomain.com");
373
374 /* "To: Fellow User <sip:user@foo.bar.domain.com>\r\n" */
375 fromto = pjsip_to_hdr_create(pool);
376 pjsip_msg_add_hdr(msg, (pjsip_hdr*)fromto);
377 name_addr = pjsip_name_addr_create(pool);
378 fromto->uri = (pjsip_uri*)name_addr;
379 pj_strdup2(pool, &name_addr->display, "Fellow User");
Benny Prijono40f2f642006-01-30 18:40:05 +0000380 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000381 name_addr->uri = (pjsip_uri*)url;
382 pj_strdup2(pool, &url->user, "user");
383 pj_strdup2(pool, &url->host, "foo.bar.domain.com");
384
385 /* "Call-ID: 12345678901234567890@bar\r\n" */
386 cid = pjsip_cid_hdr_create(pool);
387 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
388 pj_strdup2(pool, &cid->id, "12345678901234567890@bar");
389
390 /* "Content-Length: 0\r\n" */
391 clen = pjsip_clen_hdr_create(pool);
392 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
393 clen->len = 0;
394
395 /* "CSeq: 123456 INVITE\n" */
396 cseq = pjsip_cseq_hdr_create(pool);
397 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
398 cseq->cseq = 123456;
399 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
400
401 /* "Contact: <sip:joe@bar>;q=0.5;expires=3600*/
402 contact = pjsip_contact_hdr_create(pool);
403 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
404 contact->q1000 = 500;
405 contact->expires = 3600;
406 name_addr = pjsip_name_addr_create(pool);
407 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000408 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000409 name_addr->uri = (pjsip_uri*)url;
410 pj_strdup2(pool, &url->user, "joe");
411 pj_strdup2(pool, &url->host, "bar");
412
413 /*, sip:user@host;q=0.500\r" */
414 contact = pjsip_contact_hdr_create(pool);
415 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
416 contact->q1000 = 500;
Benny Prijono3818c932005-11-22 01:06:33 +0000417 name_addr = pjsip_name_addr_create(pool);
418 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000419 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000420 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000421 pj_strdup2(pool, &url->user, "user");
422 pj_strdup2(pool, &url->host, "host");
423
424 /* " ,sip:user2@host2\n" */
425 contact = pjsip_contact_hdr_create(pool);
426 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
Benny Prijono3818c932005-11-22 01:06:33 +0000427 name_addr = pjsip_name_addr_create(pool);
428 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000429 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono3818c932005-11-22 01:06:33 +0000430 name_addr->uri = (pjsip_uri*)url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000431 pj_strdup2(pool, &url->user, "user2");
432 pj_strdup2(pool, &url->host, "host2");
433
434 /* "Content-Type: text/html; charset=ISO-8859-4\r" */
435 ctype = pjsip_ctype_hdr_create(pool);
436 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
437 pj_strdup2(pool, &ctype->media.type, "text");
438 pj_strdup2(pool, &ctype->media.subtype, "html");
439 pj_strdup2(pool, &ctype->media.param, ";charset=ISO-8859-4");
440
441 /* "Route: <sip:bigbox3.site3.atlanta.com;lr>,\r\n" */
442 routing = pjsip_route_hdr_create(pool);
443 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000444 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000445 routing->name_addr.uri = (pjsip_uri*)url;
446 pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
447 url->lr_param = 1;
448
449 /* " <sip:server10.biloxi.com;lr>\r" */
450 routing = pjsip_route_hdr_create(pool);
451 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000452 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000453 routing->name_addr.uri = (pjsip_uri*)url;
454 pj_strdup2(pool, &url->host, "server10.biloxi.com");
455 url->lr_param = 1;
456
457 /* "Record-Route: <sip:server10.biloxi.com>,\r\n" */
458 routing = pjsip_rr_hdr_create(pool);
459 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000460 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000461 routing->name_addr.uri = (pjsip_uri*)url;
462 pj_strdup2(pool, &url->host, "server10.biloxi.com");
463 url->lr_param = 0;
464
465 /* " <sip:bigbox3.site3.atlanta.com;lr>\n" */
466 routing = pjsip_rr_hdr_create(pool);
467 pjsip_msg_add_hdr(msg, (pjsip_hdr*)routing);
Benny Prijono40f2f642006-01-30 18:40:05 +0000468 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000469 routing->name_addr.uri = (pjsip_uri*)url;
470 pj_strdup2(pool, &url->host, "bigbox3.site3.atlanta.com");
471 url->lr_param = 1;
472
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000473 /* "Via: SIP/2.0/SCTP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c230\n" */
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000474 via = pjsip_via_hdr_create(pool);
475 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
476 pj_strdup2(pool, &via->transport, "SCTP");
477 pj_strdup2(pool, &via->sent_by.host, "bigbox3.site3.atlanta.com");
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000478 pj_strdup2(pool, &via->branch_param, "z9hG4bK77ef4c230");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000479
480 /* "Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKnashds8\n"
481 " ;received=192.0.2.1\r\n" */
482 via = pjsip_via_hdr_create(pool);
483 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
484 pj_strdup2(pool, &via->transport, "UDP");
485 pj_strdup2(pool, &via->sent_by.host, "pc33.atlanta.com");
486 pj_strdup2(pool, &via->branch_param, "z9hG4bKnashds8");
487 pj_strdup2(pool, &via->recvd_param, "192.0.2.1");
488
489
490 /* "Via: SIP/2.0/UDP 10.2.1.1, */
491 via = pjsip_via_hdr_create(pool);
492 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
493 pj_strdup2(pool, &via->transport, "UDP");
494 pj_strdup2(pool, &via->sent_by.host, "10.2.1.1");
495
496
497 /*SIP/2.0/TCP 192.168.1.1\n" */
498 via = pjsip_via_hdr_create(pool);
499 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
500 pj_strdup2(pool, &via->transport, "TCP");
501 pj_strdup2(pool, &via->sent_by.host, "192.168.1.1");
502
503 /* "Organization: \r" */
504 str.ptr = "Organization";
505 str.slen = 12;
Benny Prijono40f2f642006-01-30 18:40:05 +0000506 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000507 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
508 generic->hvalue.ptr = NULL;
509 generic->hvalue.slen = 0;
510
511 /* "Max-Forwards: 70\n" */
512 str.ptr = "Max-Forwards";
513 str.slen = 12;
Benny Prijono40f2f642006-01-30 18:40:05 +0000514 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000515 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
516 str.ptr = "70";
517 str.slen = 2;
518 generic->hvalue = str;
519
520 /* "X-Header: \r\n" */
521 str.ptr = "X-Header";
522 str.slen = 8;
Benny Prijono40f2f642006-01-30 18:40:05 +0000523 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000524 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
525 str.ptr = NULL;
526 str.slen = 0;
527 generic->hvalue = str;
528
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000529 /* P-Associated-URI:\r\n */
530 str.ptr = "P-Associated-URI";
531 str.slen = 16;
Benny Prijono40f2f642006-01-30 18:40:05 +0000532 generic = pjsip_generic_string_hdr_create(pool, &str, NULL);
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000533 pjsip_msg_add_hdr(msg, (pjsip_hdr*)generic);
534 str.ptr = NULL;
535 str.slen = 0;
536 generic->hvalue = str;
537
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000538 return msg;
539}
Benny Prijono3818c932005-11-22 01:06:33 +0000540
541static pjsip_msg *create_msg1(pj_pool_t *pool)
542{
543 pjsip_via_hdr *via;
544 pjsip_route_hdr *route;
545 pjsip_name_addr *name_addr;
Benny Prijono0c2bc612006-01-10 13:31:40 +0000546 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000547 pjsip_max_fwd_hdr *max_fwd;
Benny Prijono3818c932005-11-22 01:06:33 +0000548 pjsip_to_hdr *to;
549 pjsip_from_hdr *from;
550 pjsip_contact_hdr *contact;
551 pjsip_ctype_hdr *ctype;
552 pjsip_cid_hdr *cid;
553 pjsip_clen_hdr *clen;
554 pjsip_cseq_hdr *cseq;
555 pjsip_msg *msg = pjsip_msg_create(pool, PJSIP_RESPONSE_MSG);
556 pjsip_msg_body *body;
557
558 //"SIP/2.0 200 OK\r\n"
559 msg->line.status.code = 200;
560 msg->line.status.reason = pj_str("OK");
561
Benny Prijono4cf8d1c2007-04-28 15:37:49 +0000562 //"Via: SIP/2.0/SCTP server10.biloxi.com;branch=z9hG4bKnashds8;rport;received=192.0.2.1\r\n"
Benny Prijono3818c932005-11-22 01:06:33 +0000563 via = pjsip_via_hdr_create(pool);
564 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
565 via->transport = pj_str("SCTP");
566 via->sent_by.host = pj_str("server10.biloxi.com");
567 via->branch_param = pj_str("z9hG4bKnashds8");
568 via->rport_param = 0;
569 via->recvd_param = pj_str("192.0.2.1");
570
571 //"Via: SIP/2.0/UDP bigbox3.site3.atlanta.com;branch=z9hG4bK77ef4c2312983.1;received=192.0.2.2\r\n"
572 via = pjsip_via_hdr_create(pool);
573 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
574 via->transport = pj_str("UDP");
575 via->sent_by.host = pj_str("bigbox3.site3.atlanta.com");
576 via->branch_param = pj_str("z9hG4bK77ef4c2312983.1");
577 via->recvd_param = pj_str("192.0.2.2");
578
579 //"Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bK776asdhds ;received=192.0.2.3\r\n"
580 via = pjsip_via_hdr_create(pool);
581 pjsip_msg_add_hdr(msg, (pjsip_hdr*)via);
582 via->transport = pj_str("UDP");
583 via->sent_by.host = pj_str("pc33.atlanta.com");
584 via->branch_param = pj_str("z9hG4bK776asdhds");
585 via->recvd_param = pj_str("192.0.2.3");
586
587 //"Route: <sip:proxy.sipprovider.com>\r\n"
588 route = pjsip_route_hdr_create(pool);
589 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
Benny Prijono40f2f642006-01-30 18:40:05 +0000590 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000591 route->name_addr.uri = (pjsip_uri*)url;
592 url->host = pj_str("proxy.sipprovider.com");
593
594 //"Route: <sip:proxy.supersip.com:5060>\r\n"
595 route = pjsip_route_hdr_create(pool);
596 pjsip_msg_add_hdr(msg, (pjsip_hdr*)route);
Benny Prijono40f2f642006-01-30 18:40:05 +0000597 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000598 route->name_addr.uri = (pjsip_uri*)url;
599 url->host = pj_str("proxy.supersip.com");
600 url->port = 5060;
601
602 //"Max-Forwards: 70\r\n"
Benny Prijono40f2f642006-01-30 18:40:05 +0000603 max_fwd = pjsip_max_fwd_hdr_create(pool, 70);
Benny Prijono3818c932005-11-22 01:06:33 +0000604 pjsip_msg_add_hdr(msg, (pjsip_hdr*)max_fwd);
Benny Prijono3818c932005-11-22 01:06:33 +0000605
606 //"To: Bob <sip:bob@biloxi.com>;tag=a6c85cf\r\n"
607 to = pjsip_to_hdr_create(pool);
608 pjsip_msg_add_hdr(msg, (pjsip_hdr*)to);
609 name_addr = pjsip_name_addr_create(pool);
610 name_addr->display = pj_str("Bob");
611 to->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000612 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000613 name_addr->uri = (pjsip_uri*)url;
614 url->user = pj_str("bob");
615 url->host = pj_str("biloxi.com");
616 to->tag = pj_str("a6c85cf");
617
618 //"From: Alice <sip:alice@atlanta.com>;tag=1928301774\r\n"
619 from = pjsip_from_hdr_create(pool);
620 pjsip_msg_add_hdr(msg, (pjsip_hdr*)from);
621 name_addr = pjsip_name_addr_create(pool);
622 name_addr->display = pj_str("Alice");
623 from->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000624 url = pjsip_sip_uri_create(pool, PJ_FALSE);
Benny Prijono3818c932005-11-22 01:06:33 +0000625 name_addr->uri = (pjsip_uri*)url;
626 url->user = pj_str("alice");
627 url->host = pj_str("atlanta.com");
628 from->tag = pj_str("1928301774");
629
630 //"Call-ID: a84b4c76e66710@pc33.atlanta.com\r\n"
631 cid = pjsip_cid_hdr_create(pool);
632 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cid);
633 cid->id = pj_str("a84b4c76e66710@pc33.atlanta.com");
634
635 //"CSeq: 314159 INVITE\r\n"
636 cseq = pjsip_cseq_hdr_create(pool);
637 pjsip_msg_add_hdr(msg, (pjsip_hdr*)cseq);
638 cseq->cseq = 314159;
639 pjsip_method_set(&cseq->method, PJSIP_INVITE_METHOD);
640
641 //"Contact: <sips:bob@192.0.2.4>\r\n"
642 contact = pjsip_contact_hdr_create(pool);
643 pjsip_msg_add_hdr(msg, (pjsip_hdr*)contact);
644 name_addr = pjsip_name_addr_create(pool);
645 contact->uri = (pjsip_uri*)name_addr;
Benny Prijono40f2f642006-01-30 18:40:05 +0000646 url = pjsip_sip_uri_create(pool, PJ_TRUE);
Benny Prijono3818c932005-11-22 01:06:33 +0000647 name_addr->uri = (pjsip_uri*)url;
648 url->user = pj_str("bob");
649 url->host = pj_str("192.0.2.4");
650
651 //"Content-Type: application/sdp\r\n"
652 ctype = pjsip_ctype_hdr_create(pool);
653 pjsip_msg_add_hdr(msg, (pjsip_hdr*)ctype);
654 ctype->media.type = pj_str("application");
655 ctype->media.subtype = pj_str("sdp");
656
657 //"Content-Length: 150\r\n"
658 clen = pjsip_clen_hdr_create(pool);
659 pjsip_msg_add_hdr(msg, (pjsip_hdr*)clen);
660 clen->len = 150;
661
662 // Body
Benny Prijonoa1e69682007-05-11 15:14:34 +0000663 body = PJ_POOL_ZALLOC_T(pool, pjsip_msg_body);
Benny Prijono3818c932005-11-22 01:06:33 +0000664 msg->body = body;
665 body->content_type.type = pj_str("application");
666 body->content_type.subtype = pj_str("sdp");
Benny Prijonoa1e69682007-05-11 15:14:34 +0000667 body->data = (void*)
Benny Prijono3818c932005-11-22 01:06:33 +0000668 "v=0\r\n"
669 "o=alice 53655765 2353687637 IN IP4 pc33.atlanta.com\r\n"
670 "s=-\r\n"
671 "t=0 0\r\n"
672 "c=IN IP4 pc33.atlanta.com\r\n"
673 "m=audio 3456 RTP/AVP 0 1 3 99\r\n"
674 "a=rtpmap:0 PCMU/8000\r\n";
Benny Prijonoa1e69682007-05-11 15:14:34 +0000675 body->len = pj_native_strlen((const char*) body->data);
Benny Prijono3818c932005-11-22 01:06:33 +0000676 body->print_body = &pjsip_print_text_body;
677
678 return msg;
679}
680
681/*****************************************************************************/
682
Benny Prijonoe93e2872006-06-28 16:46:49 +0000683static pj_status_t simple_test(void)
Benny Prijono3818c932005-11-22 01:06:33 +0000684{
Benny Prijonoe93e2872006-06-28 16:46:49 +0000685 unsigned i;
Benny Prijono3818c932005-11-22 01:06:33 +0000686 pj_status_t status;
Benny Prijono3818c932005-11-22 01:06:33 +0000687
Benny Prijono85598d92006-01-07 18:44:25 +0000688 PJ_LOG(3,(THIS_FILE, " simple test.."));
Benny Prijono3818c932005-11-22 01:06:33 +0000689 for (i=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
Benny Prijonoe93e2872006-06-28 16:46:49 +0000690 pj_pool_t *pool;
Benny Prijono3818c932005-11-22 01:06:33 +0000691 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
692 status = test_entry( pool, &test_array[i] );
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000693 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000694
695 if (status != PJ_SUCCESS)
696 return status;
697 }
698
Benny Prijonoe93e2872006-06-28 16:46:49 +0000699 return PJ_SUCCESS;
700}
701
702
703static int msg_benchmark(unsigned *p_detect, unsigned *p_parse,
704 unsigned *p_print)
705{
706 pj_status_t status;
707 pj_pool_t *pool;
708 int i, loop;
709 pj_timestamp zero;
710 pj_time_val elapsed;
711 pj_highprec_t avg_detect, avg_parse, avg_print, kbytes;
712
713
Benny Prijonoac623b32006-07-03 15:19:31 +0000714 pj_bzero(&var, sizeof(var));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000715 zero.u64 = 0;
716
Benny Prijono3818c932005-11-22 01:06:33 +0000717 for (loop=0; loop<LOOP; ++loop) {
Benny Prijonoa1e69682007-05-11 15:14:34 +0000718 for (i=0; i<(int)PJ_ARRAY_SIZE(test_array); ++i) {
Benny Prijono3818c932005-11-22 01:06:33 +0000719 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
720 status = test_entry( pool, &test_array[i] );
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000721 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono3818c932005-11-22 01:06:33 +0000722
723 if (status != PJ_SUCCESS)
724 return status;
725 }
726 }
727
Benny Prijonoe93e2872006-06-28 16:46:49 +0000728 kbytes = var.detect_len;
Benny Prijono3818c932005-11-22 01:06:33 +0000729 pj_highprec_mod(kbytes, 1000000);
730 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000731 elapsed = pj_elapsed_time(&zero, &var.detect_time);
732 avg_detect = pj_elapsed_usec(&zero, &var.detect_time);
Benny Prijono3818c932005-11-22 01:06:33 +0000733 pj_highprec_mul(avg_detect, AVERAGE_MSG_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000734 pj_highprec_div(avg_detect, var.detect_len);
Benny Prijono3818c932005-11-22 01:06:33 +0000735 avg_detect = 1000000 / avg_detect;
736
Benny Prijono85598d92006-01-07 18:44:25 +0000737 PJ_LOG(3,(THIS_FILE,
738 " %u.%u MB detected in %d.%03ds (avg=%d msg detection/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000739 (unsigned)(var.detect_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000740 elapsed.sec, elapsed.msec,
741 (unsigned)avg_detect));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000742 *p_detect = (unsigned)avg_detect;
Benny Prijono3818c932005-11-22 01:06:33 +0000743
Benny Prijonoe93e2872006-06-28 16:46:49 +0000744 kbytes = var.parse_len;
Benny Prijono3818c932005-11-22 01:06:33 +0000745 pj_highprec_mod(kbytes, 1000000);
746 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000747 elapsed = pj_elapsed_time(&zero, &var.parse_time);
748 avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
Benny Prijono3818c932005-11-22 01:06:33 +0000749 pj_highprec_mul(avg_parse, AVERAGE_MSG_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000750 pj_highprec_div(avg_parse, var.parse_len);
Benny Prijono3818c932005-11-22 01:06:33 +0000751 avg_parse = 1000000 / avg_parse;
752
Benny Prijono85598d92006-01-07 18:44:25 +0000753 PJ_LOG(3,(THIS_FILE,
754 " %u.%u MB parsed in %d.%03ds (avg=%d msg parsing/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000755 (unsigned)(var.parse_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000756 elapsed.sec, elapsed.msec,
757 (unsigned)avg_parse));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000758 *p_parse = (unsigned)avg_parse;
Benny Prijono3818c932005-11-22 01:06:33 +0000759
Benny Prijonoe93e2872006-06-28 16:46:49 +0000760 kbytes = var.print_len;
Benny Prijono3818c932005-11-22 01:06:33 +0000761 pj_highprec_mod(kbytes, 1000000);
762 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000763 elapsed = pj_elapsed_time(&zero, &var.print_time);
764 avg_print = pj_elapsed_usec(&zero, &var.print_time);
Benny Prijono3818c932005-11-22 01:06:33 +0000765 pj_highprec_mul(avg_print, AVERAGE_MSG_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000766 pj_highprec_div(avg_print, var.print_len);
Benny Prijono3818c932005-11-22 01:06:33 +0000767 avg_print = 1000000 / avg_print;
768
Benny Prijono85598d92006-01-07 18:44:25 +0000769 PJ_LOG(3,(THIS_FILE,
770 " %u.%u MB printed in %d.%03ds (avg=%d msg print/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000771 (unsigned)(var.print_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000772 elapsed.sec, elapsed.msec,
773 (unsigned)avg_print));
Benny Prijono3818c932005-11-22 01:06:33 +0000774
Benny Prijonoe93e2872006-06-28 16:46:49 +0000775 *p_print = (unsigned)avg_print;
Benny Prijono3818c932005-11-22 01:06:33 +0000776 return status;
777}
778
779/*****************************************************************************/
Benny Prijono8aea0d92007-04-29 06:23:11 +0000780/* Test various header parsing and production */
781static int hdr_test_success(pjsip_hdr *h);
782static int hdr_test_accept0(pjsip_hdr *h);
783static int hdr_test_accept1(pjsip_hdr *h);
784static int hdr_test_accept2(pjsip_hdr *h);
785static int hdr_test_allow0(pjsip_hdr *h);
786static int hdr_test_authorization(pjsip_hdr *h);
787static int hdr_test_cid(pjsip_hdr *h);
788static int hdr_test_contact0(pjsip_hdr *h);
789static int hdr_test_contact1(pjsip_hdr *h);
790static int hdr_test_content_length(pjsip_hdr *h);
791static int hdr_test_content_type(pjsip_hdr *h);
792static int hdr_test_from(pjsip_hdr *h);
793static int hdr_test_proxy_authenticate(pjsip_hdr *h);
794static int hdr_test_record_route(pjsip_hdr *h);
795static int hdr_test_supported(pjsip_hdr *h);
796static int hdr_test_to(pjsip_hdr *h);
797static int hdr_test_via(pjsip_hdr *h);
798
799
800
801#define GENERIC_PARAM "p0=a;p1=\"ab:;cd\";p2=ab%3acd;p3"
802#define GENERIC_PARAM_PARSED "p0=a;p1=\"ab:;cd\";p2=ab:cd;p3"
803#define PARAM_CHAR "[]/:&+$"
804#define SIMPLE_ADDR_SPEC "sip:host"
Benny Prijono8fcbe2d2007-04-29 18:07:53 +0000805#define ADDR_SPEC SIMPLE_ADDR_SPEC ";"PARAM_CHAR"="PARAM_CHAR ";p1=\";\""
Benny Prijono8aea0d92007-04-29 06:23:11 +0000806#define NAME_ADDR "<" ADDR_SPEC ">"
807
808#define HDR_FLAG_PARSE_FAIL 1
809#define HDR_FLAG_DONT_PRINT 2
810
811struct hdr_test_t
812{
813 char *hname;
814 char *hshort_name;
815 char *hcontent;
816 int (*test)(pjsip_hdr*);
817 unsigned flags;
818} hdr_test_data[] =
819{
820 {
821 /* Empty Accept */
822 "Accept", NULL,
823 "",
824 &hdr_test_accept0
825 },
826
827 {
828 /* Overflowing generic string header */
829 "Accept", NULL,
830 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
831 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
832 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
833 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
834 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
835 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
836 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, " \
837 "a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a",
838 &hdr_test_success,
839 HDR_FLAG_PARSE_FAIL
840 },
841
842 {
843 /* Normal Accept */
844 "Accept", NULL,
845 "application/*, text/plain",
846 &hdr_test_accept1
847 },
848
849 {
850 /* Accept with params */
851 "Accept", NULL,
852 "application/*;p1=v1, text/plain",
853 &hdr_test_accept2
854 },
855
856 {
857 /* Empty Allow */
858 "Allow", NULL,
859 "",
860 &hdr_test_allow0,
861 },
862
863 {
864 /* Authorization, testing which params should be quoted */
865 "Authorization", NULL,
866 "Digest username=\"username\", realm=\"realm\", nonce=\"nonce\", " \
867 "uri=\"sip:domain\", response=\"RESPONSE\", algorithm=MD5, " \
868 "cnonce=\"CNONCE\", opaque=\"OPAQUE\", qop=auth, nc=00000001",
869 &hdr_test_authorization
870 },
871
872 {
873 /* Call ID */
874 "Call-ID", "i",
875 "-.!%*_+`'~()<>:\\\"/[]?{}",
876 &hdr_test_cid,
877 },
878
879 {
880 /* Parameter belong to hparam */
881 "Contact", "m",
882 SIMPLE_ADDR_SPEC ";p1=v1",
883 &hdr_test_contact0,
884 HDR_FLAG_DONT_PRINT
885 },
886
887 {
888 /* generic-param in Contact header */
889 "Contact", "m",
890 NAME_ADDR ";" GENERIC_PARAM,
891 &hdr_test_contact1
892 },
893
894 {
895 /* Content-Length */
896 "Content-Length", "l",
897 "10",
898 &hdr_test_content_length
899 },
900
901 {
902 /* Content-Type, with generic-param */
903 "Content-Type", "c",
904 "application/sdp" ";" GENERIC_PARAM,
905 &hdr_test_content_type,
906 HDR_FLAG_DONT_PRINT
907 },
908
909 {
910 /* From, testing parameters and generic-param */
911 "From", "f",
912 NAME_ADDR ";" GENERIC_PARAM,
913 &hdr_test_from
914 },
915
916 {
917 /* Proxy-Authenticate, testing which params should be quoted */
918 "Proxy-Authenticate", NULL,
919 "Digest realm=\"realm\",domain=\"sip:domain\",nonce=\"nonce\"," \
920 "opaque=\"opaque\",stale=true,algorithm=MD5,qop=\"auth\"",
921 &hdr_test_proxy_authenticate
922 },
923
924 {
925 /* Record-Route, param belong to header */
926 "Record-Route", NULL,
927 NAME_ADDR ";" GENERIC_PARAM,
928 &hdr_test_record_route
929 },
930
931 {
932 /* Empty Supported */
933 "Supported", "k",
934 "",
935 &hdr_test_supported,
936 },
937
938 {
939 /* To */
940 "To", "t",
941 NAME_ADDR ";" GENERIC_PARAM,
942 &hdr_test_to
943 },
944
945 {
946 /* Via */
947 "Via", "v",
948 "SIP/2.0/XYZ host" ";" GENERIC_PARAM,
949 &hdr_test_via
950 }
951};
952
953static int hdr_test_success(pjsip_hdr *h)
954{
955 PJ_UNUSED_ARG(h);
956 return 0;
957}
958
959/* "" */
960static int hdr_test_accept0(pjsip_hdr *h)
961{
962 pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
963
964 if (h->type != PJSIP_H_ACCEPT)
965 return -1010;
966
967 if (hdr->count != 0)
968 return -1020;
969
970 return 0;
971}
972
Benny Prijono64898b52007-05-01 06:36:15 +0000973/* "application/ *, text/plain\r\n" */
Benny Prijono8aea0d92007-04-29 06:23:11 +0000974static int hdr_test_accept1(pjsip_hdr *h)
975{
976 pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
977
978 if (h->type != PJSIP_H_ACCEPT)
979 return -1110;
980
981 if (hdr->count != 2)
982 return -1120;
983
984 if (pj_strcmp2(&hdr->values[0], "application/*"))
985 return -1130;
986
987 if (pj_strcmp2(&hdr->values[1], "text/plain"))
988 return -1140;
989
990 return 0;
991}
992
Benny Prijono64898b52007-05-01 06:36:15 +0000993/* "application/ *;p1=v1, text/plain\r\n" */
Benny Prijono8aea0d92007-04-29 06:23:11 +0000994static int hdr_test_accept2(pjsip_hdr *h)
995{
996 pjsip_accept_hdr *hdr = (pjsip_accept_hdr*)h;
997
998 if (h->type != PJSIP_H_ACCEPT)
999 return -1210;
1000
1001 if (hdr->count != 2)
1002 return -1220;
1003
1004 if (pj_strcmp2(&hdr->values[0], "application/*;p1=v1"))
1005 return -1230;
1006
1007 if (pj_strcmp2(&hdr->values[1], "text/plain"))
1008 return -1240;
1009
1010 return 0;
1011}
1012
1013/* "" */
1014static int hdr_test_allow0(pjsip_hdr *h)
1015{
1016 pjsip_allow_hdr *hdr = (pjsip_allow_hdr*)h;
1017
1018 if (h->type != PJSIP_H_ALLOW)
1019 return -1310;
1020
1021 if (hdr->count != 0)
1022 return -1320;
1023
1024 return 0;
1025
1026}
1027
1028
1029/*
1030 "Digest username=\"username\", realm=\"realm\", nonce=\"nonce\", " \
1031 "uri=\"sip:domain\", response=\"RESPONSE\", algorithm=MD5, " \
1032 "cnonce=\"CNONCE\", opaque=\"OPAQUE\", qop=auth, nc=00000001",
1033 */
1034static int hdr_test_authorization(pjsip_hdr *h)
1035{
1036 pjsip_authorization_hdr *hdr = (pjsip_authorization_hdr*)h;
1037
1038 if (h->type != PJSIP_H_AUTHORIZATION)
1039 return -1410;
1040
1041 if (pj_strcmp2(&hdr->scheme, "Digest"))
1042 return -1420;
1043
1044 if (pj_strcmp2(&hdr->credential.digest.username, "username"))
1045 return -1421;
1046
1047 if (pj_strcmp2(&hdr->credential.digest.realm, "realm"))
1048 return -1422;
1049
1050 if (pj_strcmp2(&hdr->credential.digest.nonce, "nonce"))
1051 return -1423;
1052
1053 if (pj_strcmp2(&hdr->credential.digest.uri, "sip:domain"))
1054 return -1424;
1055
1056 if (pj_strcmp2(&hdr->credential.digest.response, "RESPONSE"))
1057 return -1425;
1058
1059 if (pj_strcmp2(&hdr->credential.digest.algorithm, "MD5"))
1060 return -1426;
1061
1062 if (pj_strcmp2(&hdr->credential.digest.cnonce, "CNONCE"))
1063 return -1427;
1064
1065 if (pj_strcmp2(&hdr->credential.digest.opaque, "OPAQUE"))
1066 return -1428;
1067
1068 if (pj_strcmp2(&hdr->credential.digest.qop, "auth"))
1069 return -1429;
1070
1071 if (pj_strcmp2(&hdr->credential.digest.nc, "00000001"))
1072 return -1430;
1073
1074 return 0;
1075}
1076
1077
1078/*
1079 "-.!%*_+`'~()<>:\\\"/[]?{}\r\n"
1080 */
1081static int hdr_test_cid(pjsip_hdr *h)
1082{
1083 pjsip_cid_hdr *hdr = (pjsip_cid_hdr*)h;
1084
1085 if (h->type != PJSIP_H_CALL_ID)
1086 return -1510;
1087
1088 if (pj_strcmp2(&hdr->id, "-.!%*_+`'~()<>:\\\"/[]?{}\r\n"))
1089 return -1520;
1090
1091 return 0;
1092}
1093
1094/*
1095 #define SIMPLE_ADDR_SPEC "sip:host"
1096 */
1097static int test_simple_addr_spec(pjsip_uri *uri)
1098{
1099 pjsip_sip_uri *sip_uri = (pjsip_sip_uri *)pjsip_uri_get_uri(uri);
1100
1101 if (!PJSIP_URI_SCHEME_IS_SIP(uri))
1102 return -900;
1103
1104 if (pj_strcmp2(&sip_uri->host, "host"))
1105 return -910;
1106
1107 if (sip_uri->port != 0)
1108 return -920;
1109
1110 return 0;
1111}
1112
1113/*
1114#define PARAM_CHAR "[]/:&+$"
1115#define SIMPLE_ADDR_SPEC "sip:host"
Benny Prijono8fcbe2d2007-04-29 18:07:53 +00001116#define ADDR_SPEC SIMPLE_ADDR_SPEC ";"PARAM_CHAR"="PARAM_CHAR ";p1=\";\""
Benny Prijono8aea0d92007-04-29 06:23:11 +00001117#define NAME_ADDR "<" ADDR_SPEC ">"
1118 */
Benny Prijono64898b52007-05-01 06:36:15 +00001119static int nameaddr_test(void *uri)
Benny Prijono8aea0d92007-04-29 06:23:11 +00001120{
Benny Prijono64898b52007-05-01 06:36:15 +00001121 pjsip_sip_uri *sip_uri=(pjsip_sip_uri *)pjsip_uri_get_uri((pjsip_uri*)uri);
Benny Prijono8aea0d92007-04-29 06:23:11 +00001122 pjsip_param *param;
1123 int rc;
1124
1125 if (!PJSIP_URI_SCHEME_IS_SIP(uri))
1126 return -930;
1127
1128 rc = test_simple_addr_spec((pjsip_uri*)sip_uri);
1129 if (rc != 0)
1130 return rc;
1131
Benny Prijono8fcbe2d2007-04-29 18:07:53 +00001132 if (pj_list_size(&sip_uri->other_param) != 2)
Benny Prijono8aea0d92007-04-29 06:23:11 +00001133 return -940;
1134
1135 param = sip_uri->other_param.next;
1136
1137 if (pj_strcmp2(&param->name, PARAM_CHAR))
1138 return -942;
1139
1140 if (pj_strcmp2(&param->value, PARAM_CHAR))
1141 return -943;
1142
Benny Prijono8fcbe2d2007-04-29 18:07:53 +00001143 param = param->next;
1144 if (pj_strcmp2(&param->name, "p1"))
1145 return -942;
1146 if (pj_strcmp2(&param->value, "\";\""))
1147 return -943;
1148
Benny Prijono8aea0d92007-04-29 06:23:11 +00001149 return 0;
1150}
1151
1152/*
1153#define GENERIC_PARAM "p0=a;p1=\"ab:;cd\";p2=ab%3acd;p3"
1154 */
1155static int generic_param_test(pjsip_param *param_head)
1156{
1157 pjsip_param *param;
1158
1159 if (pj_list_size(param_head) != 4)
1160 return -950;
1161
1162 param = param_head->next;
1163
1164 if (pj_strcmp2(&param->name, "p0"))
1165 return -952;
1166 if (pj_strcmp2(&param->value, "a"))
1167 return -953;
1168
1169 param = param->next;
1170 if (pj_strcmp2(&param->name, "p1"))
1171 return -954;
1172 if (pj_strcmp2(&param->value, "\"ab:;cd\""))
1173 return -955;
1174
1175 param = param->next;
1176 if (pj_strcmp2(&param->name, "p2"))
1177 return -956;
1178 if (pj_strcmp2(&param->value, "ab:cd"))
1179 return -957;
1180
1181 param = param->next;
1182 if (pj_strcmp2(&param->name, "p3"))
1183 return -958;
1184 if (pj_strcmp2(&param->value, ""))
1185 return -959;
1186
1187 return 0;
1188}
1189
1190
1191
1192/*
1193 SIMPLE_ADDR_SPEC ";p1=v1\r\n"
1194 */
1195static int hdr_test_contact0(pjsip_hdr *h)
1196{
1197 pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
1198 pjsip_param *param;
1199 int rc;
1200
1201 if (h->type != PJSIP_H_CONTACT)
1202 return -1610;
1203
1204 rc = test_simple_addr_spec(hdr->uri);
1205 if (rc != 0)
1206 return rc;
1207
1208 if (pj_list_size(&hdr->other_param) != 1)
1209 return -1620;
1210
1211 param = hdr->other_param.next;
1212
1213 if (pj_strcmp2(&param->name, "p1"))
1214 return -1630;
1215
1216 if (pj_strcmp2(&param->value, "v1"))
1217 return -1640;
1218
1219 return 0;
1220}
1221
1222/*
1223 NAME_ADDR GENERIC_PARAM "\r\n",
1224 */
1225static int hdr_test_contact1(pjsip_hdr *h)
1226{
1227 pjsip_contact_hdr *hdr = (pjsip_contact_hdr*)h;
1228 int rc;
1229
1230 if (h->type != PJSIP_H_CONTACT)
1231 return -1710;
1232
1233 rc = nameaddr_test(hdr->uri);
1234 if (rc != 0)
1235 return rc;
1236
1237 rc = generic_param_test(&hdr->other_param);
1238 if (rc != 0)
1239 return rc;
1240
1241 return 0;
1242}
1243
1244/*
1245 "10"
1246 */
1247static int hdr_test_content_length(pjsip_hdr *h)
1248{
1249 pjsip_clen_hdr *hdr = (pjsip_clen_hdr*)h;
1250
1251 if (h->type != PJSIP_H_CONTENT_LENGTH)
1252 return -1810;
1253
1254 if (hdr->len != 10)
1255 return -1820;
1256
1257 return 0;
1258}
1259
1260/*
1261 "application/sdp" GENERIC_PARAM,
1262 */
1263static int hdr_test_content_type(pjsip_hdr *h)
1264{
1265 pjsip_ctype_hdr *hdr = (pjsip_ctype_hdr*)h;
1266
1267 if (h->type != PJSIP_H_CONTENT_TYPE)
1268 return -1910;
1269
1270 if (pj_strcmp2(&hdr->media.type, "application"))
1271 return -1920;
1272
1273 if (pj_strcmp2(&hdr->media.subtype, "sdp"))
1274 return -1930;
1275
1276 /* Currently, if the media parameter contains escaped characters,
1277 * pjsip will print the parameter unescaped.
1278 */
1279 PJ_TODO(FIX_PARAMETER_IN_MEDIA_TYPE);
1280
1281 if (pj_strcmp2(&hdr->media.param, ";" GENERIC_PARAM_PARSED))
1282 return -1940;
1283
1284 return 0;
1285}
1286
1287/*
1288 NAME_ADDR GENERIC_PARAM,
1289 */
1290static int hdr_test_from(pjsip_hdr *h)
1291{
1292 pjsip_from_hdr *hdr = (pjsip_from_hdr*)h;
1293 int rc;
1294
1295 if (h->type != PJSIP_H_FROM)
1296 return -2010;
1297
1298 rc = nameaddr_test(hdr->uri);
1299 if (rc != 0)
1300 return rc;
1301
1302 rc = generic_param_test(&hdr->other_param);
1303 if (rc != 0)
1304 return rc;
1305
1306 return 0;
1307}
1308
1309/*
1310 "Digest realm=\"realm\", domain=\"sip:domain\", nonce=\"nonce\", " \
1311 "opaque=\"opaque\", stale=true, algorithm=MD5, qop=\"auth\"",
1312 */
1313static int hdr_test_proxy_authenticate(pjsip_hdr *h)
1314{
1315 pjsip_proxy_authenticate_hdr *hdr = (pjsip_proxy_authenticate_hdr*)h;
1316
1317 if (h->type != PJSIP_H_PROXY_AUTHENTICATE)
1318 return -2110;
1319
1320 if (pj_strcmp2(&hdr->scheme, "Digest"))
1321 return -2120;
1322
1323 if (pj_strcmp2(&hdr->challenge.digest.realm, "realm"))
1324 return -2130;
1325
1326 if (pj_strcmp2(&hdr->challenge.digest.domain, "sip:domain"))
1327 return -2140;
1328
1329 if (pj_strcmp2(&hdr->challenge.digest.nonce, "nonce"))
1330 return -2150;
1331
1332 if (pj_strcmp2(&hdr->challenge.digest.opaque, "opaque"))
1333 return -2160;
1334
1335 if (hdr->challenge.digest.stale != 1)
1336 return -2170;
1337
1338 if (pj_strcmp2(&hdr->challenge.digest.algorithm, "MD5"))
1339 return -2180;
1340
1341 if (pj_strcmp2(&hdr->challenge.digest.qop, "auth"))
1342 return -2190;
1343
1344 return 0;
1345}
1346
1347/*
1348 NAME_ADDR GENERIC_PARAM,
1349 */
1350static int hdr_test_record_route(pjsip_hdr *h)
1351{
1352 pjsip_rr_hdr *hdr = (pjsip_rr_hdr*)h;
1353 int rc;
1354
1355 if (h->type != PJSIP_H_RECORD_ROUTE)
1356 return -2210;
1357
Benny Prijono64898b52007-05-01 06:36:15 +00001358 rc = nameaddr_test(&hdr->name_addr);
Benny Prijono8aea0d92007-04-29 06:23:11 +00001359 if (rc != 0)
1360 return rc;
1361
1362 rc = generic_param_test(&hdr->other_param);
1363 if (rc != 0)
1364 return rc;
1365
1366 return 0;
1367
1368}
1369
1370/*
1371 " \r\n"
1372 */
1373static int hdr_test_supported(pjsip_hdr *h)
1374{
1375 pjsip_supported_hdr *hdr = (pjsip_supported_hdr*)h;
1376
1377 if (h->type != PJSIP_H_SUPPORTED)
1378 return -2310;
1379
1380 if (hdr->count != 0)
1381 return -2320;
1382
1383 return 0;
1384}
1385
1386/*
1387 NAME_ADDR GENERIC_PARAM,
1388 */
1389static int hdr_test_to(pjsip_hdr *h)
1390{
1391 pjsip_to_hdr *hdr = (pjsip_to_hdr*)h;
1392 int rc;
1393
1394 if (h->type != PJSIP_H_TO)
1395 return -2410;
1396
1397 rc = nameaddr_test(hdr->uri);
1398 if (rc != 0)
1399 return rc;
1400
1401 rc = generic_param_test(&hdr->other_param);
1402 if (rc != 0)
1403 return rc;
1404
1405 return 0;
1406}
1407
1408/*
1409 "SIP/2.0 host" GENERIC_PARAM
1410 */
1411static int hdr_test_via(pjsip_hdr *h)
1412{
1413 pjsip_via_hdr *hdr = (pjsip_via_hdr*)h;
1414 int rc;
1415
1416 if (h->type != PJSIP_H_VIA)
1417 return -2510;
1418
1419 if (pj_strcmp2(&hdr->transport, "XYZ"))
1420 return -2515;
1421
1422 if (pj_strcmp2(&hdr->sent_by.host, "host"))
1423 return -2520;
1424
1425 if (hdr->sent_by.port != 0)
1426 return -2530;
1427
1428 rc = generic_param_test(&hdr->other_param);
1429 if (rc != 0)
1430 return rc;
1431
1432 return 0;
1433}
1434
1435
1436static int hdr_test(void)
1437{
1438 unsigned i;
1439
1440 PJ_LOG(3,(THIS_FILE, " testing header parsing.."));
1441
1442 for (i=0; i<PJ_ARRAY_SIZE(hdr_test_data); ++i) {
1443 struct hdr_test_t *test = &hdr_test_data[i];
1444 pj_str_t hname;
1445 int len, parsed_len;
1446 pj_pool_t *pool;
1447 pjsip_hdr *parsed_hdr1=NULL, *parsed_hdr2=NULL;
1448 char *input, *output;
1449 int rc;
1450
1451 pool = pjsip_endpt_create_pool(endpt, NULL, POOL_SIZE, POOL_SIZE);
1452
1453 /* Parse the header */
1454 hname = pj_str(test->hname);
1455 len = strlen(test->hcontent);
Benny Prijonoa1e69682007-05-11 15:14:34 +00001456 parsed_hdr1 = (pjsip_hdr*) pjsip_parse_hdr(pool, &hname,
1457 test->hcontent, len,
1458 &parsed_len);
Benny Prijono8aea0d92007-04-29 06:23:11 +00001459 if (parsed_hdr1 == NULL) {
1460 if (test->flags & HDR_FLAG_PARSE_FAIL) {
1461 pj_pool_release(pool);
1462 continue;
1463 }
1464 PJ_LOG(3,(THIS_FILE, " error parsing header %s: %s", test->hname, test->hcontent));
1465 return -500;
1466 }
1467
1468 /* Test the parsing result */
1469 if (test->test && (rc=test->test(parsed_hdr1)) != 0) {
1470 PJ_LOG(3,(THIS_FILE, " validation failed for header %s: %s", test->hname, test->hcontent));
1471 PJ_LOG(3,(THIS_FILE, " error code is %d", rc));
1472 return -502;
1473 }
1474
Benny Prijono64898b52007-05-01 06:36:15 +00001475#if 1
Benny Prijono8aea0d92007-04-29 06:23:11 +00001476 /* Parse with hshortname, if present */
1477 if (test->hshort_name) {
1478 hname = pj_str(test->hshort_name);
1479 len = strlen(test->hcontent);
Benny Prijonoa1e69682007-05-11 15:14:34 +00001480 parsed_hdr2 = (pjsip_hdr*) pjsip_parse_hdr(pool, &hname, test->hcontent, len, &parsed_len);
Benny Prijono8aea0d92007-04-29 06:23:11 +00001481 if (parsed_hdr2 == NULL) {
1482 PJ_LOG(3,(THIS_FILE, " error parsing header %s: %s", test->hshort_name, test->hcontent));
1483 return -510;
1484 }
1485 }
1486#endif
1487
1488 if (test->flags & HDR_FLAG_DONT_PRINT) {
1489 pj_pool_release(pool);
1490 continue;
1491 }
1492
1493 /* Print the original header */
Benny Prijonoa1e69682007-05-11 15:14:34 +00001494 input = (char*) pj_pool_alloc(pool, 1024);
Benny Prijono8aea0d92007-04-29 06:23:11 +00001495 len = pj_ansi_snprintf(input, 1024, "%s: %s", test->hname, test->hcontent);
1496 if (len < 1 || len >= 1024)
1497 return -520;
1498
1499 /* Print the parsed header*/
Benny Prijonoa1e69682007-05-11 15:14:34 +00001500 output = (char*) pj_pool_alloc(pool, 1024);
Benny Prijono8aea0d92007-04-29 06:23:11 +00001501 len = pjsip_hdr_print_on(parsed_hdr1, output, 1024);
1502 if (len < 1 || len >= 1024) {
1503 PJ_LOG(3,(THIS_FILE, " header too long: %s: %s", test->hname, test->hcontent));
1504 return -530;
1505 }
1506 output[len] = 0;
1507
1508 if (strcmp(input, output) != 0) {
1509 PJ_LOG(3,(THIS_FILE, " header character by character comparison failed."));
1510 PJ_LOG(3,(THIS_FILE, " original header=|%s|", input));
1511 PJ_LOG(3,(THIS_FILE, " parsed header =|%s|", output));
1512 return -540;
1513 }
1514
1515 pj_pool_release(pool);
1516 }
1517
1518 return 0;
1519}
1520
1521
1522/*****************************************************************************/
Benny Prijonoe93e2872006-06-28 16:46:49 +00001523
1524int msg_test(void)
1525{
1526 enum { COUNT = 4, DETECT=0, PARSE=1, PRINT=2 };
1527 struct {
1528 unsigned detect;
1529 unsigned parse;
1530 unsigned print;
1531 } run[COUNT];
1532 unsigned i, max, avg_len;
1533 char desc[250];
1534 pj_status_t status;
1535
Benny Prijonoe93e2872006-06-28 16:46:49 +00001536 status = simple_test();
1537 if (status != PJ_SUCCESS)
1538 return status;
1539
Benny Prijono8aea0d92007-04-29 06:23:11 +00001540 status = hdr_test();
1541 if (status != 0)
1542 return status;
1543
Benny Prijonoe93e2872006-06-28 16:46:49 +00001544 for (i=0; i<COUNT; ++i) {
1545 PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)..", i+1, COUNT));
1546 status = msg_benchmark(&run[i].detect, &run[i].parse, &run[i].print);
1547 if (status != PJ_SUCCESS)
1548 return status;
1549 }
1550
1551 /* Calculate average message length */
1552 for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(test_array); ++i) {
1553 avg_len += test_array[i].len;
1554 }
1555 avg_len /= PJ_ARRAY_SIZE(test_array);
1556
1557
1558 /* Print maximum detect/sec */
1559 for (i=0, max=0; i<COUNT; ++i)
1560 if (run[i].detect > max) max = run[i].detect;
1561
1562 PJ_LOG(3,("", " Maximum message detection/sec=%u", max));
1563
1564 pj_ansi_sprintf(desc, "Number of SIP messages "
1565 "can be pre-parse by <tt>pjsip_find_msg()</tt> "
1566 "per second (tested with %d message sets with "
1567 "average message length of "
Benny Prijono7db431e2006-07-23 14:38:49 +00001568 "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001569 report_ival("msg-detect-per-sec", max, "msg/sec", desc);
1570
1571 /* Print maximum parse/sec */
1572 for (i=0, max=0; i<COUNT; ++i)
1573 if (run[i].parse > max) max = run[i].parse;
1574
1575 PJ_LOG(3,("", " Maximum message parsing/sec=%u", max));
1576
1577 pj_ansi_sprintf(desc, "Number of SIP messages "
1578 "can be <b>parsed</b> by <tt>pjsip_parse_msg()</tt> "
1579 "per second (tested with %d message sets with "
1580 "average message length of "
Benny Prijono7db431e2006-07-23 14:38:49 +00001581 "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001582 report_ival("msg-parse-per-sec", max, "msg/sec", desc);
1583
1584 /* Msg parsing bandwidth */
1585 report_ival("msg-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
1586 "Message parsing bandwidth in megabytes (number of megabytes"
1587 " worth of SIP messages that can be parsed per second). "
1588 "The value is derived from msg-parse-per-sec above.");
1589
1590
1591 /* Print maximum print/sec */
1592 for (i=0, max=0; i<COUNT; ++i)
1593 if (run[i].print > max) max = run[i].print;
1594
1595 PJ_LOG(3,("", " Maximum message print/sec=%u", max));
1596
1597 pj_ansi_sprintf(desc, "Number of SIP messages "
1598 "can be <b>printed</b> by <tt>pjsip_msg_print()</tt>"
1599 " per second (tested with %d message sets with "
1600 "average message length of "
Benny Prijono7db431e2006-07-23 14:38:49 +00001601 "%d bytes)", (int)PJ_ARRAY_SIZE(test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001602
1603 report_ival("msg-print-per-sec", max, "msg/sec", desc);
1604
1605 /* Msg print bandwidth */
1606 report_ival("msg-printed-bandwidth-mb", avg_len*max/1000000, "MB/sec",
1607 "Message print bandwidth in megabytes (total size of "
1608 "SIP messages printed per second). "
1609 "The value is derived from msg-print-per-sec above.");
1610
1611
1612 return PJ_SUCCESS;
1613}
1614
Benny Prijono8aea0d92007-04-29 06:23:11 +00001615
1616
1617