📄 test_nta.c
字号:
{ if (sip && sip->sip_via) { TEST_S(sip->sip_via->v_protocol, "SIP/2.0/SCTP"); } return 0;}staticint check_via_with_udp(client_t *ctx, nta_outgoing_t *orq, sip_t const *sip){ if (sip && sip->sip_via) { TEST_S(sip->sip_via->v_protocol, "SIP/2.0/UDP"); } return 0;}staticint save_and_check_tcp(client_t *ctx, nta_outgoing_t *orq, sip_t const *sip){ if (ctx->c_status >= 200 && ctx->c_extra) { tport_t *tport = nta_outgoing_transport(orq); TEST_1(tport); *(tport_t **)ctx->c_extra = tport; } return check_via_with_tcp(ctx, orq, sip);}/* Test transports */int test_tports(agent_t *ag){ int udp = 0, tcp = 0, sctp = 0, tls = 0; sip_via_t const *v, *v_udp_only = NULL; char const *udp_comp = NULL; char const *tcp_comp = NULL; tport_t *tcp_tport = NULL; url_t url[1]; BEGIN(); nta_leg_bind(ag->ag_server_leg, leg_callback_200, ag); *url = *ag->ag_contact->m_url; url->url_port = "*"; url->url_params = "transport=tcp"; url->url_params = "transport=udp"; TEST_1(nta_agent_add_tport(ag->ag_agent, (url_string_t *)url, TAG_END()) == 0); TEST_1(v = nta_agent_via(ag->ag_agent)); for (; v; v = v->v_next) { if (strcasecmp(v->v_protocol, sip_transport_udp) == 0) { if (udp) v_udp_only = v; udp = 1; if (udp_comp == NULL) udp_comp = v->v_comp; } else if (strcasecmp(v->v_protocol, sip_transport_tcp) == 0) { tcp = 1; if (tcp_comp == NULL) tcp_comp = v->v_comp; } else if (strcasecmp(v->v_protocol, sip_transport_sctp) == 0) { sctp = 1; } else if (strcasecmp(v->v_protocol, sip_transport_tls) == 0) { tls = 1; } } *url = *ag->ag_aliases->m_url; url->url_user = "bob"; if (udp_comp || tcp_comp) ag->ag_comp = "sigcomp"; { /* Test 0.1 * Send a message from default leg to default leg */ char const p_acid[] = "P-Access-Network-Info: IEEE-802.11g\n"; url_t url[1]; client_t ctx[1] = {{ ag, "Test 0.1", check_via_without_sigcomp }}; *url = *ag->ag_contact->m_url; url->url_params = NULL; ag->ag_expect_leg = ag->ag_default_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), SIPTAG_HEADER_STR(p_acid), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_default_leg); TEST_1(ag->ag_request); msg_destroy(ag->ag_request), ag->ag_request = NULL; nta_leg_bind(ag->ag_default_leg, leg_callback_200, ag); } { /* Test 0.1.2: test url_headers * * Send a message from default leg to default leg. */ url_t url[1]; sip_t *sip; client_t ctx[1] = {{ ag, "Test 0.1.2", check_via_without_sigcomp }}; *url = *ag->ag_contact->m_url; /* Test that method parameter is stripped and headers in query are used */ url->url_params = "method=MESSAGE;user=IP"; url->url_headers = "organization=United%20Testers"; ag->ag_expect_leg = ag->ag_default_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_alice), SIPTAG_TO(ag->ag_bob), SIPTAG_CONTACT(ag->ag_m_alice), TAG_END()); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_default_leg); TEST_1(ag->ag_request); TEST_1(sip = sip_object(ag->ag_request)); TEST_1(sip->sip_organization); TEST_S(sip->sip_organization->g_string, "United Testers"); TEST_S(sip->sip_request->rq_url->url_params, "user=IP"); nta_leg_bind(ag->ag_default_leg, leg_callback_200, ag); } /* Test 0.1.3 * Send a message from Bob to Alice using SIGCOMP and TCP */ if (tcp_comp) { url_t url[1]; sip_payload_t *pl; size_t size = 1024; client_t ctx[1] = {{ ag, "Test 0.1.3", check_via_with_sigcomp }}; *url = *ag->ag_aliases->m_url; url->url_user = "alice"; if (url->url_params) url->url_params = su_sprintf(NULL, "%s;transport=tcp", url->url_params); else url->url_params = "transport=tcp"; TEST_1(pl = test_payload(ag->ag_home, size)); ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, NTATAG_COMP("sigcomp"), SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 200)); TEST_1(ag->ag_client_compartment); nta_compartment_decref(&ag->ag_client_compartment); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } /* Test 0.2 * Send a message from Bob to Alice * This time specify a TCP URI, and include a large payload * of 512 kB */ if (tcp) { client_t ctx[1] = {{ ag, "Test 0.2", save_and_check_tcp, }}; url_t url[1]; sip_payload_t *pl; usize_t size = 512 * 1024; ctx->c_extra = &tcp_tport; *url = *ag->ag_aliases->m_url; url->url_user = "alice"; url->url_params = "transport=tcp"; TEST_1(pl = test_payload(ag->ag_home, size)); ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, NULL, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), NTATAG_DEFAULT_PROXY(ag->ag_obp), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 200)); TEST_1(tcp_tport); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } if (tcp_tport) { /* Test 0.2.1 - always use transport connection from NTATAG_TPORT() * * Test bug reported by geaaru * - NTATAG_TPORT() is not used if NTATAG_DEFAULT_PROXY() is given */ client_t ctx[1] = {{ ag, "Test 0.2.1", save_and_check_tcp }}; url_t url[1]; sip_payload_t *pl; tport_t *used_tport = NULL; ctx->c_extra = &used_tport; *url = *ag->ag_aliases->m_url; url->url_user = "alice"; TEST(tport_shutdown(tcp_tport, 1), 0); /* Not going to send anymore */ TEST_1(pl = test_payload(ag->ag_home, 512)); ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, NULL, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), NTATAG_DEFAULT_PROXY(ag->ag_obp), NTATAG_TPORT(tcp_tport), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 503)); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); TEST_1(used_tport == tcp_tport); tport_unref(tcp_tport), tcp_tport = NULL; if (v_udp_only) /* Prepare for next test */ TEST_1(tcp_tport = tport_ref(tport_parent(used_tport))); tport_unref(used_tport); } if (tcp_tport) { /* test 0.2.2 - select transport protocol using NTATAG_TPORT() * * Use primary NTATAG_TPORT() to select transport */ client_t ctx[1] = {{ ag, "Test 0.2.2", save_and_check_tcp }}; url_t url[1]; sip_payload_t *pl; tport_t *used_tport = NULL; ctx->c_extra = &used_tport; TEST_1(tport_is_primary(tcp_tport)); TEST_1(pl = test_payload(ag->ag_home, 512)); *url = *ag->ag_aliases->m_url; url->url_user = "alice"; url->url_host = v_udp_only->v_host; url->url_port = v_udp_only->v_port; url->url_params = NULL; /* No sigcomp */ ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, (url_string_t *)url, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), NTATAG_TPORT(tcp_tport), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 503)); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); TEST_1(used_tport); TEST_1(tport_is_tcp(used_tport)); tport_unref(used_tport); tport_unref(tcp_tport), tcp_tport = NULL; } /* Test 0.3 * Send a message from Bob to Alice * This time include a large payload of 512 kB, let NTA choose transport. */ if (tcp) { client_t ctx[1] = {{ ag, "Test 0.3" }}; url_t url[1]; sip_payload_t *pl; usize_t size = 512 * 1024; *url = *ag->ag_aliases->m_url; url->url_user = "alice"; TEST_1(pl = test_payload(ag->ag_home, size)); ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } /* Test 0.4.1: * Send a message from Bob to Alice * This time include a payload of 2 kB, let NTA choose transport. */ { client_t ctx[1] = {{ ag, "Test 0.4.1", check_via_with_tcp }}; url_t url[1]; sip_payload_t *pl; usize_t size = 2 * 1024; *url = *ag->ag_aliases->m_url; url->url_user = "alice"; TEST_1(pl = test_payload(ag->ag_home, size)); ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); su_free(ag->ag_home, ag->ag_in_via), ag->ag_in_via = NULL; } /* Test 0.4.2: * Send a message from Bob to Alices UDP-only address * This time include a payload of 2 kB, let NTA choose transport. */ if (v_udp_only) { client_t ctx[1] = {{ ag, "Test 0.4.2", check_via_with_udp }}; url_t url[1]; sip_payload_t *pl; usize_t size = 2 * 1024; *url = *ag->ag_aliases->m_url; url->url_user = "alice"; url->url_host = v_udp_only->v_host; url->url_port = v_udp_only->v_port; url->url_params = NULL; /* No sigcomp */ TEST_1(pl = test_payload(ag->ag_home, size)); ag->ag_expect_leg = ag->ag_default_leg; su_free(ag->ag_home, ag->ag_in_via), ag->ag_in_via = NULL; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_default_leg); TEST_1(ag->ag_in_via); TEST_1(strcasecmp(ag->ag_in_via->v_protocol, "SIP/2.0/UDP") == 0); su_free(ag->ag_home, ag->ag_in_via), ag->ag_in_via = NULL; } /* Test 0.5: * Send a message from Bob to Alice * This time include a payload of 2 kB, try to use UDP. */ if (udp) { client_t ctx[1] = {{ ag, "Test 0.5", check_via_with_udp }}; url_t url[1]; sip_payload_t *pl; usize_t size = 2 * 1024; *url = *ag->ag_aliases->m_url; url->url_user = "alice"; TEST_1(pl = test_payload(ag->ag_home, size)); ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name), SIPTAG_FROM(ag->ag_bob), SIPTAG_TO(ag->ag_alice), SIPTAG_CONTACT(ag->ag_m_bob), SIPTAG_PAYLOAD(pl), TPTAG_MTU(0xffffffff), TAG_END()); su_free(ag->ag_home, pl); TEST_1(!client_run(ctx, 200)); TEST_P(ag->ag_latest_leg, ag->ag_server_leg); } if (udp) { /* Test 0.6 * Send a message from default leg to server leg * using a prefilled Via header */ client_t ctx[1] = {{ ag, "Test 0.6", check_magic_branch }}; sip_via_t via[1]; sip_via_init(via); via->v_protocol = sip_transport_udp; via->v_host = ag->ag_contact->m_url->url_host; via->v_port = ag->ag_contact->m_url->url_port; sip_via_add_param(ag->ag_home, via, "branch=MagicalBranch"); nta_agent_set_params(ag->ag_agent, NTATAG_ALIASES(ag->ag_aliases), NTATAG_USER_VIA(1), TAG_END()); ag->ag_expect_leg = ag->ag_server_leg; ctx->c_orq = nta_outgoing_tcreate(ag->ag_default_leg, outgoing_callback, ctx, ag->ag_obp, SIP_METHOD_MESSAGE, (url_string_t *)url, SIPTAG_SUBJECT_STR(ctx->c_name),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -