blob: a221f4ca37c028163b0d951836a1844927c7a104 [file] [log] [blame]
Benny Prijono5dcb38d2005-11-21 01:55:47 +00001/* $Id$ */
2/*
3 * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include "test.h"
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
35#define LOOP_COUNT 10000
Benny Prijono5dcb38d2005-11-21 01:55:47 +000036#define AVERAGE_URL_LEN 80
37#define THREAD_COUNT 4
38
Benny Prijono5b917442005-11-21 17:07:18 +000039static pj_highprec_t parse_len, print_len, cmp_len;
40static pj_timestamp parse_time, print_time, cmp_time;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000041
42
43/* URI creator functions. */
44static pjsip_uri *create_uri0( pj_pool_t *pool );
45static pjsip_uri *create_uri1( pj_pool_t *pool );
46static pjsip_uri *create_uri2( pj_pool_t *pool );
47static pjsip_uri *create_uri3( pj_pool_t *pool );
48static pjsip_uri *create_uri4( pj_pool_t *pool );
49static pjsip_uri *create_uri5( pj_pool_t *pool );
50static pjsip_uri *create_uri6( pj_pool_t *pool );
51static pjsip_uri *create_uri7( pj_pool_t *pool );
52static pjsip_uri *create_uri8( pj_pool_t *pool );
53static pjsip_uri *create_uri9( pj_pool_t *pool );
54static pjsip_uri *create_uri10( pj_pool_t *pool );
55static pjsip_uri *create_uri11( pj_pool_t *pool );
56static pjsip_uri *create_uri12( pj_pool_t *pool );
57static pjsip_uri *create_uri13( pj_pool_t *pool );
58static pjsip_uri *create_uri14( pj_pool_t *pool );
59static pjsip_uri *create_uri15( pj_pool_t *pool );
60static pjsip_uri *create_uri16( pj_pool_t *pool );
61static pjsip_uri *create_uri17( pj_pool_t *pool );
Benny Prijono82458b12005-11-23 20:56:30 +000062static pjsip_uri *create_uri25( pj_pool_t *pool );
63static pjsip_uri *create_uri26( pj_pool_t *pool );
64static pjsip_uri *create_uri27( pj_pool_t *pool );
65static pjsip_uri *create_uri28( pj_pool_t *pool );
66static pjsip_uri *create_uri29( pj_pool_t *pool );
67static pjsip_uri *create_uri30( pj_pool_t *pool );
68static pjsip_uri *create_uri31( pj_pool_t *pool );
69static pjsip_uri *create_uri32( pj_pool_t *pool );
70static pjsip_uri *create_uri33( pj_pool_t *pool );
71static pjsip_uri *create_uri34( pj_pool_t *pool );
72static pjsip_uri *create_uri35( pj_pool_t *pool );
Benny Prijono5dcb38d2005-11-21 01:55:47 +000073static pjsip_uri *create_dummy( pj_pool_t *pool );
74
75#define ERR_NOT_EQUAL -1001
76#define ERR_SYNTAX_ERR -1002
77
78struct uri_test
79{
80 pj_status_t status;
81 char str[PJSIP_MAX_URL_SIZE];
Benny Prijono82458b12005-11-23 20:56:30 +000082 pjsip_uri *(*creator)(pj_pool_t *pool);
83 const char *printed;
Benny Prijono5dcb38d2005-11-21 01:55:47 +000084 pj_size_t len;
85} uri_test_array[] =
86{
87 {
88 PJ_SUCCESS,
89 "sip:localhost",
90 &create_uri0
91 },
92 {
93 PJ_SUCCESS,
94 "sip:user@localhost",
95 &create_uri1
96 },
97 {
98 PJ_SUCCESS,
99 "sip:user:password@localhost:5060",
Benny Prijono5b917442005-11-21 17:07:18 +0000100 &create_uri2, },
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000101 {
102 /* Port is specified should not match unspecified port. */
103 ERR_NOT_EQUAL,
104 "sip:localhost:5060",
105 &create_uri3
106 },
107 {
108 /* All recognized parameters. */
109 PJ_SUCCESS,
110 "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK",
111 &create_uri4
112 },
113 {
114 /* Params mixed with other params and header params. */
115 PJ_SUCCESS,
116 "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
117 "?Subject=Hello%20There&Server=SIP%20Server",
118 &create_uri5
119 },
120 {
121 /* SIPS. */
122 PJ_SUCCESS,
123 "sips:localhost",
124 &create_uri6,
125 },
126 {
127 /* Name address */
128 PJ_SUCCESS,
129 "<sip:localhost>",
130 &create_uri7
131 },
132 {
133 /* Name address with display name and SIPS scheme with some redundant
134 * whitespaced.
135 */
136 PJ_SUCCESS,
137 " Power Administrator <sips:localhost>",
138 &create_uri8
139 },
140 {
141 /* Name address. */
142 PJ_SUCCESS,
143 " \"User\" <sip:user@localhost:5071>",
144 &create_uri9
145 },
146 {
147 /* Escaped sequence in display name (display=Strange User\"\\\"). */
148 PJ_SUCCESS,
149 " \"Strange User\\\"\\\\\\\"\" <sip:localhost>",
150 &create_uri10,
151 },
152 {
153 /* Errorneous escaping in display name. */
154 ERR_SYNTAX_ERR,
155 " \"Rogue User\\\" <sip:localhost>",
156 &create_uri11,
157 },
158 {
159 /* Dangling quote in display name, but that should be OK. */
160 PJ_SUCCESS,
161 "Strange User\" <sip:localhost>",
162 &create_uri12,
163 },
164 {
165 /* Special characters in parameter value must be quoted. */
166 PJ_SUCCESS,
167 "sip:localhost;pvalue=\"hello world\"",
168 &create_uri13,
169 },
170 {
171 /* Excercise strange character sets allowed in display, user, password,
172 * host, and port.
173 */
174 PJ_SUCCESS,
175 "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@"
176 "my_proxy09.MY-domain.com:9801>",
177 &create_uri14,
178 },
179 {
180 /* Another excercise to the allowed character sets to the hostname. */
181 PJ_SUCCESS,
182 "sip:" ALPHANUM "-_.com",
183 &create_uri15,
184 },
185 {
186 /* Another excercise to the allowed character sets to the username
187 * and password.
188 */
189 PJ_SUCCESS,
190 "sip:" USER_CHAR ":" PASS_CHAR "@host",
191 &create_uri16,
192 },
193 {
194 /* Excercise to the pname and pvalue, and mixup of other-param
195 * between 'recognized' params.
196 */
197 PJ_SUCCESS,
198 "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21"
199 ";lr;other=1;transport=sctp;other2",
200 &create_uri17,
201 },
202 {
203 /* 18: This should trigger syntax error. */
204 ERR_SYNTAX_ERR,
205 "sip:",
206 &create_dummy,
207 },
208 {
209 /* 19: Syntax error: whitespace after scheme. */
210 ERR_SYNTAX_ERR,
211 "sip :host",
212 &create_dummy,
213 },
214 {
215 /* 20: Syntax error: whitespace before hostname. */
216 ERR_SYNTAX_ERR,
217 "sip: host",
218 &create_dummy,
219 },
220 {
221 /* 21: Syntax error: invalid port. */
222 ERR_SYNTAX_ERR,
223 "sip:user:password",
224 &create_dummy,
225 },
226 {
227 /* 22: Syntax error: no host. */
228 ERR_SYNTAX_ERR,
229 "sip:user@",
230 &create_dummy,
231 },
232 {
233 /* 23: Syntax error: no user/host. */
234 ERR_SYNTAX_ERR,
235 "sip:@",
236 &create_dummy,
237 },
238 {
239 /* 24: Syntax error: empty string. */
240 ERR_SYNTAX_ERR,
241 "",
242 &create_dummy,
Benny Prijono82458b12005-11-23 20:56:30 +0000243 },
244 {
245 /* 25: Simple tel: URI with global context */
246 PJ_SUCCESS,
247 "tel:+1-201-555-0123",
248 &create_uri25,
249 "tel:+1-201-555-0123"
250 },
251 {
252 /* 26: Simple tel: URI with local context */
253 PJ_SUCCESS,
254 "tel:7042;phone-context=example.com",
255 &create_uri26,
256 "tel:7042;phone-context=example.com"
257 },
258 {
259 /* 27: Simple tel: URI with local context */
260 PJ_SUCCESS,
261 "tel:863-1234;phone-context=+1-914-555",
262 &create_uri27,
263 "tel:863-1234;phone-context=+1-914-555"
264 },
265 {
266 /* 28: Comparison between local and global number */
267 ERR_NOT_EQUAL,
268 "tel:+1",
269 &create_uri28,
270 "tel:+1"
271 },
272 {
273 /* 29: tel: with some visual chars and spaces */
274 PJ_SUCCESS,
275 "tel:(44).1234-*#+Deaf",
276 &create_uri29,
277 "tel:(44).1234-*#+Deaf"
278 },
279 {
280 /* 30: isub parameters */
281 PJ_SUCCESS,
282 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=",
283 &create_uri30,
284 "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+%3d"
285 },
286 {
287 /* 31: extension number parsing and encoding */
288 PJ_SUCCESS,
289 "tel:+1;ext=+123",
290 &create_uri31,
291 "tel:+1;ext=%2b123"
292 },
293 {
294 /* 32: context parameter parsing and encoding */
295 PJ_SUCCESS,
296 "tel:911;phone-context=+1-911",
297 &create_uri32,
298 "tel:911;phone-context=+1-911"
299 },
300 {
301 /* 33: case-insensitive comparison */
302 PJ_SUCCESS,
303 "tel:911;phone-context=emergency.example.com",
304 &create_uri33,
305 "tel:911;phone-context=emergency.example.com"
306 },
307 {
308 /* 34: parameter only appears in one URL */
309 ERR_NOT_EQUAL,
310 "tel:911;p1=p1;p2=p2",
311 &create_uri34,
312 "tel:911;p1=p1;p2=p2"
313 },
314
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000315};
316
317static pjsip_uri *create_uri0(pj_pool_t *pool)
318{
319 /* "sip:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000320 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000321
322 pj_strdup2(pool, &url->host, "localhost");
323 return (pjsip_uri*)url;
324}
325
326static pjsip_uri *create_uri1(pj_pool_t *pool)
327{
328 /* "sip:user@localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000329 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000330
331 pj_strdup2( pool, &url->user, "user");
332 pj_strdup2( pool, &url->host, "localhost");
333
334 return (pjsip_uri*) url;
335}
336
337static pjsip_uri *create_uri2(pj_pool_t *pool)
338{
339 /* "sip:user:password@localhost:5060" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000340 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000341
342 pj_strdup2( pool, &url->user, "user");
343 pj_strdup2( pool, &url->passwd, "password");
344 pj_strdup2( pool, &url->host, "localhost");
345 url->port = 5060;
346
347 return (pjsip_uri*) url;
348}
349
350static pjsip_uri *create_uri3(pj_pool_t *pool)
351{
352 /* Like: "sip:localhost:5060", but without the port. */
Benny Prijono40f2f642006-01-30 18:40:05 +0000353 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000354
355 pj_strdup2(pool, &url->host, "localhost");
356 return (pjsip_uri*)url;
357}
358
359static pjsip_uri *create_uri4(pj_pool_t *pool)
360{
361 /* "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK" */
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->host, "localhost");
365 pj_strdup2(pool, &url->transport_param, "tcp");
366 pj_strdup2(pool, &url->user_param, "ip");
367 url->ttl_param = 255;
368 url->lr_param = 1;
369 pj_strdup2(pool, &url->maddr_param, "127.0.0.1");
370 pj_strdup2(pool, &url->method_param, "ACK");
371
372 return (pjsip_uri*)url;
373}
374
375#define param_add(list,pname,pvalue) \
376 do { \
377 pjsip_param *param; \
378 param=pj_pool_alloc(pool, sizeof(pjsip_param)); \
379 param->name = pj_str(pname); \
380 param->value = pj_str(pvalue); \
381 pj_list_insert_before(&list, param); \
382 } while (0)
383
384static pjsip_uri *create_uri5(pj_pool_t *pool)
385{
386 /* "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
387 "?Subject=Hello%20There&Server=SIP%20Server"
388 */
Benny Prijono40f2f642006-01-30 18:40:05 +0000389 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000390
391 pj_strdup2(pool, &url->host, "localhost");
392 pj_strdup2(pool, &url->user_param, "phone");
393
394 //pj_strdup2(pool, &url->other_param, ";pickup=hurry;message=I%20am%20sorry");
395 param_add(url->other_param, "pickup", "hurry");
396 param_add(url->other_param, "message", "I am sorry");
397
398 //pj_strdup2(pool, &url->header_param, "?Subject=Hello%20There&Server=SIP%20Server");
399 param_add(url->header_param, "Subject", "Hello There");
400 param_add(url->header_param, "Server", "SIP Server");
401 return (pjsip_uri*)url;
402
403}
404
405static pjsip_uri *create_uri6(pj_pool_t *pool)
406{
407 /* "sips:localhost" */
Benny Prijono40f2f642006-01-30 18:40:05 +0000408 pjsip_sip_uri *url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000409
410 pj_strdup2(pool, &url->host, "localhost");
411 return (pjsip_uri*)url;
412}
413
414static pjsip_uri *create_uri7(pj_pool_t *pool)
415{
416 /* "<sip:localhost>" */
417 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000418 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000419
Benny Prijono40f2f642006-01-30 18:40:05 +0000420 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000421 name_addr->uri = (pjsip_uri*) url;
422
423 pj_strdup2(pool, &url->host, "localhost");
424 return (pjsip_uri*)name_addr;
425}
426
427static pjsip_uri *create_uri8(pj_pool_t *pool)
428{
429 /* " Power Administrator <sips:localhost>" */
430 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000431 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000432
Benny Prijono40f2f642006-01-30 18:40:05 +0000433 url = pjsip_sip_uri_create(pool, 1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000434 name_addr->uri = (pjsip_uri*) url;
435
436 pj_strdup2(pool, &name_addr->display, "Power Administrator");
437 pj_strdup2(pool, &url->host, "localhost");
438 return (pjsip_uri*)name_addr;
439}
440
441static pjsip_uri *create_uri9(pj_pool_t *pool)
442{
443 /* " \"User\" <sip:user@localhost:5071>" */
444 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000445 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000446
Benny Prijono40f2f642006-01-30 18:40:05 +0000447 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000448 name_addr->uri = (pjsip_uri*) url;
449
450 pj_strdup2(pool, &name_addr->display, "User");
451 pj_strdup2(pool, &url->user, "user");
452 pj_strdup2(pool, &url->host, "localhost");
453 url->port = 5071;
454 return (pjsip_uri*)name_addr;
455}
456
457static pjsip_uri *create_uri10(pj_pool_t *pool)
458{
459 /* " \"Strange User\\\"\\\\\\\"\" <sip:localhost>" */
460 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000461 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000462
Benny Prijono40f2f642006-01-30 18:40:05 +0000463 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000464 name_addr->uri = (pjsip_uri*) url;
465
466 pj_strdup2(pool, &name_addr->display, "Strange User\\\"\\\\\\\"");
467 pj_strdup2(pool, &url->host, "localhost");
468 return (pjsip_uri*)name_addr;
469}
470
471static pjsip_uri *create_uri11(pj_pool_t *pool)
472{
473 /* " \"Rogue User\\\" <sip:localhost>" */
474 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000475 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000476
Benny Prijono40f2f642006-01-30 18:40:05 +0000477 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000478 name_addr->uri = (pjsip_uri*) url;
479
480 pj_strdup2(pool, &name_addr->display, "Rogue User\\");
481 pj_strdup2(pool, &url->host, "localhost");
482 return (pjsip_uri*)name_addr;
483}
484
485static pjsip_uri *create_uri12(pj_pool_t *pool)
486{
487 /* "Strange User\" <sip:localhost>" */
488 pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
Benny Prijono0c2bc612006-01-10 13:31:40 +0000489 pjsip_sip_uri *url;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000490
Benny Prijono40f2f642006-01-30 18:40:05 +0000491 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000492 name_addr->uri = (pjsip_uri*) url;
493
494 pj_strdup2(pool, &name_addr->display, "Strange User\"");
495 pj_strdup2(pool, &url->host, "localhost");
496 return (pjsip_uri*)name_addr;
497}
498
499static pjsip_uri *create_uri13(pj_pool_t *pool)
500{
501 /* "sip:localhost;pvalue=\"hello world\"" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000502 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000503 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000504 pj_strdup2(pool, &url->host, "localhost");
505 //pj_strdup2(pool, &url->other_param, ";pvalue=\"hello world\"");
506 param_add(url->other_param, "pvalue", "hello world");
507 return (pjsip_uri*)url;
508}
509
510static pjsip_uri *create_uri14(pj_pool_t *pool)
511{
512 /* "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@my_proxy09.my-domain.com:9801>" */
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, "This is -. !% *_+`'~ me");
520 pj_strdup2(pool, &url->user, "a19A&=+$,;?/,");
521 pj_strdup2(pool, &url->passwd, "@a&Zz=+$,");
522 pj_strdup2(pool, &url->host, "my_proxy09.MY-domain.com");
523 url->port = 9801;
524 return (pjsip_uri*)name_addr;
525}
526
527static pjsip_uri *create_uri15(pj_pool_t *pool)
528{
529 /* "sip:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.com" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000530 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000531 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000532 pj_strdup2(pool, &url->host, ALPHANUM "-_.com");
533 return (pjsip_uri*)url;
534}
535
536static pjsip_uri *create_uri16(pj_pool_t *pool)
537{
538 /* "sip:" USER_CHAR ":" PASS_CHAR "@host" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000539 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000540 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000541 pj_strdup2(pool, &url->user, USER_CHAR);
542 pj_strdup2(pool, &url->passwd, PASS_CHAR);
543 pj_strdup2(pool, &url->host, "host");
544 return (pjsip_uri*)url;
545}
546
547static pjsip_uri *create_uri17(pj_pool_t *pool)
548{
549 /* "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21;lr;other=1;transport=sctp;other2" */
Benny Prijono0c2bc612006-01-10 13:31:40 +0000550 pjsip_sip_uri *url;
Benny Prijono40f2f642006-01-30 18:40:05 +0000551 url = pjsip_sip_uri_create(pool, 0);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000552 pj_strdup2(pool, &url->host, "host");
553 pj_strdup2(pool, &url->user_param, "ip");
554 pj_strdup2(pool, &url->transport_param, "sctp");
555 param_add(url->other_param, PARAM_CHAR "!", PARAM_CHAR "!");
556 param_add(url->other_param, "other", "1");
557 param_add(url->other_param, "other2", "");
558 url->lr_param = 1;
559 return (pjsip_uri*)url;
560}
561
Benny Prijono82458b12005-11-23 20:56:30 +0000562
563static pjsip_uri *create_uri25(pj_pool_t *pool)
564{
565 /* "tel:+1-201-555-0123" */
566 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
567
568 uri->number = pj_str("+1-201-555-0123");
569 return (pjsip_uri*)uri;
570}
571
572static pjsip_uri *create_uri26(pj_pool_t *pool)
573{
574 /* tel:7042;phone-context=example.com */
575 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
576
577 uri->number = pj_str("7042");
578 uri->context = pj_str("example.com");
579 return (pjsip_uri*)uri;
580}
581
582static pjsip_uri *create_uri27(pj_pool_t *pool)
583{
584 /* "tel:863-1234;phone-context=+1-914-555" */
585 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
586
587 uri->number = pj_str("863-1234");
588 uri->context = pj_str("+1-914-555");
589 return (pjsip_uri*)uri;
590}
591
592/* "tel:1" */
593static pjsip_uri *create_uri28(pj_pool_t *pool)
594{
595 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
596
597 uri->number = pj_str("1");
598 return (pjsip_uri*)uri;
599}
600
601/* "tel:(44).1234-*#+Deaf" */
602static pjsip_uri *create_uri29(pj_pool_t *pool)
603{
604 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
605
606 uri->number = pj_str("(44).1234-*#+Deaf");
607 return (pjsip_uri*)uri;
608}
609
610/* "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=" */
611static pjsip_uri *create_uri30(pj_pool_t *pool)
612{
613 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
614
615 uri->number = pj_str("+1");
616 uri->isub_param = pj_str("/:@&$,-_.!~*'()[]/:&$aA1%21+=");
617 return (pjsip_uri*)uri;
618}
619
620/* "tel:+1;ext=+123" */
621static pjsip_uri *create_uri31(pj_pool_t *pool)
622{
623 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
624
625 uri->number = pj_str("+1");
626 uri->ext_param = pj_str("+123");
627 return (pjsip_uri*)uri;
628}
629
630/* "tel:911;phone-context=+1-911" */
631static pjsip_uri *create_uri32(pj_pool_t *pool)
632{
633 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
634
635 uri->number = pj_str("911");
636 uri->context = pj_str("+1-911");
637 return (pjsip_uri*)uri;
638}
639
640/* "tel:911;phone-context=emergency.example.com" */
641static pjsip_uri *create_uri33(pj_pool_t *pool)
642{
643 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
644
645 uri->number = pj_str("911");
646 uri->context = pj_str("EMERGENCY.EXAMPLE.COM");
647 return (pjsip_uri*)uri;
648}
649
650/* "tel:911;p1=p1;p2=p2" */
651static pjsip_uri *create_uri34(pj_pool_t *pool)
652{
653 pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
654 pjsip_param *p;
655
656 uri->number = pj_str("911");
657
658 p = pj_pool_alloc(pool, sizeof(*p));
659 p->name = p->value = pj_str("p1");
660 pj_list_insert_before(&uri->other_param, p);
661
662 return (pjsip_uri*)uri;
663}
664
665
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000666static pjsip_uri *create_dummy(pj_pool_t *pool)
667{
668 PJ_UNUSED_ARG(pool);
669 return NULL;
670}
671
672/*****************************************************************************/
673
674/*
675 * Test one test entry.
676 */
677static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
678{
679 pj_status_t status;
680 int len;
681 pjsip_uri *parsed_uri, *ref_uri;
682 pj_str_t s1 = {NULL, 0}, s2 = {NULL, 0};
683 pj_timestamp t1, t2;
684
685 entry->len = pj_native_strlen(entry->str);
686
687 /* Parse URI text. */
688 pj_get_timestamp(&t1);
Benny Prijono5b917442005-11-21 17:07:18 +0000689 parse_len = parse_len + entry->len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000690 parsed_uri = pjsip_parse_uri(pool, entry->str, entry->len, 0);
691 if (!parsed_uri) {
692 /* Parsing failed. If the entry says that this is expected, then
693 * return OK.
694 */
695 status = entry->status==ERR_SYNTAX_ERR ? PJ_SUCCESS : -10;
696 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000697 PJ_LOG(3,(THIS_FILE, " uri parse error!\n"
698 " uri='%s'\n",
699 entry->str));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000700 }
701 goto on_return;
702 }
703 pj_get_timestamp(&t2);
704 pj_sub_timestamp(&t2, &t1);
705 pj_add_timestamp(&parse_time, &t2);
706
707 /* Create the reference URI. */
708 ref_uri = entry->creator(pool);
709
710 /* Print both URI. */
711 s1.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
712 s2.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
713
714 pj_get_timestamp(&t1);
715 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, parsed_uri, s1.ptr, PJSIP_MAX_URL_SIZE);
716 if (len < 1) {
717 status = -20;
718 goto on_return;
719 }
720 s1.ptr[len] = '\0';
721 s1.slen = len;
722
Benny Prijono5b917442005-11-21 17:07:18 +0000723 print_len = print_len + len;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000724 pj_get_timestamp(&t2);
725 pj_sub_timestamp(&t2, &t1);
726 pj_add_timestamp(&print_time, &t2);
727
728 len = pjsip_uri_print( PJSIP_URI_IN_OTHER, ref_uri, s2.ptr, PJSIP_MAX_URL_SIZE);
729 if (len < 1) {
730 status = -30;
731 goto on_return;
732 }
733 s2.ptr[len] = '\0';
734 s2.slen = len;
735
736 /* Full comparison of parsed URI with reference URI. */
Benny Prijono5b917442005-11-21 17:07:18 +0000737 pj_get_timestamp(&t1);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000738 status = pjsip_uri_cmp(PJSIP_URI_IN_OTHER, parsed_uri, ref_uri);
739 if (status != 0) {
740 /* Not equal. See if this is the expected status. */
741 status = entry->status==ERR_NOT_EQUAL ? PJ_SUCCESS : -40;
742 if (status != 0) {
Benny Prijono85598d92006-01-07 18:44:25 +0000743 PJ_LOG(3,(THIS_FILE, " uri comparison mismatch, status=%d:\n"
744 " uri1='%s'\n"
745 " uri2='%s'",
746 status, s1.ptr, s2.ptr));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000747 }
748 goto on_return;
749
750 } else {
751 /* Equal. See if this is the expected status. */
752 status = entry->status==PJ_SUCCESS ? PJ_SUCCESS : -50;
753 if (status != PJ_SUCCESS) {
754 goto on_return;
755 }
756 }
757
Benny Prijono5b917442005-11-21 17:07:18 +0000758 cmp_len = cmp_len + len;
759 pj_get_timestamp(&t2);
760 pj_sub_timestamp(&t2, &t1);
761 pj_add_timestamp(&cmp_time, &t2);
762
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000763 /* Compare text. */
Benny Prijono82458b12005-11-23 20:56:30 +0000764 if (entry->printed) {
765 if (pj_strcmp2(&s1, entry->printed) != 0) {
766 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000767 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
768 " printed='%s'\n"
769 " expectd='%s'",
770 s1.ptr, entry->printed));
Benny Prijono82458b12005-11-23 20:56:30 +0000771 status = -60;
772 }
773 } else {
774 if (pj_strcmp(&s1, &s2) != 0) {
775 /* Not equal. */
Benny Prijono85598d92006-01-07 18:44:25 +0000776 PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
777 " uri1='%s'\n"
778 " uri2='%s'",
779 s1.ptr, s2.ptr));
Benny Prijono82458b12005-11-23 20:56:30 +0000780 status = -70;
781 }
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000782 }
783
784on_return:
785 return status;
786}
787
Benny Prijono0ca04b62005-12-30 23:50:15 +0000788int uri_test()
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000789{
790 unsigned i, loop;
791 pj_pool_t *pool;
792 pj_status_t status;
793 pj_timestamp zero;
Benny Prijono5b917442005-11-21 17:07:18 +0000794 pj_time_val elapsed;
795 pj_highprec_t avg_parse, avg_print, avg_cmp, kbytes;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000796
797 zero.u32.hi = zero.u32.lo = 0;
798
Benny Prijono85598d92006-01-07 18:44:25 +0000799 PJ_LOG(3,(THIS_FILE, " simple test"));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000800 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
801 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
802 status = do_uri_test(pool, &uri_test_array[i]);
803 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000804 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000805 status, i));
806 goto on_return;
807 }
808 }
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000809 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000810
Benny Prijono85598d92006-01-07 18:44:25 +0000811 PJ_LOG(3,(THIS_FILE, " benchmarking..."));
Benny Prijono5b917442005-11-21 17:07:18 +0000812 parse_len = print_len = cmp_len = 0;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000813 parse_time.u32.hi = parse_time.u32.lo = 0;
814 print_time.u32.hi = print_time.u32.lo = 0;
Benny Prijono5b917442005-11-21 17:07:18 +0000815 cmp_time.u32.hi = cmp_time.u32.lo = 0;
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000816 for (loop=0; loop<LOOP_COUNT; ++loop) {
Benny Prijono5b917442005-11-21 17:07:18 +0000817 pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000818 for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
819 status = do_uri_test(pool, &uri_test_array[i]);
820 if (status != PJ_SUCCESS) {
Benny Prijono85598d92006-01-07 18:44:25 +0000821 PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000822 status, i));
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000823 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000824 goto on_return;
825 }
826 }
Benny Prijonofa73e3e2006-01-05 23:35:46 +0000827 pjsip_endpt_release_pool(endpt, pool);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000828 }
829
Benny Prijono5b917442005-11-21 17:07:18 +0000830 kbytes = parse_len;
831 pj_highprec_mod(kbytes, 1000000);
832 pj_highprec_div(kbytes, 100000);
833 elapsed = pj_elapsed_time(&zero, &parse_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000834 avg_parse = pj_elapsed_usec(&zero, &parse_time);
835 pj_highprec_mul(avg_parse, AVERAGE_URL_LEN);
836 pj_highprec_div(avg_parse, parse_len);
837 avg_parse = 1000000 / avg_parse;
838
Benny Prijono85598d92006-01-07 18:44:25 +0000839 PJ_LOG(3,(THIS_FILE,
840 " %u.%u MB of urls parsed in %d.%03ds (avg=%d urls/sec)",
841 (unsigned)(parse_len/1000000), (unsigned)kbytes,
842 elapsed.sec, elapsed.msec,
843 (unsigned)avg_parse));
Benny Prijono5b917442005-11-21 17:07:18 +0000844
845 kbytes = print_len;
846 pj_highprec_mod(kbytes, 1000000);
847 pj_highprec_div(kbytes, 100000);
848 elapsed = pj_elapsed_time(&zero, &print_time);
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000849 avg_print = pj_elapsed_usec(&zero, &print_time);
850 pj_highprec_mul(avg_print, AVERAGE_URL_LEN);
851 pj_highprec_div(avg_print, parse_len);
852 avg_print = 1000000 / avg_print;
853
Benny Prijono85598d92006-01-07 18:44:25 +0000854 PJ_LOG(3,(THIS_FILE,
855 " %u.%u MB of urls printed in %d.%03ds (avg=%d urls/sec)",
856 (unsigned)(print_len/1000000), (unsigned)kbytes,
857 elapsed.sec, elapsed.msec,
858 (unsigned)avg_print));
Benny Prijono5b917442005-11-21 17:07:18 +0000859
860 kbytes = cmp_len;
861 pj_highprec_mod(kbytes, 1000000);
862 pj_highprec_div(kbytes, 100000);
863 elapsed = pj_elapsed_time(&zero, &cmp_time);
864 avg_cmp = pj_elapsed_usec(&zero, &cmp_time);
865 pj_highprec_mul(avg_cmp, AVERAGE_URL_LEN);
866 pj_highprec_div(avg_cmp, cmp_len);
867 avg_cmp = 1000000 / avg_cmp;
868
Benny Prijono85598d92006-01-07 18:44:25 +0000869 PJ_LOG(3,(THIS_FILE,
870 " %u.%u MB of urls compared in %d.%03ds (avg=%d urls/sec)",
871 (unsigned)(cmp_len/1000000), (unsigned)kbytes,
872 elapsed.sec, elapsed.msec,
873 (unsigned)avg_cmp));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000874
Benny Prijono85598d92006-01-07 18:44:25 +0000875 PJ_LOG(3,(THIS_FILE, " multithreaded test"));
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000876
877
878on_return:
Benny Prijono5dcb38d2005-11-21 01:55:47 +0000879 return status;
880}
881