📄 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 + -