blob: 100a24d0f504fd21df78538b4bb28b97562550b0 [file] [log] [blame]
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001/* $Id$ */
2/*
Benny Prijono32177c02008-06-20 22:44:47 +00003 * Copyright (C) 2003-2008 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 Prijono85598d92006-01-07 18:44:25 +000023#define THIS_FILE "uri_test.c"
24
Benny Prijono5dcb38d2005-11-21 01:55:47 +000025
26#define ALPHANUM "abcdefghijklmnopqrstuvwxyz" \
27 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
28 "0123456789"
29#define MARK "-_.!~*'()"
30#define USER_CHAR ALPHANUM MARK "&=+$,;?/"
31#define PASS_CHAR ALPHANUM MARK "&=+$,"
32#define PARAM_CHAR ALPHANUM MARK "[]/:&+$"
33
Benny Prijono5b917442005-11-21 17:07:18 +000034#define POOL_SIZE 8000
Benny Prijonoe93e2872006-06-28 16:46:49 +000035#if defined(PJ_DEBUG) && PJ_DEBUG!=0
36# define LOOP_COUNT 10000
37#else
38# define LOOP_COUNT 40000
39#endif
Benny Prijono5dcb38d2005-11-21 01:55:47 +000040#define AVERAGE_URL_LEN 80
41#define THREAD_COUNT 4
42
Benny Prijonoe93e2872006-06-28 16:46:49 +000043static struct
44{
45 pj_highprec_t parse_len, print_len, cmp_len;
46 pj_timestamp parse_time, print_time, cmp_time;
47} var;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000048
49
50/* URI creator functions. */
51static pjsip_uri *create_uri0( pj_pool_t *pool );
52static pjsip_uri *create_uri1( pj_pool_t *pool );
53static pjsip_uri *create_uri2( pj_pool_t *pool );
54static pjsip_uri *create_uri3( pj_pool_t *pool );
55static pjsip_uri *create_uri4( pj_pool_t *pool );
56static pjsip_uri *create_uri5( pj_pool_t *pool );
57static pjsip_uri *create_uri6( pj_pool_t *pool );
58static pjsip_uri *create_uri7( pj_pool_t *pool );
59static pjsip_uri *create_uri8( pj_pool_t *pool );
60static pjsip_uri *create_uri9( pj_pool_t *pool );
61static pjsip_uri *create_uri10( pj_pool_t *pool );
62static pjsip_uri *create_uri11( pj_pool_t *pool );
63static pjsip_uri *create_uri12( pj_pool_t *pool );
64static pjsip_uri *create_uri13( pj_pool_t *pool );
65static pjsip_uri *create_uri14( pj_pool_t *pool );
66static pjsip_uri *create_uri15( pj_pool_t *pool );
67static pjsip_uri *create_uri16( pj_pool_t *pool );
68static pjsip_uri *create_uri17( pj_pool_t *pool );
Benny Prijono82458b12005-11-23 20:56:30 +000069static pjsip_uri *create_uri25( pj_pool_t *pool );
70static pjsip_uri *create_uri26( pj_pool_t *pool );
71static pjsip_uri *create_uri27( pj_pool_t *pool );
72static pjsip_uri *create_uri28( pj_pool_t *pool );
73static pjsip_uri *create_uri29( pj_pool_t *pool );
74static pjsip_uri *create_uri30( pj_pool_t *pool );
75static pjsip_uri *create_uri31( pj_pool_t *pool );
76static pjsip_uri *create_uri32( pj_pool_t *pool );
77static pjsip_uri *create_uri33( pj_pool_t *pool );
78static pjsip_uri *create_uri34( pj_pool_t *pool );
Benny Prijonod0bd4982007-12-02 15:40:52 +000079static pjsip_uri *create_uri35( pj_pool_t *pool );
80static pjsip_uri *create_uri36( pj_pool_t *pool );
Benny Prijono3c97d9b2008-09-21 22:01:46 +000081static pjsip_uri *create_uri37( pj_pool_t *pool );
82static pjsip_uri *create_uri38( pj_pool_t *pool );
Benny Prijono5dcb38d2005-11-21 01:55:47 +000083static pjsip_uri *create_dummy( pj_pool_t *pool );
84
85#define ERR_NOT_EQUAL -1001
86#define ERR_SYNTAX_ERR -1002
87
88struct uri_test
89{
90 pj_status_t status;
91 char str[PJSIP_MAX_URL_SIZE];
Benny Prijono82458b12005-11-23 20:56:30 +000092 pjsip_uri *(*creator)(pj_pool_t *pool);
93 const char *printed;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000094 pj_size_t len;
95} uri_test_array[] =
96{
97 {
98 PJ_SUCCESS,
99 "sip:localhost",
100 &create_uri0
101 },
102 {
103 PJ_SUCCESS,
104 "sip:user@localhost",
105 &create_uri1
106 },
107 {
108 PJ_SUCCESS,
109 "sip:user:password@localhost:5060",
Benny Prijono5b917442005-11-21 17:07:18 +0000110 &create_uri2, },
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000111 {
112 /* Port is specified should not match unspecified port. */
113 ERR_NOT_EQUAL,
114 "sip:localhost:5060",
115 &create_uri3
116 },
117 {
118 /* All recognized parameters. */
119 PJ_SUCCESS,
120 "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK",
121 &create_uri4
122 },
123 {
124 /* Params mixed with other params and header params. */
125 PJ_SUCCESS,
126 "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
127 "?Subject=Hello%20There&Server=SIP%20Server",
128 &create_uri5
129 },
130 {
131 /* SIPS. */
132 PJ_SUCCESS,
133 "sips:localhost",
134 &create_uri6,
135 },
136 {
137 /* Name address */
138 PJ_SUCCESS,
139 "<sip:localhost>",
140 &create_uri7
141 },
142 {
143 /* Name address with display name and SIPS scheme with some redundant
144 * whitespaced.
145 */
146 PJ_SUCCESS,
147 " Power Administrator <sips:localhost>",
148 &create_uri8
149 },
150 {
151 /* Name address. */
152 PJ_SUCCESS,
153 " \"User\" <sip:user@localhost:5071>",
154 &create_uri9
155 },
156 {
157 /* Escaped sequence in display name (display=Strange User\"\\\"). */
158 PJ_SUCCESS,
159 " \"Strange User\\\"\\\\\\\"\" <sip:localhost>",
160 &create_uri10,
161 },
162 {
163 /* Errorneous escaping in display name. */
164 ERR_SYNTAX_ERR,
165 " \"Rogue User\\\" <sip:localhost>",
166 &create_uri11,
167 },
168 {
169 /* Dangling quote in display name, but that should be OK. */
170 PJ_SUCCESS,
171 "Strange User\" <sip:localhost>",
172 &create_uri12,
173 },
174 {
175 /* Special characters in parameter value must be quoted. */
176 PJ_SUCCESS,
177 "sip:localhost;pvalue=\"hello world\"",
178 &create_uri13,
179 },
180 {
181 /* Excercise strange character sets allowed in display, user, password,
182 * host, and port.
183 */
184 PJ_SUCCESS,
185 "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@"
186 "my_proxy09.MY-domain.com:9801>",
187 &create_uri14,
188 },
189 {
190 /* Another excercise to the allowed character sets to the hostname. */
191 PJ_SUCCESS,
192 "sip:" ALPHANUM "-_.com",
193 &create_uri15,
194 },
195 {
196 /* Another excercise to the allowed character sets to the username
197 * and password.
198 */
199 PJ_SUCCESS,
200 "sip:" USER_CHAR ":" PASS_CHAR "@host",
201 &create_uri16,
202 },
203 {
204 /* Excercise to the pname and pvalue, and mixup of other-param
205 * between 'recognized' params.
206 */
207 PJ_SUCCESS,
208 "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21"
209 ";lr;other=1;transport=sctp;other2",
210 &create_uri17,
211 },
212 {
213 /* 18: This should trigger syntax error. */
214 ERR_SYNTAX_ERR,
215 "sip:",
216 &create_dummy,
217 },
218 {
219 /* 19: Syntax error: whitespace after scheme. */
220 ERR_SYNTAX_ERR,
221 "sip :host",
222 &create_dummy,
223 },
224 {
225 /* 20: Syntax error: whitespace before hostname. */
226 ERR_SYNTAX_ERR,
227 "sip: host",
228 &create_dummy,
229 },
230 {
231 /* 21: Syntax error: invalid port. */
232 ERR_SYNTAX_ERR,
233 "sip:user:password",
234 &create_dummy,
235 },
236 {
237 /* 22: Syntax error: no host. */
238 ERR_SYNTAX_ERR,
239 "sip:user@",
240 &create_dummy,
241 },
242 {
243 /* 23: Syntax error: no user/host. */
244 ERR_SYNTAX_ERR,
245 "sip:@",
246 &create_dummy,
247 },
248 {
249 /* 24: Syntax error: empty string. */
250 ERR_SYNTAX_ERR,
251 "",
252 &create_dummy,
Benny Prijono82458b12005-11-23 20:56:30 +0000253 },
254 {
255 /* 25: Simple tel: URI with global context */
256 PJ_SUCCESS,
257 "tel:+1-201-555-0123",
258 &create_uri25,
259 "tel:+1-201-555-0123"
260 },
261 {
262 /* 26: Simple tel: URI with local context */
263 PJ_SUCCESS,
264 "tel:7042;phone-context=example.com",
265 &create_uri26,
266 "tel:7042;phone-context=example.com"
267 },
268 {
269 /* 27: Simple tel: URI with local context */
270 PJ_SUCCESS,
271 "tel:863-1234;phone-context=+1-914-555",
272 &create_uri27,
273 "tel:863-1234;phone-context=+1-914-555"
274 },
275 {
276 /* 28: Comparison between local and global number */
277 ERR_NOT_EQUAL,
278 "tel:+1",
279 &create_uri28,
280 "tel:+1"
281 },
282 {
283 /* 29: tel: with some visual chars and spaces */
284 PJ_SUCCESS,
285 "tel:(44).1234-*#+Deaf",
286 &create_uri29,
287 "tel:(44).1234-*#+Deaf"
288 },
289 {
290 /* 30: isub parameters */
291 PJ_SUCCESS,
292 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=",
293 &create_uri30,
Benny Prijono9b446222006-07-18 16:08:50 +0000294 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1!+%3d"
Benny Prijono82458b12005-11-23 20:56:30 +0000295 },
296 {
297 /* 31: extension number parsing and encoding */
298 PJ_SUCCESS,
299 "tel:+1;ext=+123",
300 &create_uri31,
301 "tel:+1;ext=%2b123"
302 },
303 {
304 /* 32: context parameter parsing and encoding */
305 PJ_SUCCESS,
306 "tel:911;phone-context=+1-911",
307 &create_uri32,
308 "tel:911;phone-context=+1-911"
309 },
310 {
311 /* 33: case-insensitive comparison */
312 PJ_SUCCESS,
313 "tel:911;phone-context=emergency.example.com",
314 &create_uri33,
315 "tel:911;phone-context=emergency.example.com"
316 },
317 {
318 /* 34: parameter only appears in one URL */
319 ERR_NOT_EQUAL,
320 "tel:911;p1=p1;p2=p2",
321 &create_uri34,
322 "tel:911;p1=p1;p2=p2"
323 },
Benny Prijonod0bd4982007-12-02 15:40:52 +0000324 {
325 /* 35: IPv6 in host and maddr parameter */
326 PJ_SUCCESS,
327 "sip:user@[::1];maddr=[::01]",
328 &create_uri35,
329 "sip:user@[::1];maddr=[::01]"
330 },
331 {
332 /* 36: IPv6 in host and maddr, without username */
333 PJ_SUCCESS,
334 "sip:[::1];maddr=[::01]",
335 &create_uri36,
336 "sip:[::1];maddr=[::01]"
Benny Prijono3c97d9b2008-09-21 22:01:46 +0000337 },
338 {
339 /* 37: Non-ASCII UTF-8 in display name, with quote */
340 PJ_SUCCESS,
341 "\"\xC0\x81\" <sip:localhost>",
342 &create_uri37,
343 "\"\xC0\x81\" <sip:localhost>"
344 },
345 {
346 /* 38: Non-ASCII UTF-8 in display name, without quote */
347 PJ_SUCCESS,
348 "\xC0\x81 <sip:localhost>",
349 &create_uri38,
350 "\"\xC0\x81\" <sip:localhost>"
Benny Prijonod0bd4982007-12-02 15:40:52 +0000351 }
352
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000353};
354
355static pjsip_uri *create_uri0(pj_pool_t *pool)
356{
357 /* "sip:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000358 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000359
360 pj_strdup2(pool, &url->host, "localhost");
361 return (pjsip_uri*)url;
362}
363
364static pjsip_uri *create_uri1(pj_pool_t *pool)
365{
366 /* "sip:user@localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000367 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000368
369 pj_strdup2( pool, &url->user, "user");
370 pj_strdup2( pool, &url->host, "localhost");
371
372 return (pjsip_uri*) url;
373}
374
375static pjsip_uri *create_uri2(pj_pool_t *pool)
376{
377 /* "sip:user:password@localhost:5060" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000378 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000379
380 pj_strdup2( pool, &url->user, "user");
381 pj_strdup2( pool, &url->passwd, "password");
382 pj_strdup2( pool, &url->host, "localhost");
383 url->port = 5060;
384
385 return (pjsip_uri*) url;
386}
387
388static pjsip_uri *create_uri3(pj_pool_t *pool)
389{
390 /* Like: "sip:localhost:5060", but without the port. */
Benny Prijono40f2f642006-01-30 18:40:05 +0000391 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000392
393 pj_strdup2(pool, &url->host, "localhost");
394 return (pjsip_uri*)url;
395}
396
397static pjsip_uri *create_uri4(pj_pool_t *pool)
398{
399 /* "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000400 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000401
402 pj_strdup2(pool, &url->host, "localhost");
403 pj_strdup2(pool, &url->transport_param, "tcp");
404 pj_strdup2(pool, &url->user_param, "ip");
405 url->ttl_param = 255;
406 url->lr_param = 1;
407 pj_strdup2(pool, &url->maddr_param, "127.0.0.1");
408 pj_strdup2(pool, &url->method_param, "ACK");
409
410 return (pjsip_uri*)url;
411}
412
413#define param_add(list,pname,pvalue) \
414 do { \
415 pjsip_param *param; \
Benny Prijonoa1e69682007-05-11 15:14:34 +0000416 param=PJ_POOL_ALLOC_T(pool, pjsip_param); \
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000417 param->name = pj_str(pname); \
418 param->value = pj_str(pvalue); \
419 pj_list_insert_before(&list, param); \
420 } while (0)
421
422static pjsip_uri *create_uri5(pj_pool_t *pool)
423{
424 /* "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
425 "?Subject=Hello%20There&Server=SIP%20Server"
426 */
Benny Prijono40f2f642006-01-30 18:40:05 +0000427 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000428
429 pj_strdup2(pool, &url->host, "localhost");
430 pj_strdup2(pool, &url->user_param, "phone");
431
432 //pj_strdup2(pool, &url->other_param, ";pickup=hurry;message=I%20am%20sorry");
433 param_add(url->other_param, "pickup", "hurry");
434 param_add(url->other_param, "message", "I am sorry");
435
436 //pj_strdup2(pool, &url->header_param, "?Subject=Hello%20There&Server=SIP%20Server");
437 param_add(url->header_param, "Subject", "Hello There");
438 param_add(url->header_param, "Server", "SIP Server");
439 return (pjsip_uri*)url;
440
441}
442
443static pjsip_uri *create_uri6(pj_pool_t *pool)
444{
445 /* "sips:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000446 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000447
448 pj_strdup2(pool, &url->host, "localhost");
449 return (pjsip_uri*)url;
450}
451
452static pjsip_uri *create_uri7(pj_pool_t *pool)
453{
454 /* "<sip:localhost>" */
455 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000456 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000457
Benny Prijono40f2f642006-01-30 18:40:05 +0000458 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000459 name_addr->uri = (pjsip_uri*) url;
460
461 pj_strdup2(pool, &url->host, "localhost");
462 return (pjsip_uri*)name_addr;
463}
464
465static pjsip_uri *create_uri8(pj_pool_t *pool)
466{
467 /* " Power Administrator <sips:localhost>" */
468 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000469 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000470
Benny Prijono40f2f642006-01-30 18:40:05 +0000471 url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000472 name_addr->uri = (pjsip_uri*) url;
473
474 pj_strdup2(pool, &name_addr->display, "Power Administrator");
475 pj_strdup2(pool, &url->host, "localhost");
476 return (pjsip_uri*)name_addr;
477}
478
479static pjsip_uri *create_uri9(pj_pool_t *pool)
480{
481 /* " \"User\" <sip:user@localhost:5071>" */
482 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000483 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000484
Benny Prijono40f2f642006-01-30 18:40:05 +0000485 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000486 name_addr->uri = (pjsip_uri*) url;
487
488 pj_strdup2(pool, &name_addr->display, "User");
489 pj_strdup2(pool, &url->user, "user");
490 pj_strdup2(pool, &url->host, "localhost");
491 url->port = 5071;
492 return (pjsip_uri*)name_addr;
493}
494
495static pjsip_uri *create_uri10(pj_pool_t *pool)
496{
497 /* " \"Strange User\\\"\\\\\\\"\" <sip:localhost>" */
498 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000499 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000500
Benny Prijono40f2f642006-01-30 18:40:05 +0000501 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000502 name_addr->uri = (pjsip_uri*) url;
503
504 pj_strdup2(pool, &name_addr->display, "Strange User\\\"\\\\\\\"");
505 pj_strdup2(pool, &url->host, "localhost");
506 return (pjsip_uri*)name_addr;
507}
508
509static pjsip_uri *create_uri11(pj_pool_t *pool)
510{
511 /* " \"Rogue User\\\" <sip:localhost>" */
512 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000513 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000514
Benny Prijono40f2f642006-01-30 18:40:05 +0000515 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000516 name_addr->uri = (pjsip_uri*) url;
517
518 pj_strdup2(pool, &name_addr->display, "Rogue User\\");
519 pj_strdup2(pool, &url->host, "localhost");
520 return (pjsip_uri*)name_addr;
521}
522
523static pjsip_uri *create_uri12(pj_pool_t *pool)
524{
525 /* "Strange User\" <sip:localhost>" */
526 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000527 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000528
Benny Prijono40f2f642006-01-30 18:40:05 +0000529 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000530 name_addr->uri = (pjsip_uri*) url;
531
532 pj_strdup2(pool, &name_addr->display, "Strange User\"");
533 pj_strdup2(pool, &url->host, "localhost");
534 return (pjsip_uri*)name_addr;
535}
536
537static pjsip_uri *create_uri13(pj_pool_t *pool)
538{
539 /* "sip:localhost;pvalue=\"hello world\"" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000540 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000541 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000542 pj_strdup2(pool, &url->host, "localhost");
543 //pj_strdup2(pool, &url->other_param, ";pvalue=\"hello world\"");
Benny Prijono94aee452007-04-29 18:29:14 +0000544 param_add(url->other_param, "pvalue", "\"hello world\"");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000545 return (pjsip_uri*)url;
546}
547
548static pjsip_uri *create_uri14(pj_pool_t *pool)
549{
550 /* "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@my_proxy09.my-domain.com:9801>" */
551 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000552 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000553
Benny Prijono40f2f642006-01-30 18:40:05 +0000554 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000555 name_addr->uri = (pjsip_uri*) url;
556
557 pj_strdup2(pool, &name_addr->display, "This is -. !% *_+`'~ me");
558 pj_strdup2(pool, &url->user, "a19A&=+$,;?/,");
559 pj_strdup2(pool, &url->passwd, "@a&Zz=+$,");
560 pj_strdup2(pool, &url->host, "my_proxy09.MY-domain.com");
561 url->port = 9801;
562 return (pjsip_uri*)name_addr;
563}
564
565static pjsip_uri *create_uri15(pj_pool_t *pool)
566{
567 /* "sip:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.com" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000568 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000569 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000570 pj_strdup2(pool, &url->host, ALPHANUM "-_.com");
571 return (pjsip_uri*)url;
572}
573
574static pjsip_uri *create_uri16(pj_pool_t *pool)
575{
576 /* "sip:" USER_CHAR ":" PASS_CHAR "@host" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000577 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000578 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000579 pj_strdup2(pool, &url->user, USER_CHAR);
580 pj_strdup2(pool, &url->passwd, PASS_CHAR);
581 pj_strdup2(pool, &url->host, "host");
582 return (pjsip_uri*)url;
583}
584
585static pjsip_uri *create_uri17(pj_pool_t *pool)
586{
587 /* "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21;lr;other=1;transport=sctp;other2" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000588 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000589 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000590 pj_strdup2(pool, &url->host, "host");
591 pj_strdup2(pool, &url->user_param, "ip");
592 pj_strdup2(pool, &url->transport_param, "sctp");
593 param_add(url->other_param, PARAM_CHAR "!", PARAM_CHAR "!");
594 param_add(url->other_param, "other", "1");
595 param_add(url->other_param, "other2", "");
596 url->lr_param = 1;
597 return (pjsip_uri*)url;
598}
599
Benny Prijono82458b12005-11-23 20:56:30 +0000600
601static pjsip_uri *create_uri25(pj_pool_t *pool)
602{
603 /* "tel:+1-201-555-0123" */
604 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
605
606 uri->number = pj_str("+1-201-555-0123");
607 return (pjsip_uri*)uri;
608}
609
610static pjsip_uri *create_uri26(pj_pool_t *pool)
611{
612 /* tel:7042;phone-context=example.com */
613 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
614
615 uri->number = pj_str("7042");
616 uri->context = pj_str("example.com");
617 return (pjsip_uri*)uri;
618}
619
620static pjsip_uri *create_uri27(pj_pool_t *pool)
621{
622 /* "tel:863-1234;phone-context=+1-914-555" */
623 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
624
625 uri->number = pj_str("863-1234");
626 uri->context = pj_str("+1-914-555");
627 return (pjsip_uri*)uri;
628}
629
630/* "tel:1" */
631static pjsip_uri *create_uri28(pj_pool_t *pool)
632{
633 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
634
635 uri->number = pj_str("1");
636 return (pjsip_uri*)uri;
637}
638
639/* "tel:(44).1234-*#+Deaf" */
640static pjsip_uri *create_uri29(pj_pool_t *pool)
641{
642 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
643
644 uri->number = pj_str("(44).1234-*#+Deaf");
645 return (pjsip_uri*)uri;
646}
647
648/* "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=" */
649static pjsip_uri *create_uri30(pj_pool_t *pool)
650{
651 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
652
653 uri->number = pj_str("+1");
Benny Prijono9b446222006-07-18 16:08:50 +0000654 uri->isub_param = pj_str("/:@&$,-_.!~*'()[]/:&$aA1!+=");
Benny Prijono82458b12005-11-23 20:56:30 +0000655 return (pjsip_uri*)uri;
656}
657
658/* "tel:+1;ext=+123" */
659static pjsip_uri *create_uri31(pj_pool_t *pool)
660{
661 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
662
663 uri->number = pj_str("+1");
664 uri->ext_param = pj_str("+123");
665 return (pjsip_uri*)uri;
666}
667
668/* "tel:911;phone-context=+1-911" */
669static pjsip_uri *create_uri32(pj_pool_t *pool)
670{
671 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
672
673 uri->number = pj_str("911");
674 uri->context = pj_str("+1-911");
675 return (pjsip_uri*)uri;
676}
677
678/* "tel:911;phone-context=emergency.example.com" */
679static pjsip_uri *create_uri33(pj_pool_t *pool)
680{
681 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
682
683 uri->number = pj_str("911");
684 uri->context = pj_str("EMERGENCY.EXAMPLE.COM");
685 return (pjsip_uri*)uri;
686}
687
688/* "tel:911;p1=p1;p2=p2" */
689static pjsip_uri *create_uri34(pj_pool_t *pool)
690{
691 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
692 pjsip_param *p;
693
694 uri->number = pj_str("911");
695
Benny Prijonoa1e69682007-05-11 15:14:34 +0000696 p = PJ_POOL_ALLOC_T(pool, pjsip_param);
Benny Prijono82458b12005-11-23 20:56:30 +0000697 p->name = p->value = pj_str("p1");
698 pj_list_insert_before(&uri->other_param, p);
699
700 return (pjsip_uri*)uri;
701}
702
Benny Prijonod0bd4982007-12-02 15:40:52 +0000703/* "sip:user@[::1];maddr=[::01]" */
704static pjsip_uri *create_uri35( pj_pool_t *pool )
705{
706 pjsip_sip_uri *url;
707 url = pjsip_sip_uri_create(pool, 0);
708 url->user = pj_str("user");
709 url->host = pj_str("::1");
710 url->maddr_param = pj_str("::01");
711 return (pjsip_uri*)url;
712}
713
714/* "sip:[::1];maddr=[::01]" */
715static pjsip_uri *create_uri36( pj_pool_t *pool )
716{
717 pjsip_sip_uri *url;
718 url = pjsip_sip_uri_create(pool, 0);
719 url->host = pj_str("::1");
720 url->maddr_param = pj_str("::01");
721 return (pjsip_uri*)url;
722
723}
Benny Prijono82458b12005-11-23 20:56:30 +0000724
Benny Prijono3c97d9b2008-09-21 22:01:46 +0000725/* "\"\xC0\x81\" <sip:localhost>" */
726static pjsip_uri *create_uri37( pj_pool_t *pool )
727{
728 pjsip_name_addr *name;
729 pjsip_sip_uri *url;
730
731 name = pjsip_name_addr_create(pool);
732 name->display = pj_str("\xC0\x81");
733
734 url = pjsip_sip_uri_create(pool, 0);
735 url->host = pj_str("localhost");
736
737 name->uri = (pjsip_uri*)url;
738
739 return (pjsip_uri*)name;
740
741}
742
743/* "\xC0\x81 <sip:localhost>" */
744static pjsip_uri *create_uri38( pj_pool_t *pool )
745{
746 pjsip_name_addr *name;
747 pjsip_sip_uri *url;
748
749 name = pjsip_name_addr_create(pool);
750 name->display = pj_str("\xC0\x81");
751
752 url = pjsip_sip_uri_create(pool, 0);
753 url->host = pj_str("localhost");
754
755 name->uri = (pjsip_uri*)url;
756
757 return (pjsip_uri*)name;
758
759}
760
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000761static pjsip_uri *create_dummy(pj_pool_t *pool)
762{
763 PJ_UNUSED_ARG(pool);
764 return NULL;
765}
766
767/*****************************************************************************/
768
769/*
770 * Test one test entry.
771 */
772static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
773{
774 pj_status_t status;
775 int len;
Benny Prijonoed76f512006-07-05 21:42:45 +0000776 char *input;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000777 pjsip_uri *parsed_uri, *ref_uri;
778 pj_str_t s1 = {NULL, 0}, s2 = {NULL, 0};
779 pj_timestamp t1, t2;
780
Benny Prijonoed76f512006-07-05 21:42:45 +0000781 if (entry->len == 0)
Nanang Izzuddin4d535bb2008-09-16 18:09:22 +0000782 entry->len = pj_ansi_strlen(entry->str);
Benny Prijonoed76f512006-07-05 21:42:45 +0000783
784#if defined(PJSIP_UNESCAPE_IN_PLACE) && PJSIP_UNESCAPE_IN_PLACE!=0
785 input = pj_pool_alloc(pool, entry->len + 1);
786 pj_memcpy(input, entry->str, entry->len);
787 input[entry->len] = '\0';
788#else
789 input = entry->str;
790#endif
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000791
792 /* Parse URI text. */
793 pj_get_timestamp(&t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000794 var.parse_len = var.parse_len + entry->len;
Benny Prijonoed76f512006-07-05 21:42:45 +0000795 parsed_uri = pjsip_parse_uri(pool, input, entry->len, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000796 if (!parsed_uri) {
797 /* Parsing failed. If the entry says that this is expected, then
798 * return OK.
799 */
800 status = entry->status==ERR_SYNTAX_ERR ? PJ_SUCCESS : -10;
801 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000802 PJ_LOG(3,(THIS_FILE, " uri parse error!\n"
803 " uri='%s'\n",
Benny Prijonoed76f512006-07-05 21:42:45 +0000804 input));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000805 }
806 goto on_return;
807 }
808 pj_get_timestamp(&t2);
809 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000810 pj_add_timestamp(&var.parse_time, &t2);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000811
812 /* Create the reference URI. */
813 ref_uri = entry->creator(pool);
814
815 /* Print both URI. */
Benny Prijonoa1e69682007-05-11 15:14:34 +0000816 s1.ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
817 s2.ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000818
819 pj_get_timestamp(&t1);
820 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, parsed_uri, s1.ptr, PJSIP_MAX_URL_SIZE);
821 if (len < 1) {
822 status = -20;
823 goto on_return;
824 }
825 s1.ptr[len] = '\0';
826 s1.slen = len;
827
Benny Prijonoe93e2872006-06-28 16:46:49 +0000828 var.print_len = var.print_len + len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000829 pj_get_timestamp(&t2);
830 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000831 pj_add_timestamp(&var.print_time, &t2);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000832
833 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, ref_uri, s2.ptr, PJSIP_MAX_URL_SIZE);
834 if (len < 1) {
835 status = -30;
836 goto on_return;
837 }
838 s2.ptr[len] = '\0';
839 s2.slen = len;
840
841 /* Full comparison of parsed URI with reference URI. */
Benny Prijono5b917442005-11-21 17:07:18 +0000842 pj_get_timestamp(&t1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000843 status = pjsip_uri_cmp(PJSIP_URI_IN_OTHER, parsed_uri, ref_uri);
844 if (status != 0) {
845 /* Not equal. See if this is the expected status. */
846 status = entry->status==ERR_NOT_EQUAL ? PJ_SUCCESS : -40;
847 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000848 PJ_LOG(3,(THIS_FILE, " uri comparison mismatch, status=%d:\n"
849 " uri1='%s'\n"
850 " uri2='%s'",
851 status, s1.ptr, s2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000852 }
853 goto on_return;
854
855 } else {
856 /* Equal. See if this is the expected status. */
857 status = entry->status==PJ_SUCCESS ? PJ_SUCCESS : -50;
858 if (status != PJ_SUCCESS) {
859 goto on_return;
860 }
861 }
862
Benny Prijonoe93e2872006-06-28 16:46:49 +0000863 var.cmp_len = var.cmp_len + len;
Benny Prijono5b917442005-11-21 17:07:18 +0000864 pj_get_timestamp(&t2);
865 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000866 pj_add_timestamp(&var.cmp_time, &t2);
Benny Prijono5b917442005-11-21 17:07:18 +0000867
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000868 /* Compare text. */
Benny Prijono82458b12005-11-23 20:56:30 +0000869 if (entry->printed) {
870 if (pj_strcmp2(&s1, entry->printed) != 0) {
871 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000872 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
873 " printed='%s'\n"
874 " expectd='%s'",
875 s1.ptr, entry->printed));
Benny Prijono82458b12005-11-23 20:56:30 +0000876 status = -60;
877 }
878 } else {
879 if (pj_strcmp(&s1, &s2) != 0) {
880 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000881 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
882 " uri1='%s'\n"
883 " uri2='%s'",
884 s1.ptr, s2.ptr));
Benny Prijono82458b12005-11-23 20:56:30 +0000885 status = -70;
886 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000887 }
888
889on_return:
890 return status;
891}
892
Benny Prijonoe93e2872006-06-28 16:46:49 +0000893
894static int simple_uri_test(void)
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000895{
Benny Prijonoe93e2872006-06-28 16:46:49 +0000896 unsigned i;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000897 pj_pool_t *pool;
898 pj_status_t status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000899
Benny Prijono85598d92006-01-07 18:44:25 +0000900 PJ_LOG(3,(THIS_FILE, " simple test"));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000901 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
Benny Prijono95c63482006-07-06 14:28:45 +0000902 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000903 status = do_uri_test(pool, &uri_test_array[i]);
Benny Prijono95c63482006-07-06 14:28:45 +0000904 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000905 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000906 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000907 status, i));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000908 return status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000909 }
910 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000911
Benny Prijonoe93e2872006-06-28 16:46:49 +0000912 return 0;
913}
914
Benny Prijonod0bd4982007-12-02 15:40:52 +0000915#if INCLUDE_BENCHMARKS
Benny Prijonoe93e2872006-06-28 16:46:49 +0000916static int uri_benchmark(unsigned *p_parse, unsigned *p_print, unsigned *p_cmp)
917{
918 unsigned i, loop;
Benny Prijonoe93e2872006-06-28 16:46:49 +0000919 pj_status_t status;
920 pj_timestamp zero;
921 pj_time_val elapsed;
922 pj_highprec_t avg_parse, avg_print, avg_cmp, kbytes;
923
Benny Prijonoac623b32006-07-03 15:19:31 +0000924 pj_bzero(&var, sizeof(var));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000925
926 zero.u32.hi = zero.u32.lo = 0;
927
928 var.parse_len = var.print_len = var.cmp_len = 0;
929 var.parse_time.u32.hi = var.parse_time.u32.lo = 0;
930 var.print_time.u32.hi = var.print_time.u32.lo = 0;
931 var.cmp_time.u32.hi = var.cmp_time.u32.lo = 0;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000932 for (loop=0; loop<LOOP_COUNT; ++loop) {
933 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
Benny Prijono95c63482006-07-06 14:28:45 +0000934 pj_pool_t *pool;
935 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000936 status = do_uri_test(pool, &uri_test_array[i]);
Benny Prijono95c63482006-07-06 14:28:45 +0000937 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000938 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000939 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000940 status, i));
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000941 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000942 goto on_return;
943 }
944 }
945 }
946
Benny Prijonoe93e2872006-06-28 16:46:49 +0000947 kbytes = var.parse_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000948 pj_highprec_mod(kbytes, 1000000);
949 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000950 elapsed = pj_elapsed_time(&zero, &var.parse_time);
951 avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000952 pj_highprec_mul(avg_parse, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000953 pj_highprec_div(avg_parse, var.parse_len);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000954 avg_parse = 1000000 / avg_parse;
955
Benny Prijono85598d92006-01-07 18:44:25 +0000956 PJ_LOG(3,(THIS_FILE,
957 " %u.%u MB of urls parsed in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000958 (unsigned)(var.parse_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000959 elapsed.sec, elapsed.msec,
960 (unsigned)avg_parse));
Benny Prijono5b917442005-11-21 17:07:18 +0000961
Benny Prijonoe93e2872006-06-28 16:46:49 +0000962 *p_parse = (unsigned)avg_parse;
963
964 kbytes = var.print_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000965 pj_highprec_mod(kbytes, 1000000);
966 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000967 elapsed = pj_elapsed_time(&zero, &var.print_time);
968 avg_print = pj_elapsed_usec(&zero, &var.print_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000969 pj_highprec_mul(avg_print, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000970 pj_highprec_div(avg_print, var.parse_len);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000971 avg_print = 1000000 / avg_print;
972
Benny Prijono85598d92006-01-07 18:44:25 +0000973 PJ_LOG(3,(THIS_FILE,
974 " %u.%u MB of urls printed in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000975 (unsigned)(var.print_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000976 elapsed.sec, elapsed.msec,
977 (unsigned)avg_print));
Benny Prijono5b917442005-11-21 17:07:18 +0000978
Benny Prijonoe93e2872006-06-28 16:46:49 +0000979 *p_print = (unsigned)avg_print;
980
981 kbytes = var.cmp_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000982 pj_highprec_mod(kbytes, 1000000);
983 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000984 elapsed = pj_elapsed_time(&zero, &var.cmp_time);
985 avg_cmp = pj_elapsed_usec(&zero, &var.cmp_time);
Benny Prijono5b917442005-11-21 17:07:18 +0000986 pj_highprec_mul(avg_cmp, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000987 pj_highprec_div(avg_cmp, var.cmp_len);
Benny Prijono5b917442005-11-21 17:07:18 +0000988 avg_cmp = 1000000 / avg_cmp;
989
Benny Prijono85598d92006-01-07 18:44:25 +0000990 PJ_LOG(3,(THIS_FILE,
991 " %u.%u MB of urls compared in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000992 (unsigned)(var.cmp_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000993 elapsed.sec, elapsed.msec,
994 (unsigned)avg_cmp));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000995
Benny Prijonoe93e2872006-06-28 16:46:49 +0000996 *p_cmp = (unsigned)avg_cmp;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000997
998on_return:
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000999 return status;
1000}
Benny Prijonod0bd4982007-12-02 15:40:52 +00001001#endif /* INCLUDE_BENCHMARKS */
Benny Prijonoe93e2872006-06-28 16:46:49 +00001002
1003/*****************************************************************************/
1004
1005int uri_test(void)
1006{
Benny Prijono9e164c12007-06-19 08:47:53 +00001007 enum { COUNT = 1, DETECT=0, PARSE=1, PRINT=2 };
Benny Prijonoe93e2872006-06-28 16:46:49 +00001008 struct {
1009 unsigned parse;
1010 unsigned print;
1011 unsigned cmp;
1012 } run[COUNT];
1013 unsigned i, max, avg_len;
1014 char desc[200];
1015 pj_status_t status;
1016
1017 status = simple_uri_test();
1018 if (status != PJ_SUCCESS)
1019 return status;
1020
Benny Prijonod0bd4982007-12-02 15:40:52 +00001021#if INCLUDE_BENCHMARKS
Benny Prijonoe93e2872006-06-28 16:46:49 +00001022 for (i=0; i<COUNT; ++i) {
1023 PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)...", i+1, COUNT));
1024 status = uri_benchmark(&run[i].parse, &run[i].print, &run[i].cmp);
1025 if (status != PJ_SUCCESS)
1026 return status;
1027 }
1028
1029 /* Calculate average URI length */
1030 for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
1031 avg_len += uri_test_array[i].len;
1032 }
1033 avg_len /= PJ_ARRAY_SIZE(uri_test_array);
1034
1035
1036 /*
1037 * Print maximum parse/sec
1038 */
1039 for (i=0, max=0; i<COUNT; ++i)
1040 if (run[i].parse > max) max = run[i].parse;
1041
1042 PJ_LOG(3,("", " Maximum URI parse/sec=%u", max));
1043
1044 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>parsed</B> with "
1045 "<tt>pjsip_parse_uri()</tt> per second "
1046 "(tested with %d URI set, with average length of "
1047 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001048 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001049
1050 report_ival("uri-parse-per-sec", max, "URI/sec", desc);
1051
1052 /* URI parsing bandwidth */
1053 report_ival("uri-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
1054 "URI parsing bandwidth in megabytes (number of megabytes "
1055 "worth of URI that can be parsed per second)");
1056
1057
1058 /* Print maximum print/sec */
1059 for (i=0, max=0; i<COUNT; ++i)
1060 if (run[i].print > max) max = run[i].print;
1061
1062 PJ_LOG(3,("", " Maximum URI print/sec=%u", max));
1063
1064 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>printed</B> with "
1065 "<tt>pjsip_uri_print()</tt> per second "
1066 "(tested with %d URI set, with average length of "
1067 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001068 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001069
1070 report_ival("uri-print-per-sec", max, "URI/sec", desc);
1071
1072 /* Print maximum detect/sec */
1073 for (i=0, max=0; i<COUNT; ++i)
1074 if (run[i].cmp > max) max = run[i].cmp;
1075
1076 PJ_LOG(3,("", " Maximum URI comparison/sec=%u", max));
1077
1078 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>compared</B> with "
1079 "<tt>pjsip_uri_cmp()</tt> per second "
1080 "(tested with %d URI set, with average length of "
1081 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001082 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001083
1084 report_ival("uri-cmp-per-sec", max, "URI/sec", desc);
1085
Benny Prijonod0bd4982007-12-02 15:40:52 +00001086#endif /* INCLUDE_BENCHMARKS */
1087
Benny Prijonoe93e2872006-06-28 16:46:49 +00001088 return PJ_SUCCESS;
1089}
1090