Set svn:eol-style property

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@65 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/src/test-pjsip/uri.c b/pjsip/src/test-pjsip/uri.c
index a61382f..4435d1a 100644
--- a/pjsip/src/test-pjsip/uri.c
+++ b/pjsip/src/test-pjsip/uri.c
@@ -1,560 +1,636 @@
-/* $Id$ */

-/* 

- * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>

- *

- * This program is free software; you can redistribute it and/or modify

- * it under the terms of the GNU General Public License as published by

- * the Free Software Foundation; either version 2 of the License, or

- * (at your option) any later version.

- *

- * This program is distributed in the hope that it will be useful,

- * but WITHOUT ANY WARRANTY; without even the implied warranty of

- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

- * GNU General Public License for more details.

- *

- * You should have received a copy of the GNU General Public License

- * along with this program; if not, write to the Free Software

- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 

- */

-#include "test.h"

-#include <pjsip_core.h>

-#include <pjlib.h>

-

-

-#define ALPHANUM    "abcdefghijklmnopqrstuvwxyz" \

-		    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \

-		    "0123456789"

-#define MARK	    "-_.!~*'()"

-#define USER	    "&=+$,;?/%"

-#define PASS	    "&=+$,%"

-#define PARAM_CHAR  "[]/:&+$" MARK "%"

-

-#define POOL_SIZE	4096

-

-static pj_uint32_t parse_len, parse_time, print_time;

-

-

-/* URI creator functions. */

-static pjsip_uri *create_uri1( pj_pool_t *pool );

-static pjsip_uri *create_uri2( pj_pool_t *pool );

-static pjsip_uri *create_uri3( pj_pool_t *pool );

-static pjsip_uri *create_uri4( pj_pool_t *pool );

-static pjsip_uri *create_uri5( pj_pool_t *pool );

-static pjsip_uri *create_uri6( pj_pool_t *pool );

-static pjsip_uri *create_uri7( pj_pool_t *pool );

-static pjsip_uri *create_uri8( pj_pool_t *pool );

-static pjsip_uri *create_uri9( pj_pool_t *pool );

-static pjsip_uri *create_uri10( pj_pool_t *pool );

-static pjsip_uri *create_uri11( pj_pool_t *pool );

-static pjsip_uri *create_uri12( pj_pool_t *pool );

-static pjsip_uri *create_uri13( pj_pool_t *pool );

-static pjsip_uri *create_uri14( pj_pool_t *pool );

-static pjsip_uri *create_uri15( pj_pool_t *pool );

-static pjsip_uri *create_uri16( pj_pool_t *pool );

-static pjsip_uri *create_uri17( pj_pool_t *pool );

-static pjsip_uri *create_uri18( pj_pool_t *pool );

-static pjsip_uri *create_uri19( pj_pool_t *pool );

-static pjsip_uri *create_dummy( pj_pool_t *pool );

-

-#define ERR_NOT_EQUAL	-1001

-#define ERR_SYNTAX_ERR	-1002

-

-struct uri_test

-{

-    pj_status_t	     status;

-    char	     str[PJSIP_MAX_URL_SIZE];

-    pjsip_uri *(*creator)(pj_pool_t *pool);

-    pj_size_t	     len;

-} uri_test_array[] = 

-{

-    {

-	PJ_SUCCESS,

-	"sip:localhost",

-	&create_uri1

-    },

-    {

-	PJ_SUCCESS,

-	"sip:user@localhost",

-	&create_uri2

-    },

-    {

-	PJ_SUCCESS,

-	"sip:user:password@localhost:5060",

-	&create_uri3,

-    },

-    {

-	/* Port is specified should not match unspecified port. */

-	ERR_NOT_EQUAL,

-	"sip:localhost:5060",

-	&create_uri4

-    },

-    {

-	/* All recognized parameters. */

-	PJ_SUCCESS,

-	"sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK",

-	&create_uri5

-    },

-    {

-	/* Params mixed with other params and header params. */

-	PJ_SUCCESS,

-	"sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"

-	"?Subject=Hello%20There&Server=SIP%20Server",

-	&create_uri6

-    },

-    {

-	/* SIPS. */

-	PJ_SUCCESS,

-	"sips:localhost",

-	&create_uri7,

-    },

-    {

-	/* Name address */

-	PJ_SUCCESS,

-	"<sip:localhost>",

-	&create_uri8

-    },

-    {

-	/* Name address with display name and SIPS scheme with some redundant

-	 * whitespaced.

-	 */

-	PJ_SUCCESS,

-	"  Power Administrator  <sips:localhost>",

-	&create_uri9

-    },

-    {

-	/* Name address. */

-	PJ_SUCCESS,

-	" \"User\" <sip:user@localhost:5071>",

-	&create_uri10

-    },

-    {

-	/* Escaped sequence in display name (display=Strange User\"\\\"). */

-	PJ_SUCCESS,

-	" \"Strange User\\\"\\\\\\\"\" <sip:localhost>",

-	&create_uri11,

-    },

-    {

-	/* Errorneous escaping in display name. */

-	ERR_SYNTAX_ERR,

-	" \"Rogue User\\\" <sip:localhost>",

-	&create_uri12,

-    },

-    {

-	/* Dangling quote in display name, but that should be OK. */

-	PJ_SUCCESS,

-	"Strange User\" <sip:localhost>",

-	&create_uri13,

-    },

-    {

-	/* Special characters in parameter value must be quoted. */

-	PJ_SUCCESS,

-	"sip:localhost;pvalue=\"hello world\"",

-	&create_uri14,

-    },

-    {

-	/* Excercise strange character sets allowed in display, user, password,

-	 * host, and port. 

-	 */

-	PJ_SUCCESS,

-	"This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%09a&Zz=+$,@"

-	"my_proxy09.MY-domain.com:9801>",

-	&create_uri15,

-    },

-    {

-	/* Another excercise to the allowed character sets to the hostname. */

-	PJ_SUCCESS,

-	"sip:" ALPHANUM "-_.com",

-	&create_uri16,

-    },

-    {

-	/* Another excercise to the allowed character sets to the username 

-	 * and password.

-	 */

-	PJ_SUCCESS,

-	"sip:" ALPHANUM USER ":" ALPHANUM PASS "@host",

-	&create_uri17,

-    },

-    {

-	/* Excercise to the pname and pvalue, and mixup of other-param

-	 * between 'recognized' params.

-	 */

-	PJ_SUCCESS,

-	"sip:host;user=ip;" ALPHANUM PARAM_CHAR "=" ALPHANUM PARAM_CHAR 

-	";lr;other=1;transport=sctp;other2",

-	&create_uri18,

-    },

-    {

-	/* This should trigger syntax error. */

-	ERR_SYNTAX_ERR,

-	"sip:",

-	&create_dummy,

-    },

-    {

-	/* Syntax error: whitespace after scheme. */

-	ERR_SYNTAX_ERR,

-	"sip :host",

-	&create_dummy,

-    },

-    {

-	/* Syntax error: whitespace before hostname. */

-	ERR_SYNTAX_ERR,

-	"sip: host",

-	&create_dummy,

-    },

-    {

-	/* Syntax error: invalid port. */

-	ERR_SYNTAX_ERR,

-	"sip:user:password",

-	&create_dummy,

-    },

-    {

-	/* Syntax error: no host. */

-	ERR_SYNTAX_ERR,

-	"sip:user@",

-	&create_dummy,

-    },

-    {

-	/* Syntax error: no user/host. */

-	ERR_SYNTAX_ERR,

-	"sip:@",

-	&create_dummy,

-    },

-    {

-	/* Syntax error: empty string. */

-	ERR_SYNTAX_ERR,

-	"",

-	&create_dummy,

-    }

-};

-

-static pjsip_uri *create_uri1(pj_pool_t *pool)

-{

-    /* "sip:localhost" */

-    pjsip_url *url = pjsip_url_create(pool, 0);

-

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_uri2(pj_pool_t *pool)

-{

-    /* "sip:user@localhost" */

-    pjsip_url *url = pjsip_url_create(pool, 0);

-

-    pj_strdup2( pool, &url->user, "user");

-    pj_strdup2( pool, &url->host, "localhost");

-

-    return (pjsip_uri*) url;

-}

-

-static pjsip_uri *create_uri3(pj_pool_t *pool)

-{

-    /* "sip:user:password@localhost:5060" */

-    pjsip_url *url = pjsip_url_create(pool, 0);

-

-    pj_strdup2( pool, &url->user, "user");

-    pj_strdup2( pool, &url->passwd, "password");

-    pj_strdup2( pool, &url->host, "localhost");

-    url->port = 5060;

-

-    return (pjsip_uri*) url;

-}

-

-static pjsip_uri *create_uri4(pj_pool_t *pool)

-{

-    /* Like: "sip:localhost:5060", but without the port. */

-    pjsip_url *url = pjsip_url_create(pool, 0);

-

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_uri5(pj_pool_t *pool)

-{

-    /* "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK" */

-    pjsip_url *url = pjsip_url_create(pool, 0);

-

-    pj_strdup2(pool, &url->host, "localhost");

-    pj_strdup2(pool, &url->transport_param, "tcp");

-    pj_strdup2(pool, &url->user_param, "ip");

-    url->ttl_param = 255;

-    url->lr_param = 1;

-    pj_strdup2(pool, &url->maddr_param, "127.0.0.1");

-    pj_strdup2(pool, &url->method_param, "ACK");

-

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_uri6(pj_pool_t *pool)

-{

-    /* "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"

-       "?Subject=Hello%20There&Server=SIP%20Server" 

-     */

-    pjsip_url *url = pjsip_url_create(pool, 0);

-

-    pj_strdup2(pool, &url->host, "localhost");

-    pj_strdup2(pool, &url->user_param, "phone");

-    pj_strdup2(pool, &url->other_param, ";pickup=hurry;message=I%20am%20sorry");

-    pj_strdup2(pool, &url->header_param, "?Subject=Hello%20There&Server=SIP%20Server");

-    return (pjsip_uri*)url;

-

-}

-

-static pjsip_uri *create_uri7(pj_pool_t *pool)

-{

-    /* "sips:localhost" */

-    pjsip_url *url = pjsip_url_create(pool, 1);

-

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_uri8(pj_pool_t *pool)

-{

-    /* "<sip:localhost>" */

-    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);

-    pjsip_url *url;

-

-    url = pjsip_url_create(pool, 0);

-    name_addr->uri = (pjsip_uri*) url;

-

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)name_addr;

-}

-

-static pjsip_uri *create_uri9(pj_pool_t *pool)

-{

-    /* "  Power Administrator <sips:localhost>" */

-    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);

-    pjsip_url *url;

-

-    url = pjsip_url_create(pool, 1);

-    name_addr->uri = (pjsip_uri*) url;

-

-    pj_strdup2(pool, &name_addr->display, "Power Administrator");

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)name_addr;

-}

-

-static pjsip_uri *create_uri10(pj_pool_t *pool)

-{

-    /* " \"User\" <sip:user@localhost:5071>" */

-    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);

-    pjsip_url *url;

-

-    url = pjsip_url_create(pool, 0);

-    name_addr->uri = (pjsip_uri*) url;

-

-    pj_strdup2(pool, &name_addr->display, "\"User\"");

-    pj_strdup2(pool, &url->user, "user");

-    pj_strdup2(pool, &url->host, "localhost");

-    url->port = 5071;

-    return (pjsip_uri*)name_addr;

-}

-

-static pjsip_uri *create_uri11(pj_pool_t *pool)

-{

-    /* " \"Strange User\\\"\\\\\\\"\" <sip:localhost>" */

-    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);

-    pjsip_url *url;

-

-    url = pjsip_url_create(pool, 0);

-    name_addr->uri = (pjsip_uri*) url;

-

-    pj_strdup2(pool, &name_addr->display, "\"Strange User\\\"\\\\\\\"\"");

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)name_addr;

-}

-

-static pjsip_uri *create_uri12(pj_pool_t *pool)

-{

-    /* " \"Rogue User\\\" <sip:localhost>" */

-    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);

-    pjsip_url *url;

-

-    url = pjsip_url_create(pool, 0);

-    name_addr->uri = (pjsip_uri*) url;

-

-    pj_strdup2(pool, &name_addr->display, "\"Rogue User\\\"");

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)name_addr;

-}

-

-static pjsip_uri *create_uri13(pj_pool_t *pool)

-{

-    /* "Strange User\" <sip:localhost>" */

-    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);

-    pjsip_url *url;

-

-    url = pjsip_url_create(pool, 0);

-    name_addr->uri = (pjsip_uri*) url;

-

-    pj_strdup2(pool, &name_addr->display, "Strange User\"");

-    pj_strdup2(pool, &url->host, "localhost");

-    return (pjsip_uri*)name_addr;

-}

-

-static pjsip_uri *create_uri14(pj_pool_t *pool)

-{

-    /* "sip:localhost;pvalue=\"hello world\"" */

-    pjsip_url *url;

-    url = pjsip_url_create(pool, 0);

-    pj_strdup2(pool, &url->host, "localhost");

-    pj_strdup2(pool, &url->other_param, ";pvalue=\"hello world\"");

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_uri15(pj_pool_t *pool)

-{

-    /* "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%09a&Zz=+$,@my_proxy09.my-domain.com:9801>" */

-    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);

-    pjsip_url *url;

-

-    url = pjsip_url_create(pool, 0);

-    name_addr->uri = (pjsip_uri*) url;

-

-    pj_strdup2(pool, &name_addr->display, "This is -. !% *_+`'~ me");

-    pj_strdup2(pool, &url->user, "a19A&=+$,;?/%2c");

-    pj_strdup2(pool, &url->passwd, "%09a&Zz=+$,");

-    pj_strdup2(pool, &url->host, "my_proxy09.MY-domain.com");

-    url->port = 9801;

-    return (pjsip_uri*)name_addr;

-}

-

-static pjsip_uri *create_uri16(pj_pool_t *pool)

-{

-    /* "sip:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.com" */

-    pjsip_url *url;

-    url = pjsip_url_create(pool, 0);

-    pj_strdup2(pool, &url->host, ALPHANUM "-_.com");

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_uri17(pj_pool_t *pool)

-{

-    /* "sip:" ALPHANUM USER ":" ALPHANUM PASS "@host" */

-    pjsip_url *url;

-    url = pjsip_url_create(pool, 0);

-    pj_strdup2(pool, &url->user, ALPHANUM USER);

-    pj_strdup2(pool, &url->passwd, ALPHANUM PASS);

-    pj_strdup2(pool, &url->host, "host");

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_uri18(pj_pool_t *pool)

-{

-    /* "sip:host;user=ip;" ALPHANUM PARAM_CHAR "=" ALPHANUM PARAM_CHAR ";lr;other=1;transport=sctp;other2" */

-    pjsip_url *url;

-    url = pjsip_url_create(pool, 0);

-    pj_strdup2(pool, &url->host, "host");

-    pj_strdup2(pool, &url->user_param, "ip");

-    pj_strdup2(pool, &url->transport_param, "sctp");

-    pj_strdup2(pool, &url->other_param, ";" ALPHANUM PARAM_CHAR "=" ALPHANUM PARAM_CHAR ";other=1;other2");    

-    url->lr_param = 1;

-    return (pjsip_uri*)url;

-}

-

-static pjsip_uri *create_dummy(pj_pool_t *pool)

-{

-    PJ_UNUSED_ARG(pool);

-    return NULL;

-}

-

-/*****************************************************************************/

-

-/*

- * Test one test entry.

- */

-static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)

-{

-    pj_status_t status;

-    int len;

-    pjsip_uri *parsed_uri, *ref_uri;

-    pj_str_t s1 = {NULL, 0}, s2 = {NULL, 0};

-    pj_timestamp t1, t2;

-

-    entry->len = pj_native_strlen(entry->str);

-

-    /* Parse URI text. */

-    pj_get_timestamp(&t1);

-    parse_len += entry->len;

-    parsed_uri = pjsip_parse_uri(pool, entry->str, entry->len, 0);

-    if (!parsed_uri) {

-	/* Parsing failed. If the entry says that this is expected, then

-	 * return OK.

-	 */

-	status = entry->status==ERR_SYNTAX_ERR ? PJ_SUCCESS : -10;

-	goto on_return;

-    }

-    pj_get_timestamp(&t2);

-    parse_time += t2.u32.lo - t1.u32.lo;

-

-    /* Create the reference URI. */

-    ref_uri = entry->creator(pool);

-

-    /* Print both URI. */

-    s1.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);

-    s2.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);

-

-    pj_get_timestamp(&t1);

-    len = pjsip_uri_print( PJSIP_URI_IN_OTHER, parsed_uri, s1.ptr, PJSIP_MAX_URL_SIZE);

-    if (len < 1) {

-	status = -20;

-	goto on_return;

-    }

-    s1.slen = len;

-

-    len = pjsip_uri_print( PJSIP_URI_IN_OTHER, ref_uri, s2.ptr, PJSIP_MAX_URL_SIZE);

-    if (len < 1) {

-	status = -30;

-	goto on_return;

-    }

-    s2.slen = len;

-    pj_get_timestamp(&t2);

-    print_time += t2.u32.lo - t1.u32.lo;

-

-    /* Full comparison of parsed URI with reference URI. */

-    if (pjsip_uri_cmp(PJSIP_URI_IN_OTHER, parsed_uri, ref_uri) != 0) {

-	/* Not equal. See if this is the expected status. */

-	status = entry->status==ERR_NOT_EQUAL ? PJ_SUCCESS : -40;

-	goto on_return;

-

-    } else {

-	/* Equal. See if this is the expected status. */

-	status = entry->status==PJ_SUCCESS ? PJ_SUCCESS : -50;

-	if (status != PJ_SUCCESS) {

-	    goto on_return;

-	}

-    }

-

-    /* Compare text. */

-    if (pj_strcmp(&s1, &s2) != 0) {

-	/* Not equal. */

-	status = -60;

-    }

-

-on_return:

-    return status;

-}

-

-pj_status_t uri_test()

-{

-    unsigned i;

-    pj_pool_t *pool;

-    pj_status_t status;

-

-    pool = pjsip_endpt_create_pool(endpt, "", 4000, 4000);

-

-    for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {

-	status = do_uri_test(pool, &uri_test_array[i]);

-	if (status != PJ_SUCCESS) {

-	    PJ_LOG(3,("uri_test", "  error %d when testing entry %d",

-		      status, i));

-	    break;

-	}

-    }

-

-    pjsip_endpt_destroy_pool(endpt, pool);

-    return status;

-}

-

+/* $Id$ */
+/* 
+ * Copyright (C) 2003-2006 Benny Prijono <benny@prijono.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
+ */
+#include "test.h"
+#include <pjsip_core.h>
+#include <pjlib.h>
+
+
+#define ALPHANUM    "abcdefghijklmnopqrstuvwxyz" \
+		    "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
+		    "0123456789"
+#define MARK	    "-_.!~*'()"
+#define USER_CHAR   ALPHANUM MARK "&=+$,;?/"
+#define PASS_CHAR   ALPHANUM MARK "&=+$,"
+#define PARAM_CHAR  ALPHANUM MARK "[]/:&+$"
+
+#define POOL_SIZE	4000
+#define LOOP_COUNT	1000
+#define AVERAGE_URL_LEN	80
+#define THREAD_COUNT	4
+
+static pj_uint32_t parse_len;
+static pj_timestamp parse_time, print_time;
+
+
+/* URI creator functions. */
+static pjsip_uri *create_uri0( pj_pool_t *pool );
+static pjsip_uri *create_uri1( pj_pool_t *pool );
+static pjsip_uri *create_uri2( pj_pool_t *pool );
+static pjsip_uri *create_uri3( pj_pool_t *pool );
+static pjsip_uri *create_uri4( pj_pool_t *pool );
+static pjsip_uri *create_uri5( pj_pool_t *pool );
+static pjsip_uri *create_uri6( pj_pool_t *pool );
+static pjsip_uri *create_uri7( pj_pool_t *pool );
+static pjsip_uri *create_uri8( pj_pool_t *pool );
+static pjsip_uri *create_uri9( pj_pool_t *pool );
+static pjsip_uri *create_uri10( pj_pool_t *pool );
+static pjsip_uri *create_uri11( pj_pool_t *pool );
+static pjsip_uri *create_uri12( pj_pool_t *pool );
+static pjsip_uri *create_uri13( pj_pool_t *pool );
+static pjsip_uri *create_uri14( pj_pool_t *pool );
+static pjsip_uri *create_uri15( pj_pool_t *pool );
+static pjsip_uri *create_uri16( pj_pool_t *pool );
+static pjsip_uri *create_uri17( pj_pool_t *pool );
+static pjsip_uri *create_dummy( pj_pool_t *pool );
+
+#define ERR_NOT_EQUAL	-1001
+#define ERR_SYNTAX_ERR	-1002
+
+struct uri_test
+{
+    pj_status_t	     status;
+    char	     str[PJSIP_MAX_URL_SIZE];
+    pjsip_uri *(*creator)(pj_pool_t *pool);
+    pj_size_t	     len;
+} uri_test_array[] = 
+{
+    {
+	PJ_SUCCESS,
+	"sip:localhost",
+	&create_uri0
+    },
+    {
+	PJ_SUCCESS,
+	"sip:user@localhost",
+	&create_uri1
+    },
+    {
+	PJ_SUCCESS,
+	"sip:user:password@localhost:5060",
+	&create_uri2,
+    },
+    {
+	/* Port is specified should not match unspecified port. */
+	ERR_NOT_EQUAL,
+	"sip:localhost:5060",
+	&create_uri3
+    },
+    {
+	/* All recognized parameters. */
+	PJ_SUCCESS,
+	"sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK",
+	&create_uri4
+    },
+    {
+	/* Params mixed with other params and header params. */
+	PJ_SUCCESS,
+	"sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
+	"?Subject=Hello%20There&Server=SIP%20Server",
+	&create_uri5
+    },
+    {
+	/* SIPS. */
+	PJ_SUCCESS,
+	"sips:localhost",
+	&create_uri6,
+    },
+    {
+	/* Name address */
+	PJ_SUCCESS,
+	"<sip:localhost>",
+	&create_uri7
+    },
+    {
+	/* Name address with display name and SIPS scheme with some redundant
+	 * whitespaced.
+	 */
+	PJ_SUCCESS,
+	"  Power Administrator  <sips:localhost>",
+	&create_uri8
+    },
+    {
+	/* Name address. */
+	PJ_SUCCESS,
+	" \"User\" <sip:user@localhost:5071>",
+	&create_uri9
+    },
+    {
+	/* Escaped sequence in display name (display=Strange User\"\\\"). */
+	PJ_SUCCESS,
+	" \"Strange User\\\"\\\\\\\"\" <sip:localhost>",
+	&create_uri10,
+    },
+    {
+	/* Errorneous escaping in display name. */
+	ERR_SYNTAX_ERR,
+	" \"Rogue User\\\" <sip:localhost>",
+	&create_uri11,
+    },
+    {
+	/* Dangling quote in display name, but that should be OK. */
+	PJ_SUCCESS,
+	"Strange User\" <sip:localhost>",
+	&create_uri12,
+    },
+    {
+	/* Special characters in parameter value must be quoted. */
+	PJ_SUCCESS,
+	"sip:localhost;pvalue=\"hello world\"",
+	&create_uri13,
+    },
+    {
+	/* Excercise strange character sets allowed in display, user, password,
+	 * host, and port. 
+	 */
+	PJ_SUCCESS,
+	"This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@"
+	"my_proxy09.MY-domain.com:9801>",
+	&create_uri14,
+    },
+    {
+	/* Another excercise to the allowed character sets to the hostname. */
+	PJ_SUCCESS,
+	"sip:" ALPHANUM "-_.com",
+	&create_uri15,
+    },
+    {
+	/* Another excercise to the allowed character sets to the username 
+	 * and password.
+	 */
+	PJ_SUCCESS,
+	"sip:" USER_CHAR ":" PASS_CHAR "@host",
+	&create_uri16,
+    },
+    {
+	/* Excercise to the pname and pvalue, and mixup of other-param
+	 * between 'recognized' params.
+	 */
+	PJ_SUCCESS,
+	"sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21"
+	";lr;other=1;transport=sctp;other2",
+	&create_uri17,
+    },
+    {
+	/* 18: This should trigger syntax error. */
+	ERR_SYNTAX_ERR,
+	"sip:",
+	&create_dummy,
+    },
+    {
+	/* 19: Syntax error: whitespace after scheme. */
+	ERR_SYNTAX_ERR,
+	"sip :host",
+	&create_dummy,
+    },
+    {
+	/* 20: Syntax error: whitespace before hostname. */
+	ERR_SYNTAX_ERR,
+	"sip: host",
+	&create_dummy,
+    },
+    {
+	/* 21: Syntax error: invalid port. */
+	ERR_SYNTAX_ERR,
+	"sip:user:password",
+	&create_dummy,
+    },
+    {
+	/* 22: Syntax error: no host. */
+	ERR_SYNTAX_ERR,
+	"sip:user@",
+	&create_dummy,
+    },
+    {
+	/* 23: Syntax error: no user/host. */
+	ERR_SYNTAX_ERR,
+	"sip:@",
+	&create_dummy,
+    },
+    {
+	/* 24: Syntax error: empty string. */
+	ERR_SYNTAX_ERR,
+	"",
+	&create_dummy,
+    }
+};
+
+static pjsip_uri *create_uri0(pj_pool_t *pool)
+{
+    /* "sip:localhost" */
+    pjsip_url *url = pjsip_url_create(pool, 0);
+
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)url;
+}
+
+static pjsip_uri *create_uri1(pj_pool_t *pool)
+{
+    /* "sip:user@localhost" */
+    pjsip_url *url = pjsip_url_create(pool, 0);
+
+    pj_strdup2( pool, &url->user, "user");
+    pj_strdup2( pool, &url->host, "localhost");
+
+    return (pjsip_uri*) url;
+}
+
+static pjsip_uri *create_uri2(pj_pool_t *pool)
+{
+    /* "sip:user:password@localhost:5060" */
+    pjsip_url *url = pjsip_url_create(pool, 0);
+
+    pj_strdup2( pool, &url->user, "user");
+    pj_strdup2( pool, &url->passwd, "password");
+    pj_strdup2( pool, &url->host, "localhost");
+    url->port = 5060;
+
+    return (pjsip_uri*) url;
+}
+
+static pjsip_uri *create_uri3(pj_pool_t *pool)
+{
+    /* Like: "sip:localhost:5060", but without the port. */
+    pjsip_url *url = pjsip_url_create(pool, 0);
+
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)url;
+}
+
+static pjsip_uri *create_uri4(pj_pool_t *pool)
+{
+    /* "sip:localhost;transport=tcp;user=ip;ttl=255;lr;maddr=127.0.0.1;method=ACK" */
+    pjsip_url *url = pjsip_url_create(pool, 0);
+
+    pj_strdup2(pool, &url->host, "localhost");
+    pj_strdup2(pool, &url->transport_param, "tcp");
+    pj_strdup2(pool, &url->user_param, "ip");
+    url->ttl_param = 255;
+    url->lr_param = 1;
+    pj_strdup2(pool, &url->maddr_param, "127.0.0.1");
+    pj_strdup2(pool, &url->method_param, "ACK");
+
+    return (pjsip_uri*)url;
+}
+
+#define param_add(list,pname,pvalue)  \
+	do { \
+	    pjsip_param *param; \
+	    param=pj_pool_alloc(pool, sizeof(pjsip_param)); \
+	    param->name = pj_str(pname); \
+	    param->value = pj_str(pvalue); \
+	    pj_list_insert_before(&list, param); \
+	} while (0)
+
+static pjsip_uri *create_uri5(pj_pool_t *pool)
+{
+    /* "sip:localhost;pickup=hurry;user=phone;message=I%20am%20sorry"
+       "?Subject=Hello%20There&Server=SIP%20Server" 
+     */
+    pjsip_url *url = pjsip_url_create(pool, 0);
+
+    pj_strdup2(pool, &url->host, "localhost");
+    pj_strdup2(pool, &url->user_param, "phone");
+
+    //pj_strdup2(pool, &url->other_param, ";pickup=hurry;message=I%20am%20sorry");
+    param_add(url->other_param, "pickup", "hurry");
+    param_add(url->other_param, "message", "I am sorry");
+
+    //pj_strdup2(pool, &url->header_param, "?Subject=Hello%20There&Server=SIP%20Server");
+    param_add(url->header_param, "Subject", "Hello There");
+    param_add(url->header_param, "Server", "SIP Server");
+    return (pjsip_uri*)url;
+
+}
+
+static pjsip_uri *create_uri6(pj_pool_t *pool)
+{
+    /* "sips:localhost" */
+    pjsip_url *url = pjsip_url_create(pool, 1);
+
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)url;
+}
+
+static pjsip_uri *create_uri7(pj_pool_t *pool)
+{
+    /* "<sip:localhost>" */
+    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
+    pjsip_url *url;
+
+    url = pjsip_url_create(pool, 0);
+    name_addr->uri = (pjsip_uri*) url;
+
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)name_addr;
+}
+
+static pjsip_uri *create_uri8(pj_pool_t *pool)
+{
+    /* "  Power Administrator <sips:localhost>" */
+    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
+    pjsip_url *url;
+
+    url = pjsip_url_create(pool, 1);
+    name_addr->uri = (pjsip_uri*) url;
+
+    pj_strdup2(pool, &name_addr->display, "Power Administrator");
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)name_addr;
+}
+
+static pjsip_uri *create_uri9(pj_pool_t *pool)
+{
+    /* " \"User\" <sip:user@localhost:5071>" */
+    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
+    pjsip_url *url;
+
+    url = pjsip_url_create(pool, 0);
+    name_addr->uri = (pjsip_uri*) url;
+
+    pj_strdup2(pool, &name_addr->display, "User");
+    pj_strdup2(pool, &url->user, "user");
+    pj_strdup2(pool, &url->host, "localhost");
+    url->port = 5071;
+    return (pjsip_uri*)name_addr;
+}
+
+static pjsip_uri *create_uri10(pj_pool_t *pool)
+{
+    /* " \"Strange User\\\"\\\\\\\"\" <sip:localhost>" */
+    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
+    pjsip_url *url;
+
+    url = pjsip_url_create(pool, 0);
+    name_addr->uri = (pjsip_uri*) url;
+
+    pj_strdup2(pool, &name_addr->display, "Strange User\\\"\\\\\\\"");
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)name_addr;
+}
+
+static pjsip_uri *create_uri11(pj_pool_t *pool)
+{
+    /* " \"Rogue User\\\" <sip:localhost>" */
+    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
+    pjsip_url *url;
+
+    url = pjsip_url_create(pool, 0);
+    name_addr->uri = (pjsip_uri*) url;
+
+    pj_strdup2(pool, &name_addr->display, "Rogue User\\");
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)name_addr;
+}
+
+static pjsip_uri *create_uri12(pj_pool_t *pool)
+{
+    /* "Strange User\" <sip:localhost>" */
+    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
+    pjsip_url *url;
+
+    url = pjsip_url_create(pool, 0);
+    name_addr->uri = (pjsip_uri*) url;
+
+    pj_strdup2(pool, &name_addr->display, "Strange User\"");
+    pj_strdup2(pool, &url->host, "localhost");
+    return (pjsip_uri*)name_addr;
+}
+
+static pjsip_uri *create_uri13(pj_pool_t *pool)
+{
+    /* "sip:localhost;pvalue=\"hello world\"" */
+    pjsip_url *url;
+    url = pjsip_url_create(pool, 0);
+    pj_strdup2(pool, &url->host, "localhost");
+    //pj_strdup2(pool, &url->other_param, ";pvalue=\"hello world\"");
+    param_add(url->other_param, "pvalue", "hello world");
+    return (pjsip_uri*)url;
+}
+
+static pjsip_uri *create_uri14(pj_pool_t *pool)
+{
+    /* "This is -. !% *_+`'~ me <sip:a19A&=+$,;?/%2c:%40a&Zz=+$,@my_proxy09.my-domain.com:9801>" */
+    pjsip_name_addr *name_addr = pjsip_name_addr_create(pool);
+    pjsip_url *url;
+
+    url = pjsip_url_create(pool, 0);
+    name_addr->uri = (pjsip_uri*) url;
+
+    pj_strdup2(pool, &name_addr->display, "This is -. !% *_+`'~ me");
+    pj_strdup2(pool, &url->user, "a19A&=+$,;?/,");
+    pj_strdup2(pool, &url->passwd, "@a&Zz=+$,");
+    pj_strdup2(pool, &url->host, "my_proxy09.MY-domain.com");
+    url->port = 9801;
+    return (pjsip_uri*)name_addr;
+}
+
+static pjsip_uri *create_uri15(pj_pool_t *pool)
+{
+    /* "sip:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.com" */
+    pjsip_url *url;
+    url = pjsip_url_create(pool, 0);
+    pj_strdup2(pool, &url->host, ALPHANUM "-_.com");
+    return (pjsip_uri*)url;
+}
+
+static pjsip_uri *create_uri16(pj_pool_t *pool)
+{
+    /* "sip:" USER_CHAR ":" PASS_CHAR "@host" */
+    pjsip_url *url;
+    url = pjsip_url_create(pool, 0);
+    pj_strdup2(pool, &url->user, USER_CHAR);
+    pj_strdup2(pool, &url->passwd, PASS_CHAR);
+    pj_strdup2(pool, &url->host, "host");
+    return (pjsip_uri*)url;
+}
+
+static pjsip_uri *create_uri17(pj_pool_t *pool)
+{
+    /* "sip:host;user=ip;" PARAM_CHAR "%21=" PARAM_CHAR "%21;lr;other=1;transport=sctp;other2" */
+    pjsip_url *url;
+    url = pjsip_url_create(pool, 0);
+    pj_strdup2(pool, &url->host, "host");
+    pj_strdup2(pool, &url->user_param, "ip");
+    pj_strdup2(pool, &url->transport_param, "sctp");
+    param_add(url->other_param, PARAM_CHAR "!", PARAM_CHAR "!");
+    param_add(url->other_param, "other", "1");
+    param_add(url->other_param, "other2", "");
+    url->lr_param = 1;
+    return (pjsip_uri*)url;
+}
+
+static pjsip_uri *create_dummy(pj_pool_t *pool)
+{
+    PJ_UNUSED_ARG(pool);
+    return NULL;
+}
+
+/*****************************************************************************/
+
+/*
+ * Test one test entry.
+ */
+static pj_status_t do_uri_test(pj_pool_t *pool, struct uri_test *entry)
+{
+    pj_status_t status;
+    int len;
+    pjsip_uri *parsed_uri, *ref_uri;
+    pj_str_t s1 = {NULL, 0}, s2 = {NULL, 0};
+    pj_timestamp t1, t2;
+
+    entry->len = pj_native_strlen(entry->str);
+
+    /* Parse URI text. */
+    pj_get_timestamp(&t1);
+    parse_len += entry->len;
+    parsed_uri = pjsip_parse_uri(pool, entry->str, entry->len, 0);
+    if (!parsed_uri) {
+	/* Parsing failed. If the entry says that this is expected, then
+	 * return OK.
+	 */
+	status = entry->status==ERR_SYNTAX_ERR ? PJ_SUCCESS : -10;
+	if (status != 0) {
+	    PJ_LOG(3,("", "   uri parse error!\n"
+			  "   uri='%s'\n",
+			  entry->str));
+	}
+	goto on_return;
+    }
+    pj_get_timestamp(&t2);
+    pj_sub_timestamp(&t2, &t1);
+    pj_add_timestamp(&parse_time, &t2);
+
+    /* Create the reference URI. */
+    ref_uri = entry->creator(pool);
+
+    /* Print both URI. */
+    s1.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
+    s2.ptr = pj_pool_alloc(pool, PJSIP_MAX_URL_SIZE);
+
+    pj_get_timestamp(&t1);
+    len = pjsip_uri_print( PJSIP_URI_IN_OTHER, parsed_uri, s1.ptr, PJSIP_MAX_URL_SIZE);
+    if (len < 1) {
+	status = -20;
+	goto on_return;
+    }
+    s1.ptr[len] = '\0';
+    s1.slen = len;
+
+    pj_get_timestamp(&t2);
+    pj_sub_timestamp(&t2, &t1);
+    pj_add_timestamp(&print_time, &t2);
+
+    len = pjsip_uri_print( PJSIP_URI_IN_OTHER, ref_uri, s2.ptr, PJSIP_MAX_URL_SIZE);
+    if (len < 1) {
+	status = -30;
+	goto on_return;
+    }
+    s2.ptr[len] = '\0';
+    s2.slen = len;
+
+    /* Full comparison of parsed URI with reference URI. */
+    status = pjsip_uri_cmp(PJSIP_URI_IN_OTHER, parsed_uri, ref_uri);
+    if (status != 0) {
+	/* Not equal. See if this is the expected status. */
+	status = entry->status==ERR_NOT_EQUAL ? PJ_SUCCESS : -40;
+	if (status != 0) {
+	    PJ_LOG(3,("", "   uri comparison mismatch, status=%d:\n"
+			  "    uri1='%s'\n"
+			  "    uri2='%s'",
+			  status, s1.ptr, s2.ptr));
+	}
+	goto on_return;
+
+    } else {
+	/* Equal. See if this is the expected status. */
+	status = entry->status==PJ_SUCCESS ? PJ_SUCCESS : -50;
+	if (status != PJ_SUCCESS) {
+	    goto on_return;
+	}
+    }
+
+    /* Compare text. */
+    if (pj_strcmp(&s1, &s2) != 0) {
+	/* Not equal. */
+	status = -60;
+    }
+
+on_return:
+    return status;
+}
+
+pj_status_t uri_test()
+{
+    unsigned i, loop;
+    pj_pool_t *pool;
+    pj_status_t status;
+    pj_timestamp zero;
+    pj_highprec_t avg_parse, avg_print;
+
+    zero.u32.hi = zero.u32.lo = 0;
+
+    PJ_LOG(3,("", "  simple test"));
+    pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
+    for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
+	status = do_uri_test(pool, &uri_test_array[i]);
+	if (status != PJ_SUCCESS) {
+	    PJ_LOG(3,("uri_test", "  error %d when testing entry %d",
+		      status, i));
+	    goto on_return;
+	}
+    }
+    pjsip_endpt_destroy_pool(endpt, pool);
+
+    PJ_LOG(3,("", "  benchmarking..."));
+    parse_len = 0;
+    parse_time.u32.hi = parse_time.u32.lo = 0;
+    print_time.u32.hi = print_time.u32.lo = 0;
+    pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
+    for (loop=0; loop<LOOP_COUNT; ++loop) {
+	for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
+	    status = do_uri_test(pool, &uri_test_array[i]);
+	    if (status != PJ_SUCCESS) {
+		PJ_LOG(3,("uri_test", "  error %d when testing entry %d",
+			  status, i));
+		goto on_return;
+	    }
+	}
+    }
+
+    avg_parse = pj_elapsed_usec(&zero, &parse_time);
+    pj_highprec_mul(avg_parse, AVERAGE_URL_LEN);
+    pj_highprec_div(avg_parse, parse_len);
+    avg_parse = 1000000 / avg_parse;
+
+    avg_print = pj_elapsed_usec(&zero, &print_time);
+    pj_highprec_mul(avg_print, AVERAGE_URL_LEN);
+    pj_highprec_div(avg_print, parse_len);
+    avg_print = 1000000 / avg_print;
+
+    PJ_LOG(3,("", "   done. Average parse=%d url/sec, print=%d url/sec",
+		  (unsigned)avg_parse, (unsigned)avg_print));
+
+    PJ_LOG(3,("", "  multithreaded test"));
+
+
+on_return:
+    pjsip_endpt_destroy_pool(endpt, pool);
+    return status;
+}
+