blob: d51c6fe528543df8394f99df5e8a1e3399718eef [file] [log] [blame]
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001/* $Id$ */
2/*
Benny Prijono844653c2008-12-23 17:27:53 +00003 * Copyright (C) 2008-2009 Teluu Inc. (http://www.teluu.com)
Benny Prijono32177c02008-06-20 22:44:47 +00004 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
Benny Prijono5dcb38d2005-11-21 01:55:47 +00005 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20#include "test.h"
Benny Prijono40f2f642006-01-30 18:40:05 +000021#include <pjsip.h>
Benny Prijono5dcb38d2005-11-21 01:55:47 +000022#include <pjlib.h>
23
Benny Prijono85598d92006-01-07 18:44:25 +000024#define THIS_FILE "uri_test.c"
25
Benny Prijono5dcb38d2005-11-21 01:55:47 +000026
27#define ALPHANUM "abcdefghijklmnopqrstuvwxyz" \
28 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
29 "0123456789"
30#define MARK "-_.!~*'()"
31#define USER_CHAR ALPHANUM MARK "&=+$,;?/"
32#define PASS_CHAR ALPHANUM MARK "&=+$,"
33#define PARAM_CHAR ALPHANUM MARK "[]/:&+$"
34
Benny Prijono5b917442005-11-21 17:07:18 +000035#define POOL_SIZE 8000
Benny Prijonoe93e2872006-06-28 16:46:49 +000036#if defined(PJ_DEBUG) && PJ_DEBUG!=0
37# define LOOP_COUNT 10000
38#else
39# define LOOP_COUNT 40000
40#endif
Benny Prijono5dcb38d2005-11-21 01:55:47 +000041#define AVERAGE_URL_LEN 80
42#define THREAD_COUNT 4
43
Benny Prijonoe93e2872006-06-28 16:46:49 +000044static struct
45{
46 pj_highprec_t parse_len, print_len, cmp_len;
47 pj_timestamp parse_time, print_time, cmp_time;
48} var;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000049
50
51/* URI creator functions. */
52static pjsip_uri *create_uri0( pj_pool_t *pool );
53static pjsip_uri *create_uri1( pj_pool_t *pool );
54static pjsip_uri *create_uri2( pj_pool_t *pool );
55static pjsip_uri *create_uri3( pj_pool_t *pool );
56static pjsip_uri *create_uri4( pj_pool_t *pool );
57static pjsip_uri *create_uri5( pj_pool_t *pool );
58static pjsip_uri *create_uri6( pj_pool_t *pool );
59static pjsip_uri *create_uri7( pj_pool_t *pool );
60static pjsip_uri *create_uri8( pj_pool_t *pool );
61static pjsip_uri *create_uri9( pj_pool_t *pool );
62static pjsip_uri *create_uri10( pj_pool_t *pool );
63static pjsip_uri *create_uri11( pj_pool_t *pool );
64static pjsip_uri *create_uri12( pj_pool_t *pool );
65static pjsip_uri *create_uri13( pj_pool_t *pool );
66static pjsip_uri *create_uri14( pj_pool_t *pool );
67static pjsip_uri *create_uri15( pj_pool_t *pool );
68static pjsip_uri *create_uri16( pj_pool_t *pool );
69static pjsip_uri *create_uri17( pj_pool_t *pool );
Benny Prijono82458b12005-11-23 20:56:30 +000070static pjsip_uri *create_uri25( pj_pool_t *pool );
71static pjsip_uri *create_uri26( pj_pool_t *pool );
72static pjsip_uri *create_uri27( pj_pool_t *pool );
73static pjsip_uri *create_uri28( pj_pool_t *pool );
74static pjsip_uri *create_uri29( pj_pool_t *pool );
75static pjsip_uri *create_uri30( pj_pool_t *pool );
76static pjsip_uri *create_uri31( pj_pool_t *pool );
77static pjsip_uri *create_uri32( pj_pool_t *pool );
78static pjsip_uri *create_uri33( pj_pool_t *pool );
79static pjsip_uri *create_uri34( pj_pool_t *pool );
Benny Prijonod0bd4982007-12-02 15:40:52 +000080static pjsip_uri *create_uri35( pj_pool_t *pool );
81static pjsip_uri *create_uri36( pj_pool_t *pool );
Benny Prijono3c97d9b2008-09-21 22:01:46 +000082static pjsip_uri *create_uri37( pj_pool_t *pool );
83static pjsip_uri *create_uri38( pj_pool_t *pool );
Benny Prijono5dcb38d2005-11-21 01:55:47 +000084static pjsip_uri *create_dummy( pj_pool_t *pool );
85
86#define ERR_NOT_EQUAL -1001
87#define ERR_SYNTAX_ERR -1002
88
89struct uri_test
90{
91 pj_status_t status;
92 char str[PJSIP_MAX_URL_SIZE];
Benny Prijono82458b12005-11-23 20:56:30 +000093 pjsip_uri *(*creator)(pj_pool_t *pool);
94 const char *printed;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000095 pj_size_t len;
96} uri_test_array[] =
97{
98 {
99 PJ_SUCCESS,
100 "sip:localhost",
101 &create_uri0
102 },
103 {
104 PJ_SUCCESS,
105 "sip:user@localhost",
106 &create_uri1
107 },
108 {
109 PJ_SUCCESS,
110 "sip:user:password@localhost:5060",
Benny Prijono5b917442005-11-21 17:07:18 +0000111 &create_uri2, },
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000112 {
113 /* Port is specified should not match unspecified port. */
114 ERR_NOT_EQUAL,
115 "sip:localhost:5060",
116 &create_uri3
117 },
118 {
119 /* All recognized parameters. */
120 PJ_SUCCESS,
121 "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK",
122 &create_uri4
123 },
124 {
125 /* Params mixed with other params and header params. */
126 PJ_SUCCESS,
127 "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
128 "?Subject=Hello%20There&Server=SIP%20Server",
129 &create_uri5
130 },
131 {
132 /* SIPS. */
133 PJ_SUCCESS,
134 "sips:localhost",
135 &create_uri6,
136 },
137 {
138 /* Name address */
139 PJ_SUCCESS,
140 "<sip:localhost>",
141 &create_uri7
142 },
143 {
144 /* Name address with display name and SIPS scheme with some redundant
145 * whitespaced.
146 */
147 PJ_SUCCESS,
148 " Power Administrator <sips:localhost>",
149 &create_uri8
150 },
151 {
152 /* Name address. */
153 PJ_SUCCESS,
154 " \"User\" <sip:user@localhost:5071>",
155 &create_uri9
156 },
157 {
158 /* Escaped sequence in display name (display=Strange User\"\\\"). */
159 PJ_SUCCESS,
160 " \"Strange User\\\"\\\\\\\"\" <sip:localhost>",
161 &create_uri10,
162 },
163 {
164 /* Errorneous escaping in display name. */
165 ERR_SYNTAX_ERR,
166 " \"Rogue User\\\" <sip:localhost>",
167 &create_uri11,
168 },
169 {
170 /* Dangling quote in display name, but that should be OK. */
171 PJ_SUCCESS,
172 "Strange User\" <sip:localhost>",
173 &create_uri12,
174 },
175 {
176 /* Special characters in parameter value must be quoted. */
177 PJ_SUCCESS,
178 "sip:localhost;pvalue=\"hello world\"",
179 &create_uri13,
180 },
181 {
182 /* Excercise strange character sets allowed in display, user, password,
183 * host, and port.
184 */
185 PJ_SUCCESS,
186 "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@"
187 "my_proxy09.MY-domain.com:9801>",
188 &create_uri14,
189 },
190 {
191 /* Another excercise to the allowed character sets to the hostname. */
192 PJ_SUCCESS,
193 "sip:" ALPHANUM "-_.com",
194 &create_uri15,
195 },
196 {
197 /* Another excercise to the allowed character sets to the username
198 * and password.
199 */
200 PJ_SUCCESS,
201 "sip:" USER_CHAR ":" PASS_CHAR "@host",
202 &create_uri16,
203 },
204 {
205 /* Excercise to the pname and pvalue, and mixup of other-param
206 * between 'recognized' params.
207 */
208 PJ_SUCCESS,
209 "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21"
210 ";lr;other=1;transport=sctp;other2",
211 &create_uri17,
212 },
213 {
214 /* 18: This should trigger syntax error. */
215 ERR_SYNTAX_ERR,
216 "sip:",
217 &create_dummy,
218 },
219 {
220 /* 19: Syntax error: whitespace after scheme. */
221 ERR_SYNTAX_ERR,
222 "sip :host",
223 &create_dummy,
224 },
225 {
226 /* 20: Syntax error: whitespace before hostname. */
227 ERR_SYNTAX_ERR,
228 "sip: host",
229 &create_dummy,
230 },
231 {
232 /* 21: Syntax error: invalid port. */
233 ERR_SYNTAX_ERR,
234 "sip:user:password",
235 &create_dummy,
236 },
237 {
238 /* 22: Syntax error: no host. */
239 ERR_SYNTAX_ERR,
240 "sip:user@",
241 &create_dummy,
242 },
243 {
244 /* 23: Syntax error: no user/host. */
245 ERR_SYNTAX_ERR,
246 "sip:@",
247 &create_dummy,
248 },
249 {
250 /* 24: Syntax error: empty string. */
251 ERR_SYNTAX_ERR,
252 "",
253 &create_dummy,
Benny Prijono82458b12005-11-23 20:56:30 +0000254 },
255 {
256 /* 25: Simple tel: URI with global context */
257 PJ_SUCCESS,
258 "tel:+1-201-555-0123",
259 &create_uri25,
260 "tel:+1-201-555-0123"
261 },
262 {
263 /* 26: Simple tel: URI with local context */
264 PJ_SUCCESS,
265 "tel:7042;phone-context=example.com",
266 &create_uri26,
267 "tel:7042;phone-context=example.com"
268 },
269 {
270 /* 27: Simple tel: URI with local context */
271 PJ_SUCCESS,
272 "tel:863-1234;phone-context=+1-914-555",
273 &create_uri27,
274 "tel:863-1234;phone-context=+1-914-555"
275 },
276 {
277 /* 28: Comparison between local and global number */
278 ERR_NOT_EQUAL,
279 "tel:+1",
280 &create_uri28,
281 "tel:+1"
282 },
283 {
284 /* 29: tel: with some visual chars and spaces */
285 PJ_SUCCESS,
286 "tel:(44).1234-*#+Deaf",
287 &create_uri29,
288 "tel:(44).1234-*#+Deaf"
289 },
290 {
291 /* 30: isub parameters */
292 PJ_SUCCESS,
293 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=",
294 &create_uri30,
Benny Prijono9b446222006-07-18 16:08:50 +0000295 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1!+%3d"
Benny Prijono82458b12005-11-23 20:56:30 +0000296 },
297 {
298 /* 31: extension number parsing and encoding */
299 PJ_SUCCESS,
300 "tel:+1;ext=+123",
301 &create_uri31,
302 "tel:+1;ext=%2b123"
303 },
304 {
305 /* 32: context parameter parsing and encoding */
306 PJ_SUCCESS,
307 "tel:911;phone-context=+1-911",
308 &create_uri32,
309 "tel:911;phone-context=+1-911"
310 },
311 {
312 /* 33: case-insensitive comparison */
313 PJ_SUCCESS,
314 "tel:911;phone-context=emergency.example.com",
315 &create_uri33,
316 "tel:911;phone-context=emergency.example.com"
317 },
318 {
319 /* 34: parameter only appears in one URL */
320 ERR_NOT_EQUAL,
321 "tel:911;p1=p1;p2=p2",
322 &create_uri34,
323 "tel:911;p1=p1;p2=p2"
324 },
Benny Prijonod0bd4982007-12-02 15:40:52 +0000325 {
326 /* 35: IPv6 in host and maddr parameter */
327 PJ_SUCCESS,
328 "sip:user@[::1];maddr=[::01]",
329 &create_uri35,
330 "sip:user@[::1];maddr=[::01]"
331 },
332 {
333 /* 36: IPv6 in host and maddr, without username */
334 PJ_SUCCESS,
335 "sip:[::1];maddr=[::01]",
336 &create_uri36,
337 "sip:[::1];maddr=[::01]"
Benny Prijono3c97d9b2008-09-21 22:01:46 +0000338 },
339 {
340 /* 37: Non-ASCII UTF-8 in display name, with quote */
341 PJ_SUCCESS,
342 "\"\xC0\x81\" <sip:localhost>",
343 &create_uri37,
344 "\"\xC0\x81\" <sip:localhost>"
345 },
346 {
347 /* 38: Non-ASCII UTF-8 in display name, without quote */
348 PJ_SUCCESS,
349 "\xC0\x81 <sip:localhost>",
350 &create_uri38,
351 "\"\xC0\x81\" <sip:localhost>"
Benny Prijonod0bd4982007-12-02 15:40:52 +0000352 }
353
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000354};
355
356static pjsip_uri *create_uri0(pj_pool_t *pool)
357{
358 /* "sip:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000359 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000360
361 pj_strdup2(pool, &url->host, "localhost");
362 return (pjsip_uri*)url;
363}
364
365static pjsip_uri *create_uri1(pj_pool_t *pool)
366{
367 /* "sip:user@localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000368 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000369
370 pj_strdup2( pool, &url->user, "user");
371 pj_strdup2( pool, &url->host, "localhost");
372
373 return (pjsip_uri*) url;
374}
375
376static pjsip_uri *create_uri2(pj_pool_t *pool)
377{
378 /* "sip:user:password@localhost:5060" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000379 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000380
381 pj_strdup2( pool, &url->user, "user");
382 pj_strdup2( pool, &url->passwd, "password");
383 pj_strdup2( pool, &url->host, "localhost");
384 url->port = 5060;
385
386 return (pjsip_uri*) url;
387}
388
389static pjsip_uri *create_uri3(pj_pool_t *pool)
390{
391 /* Like: "sip:localhost:5060", but without the port. */
Benny Prijono40f2f642006-01-30 18:40:05 +0000392 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000393
394 pj_strdup2(pool, &url->host, "localhost");
395 return (pjsip_uri*)url;
396}
397
398static pjsip_uri *create_uri4(pj_pool_t *pool)
399{
400 /* "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000401 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000402
403 pj_strdup2(pool, &url->host, "localhost");
404 pj_strdup2(pool, &url->transport_param, "tcp");
405 pj_strdup2(pool, &url->user_param, "ip");
406 url->ttl_param = 255;
407 url->lr_param = 1;
408 pj_strdup2(pool, &url->maddr_param, "127.0.0.1");
409 pj_strdup2(pool, &url->method_param, "ACK");
410
411 return (pjsip_uri*)url;
412}
413
414#define param_add(list,pname,pvalue) \
415 do { \
416 pjsip_param *param; \
Benny Prijonoa1e69682007-05-11 15:14:34 +0000417 param=PJ_POOL_ALLOC_T(pool, pjsip_param); \
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000418 param->name = pj_str(pname); \
419 param->value = pj_str(pvalue); \
420 pj_list_insert_before(&list, param); \
421 } while (0)
422
423static pjsip_uri *create_uri5(pj_pool_t *pool)
424{
425 /* "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
426 "?Subject=Hello%20There&Server=SIP%20Server"
427 */
Benny Prijono40f2f642006-01-30 18:40:05 +0000428 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000429
430 pj_strdup2(pool, &url->host, "localhost");
431 pj_strdup2(pool, &url->user_param, "phone");
432
433 //pj_strdup2(pool, &url->other_param, ";pickup=hurry;message=I%20am%20sorry");
434 param_add(url->other_param, "pickup", "hurry");
435 param_add(url->other_param, "message", "I am sorry");
436
437 //pj_strdup2(pool, &url->header_param, "?Subject=Hello%20There&Server=SIP%20Server");
438 param_add(url->header_param, "Subject", "Hello There");
439 param_add(url->header_param, "Server", "SIP Server");
440 return (pjsip_uri*)url;
441
442}
443
444static pjsip_uri *create_uri6(pj_pool_t *pool)
445{
446 /* "sips:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000447 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000448
449 pj_strdup2(pool, &url->host, "localhost");
450 return (pjsip_uri*)url;
451}
452
453static pjsip_uri *create_uri7(pj_pool_t *pool)
454{
455 /* "<sip:localhost>" */
456 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000457 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000458
Benny Prijono40f2f642006-01-30 18:40:05 +0000459 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000460 name_addr->uri = (pjsip_uri*) url;
461
462 pj_strdup2(pool, &url->host, "localhost");
463 return (pjsip_uri*)name_addr;
464}
465
466static pjsip_uri *create_uri8(pj_pool_t *pool)
467{
468 /* " Power Administrator <sips:localhost>" */
469 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000470 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000471
Benny Prijono40f2f642006-01-30 18:40:05 +0000472 url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000473 name_addr->uri = (pjsip_uri*) url;
474
475 pj_strdup2(pool, &name_addr->display, "Power Administrator");
476 pj_strdup2(pool, &url->host, "localhost");
477 return (pjsip_uri*)name_addr;
478}
479
480static pjsip_uri *create_uri9(pj_pool_t *pool)
481{
482 /* " \"User\" <sip:user@localhost:5071>" */
483 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000484 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000485
Benny Prijono40f2f642006-01-30 18:40:05 +0000486 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000487 name_addr->uri = (pjsip_uri*) url;
488
489 pj_strdup2(pool, &name_addr->display, "User");
490 pj_strdup2(pool, &url->user, "user");
491 pj_strdup2(pool, &url->host, "localhost");
492 url->port = 5071;
493 return (pjsip_uri*)name_addr;
494}
495
496static pjsip_uri *create_uri10(pj_pool_t *pool)
497{
498 /* " \"Strange User\\\"\\\\\\\"\" <sip:localhost>" */
499 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000500 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000501
Benny Prijono40f2f642006-01-30 18:40:05 +0000502 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000503 name_addr->uri = (pjsip_uri*) url;
504
505 pj_strdup2(pool, &name_addr->display, "Strange User\\\"\\\\\\\"");
506 pj_strdup2(pool, &url->host, "localhost");
507 return (pjsip_uri*)name_addr;
508}
509
510static pjsip_uri *create_uri11(pj_pool_t *pool)
511{
512 /* " \"Rogue User\\\" <sip:localhost>" */
513 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000514 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000515
Benny Prijono40f2f642006-01-30 18:40:05 +0000516 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000517 name_addr->uri = (pjsip_uri*) url;
518
519 pj_strdup2(pool, &name_addr->display, "Rogue User\\");
520 pj_strdup2(pool, &url->host, "localhost");
521 return (pjsip_uri*)name_addr;
522}
523
524static pjsip_uri *create_uri12(pj_pool_t *pool)
525{
526 /* "Strange User\" <sip:localhost>" */
527 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000528 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000529
Benny Prijono40f2f642006-01-30 18:40:05 +0000530 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000531 name_addr->uri = (pjsip_uri*) url;
532
533 pj_strdup2(pool, &name_addr->display, "Strange User\"");
534 pj_strdup2(pool, &url->host, "localhost");
535 return (pjsip_uri*)name_addr;
536}
537
538static pjsip_uri *create_uri13(pj_pool_t *pool)
539{
540 /* "sip:localhost;pvalue=\"hello world\"" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000541 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000542 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000543 pj_strdup2(pool, &url->host, "localhost");
544 //pj_strdup2(pool, &url->other_param, ";pvalue=\"hello world\"");
Benny Prijono94aee452007-04-29 18:29:14 +0000545 param_add(url->other_param, "pvalue", "\"hello world\"");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000546 return (pjsip_uri*)url;
547}
548
549static pjsip_uri *create_uri14(pj_pool_t *pool)
550{
551 /* "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@my_proxy09.my-domain.com:9801>" */
552 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000553 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000554
Benny Prijono40f2f642006-01-30 18:40:05 +0000555 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000556 name_addr->uri = (pjsip_uri*) url;
557
558 pj_strdup2(pool, &name_addr->display, "This is -. !% *_+`'~ me");
559 pj_strdup2(pool, &url->user, "a19A&=+$,;?/,");
560 pj_strdup2(pool, &url->passwd, "@a&Zz=+$,");
561 pj_strdup2(pool, &url->host, "my_proxy09.MY-domain.com");
562 url->port = 9801;
563 return (pjsip_uri*)name_addr;
564}
565
566static pjsip_uri *create_uri15(pj_pool_t *pool)
567{
568 /* "sip:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.com" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000569 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000570 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000571 pj_strdup2(pool, &url->host, ALPHANUM "-_.com");
572 return (pjsip_uri*)url;
573}
574
575static pjsip_uri *create_uri16(pj_pool_t *pool)
576{
577 /* "sip:" USER_CHAR ":" PASS_CHAR "@host" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000578 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000579 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000580 pj_strdup2(pool, &url->user, USER_CHAR);
581 pj_strdup2(pool, &url->passwd, PASS_CHAR);
582 pj_strdup2(pool, &url->host, "host");
583 return (pjsip_uri*)url;
584}
585
586static pjsip_uri *create_uri17(pj_pool_t *pool)
587{
588 /* "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21;lr;other=1;transport=sctp;other2" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000589 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000590 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000591 pj_strdup2(pool, &url->host, "host");
592 pj_strdup2(pool, &url->user_param, "ip");
593 pj_strdup2(pool, &url->transport_param, "sctp");
594 param_add(url->other_param, PARAM_CHAR "!", PARAM_CHAR "!");
595 param_add(url->other_param, "other", "1");
596 param_add(url->other_param, "other2", "");
597 url->lr_param = 1;
598 return (pjsip_uri*)url;
599}
600
Benny Prijono82458b12005-11-23 20:56:30 +0000601
602static pjsip_uri *create_uri25(pj_pool_t *pool)
603{
604 /* "tel:+1-201-555-0123" */
605 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
606
607 uri->number = pj_str("+1-201-555-0123");
608 return (pjsip_uri*)uri;
609}
610
611static pjsip_uri *create_uri26(pj_pool_t *pool)
612{
613 /* tel:7042;phone-context=example.com */
614 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
615
616 uri->number = pj_str("7042");
617 uri->context = pj_str("example.com");
618 return (pjsip_uri*)uri;
619}
620
621static pjsip_uri *create_uri27(pj_pool_t *pool)
622{
623 /* "tel:863-1234;phone-context=+1-914-555" */
624 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
625
626 uri->number = pj_str("863-1234");
627 uri->context = pj_str("+1-914-555");
628 return (pjsip_uri*)uri;
629}
630
631/* "tel:1" */
632static pjsip_uri *create_uri28(pj_pool_t *pool)
633{
634 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
635
636 uri->number = pj_str("1");
637 return (pjsip_uri*)uri;
638}
639
640/* "tel:(44).1234-*#+Deaf" */
641static pjsip_uri *create_uri29(pj_pool_t *pool)
642{
643 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
644
645 uri->number = pj_str("(44).1234-*#+Deaf");
646 return (pjsip_uri*)uri;
647}
648
649/* "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=" */
650static pjsip_uri *create_uri30(pj_pool_t *pool)
651{
652 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
653
654 uri->number = pj_str("+1");
Benny Prijono9b446222006-07-18 16:08:50 +0000655 uri->isub_param = pj_str("/:@&$,-_.!~*'()[]/:&$aA1!+=");
Benny Prijono82458b12005-11-23 20:56:30 +0000656 return (pjsip_uri*)uri;
657}
658
659/* "tel:+1;ext=+123" */
660static pjsip_uri *create_uri31(pj_pool_t *pool)
661{
662 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
663
664 uri->number = pj_str("+1");
665 uri->ext_param = pj_str("+123");
666 return (pjsip_uri*)uri;
667}
668
669/* "tel:911;phone-context=+1-911" */
670static pjsip_uri *create_uri32(pj_pool_t *pool)
671{
672 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
673
674 uri->number = pj_str("911");
675 uri->context = pj_str("+1-911");
676 return (pjsip_uri*)uri;
677}
678
679/* "tel:911;phone-context=emergency.example.com" */
680static pjsip_uri *create_uri33(pj_pool_t *pool)
681{
682 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
683
684 uri->number = pj_str("911");
685 uri->context = pj_str("EMERGENCY.EXAMPLE.COM");
686 return (pjsip_uri*)uri;
687}
688
689/* "tel:911;p1=p1;p2=p2" */
690static pjsip_uri *create_uri34(pj_pool_t *pool)
691{
692 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
693 pjsip_param *p;
694
695 uri->number = pj_str("911");
696
Benny Prijonoa1e69682007-05-11 15:14:34 +0000697 p = PJ_POOL_ALLOC_T(pool, pjsip_param);
Benny Prijono82458b12005-11-23 20:56:30 +0000698 p->name = p->value = pj_str("p1");
699 pj_list_insert_before(&uri->other_param, p);
700
701 return (pjsip_uri*)uri;
702}
703
Benny Prijonod0bd4982007-12-02 15:40:52 +0000704/* "sip:user@[::1];maddr=[::01]" */
705static pjsip_uri *create_uri35( pj_pool_t *pool )
706{
707 pjsip_sip_uri *url;
708 url = pjsip_sip_uri_create(pool, 0);
709 url->user = pj_str("user");
710 url->host = pj_str("::1");
711 url->maddr_param = pj_str("::01");
712 return (pjsip_uri*)url;
713}
714
715/* "sip:[::1];maddr=[::01]" */
716static pjsip_uri *create_uri36( pj_pool_t *pool )
717{
718 pjsip_sip_uri *url;
719 url = pjsip_sip_uri_create(pool, 0);
720 url->host = pj_str("::1");
721 url->maddr_param = pj_str("::01");
722 return (pjsip_uri*)url;
723
724}
Benny Prijono82458b12005-11-23 20:56:30 +0000725
Benny Prijono3c97d9b2008-09-21 22:01:46 +0000726/* "\"\xC0\x81\" <sip:localhost>" */
727static pjsip_uri *create_uri37( pj_pool_t *pool )
728{
729 pjsip_name_addr *name;
730 pjsip_sip_uri *url;
731
732 name = pjsip_name_addr_create(pool);
733 name->display = pj_str("\xC0\x81");
734
735 url = pjsip_sip_uri_create(pool, 0);
736 url->host = pj_str("localhost");
737
738 name->uri = (pjsip_uri*)url;
739
740 return (pjsip_uri*)name;
741
742}
743
744/* "\xC0\x81 <sip:localhost>" */
745static pjsip_uri *create_uri38( pj_pool_t *pool )
746{
747 pjsip_name_addr *name;
748 pjsip_sip_uri *url;
749
750 name = pjsip_name_addr_create(pool);
751 name->display = pj_str("\xC0\x81");
752
753 url = pjsip_sip_uri_create(pool, 0);
754 url->host = pj_str("localhost");
755
756 name->uri = (pjsip_uri*)url;
757
758 return (pjsip_uri*)name;
759
760}
761
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000762static pjsip_uri *create_dummy(pj_pool_t *pool)
763{
764 PJ_UNUSED_ARG(pool);
765 return NULL;
766}
767
768/*****************************************************************************/
769
770/*
771 * Test one test entry.
772 */
773static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
774{
775 pj_status_t status;
776 int len;
Benny Prijonoed76f512006-07-05 21:42:45 +0000777 char *input;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000778 pjsip_uri *parsed_uri, *ref_uri;
779 pj_str_t s1 = {NULL, 0}, s2 = {NULL, 0};
780 pj_timestamp t1, t2;
781
Benny Prijonoed76f512006-07-05 21:42:45 +0000782 if (entry->len == 0)
Nanang Izzuddin4d535bb2008-09-16 18:09:22 +0000783 entry->len = pj_ansi_strlen(entry->str);
Benny Prijonoed76f512006-07-05 21:42:45 +0000784
785#if defined(PJSIP_UNESCAPE_IN_PLACE) && PJSIP_UNESCAPE_IN_PLACE!=0
786 input = pj_pool_alloc(pool, entry->len + 1);
787 pj_memcpy(input, entry->str, entry->len);
788 input[entry->len] = '\0';
789#else
790 input = entry->str;
791#endif
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000792
793 /* Parse URI text. */
794 pj_get_timestamp(&t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000795 var.parse_len = var.parse_len + entry->len;
Benny Prijonoed76f512006-07-05 21:42:45 +0000796 parsed_uri = pjsip_parse_uri(pool, input, entry->len, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000797 if (!parsed_uri) {
798 /* Parsing failed. If the entry says that this is expected, then
799 * return OK.
800 */
801 status = entry->status==ERR_SYNTAX_ERR ? PJ_SUCCESS : -10;
802 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000803 PJ_LOG(3,(THIS_FILE, " uri parse error!\n"
804 " uri='%s'\n",
Benny Prijonoed76f512006-07-05 21:42:45 +0000805 input));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000806 }
807 goto on_return;
808 }
809 pj_get_timestamp(&t2);
810 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000811 pj_add_timestamp(&var.parse_time, &t2);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000812
813 /* Create the reference URI. */
814 ref_uri = entry->creator(pool);
815
816 /* Print both URI. */
Benny Prijonoa1e69682007-05-11 15:14:34 +0000817 s1.ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
818 s2.ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000819
820 pj_get_timestamp(&t1);
821 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, parsed_uri, s1.ptr, PJSIP_MAX_URL_SIZE);
822 if (len < 1) {
823 status = -20;
824 goto on_return;
825 }
826 s1.ptr[len] = '\0';
827 s1.slen = len;
828
Benny Prijonoe93e2872006-06-28 16:46:49 +0000829 var.print_len = var.print_len + len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000830 pj_get_timestamp(&t2);
831 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000832 pj_add_timestamp(&var.print_time, &t2);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000833
834 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, ref_uri, s2.ptr, PJSIP_MAX_URL_SIZE);
835 if (len < 1) {
836 status = -30;
837 goto on_return;
838 }
839 s2.ptr[len] = '\0';
840 s2.slen = len;
841
842 /* Full comparison of parsed URI with reference URI. */
Benny Prijono5b917442005-11-21 17:07:18 +0000843 pj_get_timestamp(&t1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000844 status = pjsip_uri_cmp(PJSIP_URI_IN_OTHER, parsed_uri, ref_uri);
845 if (status != 0) {
846 /* Not equal. See if this is the expected status. */
847 status = entry->status==ERR_NOT_EQUAL ? PJ_SUCCESS : -40;
848 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000849 PJ_LOG(3,(THIS_FILE, " uri comparison mismatch, status=%d:\n"
850 " uri1='%s'\n"
851 " uri2='%s'",
852 status, s1.ptr, s2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000853 }
854 goto on_return;
855
856 } else {
857 /* Equal. See if this is the expected status. */
858 status = entry->status==PJ_SUCCESS ? PJ_SUCCESS : -50;
859 if (status != PJ_SUCCESS) {
860 goto on_return;
861 }
862 }
863
Benny Prijonoe93e2872006-06-28 16:46:49 +0000864 var.cmp_len = var.cmp_len + len;
Benny Prijono5b917442005-11-21 17:07:18 +0000865 pj_get_timestamp(&t2);
866 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000867 pj_add_timestamp(&var.cmp_time, &t2);
Benny Prijono5b917442005-11-21 17:07:18 +0000868
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000869 /* Compare text. */
Benny Prijono82458b12005-11-23 20:56:30 +0000870 if (entry->printed) {
871 if (pj_strcmp2(&s1, entry->printed) != 0) {
872 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000873 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
874 " printed='%s'\n"
875 " expectd='%s'",
876 s1.ptr, entry->printed));
Benny Prijono82458b12005-11-23 20:56:30 +0000877 status = -60;
878 }
879 } else {
880 if (pj_strcmp(&s1, &s2) != 0) {
881 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000882 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
883 " uri1='%s'\n"
884 " uri2='%s'",
885 s1.ptr, s2.ptr));
Benny Prijono82458b12005-11-23 20:56:30 +0000886 status = -70;
887 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000888 }
889
890on_return:
891 return status;
892}
893
Benny Prijonoe93e2872006-06-28 16:46:49 +0000894
895static int simple_uri_test(void)
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000896{
Benny Prijonoe93e2872006-06-28 16:46:49 +0000897 unsigned i;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000898 pj_pool_t *pool;
899 pj_status_t status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000900
Benny Prijono85598d92006-01-07 18:44:25 +0000901 PJ_LOG(3,(THIS_FILE, " simple test"));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000902 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
Benny Prijono95c63482006-07-06 14:28:45 +0000903 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000904 status = do_uri_test(pool, &uri_test_array[i]);
Benny Prijono95c63482006-07-06 14:28:45 +0000905 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000906 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000907 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000908 status, i));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000909 return status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000910 }
911 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000912
Benny Prijonoe93e2872006-06-28 16:46:49 +0000913 return 0;
914}
915
Benny Prijonod0bd4982007-12-02 15:40:52 +0000916#if INCLUDE_BENCHMARKS
Benny Prijonoe93e2872006-06-28 16:46:49 +0000917static int uri_benchmark(unsigned *p_parse, unsigned *p_print, unsigned *p_cmp)
918{
919 unsigned i, loop;
Benny Prijonoe93e2872006-06-28 16:46:49 +0000920 pj_status_t status;
921 pj_timestamp zero;
922 pj_time_val elapsed;
923 pj_highprec_t avg_parse, avg_print, avg_cmp, kbytes;
924
Benny Prijonoac623b32006-07-03 15:19:31 +0000925 pj_bzero(&var, sizeof(var));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000926
927 zero.u32.hi = zero.u32.lo = 0;
928
929 var.parse_len = var.print_len = var.cmp_len = 0;
930 var.parse_time.u32.hi = var.parse_time.u32.lo = 0;
931 var.print_time.u32.hi = var.print_time.u32.lo = 0;
932 var.cmp_time.u32.hi = var.cmp_time.u32.lo = 0;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000933 for (loop=0; loop<LOOP_COUNT; ++loop) {
934 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
Benny Prijono95c63482006-07-06 14:28:45 +0000935 pj_pool_t *pool;
936 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000937 status = do_uri_test(pool, &uri_test_array[i]);
Benny Prijono95c63482006-07-06 14:28:45 +0000938 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000939 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000940 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000941 status, i));
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000942 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000943 goto on_return;
944 }
945 }
946 }
947
Benny Prijonoe93e2872006-06-28 16:46:49 +0000948 kbytes = var.parse_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000949 pj_highprec_mod(kbytes, 1000000);
950 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000951 elapsed = pj_elapsed_time(&zero, &var.parse_time);
952 avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000953 pj_highprec_mul(avg_parse, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000954 pj_highprec_div(avg_parse, var.parse_len);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000955 avg_parse = 1000000 / avg_parse;
956
Benny Prijono85598d92006-01-07 18:44:25 +0000957 PJ_LOG(3,(THIS_FILE,
958 " %u.%u MB of urls parsed in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000959 (unsigned)(var.parse_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000960 elapsed.sec, elapsed.msec,
961 (unsigned)avg_parse));
Benny Prijono5b917442005-11-21 17:07:18 +0000962
Benny Prijonoe93e2872006-06-28 16:46:49 +0000963 *p_parse = (unsigned)avg_parse;
964
965 kbytes = var.print_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000966 pj_highprec_mod(kbytes, 1000000);
967 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000968 elapsed = pj_elapsed_time(&zero, &var.print_time);
969 avg_print = pj_elapsed_usec(&zero, &var.print_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000970 pj_highprec_mul(avg_print, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000971 pj_highprec_div(avg_print, var.parse_len);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000972 avg_print = 1000000 / avg_print;
973
Benny Prijono85598d92006-01-07 18:44:25 +0000974 PJ_LOG(3,(THIS_FILE,
975 " %u.%u MB of urls printed in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000976 (unsigned)(var.print_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000977 elapsed.sec, elapsed.msec,
978 (unsigned)avg_print));
Benny Prijono5b917442005-11-21 17:07:18 +0000979
Benny Prijonoe93e2872006-06-28 16:46:49 +0000980 *p_print = (unsigned)avg_print;
981
982 kbytes = var.cmp_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000983 pj_highprec_mod(kbytes, 1000000);
984 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000985 elapsed = pj_elapsed_time(&zero, &var.cmp_time);
986 avg_cmp = pj_elapsed_usec(&zero, &var.cmp_time);
Benny Prijono5b917442005-11-21 17:07:18 +0000987 pj_highprec_mul(avg_cmp, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000988 pj_highprec_div(avg_cmp, var.cmp_len);
Benny Prijono5b917442005-11-21 17:07:18 +0000989 avg_cmp = 1000000 / avg_cmp;
990
Benny Prijono85598d92006-01-07 18:44:25 +0000991 PJ_LOG(3,(THIS_FILE,
992 " %u.%u MB of urls compared in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000993 (unsigned)(var.cmp_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000994 elapsed.sec, elapsed.msec,
995 (unsigned)avg_cmp));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000996
Benny Prijonoe93e2872006-06-28 16:46:49 +0000997 *p_cmp = (unsigned)avg_cmp;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000998
999on_return:
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001000 return status;
1001}
Benny Prijonod0bd4982007-12-02 15:40:52 +00001002#endif /* INCLUDE_BENCHMARKS */
Benny Prijonoe93e2872006-06-28 16:46:49 +00001003
1004/*****************************************************************************/
1005
1006int uri_test(void)
1007{
Benny Prijono9e164c12007-06-19 08:47:53 +00001008 enum { COUNT = 1, DETECT=0, PARSE=1, PRINT=2 };
Benny Prijonoe93e2872006-06-28 16:46:49 +00001009 struct {
1010 unsigned parse;
1011 unsigned print;
1012 unsigned cmp;
1013 } run[COUNT];
1014 unsigned i, max, avg_len;
1015 char desc[200];
1016 pj_status_t status;
1017
1018 status = simple_uri_test();
1019 if (status != PJ_SUCCESS)
1020 return status;
1021
Benny Prijonod0bd4982007-12-02 15:40:52 +00001022#if INCLUDE_BENCHMARKS
Benny Prijonoe93e2872006-06-28 16:46:49 +00001023 for (i=0; i<COUNT; ++i) {
1024 PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)...", i+1, COUNT));
1025 status = uri_benchmark(&run[i].parse, &run[i].print, &run[i].cmp);
1026 if (status != PJ_SUCCESS)
1027 return status;
1028 }
1029
1030 /* Calculate average URI length */
1031 for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
1032 avg_len += uri_test_array[i].len;
1033 }
1034 avg_len /= PJ_ARRAY_SIZE(uri_test_array);
1035
1036
1037 /*
1038 * Print maximum parse/sec
1039 */
1040 for (i=0, max=0; i<COUNT; ++i)
1041 if (run[i].parse > max) max = run[i].parse;
1042
1043 PJ_LOG(3,("", " Maximum URI parse/sec=%u", max));
1044
1045 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>parsed</B> with "
1046 "<tt>pjsip_parse_uri()</tt> per second "
1047 "(tested with %d URI set, with average length of "
1048 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001049 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001050
1051 report_ival("uri-parse-per-sec", max, "URI/sec", desc);
1052
1053 /* URI parsing bandwidth */
1054 report_ival("uri-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
1055 "URI parsing bandwidth in megabytes (number of megabytes "
1056 "worth of URI that can be parsed per second)");
1057
1058
1059 /* Print maximum print/sec */
1060 for (i=0, max=0; i<COUNT; ++i)
1061 if (run[i].print > max) max = run[i].print;
1062
1063 PJ_LOG(3,("", " Maximum URI print/sec=%u", max));
1064
1065 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>printed</B> with "
1066 "<tt>pjsip_uri_print()</tt> per second "
1067 "(tested with %d URI set, with average length of "
1068 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001069 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001070
1071 report_ival("uri-print-per-sec", max, "URI/sec", desc);
1072
1073 /* Print maximum detect/sec */
1074 for (i=0, max=0; i<COUNT; ++i)
1075 if (run[i].cmp > max) max = run[i].cmp;
1076
1077 PJ_LOG(3,("", " Maximum URI comparison/sec=%u", max));
1078
1079 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>compared</B> with "
1080 "<tt>pjsip_uri_cmp()</tt> per second "
1081 "(tested with %d URI set, with average length of "
1082 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001083 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001084
1085 report_ival("uri-cmp-per-sec", max, "URI/sec", desc);
1086
Benny Prijonod0bd4982007-12-02 15:40:52 +00001087#endif /* INCLUDE_BENCHMARKS */
1088
Benny Prijonoe93e2872006-06-28 16:46:49 +00001089 return PJ_SUCCESS;
1090}
1091