📄 uri_test.c
字号:
/* $Id: uri_test.c 974 2007-02-19 01:13:53Z bennylp $ */
/*
* Copyright (C) 2003-2007 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.h>
#include <pjlib.h>
#define THIS_FILE "uri_test.c"
#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 8000
#if defined(PJ_DEBUG) && PJ_DEBUG!=0
# define LOOP_COUNT 10000
#else
# define LOOP_COUNT 40000
#endif
#define AVERAGE_URL_LEN 80
#define THREAD_COUNT 4
static struct
{
pj_highprec_t parse_len, print_len, cmp_len;
pj_timestamp parse_time, print_time, cmp_time;
} var;
/* 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_uri25( pj_pool_t *pool );
static pjsip_uri *create_uri26( pj_pool_t *pool );
static pjsip_uri *create_uri27( pj_pool_t *pool );
static pjsip_uri *create_uri28( pj_pool_t *pool );
static pjsip_uri *create_uri29( pj_pool_t *pool );
static pjsip_uri *create_uri30( pj_pool_t *pool );
static pjsip_uri *create_uri31( pj_pool_t *pool );
static pjsip_uri *create_uri32( pj_pool_t *pool );
static pjsip_uri *create_uri33( pj_pool_t *pool );
static pjsip_uri *create_uri34( pj_pool_t *pool );
//static pjsip_uri *create_uri35( 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);
const char *printed;
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,
},
{
/* 25: Simple tel: URI with global context */
PJ_SUCCESS,
"tel:+1-201-555-0123",
&create_uri25,
"tel:+1-201-555-0123"
},
{
/* 26: Simple tel: URI with local context */
PJ_SUCCESS,
"tel:7042;phone-context=example.com",
&create_uri26,
"tel:7042;phone-context=example.com"
},
{
/* 27: Simple tel: URI with local context */
PJ_SUCCESS,
"tel:863-1234;phone-context=+1-914-555",
&create_uri27,
"tel:863-1234;phone-context=+1-914-555"
},
{
/* 28: Comparison between local and global number */
ERR_NOT_EQUAL,
"tel:+1",
&create_uri28,
"tel:+1"
},
{
/* 29: tel: with some visual chars and spaces */
PJ_SUCCESS,
"tel:(44).1234-*#+Deaf",
&create_uri29,
"tel:(44).1234-*#+Deaf"
},
{
/* 30: isub parameters */
PJ_SUCCESS,
"tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=",
&create_uri30,
"tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1!+%3d"
},
{
/* 31: extension number parsing and encoding */
PJ_SUCCESS,
"tel:+1;ext=+123",
&create_uri31,
"tel:+1;ext=%2b123"
},
{
/* 32: context parameter parsing and encoding */
PJ_SUCCESS,
"tel:911;phone-context=+1-911",
&create_uri32,
"tel:911;phone-context=+1-911"
},
{
/* 33: case-insensitive comparison */
PJ_SUCCESS,
"tel:911;phone-context=emergency.example.com",
&create_uri33,
"tel:911;phone-context=emergency.example.com"
},
{
/* 34: parameter only appears in one URL */
ERR_NOT_EQUAL,
"tel:911;p1=p1;p2=p2",
&create_uri34,
"tel:911;p1=p1;p2=p2"
},
};
static pjsip_uri *create_uri0(pj_pool_t *pool)
{
/* "sip:localhost" */
pjsip_sip_uri *url = pjsip_sip_uri_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_sip_uri *url = pjsip_sip_uri_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_sip_uri *url = pjsip_sip_uri_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_sip_uri *url = pjsip_sip_uri_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_sip_uri *url = pjsip_sip_uri_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_sip_uri *url = pjsip_sip_uri_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_sip_uri *url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_create(pool, 0);
name_addr->uri = (pjsip_uri*) url;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -