Add additional unit test options (#2961)

This commit is contained in:
George Joseph 2022-02-10 21:28:03 -07:00 committed by GitHub
parent a5fa35305a
commit 668a828631
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 257 additions and 72 deletions

2
.gitignore vendored
View File

@ -68,3 +68,5 @@ tests/pjsua/wavs/tmp*.wav
tests/pjsua/tools/cmp_wav
tests/pjsua/tools/cmp_wav.dSYM
tests/pjsua/logs
# benchmark output
*bench*.htm

View File

@ -51,7 +51,7 @@ static void print_stack(int sig)
exit(1);
}
static void init_signals()
static void init_signals(void)
{
signal(SIGSEGV, &print_stack);
signal(SIGABRT, &print_stack);
@ -68,20 +68,33 @@ static void init_signals()
int main(int argc, char *argv[])
{
int rc;
PJ_UNUSED_ARG(argc);
PJ_UNUSED_ARG(argv);
int interractive = 0;
int no_trap = 0;
boost();
init_signals();
while (argc > 1) {
char *arg = argv[--argc];
if (*arg=='-' && *(arg+1)=='i') {
interractive = 1;
} else if (*arg=='-' && *(arg+1)=='n') {
no_trap = 1;
}
}
if (!no_trap) {
init_signals();
}
rc = test_main();
if (argc==2 && pj_ansi_strcmp(argv[1], "-i")==0) {
if (interractive) {
char s[10];
puts("Press ENTER to quit");
if (fgets(s, sizeof(s), stdin) == NULL)
puts("");
puts("Press <ENTER> to exit");
if (!fgets(s, sizeof(s), stdin))
return rc;
}

View File

@ -72,7 +72,7 @@ static void print_stack(int sig)
exit(1);
}
static void init_signals()
static void init_signals(void)
{
signal(SIGSEGV, &print_stack);
signal(SIGABRT, &print_stack);
@ -86,9 +86,9 @@ int main(int argc, char *argv[])
{
int rc;
int interractive = 0;
int no_trap = 0;
boost();
init_signals();
while (argc > 1) {
char *arg = argv[--argc];
@ -96,6 +96,8 @@ int main(int argc, char *argv[])
if (*arg=='-' && *(arg+1)=='i') {
interractive = 1;
} else if (*arg=='-' && *(arg+1)=='n') {
no_trap = 1;
} else if (*arg=='-' && *(arg+1)=='p') {
pj_str_t port = pj_str(argv[--argc]);
@ -118,6 +120,10 @@ int main(int argc, char *argv[])
}
}
if (!no_trap) {
init_signals();
}
rc = test_main();
if (interractive) {

View File

@ -50,7 +50,7 @@ static void print_stack(int sig)
exit(1);
}
static void init_signals()
static void init_signals(void)
{
signal(SIGSEGV, &print_stack);
signal(SIGABRT, &print_stack);
@ -64,13 +64,31 @@ static void init_signals()
static int main_func(int argc, char *argv[])
{
int rc;
char s[10];
int interractive = 0;
int no_trap = 0;
while (argc > 1) {
char *arg = argv[--argc];
if (*arg=='-' && *(arg+1)=='i') {
interractive = 1;
} else if (*arg=='-' && *(arg+1)=='n') {
no_trap = 1;
}
}
if (!no_trap) {
init_signals();
}
rc = test_main();
if (argc == 2 && argv[1][0]=='-' && argv[1][1]=='i') {
puts("\nPress <ENTER> to quit");
if (fgets(s, sizeof(s), stdin) == NULL)
if (interractive) {
char s[10];
puts("");
puts("Press <ENTER> to exit");
if (!fgets(s, sizeof(s), stdin))
return rc;
}
@ -79,6 +97,5 @@ static int main_func(int argc, char *argv[])
int main(int argc, char *argv[])
{
init_signals();
return pj_run_app(&main_func, argc, argv, 0);
}

View File

@ -50,7 +50,7 @@ static void print_stack(int sig)
exit(1);
}
static void init_signals()
static void init_signals(void)
{
signal(SIGSEGV, &print_stack);
signal(SIGABRT, &print_stack);
@ -65,20 +65,33 @@ static void init_signals()
int main(int argc, char *argv[])
{
int rc;
PJ_UNUSED_ARG(argc);
PJ_UNUSED_ARG(argv);
int interractive = 0;
int no_trap = 0;
boost();
init_signals();
while (argc > 1) {
char *arg = argv[--argc];
if (*arg=='-' && *(arg+1)=='i') {
interractive = 1;
} else if (*arg=='-' && *(arg+1)=='n') {
no_trap = 1;
}
}
if (!no_trap) {
init_signals();
}
rc = test_main();
if (argc == 2 && pj_ansi_strcmp(argv[1], "-i")==0) {
char buf[10];
if (interractive) {
char s[10];
puts("");
puts("Press <ENTER> to exit");
if (fgets(buf, sizeof(buf), stdin) == NULL)
if (!fgets(s, sizeof(s), stdin))
return rc;
}

View File

@ -24,13 +24,16 @@
extern const char *system_name;
static void usage()
static void usage(void)
{
puts("Usage: test-pjsip");
puts("Options:");
puts(" -i,--interractive Key input at the end.");
puts(" -h,--help Show this screen");
puts(" -l,--log-level N Set log level (0-6)");
puts(" -i,--interractive Key input at the end.");
puts(" -h,--help Show this screen");
puts(" -l,--log-level N Set log level (0-6)");
puts(" -n,--no-trap Let signals be handled by the OS");
puts(" -t,--tests testname,... Comma separated list of test to run");
list_tests();
}
#if PJ_LINUX || PJ_DARWINOS
@ -51,7 +54,7 @@ static void print_stack(int sig)
exit(1);
}
static void init_signals()
static void init_signals(void)
{
signal(SIGSEGV, &print_stack);
signal(SIGABRT, &print_stack);
@ -66,11 +69,11 @@ int main(int argc, char *argv[])
int interractive = 0;
int retval;
char **opt_arg;
int no_trap = 0;
char *testlist = NULL;
PJ_UNUSED_ARG(argc);
init_signals();
/* Parse arguments. */
opt_arg = argv+1;
while (*opt_arg) {
@ -78,6 +81,10 @@ int main(int argc, char *argv[])
strcmp(*opt_arg, "--interractive") == 0)
{
interractive = 1;
} else if (strcmp(*opt_arg, "-n") == 0 ||
strcmp(*opt_arg, "--no-trap") == 0)
{
no_trap = 1;
} else if (strcmp(*opt_arg, "-h") == 0 ||
strcmp(*opt_arg, "--help") == 0)
{
@ -101,6 +108,15 @@ int main(int argc, char *argv[])
return 1;
}
system_name = *opt_arg;
} else if (strcmp(*opt_arg, "-t") == 0 ||
strcmp(*opt_arg, "--tests") == 0)
{
++opt_arg;
if (!opt_arg) {
usage();
return 1;
}
testlist = *opt_arg;
} else {
usage();
return 1;
@ -109,7 +125,11 @@ int main(int argc, char *argv[])
++opt_arg;
}
retval = test_main();
if (!no_trap) {
init_signals();
}
retval = test_main(testlist);
if (interractive) {
char s[10];

View File

@ -45,6 +45,9 @@
if (rc!=0) goto on_return; \
} while (0)
#ifdef _MSC_VER
# define strtok_r strtok_s
#endif
pjsip_endpoint *endpt;
pj_caching_pool caching_pool;
@ -56,6 +59,85 @@ static pj_oshandle_t fd_report;
const char *system_name = "Unknown";
static char buf[1024];
static struct {
const char *name;
int run_test;
} test_list[] = {
{ "uri", 0},
{ "msg", 0},
{ "multipart", 0},
{ "txdata", 0},
{ "tsx_bench", 0},
{ "udp", 0},
{ "loop", 0},
{ "tcp", 0},
{ "resolve", 0},
{ "tsx", 0},
{ "tsx_destroy", 0},
{ "inv_oa", 0},
{ "regc", 0},
};
enum tests_to_run {
include_uri_test = 0,
include_msg_test,
include_multipart_test,
include_txdata_test,
include_tsx_bench,
include_udp_test,
include_loop_test,
include_tcp_test,
include_resolve_test,
include_tsx_test,
include_tsx_destroy_test,
include_inv_oa_test,
include_regc_test,
};
static int run_all_tests = 1;
static pj_status_t select_tests(char *testlist)
{
char *token;
char *saveptr;
int maxtok = PJ_ARRAY_SIZE(test_list);
int i, j;
if (!testlist) {
return PJ_SUCCESS;
}
run_all_tests = 0;
for (token = strtok_r(testlist, ",", &saveptr); token != NULL;
token = strtok_r(NULL, ",", &saveptr)) {
int found = 0;
for (j = 0; j < maxtok; j++) {
if (strcmp(token, test_list[j].name) == 0) {
test_list[j].run_test = 1;
found = 1;
}
}
if (!found) {
fprintf(stderr, "Test '%s' is not valid\n", token);
return PJ_ENOTFOUND;
}
}
return PJ_SUCCESS;
}
void list_tests(void) {
int maxtok = PJ_ARRAY_SIZE(test_list);
int j;
fprintf(stderr, "Valid tests:\n");
for (j = 0; j < maxtok; j++) {
fprintf(stderr, " %s\n", test_list[j].name);
}
}
#define SHOULD_RUN_TEST(ix) (run_all_tests || test_list[ix].run_test)
void app_perror(const char *msg, pj_status_t rc)
{
char errbuf[256];
@ -221,7 +303,7 @@ static void close_report(void)
}
int test_main(void)
int test_main(char *testlist)
{
pj_status_t rc;
const char *filename;
@ -237,6 +319,12 @@ int test_main(void)
#endif /* INCLUDE_TSX_TEST */
int line;
rc = select_tests(testlist);
if (rc != PJ_SUCCESS) {
list_tests();
return rc;
}
pj_log_set_level(log_level);
pj_log_set_decor(param_log_decor);
@ -293,87 +381,112 @@ int test_main(void)
#if INCLUDE_URI_TEST
DO_TEST(uri_test());
if (SHOULD_RUN_TEST(include_uri_test)) {
DO_TEST(uri_test());
}
#endif
#if INCLUDE_MSG_TEST
DO_TEST(msg_test());
DO_TEST(msg_err_test());
if (SHOULD_RUN_TEST(include_msg_test)) {
DO_TEST(msg_test());
DO_TEST(msg_err_test());
}
#endif
#if INCLUDE_MULTIPART_TEST
DO_TEST(multipart_test());
if (SHOULD_RUN_TEST(include_multipart_test)) {
DO_TEST(multipart_test());
}
#endif
#if INCLUDE_TXDATA_TEST
DO_TEST(txdata_test());
if (SHOULD_RUN_TEST(include_txdata_test)) {
DO_TEST(txdata_test());
}
#endif
#if INCLUDE_TSX_BENCH
DO_TEST(tsx_bench());
if (SHOULD_RUN_TEST(include_tsx_bench)) {
DO_TEST(tsx_bench());
}
#endif
#if INCLUDE_UDP_TEST
DO_TEST(transport_udp_test());
if (SHOULD_RUN_TEST(include_udp_test)) {
DO_TEST(transport_udp_test());
}
#endif
#if INCLUDE_LOOP_TEST
DO_TEST(transport_loop_test());
if (SHOULD_RUN_TEST(include_loop_test)) {
DO_TEST(transport_loop_test());
}
#endif
#if INCLUDE_TCP_TEST
DO_TEST(transport_tcp_test());
if (SHOULD_RUN_TEST(include_tcp_test)) {
DO_TEST(transport_tcp_test());
}
#endif
#if INCLUDE_RESOLVE_TEST
DO_TEST(resolve_test());
if (SHOULD_RUN_TEST(include_resolve_test)) {
DO_TEST(resolve_test());
}
#endif
#if INCLUDE_TSX_TEST
status = pjsip_udp_transport_start(endpt, NULL, NULL, 1, &tp);
if (status == PJ_SUCCESS) {
tsx_test[tsx_test_cnt].port = tp->local_name.port;
tsx_test[tsx_test_cnt].tp_type = "udp";
tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_UDP;
++tsx_test_cnt;
}
if (SHOULD_RUN_TEST(include_tsx_test)) {
status = pjsip_udp_transport_start(endpt, NULL, NULL, 1, &tp);
if (status == PJ_SUCCESS) {
tsx_test[tsx_test_cnt].port = tp->local_name.port;
tsx_test[tsx_test_cnt].tp_type = "udp";
tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_UDP;
++tsx_test_cnt;
}
#if PJ_HAS_TCP
status = pjsip_tcp_transport_start(endpt, NULL, 1, &tpfactory);
if (status == PJ_SUCCESS) {
tsx_test[tsx_test_cnt].port = tpfactory->addr_name.port;
tsx_test[tsx_test_cnt].tp_type = "tcp";
tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_TCP;
++tsx_test_cnt;
} else {
app_perror("Unable to create TCP", status);
rc = -4;
goto on_return;
}
status = pjsip_tcp_transport_start(endpt, NULL, 1, &tpfactory);
if (status == PJ_SUCCESS) {
tsx_test[tsx_test_cnt].port = tpfactory->addr_name.port;
tsx_test[tsx_test_cnt].tp_type = "tcp";
tsx_test[tsx_test_cnt].type = PJSIP_TRANSPORT_TCP;
++tsx_test_cnt;
} else {
app_perror("Unable to create TCP", status);
rc = -4;
goto on_return;
}
#endif
for (i=0; i<tsx_test_cnt; ++i) {
DO_TSX_TEST(tsx_basic_test, &tsx_test[i]);
DO_TSX_TEST(tsx_uac_test, &tsx_test[i]);
DO_TSX_TEST(tsx_uas_test, &tsx_test[i]);
for (i = 0; i < tsx_test_cnt; ++i) {
DO_TSX_TEST(tsx_basic_test, &tsx_test[i]);
DO_TSX_TEST(tsx_uac_test, &tsx_test[i]);
DO_TSX_TEST(tsx_uas_test, &tsx_test[i]);
}
}
#endif
#if INCLUDE_INV_OA_TEST
DO_TEST(inv_offer_answer_test());
if (SHOULD_RUN_TEST(include_inv_oa_test)) {
DO_TEST(inv_offer_answer_test());
}
#endif
#if INCLUDE_REGC_TEST
DO_TEST(regc_test());
if (SHOULD_RUN_TEST(include_regc_test)) {
DO_TEST(regc_test());
}
#endif
/*
* Better be last because it recreates the endpt
*/
#if INCLUDE_TSX_DESTROY_TEST
DO_TEST(tsx_destroy_test());
if (SHOULD_RUN_TEST(include_tsx_destroy_test)) {
DO_TEST(tsx_destroy_test());
}
#endif
on_return:

View File

@ -115,9 +115,10 @@ int transport_load_test(char *target_url);
int inv_offer_answer_test(void);
/* Test main entry */
int test_main(void);
int test_main(char *testlist);
/* Test utilities. */
void list_tests(void);
void app_perror(const char *msg, pj_status_t status);
int init_msg_logger(void);
int msg_logger_set_enabled(pj_bool_t enabled);