blob: df99f5726257dd9bbb89c2f561513c10525e6d0f [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 Prijono5dcb38d2005-11-21 01:55:47 +000081static pjsip_uri *create_dummy( pj_pool_t *pool );
82
83#define ERR_NOT_EQUAL -1001
84#define ERR_SYNTAX_ERR -1002
85
86struct uri_test
87{
88 pj_status_t status;
89 char str[PJSIP_MAX_URL_SIZE];
Benny Prijono82458b12005-11-23 20:56:30 +000090 pjsip_uri *(*creator)(pj_pool_t *pool);
91 const char *printed;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000092 pj_size_t len;
93} uri_test_array[] =
94{
95 {
96 PJ_SUCCESS,
97 "sip:localhost",
98 &create_uri0
99 },
100 {
101 PJ_SUCCESS,
102 "sip:user@localhost",
103 &create_uri1
104 },
105 {
106 PJ_SUCCESS,
107 "sip:user:password@localhost:5060",
Benny Prijono5b917442005-11-21 17:07:18 +0000108 &create_uri2, },
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000109 {
110 /* Port is specified should not match unspecified port. */
111 ERR_NOT_EQUAL,
112 "sip:localhost:5060",
113 &create_uri3
114 },
115 {
116 /* All recognized parameters. */
117 PJ_SUCCESS,
118 "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK",
119 &create_uri4
120 },
121 {
122 /* Params mixed with other params and header params. */
123 PJ_SUCCESS,
124 "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
125 "?Subject=Hello%20There&Server=SIP%20Server",
126 &create_uri5
127 },
128 {
129 /* SIPS. */
130 PJ_SUCCESS,
131 "sips:localhost",
132 &create_uri6,
133 },
134 {
135 /* Name address */
136 PJ_SUCCESS,
137 "<sip:localhost>",
138 &create_uri7
139 },
140 {
141 /* Name address with display name and SIPS scheme with some redundant
142 * whitespaced.
143 */
144 PJ_SUCCESS,
145 " Power Administrator <sips:localhost>",
146 &create_uri8
147 },
148 {
149 /* Name address. */
150 PJ_SUCCESS,
151 " \"User\" <sip:user@localhost:5071>",
152 &create_uri9
153 },
154 {
155 /* Escaped sequence in display name (display=Strange User\"\\\"). */
156 PJ_SUCCESS,
157 " \"Strange User\\\"\\\\\\\"\" <sip:localhost>",
158 &create_uri10,
159 },
160 {
161 /* Errorneous escaping in display name. */
162 ERR_SYNTAX_ERR,
163 " \"Rogue User\\\" <sip:localhost>",
164 &create_uri11,
165 },
166 {
167 /* Dangling quote in display name, but that should be OK. */
168 PJ_SUCCESS,
169 "Strange User\" <sip:localhost>",
170 &create_uri12,
171 },
172 {
173 /* Special characters in parameter value must be quoted. */
174 PJ_SUCCESS,
175 "sip:localhost;pvalue=\"hello world\"",
176 &create_uri13,
177 },
178 {
179 /* Excercise strange character sets allowed in display, user, password,
180 * host, and port.
181 */
182 PJ_SUCCESS,
183 "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@"
184 "my_proxy09.MY-domain.com:9801>",
185 &create_uri14,
186 },
187 {
188 /* Another excercise to the allowed character sets to the hostname. */
189 PJ_SUCCESS,
190 "sip:" ALPHANUM "-_.com",
191 &create_uri15,
192 },
193 {
194 /* Another excercise to the allowed character sets to the username
195 * and password.
196 */
197 PJ_SUCCESS,
198 "sip:" USER_CHAR ":" PASS_CHAR "@host",
199 &create_uri16,
200 },
201 {
202 /* Excercise to the pname and pvalue, and mixup of other-param
203 * between 'recognized' params.
204 */
205 PJ_SUCCESS,
206 "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21"
207 ";lr;other=1;transport=sctp;other2",
208 &create_uri17,
209 },
210 {
211 /* 18: This should trigger syntax error. */
212 ERR_SYNTAX_ERR,
213 "sip:",
214 &create_dummy,
215 },
216 {
217 /* 19: Syntax error: whitespace after scheme. */
218 ERR_SYNTAX_ERR,
219 "sip :host",
220 &create_dummy,
221 },
222 {
223 /* 20: Syntax error: whitespace before hostname. */
224 ERR_SYNTAX_ERR,
225 "sip: host",
226 &create_dummy,
227 },
228 {
229 /* 21: Syntax error: invalid port. */
230 ERR_SYNTAX_ERR,
231 "sip:user:password",
232 &create_dummy,
233 },
234 {
235 /* 22: Syntax error: no host. */
236 ERR_SYNTAX_ERR,
237 "sip:user@",
238 &create_dummy,
239 },
240 {
241 /* 23: Syntax error: no user/host. */
242 ERR_SYNTAX_ERR,
243 "sip:@",
244 &create_dummy,
245 },
246 {
247 /* 24: Syntax error: empty string. */
248 ERR_SYNTAX_ERR,
249 "",
250 &create_dummy,
Benny Prijono82458b12005-11-23 20:56:30 +0000251 },
252 {
253 /* 25: Simple tel: URI with global context */
254 PJ_SUCCESS,
255 "tel:+1-201-555-0123",
256 &create_uri25,
257 "tel:+1-201-555-0123"
258 },
259 {
260 /* 26: Simple tel: URI with local context */
261 PJ_SUCCESS,
262 "tel:7042;phone-context=example.com",
263 &create_uri26,
264 "tel:7042;phone-context=example.com"
265 },
266 {
267 /* 27: Simple tel: URI with local context */
268 PJ_SUCCESS,
269 "tel:863-1234;phone-context=+1-914-555",
270 &create_uri27,
271 "tel:863-1234;phone-context=+1-914-555"
272 },
273 {
274 /* 28: Comparison between local and global number */
275 ERR_NOT_EQUAL,
276 "tel:+1",
277 &create_uri28,
278 "tel:+1"
279 },
280 {
281 /* 29: tel: with some visual chars and spaces */
282 PJ_SUCCESS,
283 "tel:(44).1234-*#+Deaf",
284 &create_uri29,
285 "tel:(44).1234-*#+Deaf"
286 },
287 {
288 /* 30: isub parameters */
289 PJ_SUCCESS,
290 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=",
291 &create_uri30,
Benny Prijono9b446222006-07-18 16:08:50 +0000292 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1!+%3d"
Benny Prijono82458b12005-11-23 20:56:30 +0000293 },
294 {
295 /* 31: extension number parsing and encoding */
296 PJ_SUCCESS,
297 "tel:+1;ext=+123",
298 &create_uri31,
299 "tel:+1;ext=%2b123"
300 },
301 {
302 /* 32: context parameter parsing and encoding */
303 PJ_SUCCESS,
304 "tel:911;phone-context=+1-911",
305 &create_uri32,
306 "tel:911;phone-context=+1-911"
307 },
308 {
309 /* 33: case-insensitive comparison */
310 PJ_SUCCESS,
311 "tel:911;phone-context=emergency.example.com",
312 &create_uri33,
313 "tel:911;phone-context=emergency.example.com"
314 },
315 {
316 /* 34: parameter only appears in one URL */
317 ERR_NOT_EQUAL,
318 "tel:911;p1=p1;p2=p2",
319 &create_uri34,
320 "tel:911;p1=p1;p2=p2"
321 },
Benny Prijonod0bd4982007-12-02 15:40:52 +0000322 {
323 /* 35: IPv6 in host and maddr parameter */
324 PJ_SUCCESS,
325 "sip:user@[::1];maddr=[::01]",
326 &create_uri35,
327 "sip:user@[::1];maddr=[::01]"
328 },
329 {
330 /* 36: IPv6 in host and maddr, without username */
331 PJ_SUCCESS,
332 "sip:[::1];maddr=[::01]",
333 &create_uri36,
334 "sip:[::1];maddr=[::01]"
335 }
336
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000337};
338
339static pjsip_uri *create_uri0(pj_pool_t *pool)
340{
341 /* "sip:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000342 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000343
344 pj_strdup2(pool, &url->host, "localhost");
345 return (pjsip_uri*)url;
346}
347
348static pjsip_uri *create_uri1(pj_pool_t *pool)
349{
350 /* "sip:user@localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000351 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000352
353 pj_strdup2( pool, &url->user, "user");
354 pj_strdup2( pool, &url->host, "localhost");
355
356 return (pjsip_uri*) url;
357}
358
359static pjsip_uri *create_uri2(pj_pool_t *pool)
360{
361 /* "sip:user:password@localhost:5060" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000362 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000363
364 pj_strdup2( pool, &url->user, "user");
365 pj_strdup2( pool, &url->passwd, "password");
366 pj_strdup2( pool, &url->host, "localhost");
367 url->port = 5060;
368
369 return (pjsip_uri*) url;
370}
371
372static pjsip_uri *create_uri3(pj_pool_t *pool)
373{
374 /* Like: "sip:localhost:5060", but without the port. */
Benny Prijono40f2f642006-01-30 18:40:05 +0000375 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000376
377 pj_strdup2(pool, &url->host, "localhost");
378 return (pjsip_uri*)url;
379}
380
381static pjsip_uri *create_uri4(pj_pool_t *pool)
382{
383 /* "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000384 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000385
386 pj_strdup2(pool, &url->host, "localhost");
387 pj_strdup2(pool, &url->transport_param, "tcp");
388 pj_strdup2(pool, &url->user_param, "ip");
389 url->ttl_param = 255;
390 url->lr_param = 1;
391 pj_strdup2(pool, &url->maddr_param, "127.0.0.1");
392 pj_strdup2(pool, &url->method_param, "ACK");
393
394 return (pjsip_uri*)url;
395}
396
397#define param_add(list,pname,pvalue) \
398 do { \
399 pjsip_param *param; \
Benny Prijonoa1e69682007-05-11 15:14:34 +0000400 param=PJ_POOL_ALLOC_T(pool, pjsip_param); \
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000401 param->name = pj_str(pname); \
402 param->value = pj_str(pvalue); \
403 pj_list_insert_before(&list, param); \
404 } while (0)
405
406static pjsip_uri *create_uri5(pj_pool_t *pool)
407{
408 /* "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
409 "?Subject=Hello%20There&Server=SIP%20Server"
410 */
Benny Prijono40f2f642006-01-30 18:40:05 +0000411 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000412
413 pj_strdup2(pool, &url->host, "localhost");
414 pj_strdup2(pool, &url->user_param, "phone");
415
416 //pj_strdup2(pool, &url->other_param, ";pickup=hurry;message=I%20am%20sorry");
417 param_add(url->other_param, "pickup", "hurry");
418 param_add(url->other_param, "message", "I am sorry");
419
420 //pj_strdup2(pool, &url->header_param, "?Subject=Hello%20There&Server=SIP%20Server");
421 param_add(url->header_param, "Subject", "Hello There");
422 param_add(url->header_param, "Server", "SIP Server");
423 return (pjsip_uri*)url;
424
425}
426
427static pjsip_uri *create_uri6(pj_pool_t *pool)
428{
429 /* "sips:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000430 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000431
432 pj_strdup2(pool, &url->host, "localhost");
433 return (pjsip_uri*)url;
434}
435
436static pjsip_uri *create_uri7(pj_pool_t *pool)
437{
438 /* "<sip:localhost>" */
439 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000440 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000441
Benny Prijono40f2f642006-01-30 18:40:05 +0000442 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000443 name_addr->uri = (pjsip_uri*) url;
444
445 pj_strdup2(pool, &url->host, "localhost");
446 return (pjsip_uri*)name_addr;
447}
448
449static pjsip_uri *create_uri8(pj_pool_t *pool)
450{
451 /* " Power Administrator <sips:localhost>" */
452 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000453 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000454
Benny Prijono40f2f642006-01-30 18:40:05 +0000455 url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000456 name_addr->uri = (pjsip_uri*) url;
457
458 pj_strdup2(pool, &name_addr->display, "Power Administrator");
459 pj_strdup2(pool, &url->host, "localhost");
460 return (pjsip_uri*)name_addr;
461}
462
463static pjsip_uri *create_uri9(pj_pool_t *pool)
464{
465 /* " \"User\" <sip:user@localhost:5071>" */
466 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000467 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000468
Benny Prijono40f2f642006-01-30 18:40:05 +0000469 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000470 name_addr->uri = (pjsip_uri*) url;
471
472 pj_strdup2(pool, &name_addr->display, "User");
473 pj_strdup2(pool, &url->user, "user");
474 pj_strdup2(pool, &url->host, "localhost");
475 url->port = 5071;
476 return (pjsip_uri*)name_addr;
477}
478
479static pjsip_uri *create_uri10(pj_pool_t *pool)
480{
481 /* " \"Strange User\\\"\\\\\\\"\" <sip:localhost>" */
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, "Strange User\\\"\\\\\\\"");
489 pj_strdup2(pool, &url->host, "localhost");
490 return (pjsip_uri*)name_addr;
491}
492
493static pjsip_uri *create_uri11(pj_pool_t *pool)
494{
495 /* " \"Rogue User\\\" <sip:localhost>" */
496 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000497 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000498
Benny Prijono40f2f642006-01-30 18:40:05 +0000499 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000500 name_addr->uri = (pjsip_uri*) url;
501
502 pj_strdup2(pool, &name_addr->display, "Rogue User\\");
503 pj_strdup2(pool, &url->host, "localhost");
504 return (pjsip_uri*)name_addr;
505}
506
507static pjsip_uri *create_uri12(pj_pool_t *pool)
508{
509 /* "Strange User\" <sip:localhost>" */
510 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000511 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000512
Benny Prijono40f2f642006-01-30 18:40:05 +0000513 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000514 name_addr->uri = (pjsip_uri*) url;
515
516 pj_strdup2(pool, &name_addr->display, "Strange User\"");
517 pj_strdup2(pool, &url->host, "localhost");
518 return (pjsip_uri*)name_addr;
519}
520
521static pjsip_uri *create_uri13(pj_pool_t *pool)
522{
523 /* "sip:localhost;pvalue=\"hello world\"" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000524 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000525 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000526 pj_strdup2(pool, &url->host, "localhost");
527 //pj_strdup2(pool, &url->other_param, ";pvalue=\"hello world\"");
Benny Prijono94aee452007-04-29 18:29:14 +0000528 param_add(url->other_param, "pvalue", "\"hello world\"");
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000529 return (pjsip_uri*)url;
530}
531
532static pjsip_uri *create_uri14(pj_pool_t *pool)
533{
534 /* "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@my_proxy09.my-domain.com:9801>" */
535 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000536 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000537
Benny Prijono40f2f642006-01-30 18:40:05 +0000538 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000539 name_addr->uri = (pjsip_uri*) url;
540
541 pj_strdup2(pool, &name_addr->display, "This is -. !% *_+`'~ me");
542 pj_strdup2(pool, &url->user, "a19A&=+$,;?/,");
543 pj_strdup2(pool, &url->passwd, "@a&Zz=+$,");
544 pj_strdup2(pool, &url->host, "my_proxy09.MY-domain.com");
545 url->port = 9801;
546 return (pjsip_uri*)name_addr;
547}
548
549static pjsip_uri *create_uri15(pj_pool_t *pool)
550{
551 /* "sip:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.com" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000552 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000553 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000554 pj_strdup2(pool, &url->host, ALPHANUM "-_.com");
555 return (pjsip_uri*)url;
556}
557
558static pjsip_uri *create_uri16(pj_pool_t *pool)
559{
560 /* "sip:" USER_CHAR ":" PASS_CHAR "@host" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000561 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000562 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000563 pj_strdup2(pool, &url->user, USER_CHAR);
564 pj_strdup2(pool, &url->passwd, PASS_CHAR);
565 pj_strdup2(pool, &url->host, "host");
566 return (pjsip_uri*)url;
567}
568
569static pjsip_uri *create_uri17(pj_pool_t *pool)
570{
571 /* "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21;lr;other=1;transport=sctp;other2" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000572 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000573 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000574 pj_strdup2(pool, &url->host, "host");
575 pj_strdup2(pool, &url->user_param, "ip");
576 pj_strdup2(pool, &url->transport_param, "sctp");
577 param_add(url->other_param, PARAM_CHAR "!", PARAM_CHAR "!");
578 param_add(url->other_param, "other", "1");
579 param_add(url->other_param, "other2", "");
580 url->lr_param = 1;
581 return (pjsip_uri*)url;
582}
583
Benny Prijono82458b12005-11-23 20:56:30 +0000584
585static pjsip_uri *create_uri25(pj_pool_t *pool)
586{
587 /* "tel:+1-201-555-0123" */
588 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
589
590 uri->number = pj_str("+1-201-555-0123");
591 return (pjsip_uri*)uri;
592}
593
594static pjsip_uri *create_uri26(pj_pool_t *pool)
595{
596 /* tel:7042;phone-context=example.com */
597 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
598
599 uri->number = pj_str("7042");
600 uri->context = pj_str("example.com");
601 return (pjsip_uri*)uri;
602}
603
604static pjsip_uri *create_uri27(pj_pool_t *pool)
605{
606 /* "tel:863-1234;phone-context=+1-914-555" */
607 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
608
609 uri->number = pj_str("863-1234");
610 uri->context = pj_str("+1-914-555");
611 return (pjsip_uri*)uri;
612}
613
614/* "tel:1" */
615static pjsip_uri *create_uri28(pj_pool_t *pool)
616{
617 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
618
619 uri->number = pj_str("1");
620 return (pjsip_uri*)uri;
621}
622
623/* "tel:(44).1234-*#+Deaf" */
624static pjsip_uri *create_uri29(pj_pool_t *pool)
625{
626 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
627
628 uri->number = pj_str("(44).1234-*#+Deaf");
629 return (pjsip_uri*)uri;
630}
631
632/* "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=" */
633static pjsip_uri *create_uri30(pj_pool_t *pool)
634{
635 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
636
637 uri->number = pj_str("+1");
Benny Prijono9b446222006-07-18 16:08:50 +0000638 uri->isub_param = pj_str("/:@&$,-_.!~*'()[]/:&$aA1!+=");
Benny Prijono82458b12005-11-23 20:56:30 +0000639 return (pjsip_uri*)uri;
640}
641
642/* "tel:+1;ext=+123" */
643static pjsip_uri *create_uri31(pj_pool_t *pool)
644{
645 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
646
647 uri->number = pj_str("+1");
648 uri->ext_param = pj_str("+123");
649 return (pjsip_uri*)uri;
650}
651
652/* "tel:911;phone-context=+1-911" */
653static pjsip_uri *create_uri32(pj_pool_t *pool)
654{
655 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
656
657 uri->number = pj_str("911");
658 uri->context = pj_str("+1-911");
659 return (pjsip_uri*)uri;
660}
661
662/* "tel:911;phone-context=emergency.example.com" */
663static pjsip_uri *create_uri33(pj_pool_t *pool)
664{
665 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
666
667 uri->number = pj_str("911");
668 uri->context = pj_str("EMERGENCY.EXAMPLE.COM");
669 return (pjsip_uri*)uri;
670}
671
672/* "tel:911;p1=p1;p2=p2" */
673static pjsip_uri *create_uri34(pj_pool_t *pool)
674{
675 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
676 pjsip_param *p;
677
678 uri->number = pj_str("911");
679
Benny Prijonoa1e69682007-05-11 15:14:34 +0000680 p = PJ_POOL_ALLOC_T(pool, pjsip_param);
Benny Prijono82458b12005-11-23 20:56:30 +0000681 p->name = p->value = pj_str("p1");
682 pj_list_insert_before(&uri->other_param, p);
683
684 return (pjsip_uri*)uri;
685}
686
Benny Prijonod0bd4982007-12-02 15:40:52 +0000687/* "sip:user@[::1];maddr=[::01]" */
688static pjsip_uri *create_uri35( pj_pool_t *pool )
689{
690 pjsip_sip_uri *url;
691 url = pjsip_sip_uri_create(pool, 0);
692 url->user = pj_str("user");
693 url->host = pj_str("::1");
694 url->maddr_param = pj_str("::01");
695 return (pjsip_uri*)url;
696}
697
698/* "sip:[::1];maddr=[::01]" */
699static pjsip_uri *create_uri36( pj_pool_t *pool )
700{
701 pjsip_sip_uri *url;
702 url = pjsip_sip_uri_create(pool, 0);
703 url->host = pj_str("::1");
704 url->maddr_param = pj_str("::01");
705 return (pjsip_uri*)url;
706
707}
Benny Prijono82458b12005-11-23 20:56:30 +0000708
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000709static pjsip_uri *create_dummy(pj_pool_t *pool)
710{
711 PJ_UNUSED_ARG(pool);
712 return NULL;
713}
714
715/*****************************************************************************/
716
717/*
718 * Test one test entry.
719 */
720static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
721{
722 pj_status_t status;
723 int len;
Benny Prijonoed76f512006-07-05 21:42:45 +0000724 char *input;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000725 pjsip_uri *parsed_uri, *ref_uri;
726 pj_str_t s1 = {NULL, 0}, s2 = {NULL, 0};
727 pj_timestamp t1, t2;
728
Benny Prijonoed76f512006-07-05 21:42:45 +0000729 if (entry->len == 0)
Nanang Izzuddin4d535bb2008-09-16 18:09:22 +0000730 entry->len = pj_ansi_strlen(entry->str);
Benny Prijonoed76f512006-07-05 21:42:45 +0000731
732#if defined(PJSIP_UNESCAPE_IN_PLACE) && PJSIP_UNESCAPE_IN_PLACE!=0
733 input = pj_pool_alloc(pool, entry->len + 1);
734 pj_memcpy(input, entry->str, entry->len);
735 input[entry->len] = '\0';
736#else
737 input = entry->str;
738#endif
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000739
740 /* Parse URI text. */
741 pj_get_timestamp(&t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000742 var.parse_len = var.parse_len + entry->len;
Benny Prijonoed76f512006-07-05 21:42:45 +0000743 parsed_uri = pjsip_parse_uri(pool, input, entry->len, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000744 if (!parsed_uri) {
745 /* Parsing failed. If the entry says that this is expected, then
746 * return OK.
747 */
748 status = entry->status==ERR_SYNTAX_ERR ? PJ_SUCCESS : -10;
749 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000750 PJ_LOG(3,(THIS_FILE, " uri parse error!\n"
751 " uri='%s'\n",
Benny Prijonoed76f512006-07-05 21:42:45 +0000752 input));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000753 }
754 goto on_return;
755 }
756 pj_get_timestamp(&t2);
757 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000758 pj_add_timestamp(&var.parse_time, &t2);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000759
760 /* Create the reference URI. */
761 ref_uri = entry->creator(pool);
762
763 /* Print both URI. */
Benny Prijonoa1e69682007-05-11 15:14:34 +0000764 s1.ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
765 s2.ptr = (char*) pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000766
767 pj_get_timestamp(&t1);
768 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, parsed_uri, s1.ptr, PJSIP_MAX_URL_SIZE);
769 if (len < 1) {
770 status = -20;
771 goto on_return;
772 }
773 s1.ptr[len] = '\0';
774 s1.slen = len;
775
Benny Prijonoe93e2872006-06-28 16:46:49 +0000776 var.print_len = var.print_len + len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000777 pj_get_timestamp(&t2);
778 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000779 pj_add_timestamp(&var.print_time, &t2);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000780
781 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, ref_uri, s2.ptr, PJSIP_MAX_URL_SIZE);
782 if (len < 1) {
783 status = -30;
784 goto on_return;
785 }
786 s2.ptr[len] = '\0';
787 s2.slen = len;
788
789 /* Full comparison of parsed URI with reference URI. */
Benny Prijono5b917442005-11-21 17:07:18 +0000790 pj_get_timestamp(&t1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000791 status = pjsip_uri_cmp(PJSIP_URI_IN_OTHER, parsed_uri, ref_uri);
792 if (status != 0) {
793 /* Not equal. See if this is the expected status. */
794 status = entry->status==ERR_NOT_EQUAL ? PJ_SUCCESS : -40;
795 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000796 PJ_LOG(3,(THIS_FILE, " uri comparison mismatch, status=%d:\n"
797 " uri1='%s'\n"
798 " uri2='%s'",
799 status, s1.ptr, s2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000800 }
801 goto on_return;
802
803 } else {
804 /* Equal. See if this is the expected status. */
805 status = entry->status==PJ_SUCCESS ? PJ_SUCCESS : -50;
806 if (status != PJ_SUCCESS) {
807 goto on_return;
808 }
809 }
810
Benny Prijonoe93e2872006-06-28 16:46:49 +0000811 var.cmp_len = var.cmp_len + len;
Benny Prijono5b917442005-11-21 17:07:18 +0000812 pj_get_timestamp(&t2);
813 pj_sub_timestamp(&t2, &t1);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000814 pj_add_timestamp(&var.cmp_time, &t2);
Benny Prijono5b917442005-11-21 17:07:18 +0000815
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000816 /* Compare text. */
Benny Prijono82458b12005-11-23 20:56:30 +0000817 if (entry->printed) {
818 if (pj_strcmp2(&s1, entry->printed) != 0) {
819 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000820 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
821 " printed='%s'\n"
822 " expectd='%s'",
823 s1.ptr, entry->printed));
Benny Prijono82458b12005-11-23 20:56:30 +0000824 status = -60;
825 }
826 } else {
827 if (pj_strcmp(&s1, &s2) != 0) {
828 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000829 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
830 " uri1='%s'\n"
831 " uri2='%s'",
832 s1.ptr, s2.ptr));
Benny Prijono82458b12005-11-23 20:56:30 +0000833 status = -70;
834 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000835 }
836
837on_return:
838 return status;
839}
840
Benny Prijonoe93e2872006-06-28 16:46:49 +0000841
842static int simple_uri_test(void)
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000843{
Benny Prijonoe93e2872006-06-28 16:46:49 +0000844 unsigned i;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000845 pj_pool_t *pool;
846 pj_status_t status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000847
Benny Prijono85598d92006-01-07 18:44:25 +0000848 PJ_LOG(3,(THIS_FILE, " simple test"));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000849 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
Benny Prijono95c63482006-07-06 14:28:45 +0000850 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000851 status = do_uri_test(pool, &uri_test_array[i]);
Benny Prijono95c63482006-07-06 14:28:45 +0000852 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000853 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000854 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000855 status, i));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000856 return status;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000857 }
858 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000859
Benny Prijonoe93e2872006-06-28 16:46:49 +0000860 return 0;
861}
862
Benny Prijonod0bd4982007-12-02 15:40:52 +0000863#if INCLUDE_BENCHMARKS
Benny Prijonoe93e2872006-06-28 16:46:49 +0000864static int uri_benchmark(unsigned *p_parse, unsigned *p_print, unsigned *p_cmp)
865{
866 unsigned i, loop;
Benny Prijonoe93e2872006-06-28 16:46:49 +0000867 pj_status_t status;
868 pj_timestamp zero;
869 pj_time_val elapsed;
870 pj_highprec_t avg_parse, avg_print, avg_cmp, kbytes;
871
Benny Prijonoac623b32006-07-03 15:19:31 +0000872 pj_bzero(&var, sizeof(var));
Benny Prijonoe93e2872006-06-28 16:46:49 +0000873
874 zero.u32.hi = zero.u32.lo = 0;
875
876 var.parse_len = var.print_len = var.cmp_len = 0;
877 var.parse_time.u32.hi = var.parse_time.u32.lo = 0;
878 var.print_time.u32.hi = var.print_time.u32.lo = 0;
879 var.cmp_time.u32.hi = var.cmp_time.u32.lo = 0;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000880 for (loop=0; loop<LOOP_COUNT; ++loop) {
881 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
Benny Prijono95c63482006-07-06 14:28:45 +0000882 pj_pool_t *pool;
883 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000884 status = do_uri_test(pool, &uri_test_array[i]);
Benny Prijono95c63482006-07-06 14:28:45 +0000885 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000886 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000887 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000888 status, i));
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000889 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000890 goto on_return;
891 }
892 }
893 }
894
Benny Prijonoe93e2872006-06-28 16:46:49 +0000895 kbytes = var.parse_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000896 pj_highprec_mod(kbytes, 1000000);
897 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000898 elapsed = pj_elapsed_time(&zero, &var.parse_time);
899 avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000900 pj_highprec_mul(avg_parse, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000901 pj_highprec_div(avg_parse, var.parse_len);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000902 avg_parse = 1000000 / avg_parse;
903
Benny Prijono85598d92006-01-07 18:44:25 +0000904 PJ_LOG(3,(THIS_FILE,
905 " %u.%u MB of urls parsed in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000906 (unsigned)(var.parse_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000907 elapsed.sec, elapsed.msec,
908 (unsigned)avg_parse));
Benny Prijono5b917442005-11-21 17:07:18 +0000909
Benny Prijonoe93e2872006-06-28 16:46:49 +0000910 *p_parse = (unsigned)avg_parse;
911
912 kbytes = var.print_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000913 pj_highprec_mod(kbytes, 1000000);
914 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000915 elapsed = pj_elapsed_time(&zero, &var.print_time);
916 avg_print = pj_elapsed_usec(&zero, &var.print_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000917 pj_highprec_mul(avg_print, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000918 pj_highprec_div(avg_print, var.parse_len);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000919 avg_print = 1000000 / avg_print;
920
Benny Prijono85598d92006-01-07 18:44:25 +0000921 PJ_LOG(3,(THIS_FILE,
922 " %u.%u MB of urls printed in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000923 (unsigned)(var.print_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000924 elapsed.sec, elapsed.msec,
925 (unsigned)avg_print));
Benny Prijono5b917442005-11-21 17:07:18 +0000926
Benny Prijonoe93e2872006-06-28 16:46:49 +0000927 *p_print = (unsigned)avg_print;
928
929 kbytes = var.cmp_len;
Benny Prijono5b917442005-11-21 17:07:18 +0000930 pj_highprec_mod(kbytes, 1000000);
931 pj_highprec_div(kbytes, 100000);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000932 elapsed = pj_elapsed_time(&zero, &var.cmp_time);
933 avg_cmp = pj_elapsed_usec(&zero, &var.cmp_time);
Benny Prijono5b917442005-11-21 17:07:18 +0000934 pj_highprec_mul(avg_cmp, AVERAGE_URL_LEN);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000935 pj_highprec_div(avg_cmp, var.cmp_len);
Benny Prijono5b917442005-11-21 17:07:18 +0000936 avg_cmp = 1000000 / avg_cmp;
937
Benny Prijono85598d92006-01-07 18:44:25 +0000938 PJ_LOG(3,(THIS_FILE,
939 " %u.%u MB of urls compared in %d.%03ds (avg=%d urls/sec)",
Benny Prijonoe93e2872006-06-28 16:46:49 +0000940 (unsigned)(var.cmp_len/1000000), (unsigned)kbytes,
Benny Prijono85598d92006-01-07 18:44:25 +0000941 elapsed.sec, elapsed.msec,
942 (unsigned)avg_cmp));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000943
Benny Prijonoe93e2872006-06-28 16:46:49 +0000944 *p_cmp = (unsigned)avg_cmp;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000945
946on_return:
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000947 return status;
948}
Benny Prijonod0bd4982007-12-02 15:40:52 +0000949#endif /* INCLUDE_BENCHMARKS */
Benny Prijonoe93e2872006-06-28 16:46:49 +0000950
951/*****************************************************************************/
952
953int uri_test(void)
954{
Benny Prijono9e164c12007-06-19 08:47:53 +0000955 enum { COUNT = 1, DETECT=0, PARSE=1, PRINT=2 };
Benny Prijonoe93e2872006-06-28 16:46:49 +0000956 struct {
957 unsigned parse;
958 unsigned print;
959 unsigned cmp;
960 } run[COUNT];
961 unsigned i, max, avg_len;
962 char desc[200];
963 pj_status_t status;
964
965 status = simple_uri_test();
966 if (status != PJ_SUCCESS)
967 return status;
968
Benny Prijonod0bd4982007-12-02 15:40:52 +0000969#if INCLUDE_BENCHMARKS
Benny Prijonoe93e2872006-06-28 16:46:49 +0000970 for (i=0; i<COUNT; ++i) {
971 PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)...", i+1, COUNT));
972 status = uri_benchmark(&run[i].parse, &run[i].print, &run[i].cmp);
973 if (status != PJ_SUCCESS)
974 return status;
975 }
976
977 /* Calculate average URI length */
978 for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
979 avg_len += uri_test_array[i].len;
980 }
981 avg_len /= PJ_ARRAY_SIZE(uri_test_array);
982
983
984 /*
985 * Print maximum parse/sec
986 */
987 for (i=0, max=0; i<COUNT; ++i)
988 if (run[i].parse > max) max = run[i].parse;
989
990 PJ_LOG(3,("", " Maximum URI parse/sec=%u", max));
991
992 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>parsed</B> with "
993 "<tt>pjsip_parse_uri()</tt> per second "
994 "(tested with %d URI set, with average length of "
995 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +0000996 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +0000997
998 report_ival("uri-parse-per-sec", max, "URI/sec", desc);
999
1000 /* URI parsing bandwidth */
1001 report_ival("uri-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
1002 "URI parsing bandwidth in megabytes (number of megabytes "
1003 "worth of URI that can be parsed per second)");
1004
1005
1006 /* Print maximum print/sec */
1007 for (i=0, max=0; i<COUNT; ++i)
1008 if (run[i].print > max) max = run[i].print;
1009
1010 PJ_LOG(3,("", " Maximum URI print/sec=%u", max));
1011
1012 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>printed</B> with "
1013 "<tt>pjsip_uri_print()</tt> per second "
1014 "(tested with %d URI set, with average length of "
1015 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001016 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001017
1018 report_ival("uri-print-per-sec", max, "URI/sec", desc);
1019
1020 /* Print maximum detect/sec */
1021 for (i=0, max=0; i<COUNT; ++i)
1022 if (run[i].cmp > max) max = run[i].cmp;
1023
1024 PJ_LOG(3,("", " Maximum URI comparison/sec=%u", max));
1025
1026 pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>compared</B> with "
1027 "<tt>pjsip_uri_cmp()</tt> per second "
1028 "(tested with %d URI set, with average length of "
1029 "%d chars)",
Benny Prijono7db431e2006-07-23 14:38:49 +00001030 (int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
Benny Prijonoe93e2872006-06-28 16:46:49 +00001031
1032 report_ival("uri-cmp-per-sec", max, "URI/sec", desc);
1033
Benny Prijonod0bd4982007-12-02 15:40:52 +00001034#endif /* INCLUDE_BENCHMARKS */
1035
Benny Prijonoe93e2872006-06-28 16:46:49 +00001036 return PJ_SUCCESS;
1037}
1038