int turn_sock_test(void) { pj_pool_t *pool; pj_stun_config stun_cfg; int i, rc = 0; pool = pj_pool_create(mem, "turntest", 512, 512, NULL); rc = create_stun_config(pool, &stun_cfg); if (rc != PJ_SUCCESS) { pj_pool_release(pool); return -2; } rc = state_progression_test(&stun_cfg); if (rc != 0) goto on_return; for (i=0; i<=1; ++i) { int j; for (j=0; j<=1; ++j) { rc = destroy_test(&stun_cfg, i, j); if (rc != 0) goto on_return; } } on_return: destroy_stun_config(&stun_cfg); pj_pool_release(pool); return rc; }
int ice_conc_test(void) { const unsigned LOOP = 100; pj_pool_t *pool; pj_stun_config stun_cfg; unsigned i; int rc; pool = pj_pool_create(mem, NULL, 512, 512, NULL); rc = create_stun_config(pool, &stun_cfg); if (rc != PJ_SUCCESS) { pj_pool_release(pool); return -7; } for (i = 0; i < LOOP; i++) { PJ_LOG(3,(THIS_FILE, INDENT "Test %d of %d", i+1, LOOP)); rc = ice_one_conc_test(&stun_cfg, PJ_TRUE); if (rc) break; } /* Avoid compiler warning */ goto on_return; on_return: destroy_stun_config(&stun_cfg); pj_pool_release(pool); return rc; }
int ice_test(void) { pj_pool_t *pool; pj_stun_config stun_cfg; unsigned i; int rc; struct sess_cfg_t { const char *title; unsigned server_flag; struct test_cfg ua1; struct test_cfg ua2; } sess_cfg[] = { /* Role comp# host? stun? turn? flag? ans_del snd_del des_del */ { "hosts candidates only", 0xFFFF, {ROLE1, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }, { "host and srflxes", 0xFFFF, {ROLE1, 1, YES, YES, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, YES, YES, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }, { "host vs relay", 0xFFFF, {ROLE1, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }, { "relay vs host", 0xFFFF, {ROLE1, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, YES, NO, NO, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }, { "relay vs relay", 0xFFFF, {ROLE1, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, NO, NO, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }, { "all candidates", 0xFFFF, {ROLE1, 1, YES, YES, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, YES, YES, YES, NO, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }, }; pool = pj_pool_create(mem, NULL, 512, 512, NULL); rc = create_stun_config(pool, &stun_cfg); if (rc != PJ_SUCCESS) { pj_pool_release(pool); return -7; } /* Simple test first with host candidate */ if (1) { struct sess_cfg_t cfg = { "Basic with host candidates", 0x0, /* Role comp# host? stun? turn? flag? ans_del snd_del des_del */ {ROLE1, 1, YES, NO, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, YES, NO, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }; rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; cfg.ua1.comp_cnt = 2; cfg.ua2.comp_cnt = 2; rc = perform_test("Basic with host candidates, 2 components", &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; } /* Simple test first with srflx candidate */ if (1) { struct sess_cfg_t cfg = { "Basic with srflx candidates", 0xFFFF, /* Role comp# host? stun? turn? flag? ans_del snd_del des_del */ {ROLE1, 1, YES, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, YES, YES, NO, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }; rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; cfg.ua1.comp_cnt = 2; cfg.ua2.comp_cnt = 2; rc = perform_test("Basic with srflx candidates, 2 components", &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; } /* Simple test with relay candidate */ if (1) { struct sess_cfg_t cfg = { "Basic with relay candidates", 0xFFFF, /* Role comp# host? stun? turn? flag? ans_del snd_del des_del */ {ROLE1, 1, NO, NO, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}}, {ROLE2, 1, NO, NO, YES, 0, 0, 0, 0, {PJ_SUCCESS, PJ_SUCCESS}} }; rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; cfg.ua1.comp_cnt = 2; cfg.ua2.comp_cnt = 2; rc = perform_test("Basic with relay candidates, 2 components", &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; } /* Failure test with STUN resolution */ if (1) { struct sess_cfg_t cfg = { "STUN resolution failure", 0x0, /* Role comp# host? stun? turn? flag? ans_del snd_del des_del */ {ROLE1, 2, NO, YES, NO, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}}, {ROLE2, 2, NO, YES, NO, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}} }; rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; cfg.ua1.client_flag |= DEL_ON_ERR; cfg.ua2.client_flag |= DEL_ON_ERR; rc = perform_test("STUN resolution failure with destroy on callback", &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; } /* Failure test with TURN resolution */ if (1) { struct sess_cfg_t cfg = { "TURN allocation failure", 0xFFFF, /* Role comp# host? stun? turn? flag? ans_del snd_del des_del */ {ROLE1, 2, NO, NO, YES, WRONG_TURN, 0, 0, 0, {PJ_STATUS_FROM_STUN_CODE(401), -1}}, {ROLE2, 2, NO, NO, YES, WRONG_TURN, 0, 0, 0, {PJ_STATUS_FROM_STUN_CODE(401), -1}} }; rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; cfg.ua1.client_flag |= DEL_ON_ERR; cfg.ua2.client_flag |= DEL_ON_ERR; rc = perform_test("TURN allocation failure with destroy on callback", &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; } /* STUN failure, testing TURN deallocation */ if (1) { struct sess_cfg_t cfg = { "STUN failure, testing TURN deallocation", 0xFFFF & (~(CREATE_STUN_SERVER)), /* Role comp# host? stun? turn? flag? ans_del snd_del des_del */ {ROLE1, 2, YES, YES, YES, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}}, {ROLE2, 2, YES, YES, YES, 0, 0, 0, 0, {PJNATH_ESTUNTIMEDOUT, -1}} }; rc = perform_test(cfg.title, &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; cfg.ua1.client_flag |= DEL_ON_ERR; cfg.ua2.client_flag |= DEL_ON_ERR; rc = perform_test("STUN failure, testing TURN deallocation (cb)", &stun_cfg, cfg.server_flag, &cfg.ua1, &cfg.ua2); if (rc != 0) goto on_return; } rc = 0; /* Iterate each test item */ for (i=0; i<PJ_ARRAY_SIZE(sess_cfg); ++i) { struct sess_cfg_t *cfg = &sess_cfg[i]; unsigned delay[] = { 50, 2000 }; unsigned d; PJ_LOG(3,("", " %s", cfg->title)); /* For each test item, test with various answer delay */ for (d=0; d<PJ_ARRAY_SIZE(delay); ++d) { struct role_t { pj_ice_sess_role ua1; pj_ice_sess_role ua2; } role[] = { { ROLE1, ROLE2}, { ROLE2, ROLE1}, { ROLE1, ROLE1}, { ROLE2, ROLE2} }; unsigned j; cfg->ua1.answer_delay = delay[d]; cfg->ua2.answer_delay = delay[d]; /* For each test item, test with role conflict scenarios */ for (j=0; j<PJ_ARRAY_SIZE(role); ++j) { unsigned k1; cfg->ua1.role = role[j].ua1; cfg->ua2.role = role[j].ua2; /* For each test item, test with different number of components */ for (k1=1; k1<=2; ++k1) { unsigned k2; cfg->ua1.comp_cnt = k1; for (k2=1; k2<=2; ++k2) { char title[120]; sprintf(title, "%s/%s, %dms answer delay, %d vs %d components", pj_ice_sess_role_name(role[j].ua1), pj_ice_sess_role_name(role[j].ua2), delay[d], k1, k2); cfg->ua2.comp_cnt = k2; rc = perform_test(title, &stun_cfg, cfg->server_flag, &cfg->ua1, &cfg->ua2); if (rc != 0) goto on_return; } } } } } on_return: destroy_stun_config(&stun_cfg); pj_pool_release(pool); return rc; }