📄 uri_test.c
字号:
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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_sip_uri *url;
url = pjsip_sip_uri_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_uri25(pj_pool_t *pool)
{
/* "tel:+1-201-555-0123" */
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("+1-201-555-0123");
return (pjsip_uri*)uri;
}
static pjsip_uri *create_uri26(pj_pool_t *pool)
{
/* tel:7042;phone-context=example.com */
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("7042");
uri->context = pj_str("example.com");
return (pjsip_uri*)uri;
}
static pjsip_uri *create_uri27(pj_pool_t *pool)
{
/* "tel:863-1234;phone-context=+1-914-555" */
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("863-1234");
uri->context = pj_str("+1-914-555");
return (pjsip_uri*)uri;
}
/* "tel:1" */
static pjsip_uri *create_uri28(pj_pool_t *pool)
{
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("1");
return (pjsip_uri*)uri;
}
/* "tel:(44).1234-*#+Deaf" */
static pjsip_uri *create_uri29(pj_pool_t *pool)
{
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("(44).1234-*#+Deaf");
return (pjsip_uri*)uri;
}
/* "tel:+1;isub=/:@&$,-_.!~*'()[]/:&$aA1%21+=" */
static pjsip_uri *create_uri30(pj_pool_t *pool)
{
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("+1");
uri->isub_param = pj_str("/:@&$,-_.!~*'()[]/:&$aA1!+=");
return (pjsip_uri*)uri;
}
/* "tel:+1;ext=+123" */
static pjsip_uri *create_uri31(pj_pool_t *pool)
{
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("+1");
uri->ext_param = pj_str("+123");
return (pjsip_uri*)uri;
}
/* "tel:911;phone-context=+1-911" */
static pjsip_uri *create_uri32(pj_pool_t *pool)
{
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("911");
uri->context = pj_str("+1-911");
return (pjsip_uri*)uri;
}
/* "tel:911;phone-context=emergency.example.com" */
static pjsip_uri *create_uri33(pj_pool_t *pool)
{
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
uri->number = pj_str("911");
uri->context = pj_str("EMERGENCY.EXAMPLE.COM");
return (pjsip_uri*)uri;
}
/* "tel:911;p1=p1;p2=p2" */
static pjsip_uri *create_uri34(pj_pool_t *pool)
{
pjsip_tel_uri *uri = pjsip_tel_uri_create(pool);
pjsip_param *p;
uri->number = pj_str("911");
p = pj_pool_alloc(pool, sizeof(*p));
p->name = p->value = pj_str("p1");
pj_list_insert_before(&uri->other_param, p);
return (pjsip_uri*)uri;
}
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;
char *input;
pjsip_uri *parsed_uri, *ref_uri;
pj_str_t s1 = {NULL, 0}, s2 = {NULL, 0};
pj_timestamp t1, t2;
if (entry->len == 0)
entry->len = pj_native_strlen(entry->str);
#if defined(PJSIP_UNESCAPE_IN_PLACE) && PJSIP_UNESCAPE_IN_PLACE!=0
input = pj_pool_alloc(pool, entry->len + 1);
pj_memcpy(input, entry->str, entry->len);
input[entry->len] = '\0';
#else
input = entry->str;
#endif
/* Parse URI text. */
pj_get_timestamp(&t1);
var.parse_len = var.parse_len + entry->len;
parsed_uri = pjsip_parse_uri(pool, input, 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,(THIS_FILE, " uri parse error!\n"
" uri='%s'\n",
input));
}
goto on_return;
}
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
pj_add_timestamp(&var.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;
var.print_len = var.print_len + len;
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
pj_add_timestamp(&var.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. */
pj_get_timestamp(&t1);
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,(THIS_FILE, " 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;
}
}
var.cmp_len = var.cmp_len + len;
pj_get_timestamp(&t2);
pj_sub_timestamp(&t2, &t1);
pj_add_timestamp(&var.cmp_time, &t2);
/* Compare text. */
if (entry->printed) {
if (pj_strcmp2(&s1, entry->printed) != 0) {
/* Not equal. */
PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
" printed='%s'\n"
" expectd='%s'",
s1.ptr, entry->printed));
status = -60;
}
} else {
if (pj_strcmp(&s1, &s2) != 0) {
/* Not equal. */
PJ_LOG(3,(THIS_FILE, " uri print mismatch:\n"
" uri1='%s'\n"
" uri2='%s'",
s1.ptr, s2.ptr));
status = -70;
}
}
on_return:
return status;
}
static int simple_uri_test(void)
{
unsigned i;
pj_pool_t *pool;
pj_status_t status;
PJ_LOG(3,(THIS_FILE, " simple test"));
for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
status = do_uri_test(pool, &uri_test_array[i]);
pjsip_endpt_release_pool(endpt, pool);
if (status != PJ_SUCCESS) {
PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
status, i));
return status;
}
}
return 0;
}
static int uri_benchmark(unsigned *p_parse, unsigned *p_print, unsigned *p_cmp)
{
unsigned i, loop;
pj_status_t status;
pj_timestamp zero;
pj_time_val elapsed;
pj_highprec_t avg_parse, avg_print, avg_cmp, kbytes;
pj_bzero(&var, sizeof(var));
zero.u32.hi = zero.u32.lo = 0;
var.parse_len = var.print_len = var.cmp_len = 0;
var.parse_time.u32.hi = var.parse_time.u32.lo = 0;
var.print_time.u32.hi = var.print_time.u32.lo = 0;
var.cmp_time.u32.hi = var.cmp_time.u32.lo = 0;
for (loop=0; loop<LOOP_COUNT; ++loop) {
for (i=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
pj_pool_t *pool;
pool = pjsip_endpt_create_pool(endpt, "", POOL_SIZE, POOL_SIZE);
status = do_uri_test(pool, &uri_test_array[i]);
pjsip_endpt_release_pool(endpt, pool);
if (status != PJ_SUCCESS) {
PJ_LOG(3,(THIS_FILE, " error %d when testing entry %d",
status, i));
pjsip_endpt_release_pool(endpt, pool);
goto on_return;
}
}
}
kbytes = var.parse_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
elapsed = pj_elapsed_time(&zero, &var.parse_time);
avg_parse = pj_elapsed_usec(&zero, &var.parse_time);
pj_highprec_mul(avg_parse, AVERAGE_URL_LEN);
pj_highprec_div(avg_parse, var.parse_len);
avg_parse = 1000000 / avg_parse;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB of urls parsed in %d.%03ds (avg=%d urls/sec)",
(unsigned)(var.parse_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_parse));
*p_parse = (unsigned)avg_parse;
kbytes = var.print_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
elapsed = pj_elapsed_time(&zero, &var.print_time);
avg_print = pj_elapsed_usec(&zero, &var.print_time);
pj_highprec_mul(avg_print, AVERAGE_URL_LEN);
pj_highprec_div(avg_print, var.parse_len);
avg_print = 1000000 / avg_print;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB of urls printed in %d.%03ds (avg=%d urls/sec)",
(unsigned)(var.print_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_print));
*p_print = (unsigned)avg_print;
kbytes = var.cmp_len;
pj_highprec_mod(kbytes, 1000000);
pj_highprec_div(kbytes, 100000);
elapsed = pj_elapsed_time(&zero, &var.cmp_time);
avg_cmp = pj_elapsed_usec(&zero, &var.cmp_time);
pj_highprec_mul(avg_cmp, AVERAGE_URL_LEN);
pj_highprec_div(avg_cmp, var.cmp_len);
avg_cmp = 1000000 / avg_cmp;
PJ_LOG(3,(THIS_FILE,
" %u.%u MB of urls compared in %d.%03ds (avg=%d urls/sec)",
(unsigned)(var.cmp_len/1000000), (unsigned)kbytes,
elapsed.sec, elapsed.msec,
(unsigned)avg_cmp));
*p_cmp = (unsigned)avg_cmp;
on_return:
return status;
}
/*****************************************************************************/
int uri_test(void)
{
enum { COUNT = 4, DETECT=0, PARSE=1, PRINT=2 };
struct {
unsigned parse;
unsigned print;
unsigned cmp;
} run[COUNT];
unsigned i, max, avg_len;
char desc[200];
pj_status_t status;
status = simple_uri_test();
if (status != PJ_SUCCESS)
return status;
for (i=0; i<COUNT; ++i) {
PJ_LOG(3,(THIS_FILE, " benchmarking (%d of %d)...", i+1, COUNT));
status = uri_benchmark(&run[i].parse, &run[i].print, &run[i].cmp);
if (status != PJ_SUCCESS)
return status;
}
/* Calculate average URI length */
for (i=0, avg_len=0; i<PJ_ARRAY_SIZE(uri_test_array); ++i) {
avg_len += uri_test_array[i].len;
}
avg_len /= PJ_ARRAY_SIZE(uri_test_array);
/*
* Print maximum parse/sec
*/
for (i=0, max=0; i<COUNT; ++i)
if (run[i].parse > max) max = run[i].parse;
PJ_LOG(3,("", " Maximum URI parse/sec=%u", max));
pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>parsed</B> with "
"<tt>pjsip_parse_uri()</tt> per second "
"(tested with %d URI set, with average length of "
"%d chars)",
(int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
report_ival("uri-parse-per-sec", max, "URI/sec", desc);
/* URI parsing bandwidth */
report_ival("uri-parse-bandwidth-mb", avg_len*max/1000000, "MB/sec",
"URI parsing bandwidth in megabytes (number of megabytes "
"worth of URI that can be parsed per second)");
/* Print maximum print/sec */
for (i=0, max=0; i<COUNT; ++i)
if (run[i].print > max) max = run[i].print;
PJ_LOG(3,("", " Maximum URI print/sec=%u", max));
pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>printed</B> with "
"<tt>pjsip_uri_print()</tt> per second "
"(tested with %d URI set, with average length of "
"%d chars)",
(int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
report_ival("uri-print-per-sec", max, "URI/sec", desc);
/* Print maximum detect/sec */
for (i=0, max=0; i<COUNT; ++i)
if (run[i].cmp > max) max = run[i].cmp;
PJ_LOG(3,("", " Maximum URI comparison/sec=%u", max));
pj_ansi_sprintf(desc, "Number of SIP/TEL URIs that can be <B>compared</B> with "
"<tt>pjsip_uri_cmp()</tt> per second "
"(tested with %d URI set, with average length of "
"%d chars)",
(int)PJ_ARRAY_SIZE(uri_test_array), avg_len);
report_ival("uri-cmp-per-sec", max, "URI/sec", desc);
return PJ_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -