📄 check_register.c
字号:
fail_if(s2->registration->contact->m_next != NULL); s2_register_teardown();} END_TESTSTART_TEST(register_1_2_2_3){ nua_handle_t *nh = nua_handle(nua, NULL, TAG_END()); struct message *m; s2_case("1.2.2.3", "Register behind NAT", "Authenticate, outbound activated, " "detect NAT binding change when re-REGISTERing"); mark_point(); make_auth_natted_register(nh, NUTAG_OUTBOUND("no-options-keepalive"), TAG_END()); s2->registration->nh = nh; receive_natted = "received=4.255.255.10"; s2_fast_forward(3600); mark_point(); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_authorization); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); s2_check_event(nua_r_register, 100); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_authorization); fail_if(!m->sip->sip_contact || !m->sip->sip_contact->m_next); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); fail_unless(s2->registration->contact != NULL); fail_if(s2->registration->contact->m_next != NULL); s2_check_event(nua_r_register, 200); s2_register_teardown();} END_TESTSTART_TEST(register_1_2_3) { nua_handle_t *nh; struct message *m; s2_case("1.2.3", "Register behind NAT", "Outbound activated by error response"); nh = nua_handle(nua, NULL, TAG_END()); nua_register(nh, TAG_END()); mark_point(); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_contact || m->sip->sip_contact->m_next); s2_respond_to(m, NULL, 400, "Bad Contact", SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); s2_check_event(nua_r_register, 100); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); fail_unless(s2->registration->contact != NULL); fail_if(s2->registration->contact->m_next != NULL); s2_check_event(nua_r_register, 200); s2->registration->nh = nh; s2_register_teardown();} END_TEST/* ---------------------------------------------------------------------- */START_TEST(register_1_3_1){ nua_handle_t *nh; struct message *m; s2_case("1.3.1", "Register over TCP via NAT", "REGISTER via TCP, detect NTA, re-REGISTER"); nh = nua_handle(nua, NULL, TAG_END()); nua_register(nh, NUTAG_PROXY(s2->tcp.contact->m_url), TAG_END()); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_contact || m->sip->sip_contact->m_next); fail_if(!tport_is_tcp(m->tport)); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); assert(s2->registration->contact != NULL); s2_check_event(nua_r_register, 100); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_contact || !m->sip->sip_contact->m_next); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); fail_unless(s2->registration->contact != NULL); fail_if(s2->registration->contact->m_next != NULL); fail_unless( url_has_param(s2->registration->contact->m_url, "transport=tcp")); s2_check_event(nua_r_register, 200); s2->registration->nh = nh; s2_register_teardown();} END_TESTSTART_TEST(register_1_3_2_1){ nua_handle_t *nh = nua_handle(nua, NULL, TAG_END()); s2_case("1.3.2.1", "Register behind NAT", "Authenticate, outbound activated"); mark_point(); s2->registration->nh = nh; make_auth_natted_register(nh, NUTAG_PROXY(s2->tcp.contact->m_url), TAG_END()); fail_if(!tport_is_tcp(s2->registration->tport)); s2_register_teardown();}END_TESTSTART_TEST(register_1_3_2_2){ nua_handle_t *nh = nua_handle(nua, NULL, TAG_END()); struct message *m; s2_case("1.3.2.2", "Register behind NAT with TCP", "Detect NAT over TCP using rport. " "Authenticate, detect NAT, " "close TCP at server, wait for re-REGISTERs."); nua_set_params(nua, NTATAG_TCP_RPORT(1), TAG_END()); s2_check_event(nua_r_set_params, 200); mark_point(); s2->registration->nh = nh; make_auth_natted_register( nh, NUTAG_PROXY(s2->tcp.contact->m_url), NUTAG_OUTBOUND("no-options-keepalive, no-validate"), TAG_END()); fail_if(!tport_is_tcp(s2->registration->tport)); tport_shutdown(s2->registration->tport, 2); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_authorization); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); /* The "NAT binding" changed when new TCP connection is established */ /* => NUA re-REGISTERs with newly detected contact */ s2_check_event(nua_r_register, 100); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_authorization); fail_if(!m->sip->sip_contact || !m->sip->sip_contact->m_next); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); s2_check_event(nua_r_register, 200); fail_unless(s2->registration->contact != NULL); fail_if(s2->registration->contact->m_next != NULL); s2_register_teardown();}END_TESTSTART_TEST(register_1_3_3_1){ nua_handle_t *nh = nua_handle(nua, NULL, TAG_END()); struct message *m; tport_t *tcp; s2_case("1.3.3.1", "Register behind NAT with UDP and TCP", "Register with UDP, UDP time-outing, then w/ TCP using rport. "); nua_set_params(nua, NTATAG_TCP_RPORT(1), TAG_END()); s2_check_event(nua_r_set_params, 200); mark_point(); s2->registration->nh = nh; nua_register(nh, NUTAG_OUTBOUND("no-options-keepalive, no-validate"), TAG_END()); /* NTA tries with UDP, we drop them */ for (;;) { m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); if (!tport_is_udp(m->tport)) /* Drop UDP */ break; s2_free_message(m); s2_fast_forward(4); } tcp = tport_ref(m->tport); /* Respond to request over TCP */ s2_respond_to(m, NULL, SIP_401_UNAUTHORIZED, SIPTAG_WWW_AUTHENTICATE_STR(s2_auth_digest_str), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); s2_check_event(nua_r_register, 401); nua_authenticate(nh, NUTAG_AUTH(s2_auth_credentials), TAG_END()); /* Turn off pong */ tport_set_params(tcp, TPTAG_PONG2PING(0), TAG_END()); /* Now request over UDP ... registering TCP contact! */ m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_authorization); s2_save_register(m); fail_unless( url_has_param(s2->registration->contact->m_url, "transport=tcp")); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); /* NUA detects oops... re-registers UDP */ s2_check_event(nua_r_register, 100); m = s2_wait_for_request(SIP_METHOD_REGISTER); fail_if(!m); fail_if(!m->sip->sip_authorization); fail_if(!m->sip->sip_contact || !m->sip->sip_contact->m_next); s2_save_register(m); s2_respond_to(m, NULL, SIP_200_OK, SIPTAG_CONTACT(s2->registration->contact), SIPTAG_VIA(natted_via(m)), TAG_END()); s2_free_message(m); s2_check_event(nua_r_register, 200); fail_unless(s2->registration->contact != NULL); fail_if(s2->registration->contact->m_next != NULL); /* Wait until ping-pong failure closes the TCP connection */ { int i; for (i = 0; i < 5; i++) { su_root_step(s2->root, 5); su_root_step(s2->root, 5); su_root_step(s2->root, 5); s2_fast_forward(5); } } s2_register_teardown();}END_TEST/* ---------------------------------------------------------------------- */TCase *register_tcase(void){ TCase *tc = tcase_create("1 - REGISTER"); /* Each testcase is run in different process */ tcase_add_checked_fixture(tc, register_setup, register_teardown); { tcase_add_test(tc, register_1_0_1); tcase_add_test(tc, register_1_1_1); tcase_add_test(tc, register_1_1_2); tcase_add_test(tc, register_1_2_1); tcase_add_test(tc, register_1_2_2_1); tcase_add_test(tc, register_1_2_2_2); tcase_add_test(tc, register_1_2_2_3); tcase_add_test(tc, register_1_2_3); tcase_add_test(tc, register_1_3_1); tcase_add_test(tc, register_1_3_2_1); tcase_add_test(tc, register_1_3_2_2); } tcase_set_timeout(tc, 5); return tc;}TCase *pingpong_tcase(void){ TCase *tc = tcase_create("1 - REGISTER with PingPong"); /* Each testcase is run in different process */ tcase_add_checked_fixture(tc, register_pingpong_setup, register_teardown); { tcase_add_test(tc, register_1_3_3_1); } tcase_set_timeout(tc, 5); return tc;}void check_register_cases(Suite *suite){ suite_add_tcase(suite, register_tcase()); suite_add_tcase(suite, pingpong_tcase());}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -