📄 check_session.c
字号:
} return tc;}/* ====================================================================== *//* Weird call termination cases */START_TEST(bye_4_1_1){ nua_handle_t *nh; struct message *bye, *r481; s2_case("4.1.1", "Re-INVITE while terminating", "NUA sends BYE, " "BYE is challenged, " "and NUA is re-INVITEd at the same time."); nh = invite_to_nua(TAG_END()); s2_flush_events(); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_407_PROXY_AUTH_REQUIRED, SIPTAG_PROXY_AUTHENTICATE_STR(s2_auth_digest_str), TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 407)); soa_generate_offer(soa, 1, NULL); request_with_sdp(dialog, SIP_METHOD_INVITE, NULL, TAG_END()); do { r481 = s2_wait_for_response(0, SIP_METHOD_INVITE); } while (r481->sip->sip_status->st_status < 200); s2_update_dialog(dialog, r481); /* send ACK */ fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_1_2){ nua_handle_t *nh; struct message *bye, *r481; s2_case("4.1.2", "Re-INVITE while terminating", "NUA sends BYE, and gets re-INVITEd at same time"); nh = invite_to_nua(TAG_END()); s2_flush_events(); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); request_with_sdp(dialog, SIP_METHOD_INVITE, NULL, TAG_END()); do { r481 = s2_wait_for_response(0, SIP_METHOD_INVITE); } while (r481->sip->sip_status->st_status < 200); s2_update_dialog(dialog, r481); /* send ACK */ fail_unless(s2_check_callstate(nua_callstate_terminated)); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 200)); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_1_3){ nua_handle_t *nh; struct message *bye; struct event *i_bye; s2_case("4.1.3", "BYE while terminating", "NUA sends BYE and receives BYE"); nh = invite_to_nua(TAG_END()); mark_point(); nua_set_hparams(nh, NUTAG_APPL_METHOD("BYE"), TAG_END()); fail_unless(s2_check_event(nua_r_set_params, 200)); s2_flush_events(); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_request_to(dialog, SIP_METHOD_BYE, NULL, TAG_END()); i_bye = s2_wait_for_event(nua_i_bye, 100); fail_if(!i_bye); nua_respond(nh, 200, "OKOK", NUTAG_WITH(i_bye->data->e_msg), TAG_END()); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 200)); fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_unless(s2_check_response(200, SIP_METHOD_BYE)); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_1_4){ nua_handle_t *nh; struct message *bye; struct event *i_bye; s2_case("4.1.4", "Send BYE after BYE has been received", "NUA receives BYE, tries to send BYE at same time"); nh = invite_to_nua(TAG_END()); mark_point(); nua_set_hparams(nh, NUTAG_APPL_METHOD("BYE"), TAG_END()); fail_unless(s2_check_event(nua_r_set_params, 200)); s2_flush_events(); s2_request_to(dialog, SIP_METHOD_BYE, NULL, TAG_END()); i_bye = s2_wait_for_event(nua_i_bye, 100); fail_if(!i_bye); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 200)); fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_respond(nh, 200, "OKOK", NUTAG_WITH(i_bye->data->e_msg), TAG_END()); fail_unless(s2_check_response(200, SIP_METHOD_BYE)); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_1_5){ nua_handle_t *nh; struct message *bye; struct event *i_bye; s2_case("4.1.5", "Send BYE after BYE has been received", "NUA receives BYE, tries to send BYE at same time"); nh = invite_to_nua(TAG_END()); mark_point(); nua_set_hparams(nh, NUTAG_APPL_METHOD("BYE"), TAG_END()); fail_unless(s2_check_event(nua_r_set_params, 200)); s2_flush_events(); s2_request_to(dialog, SIP_METHOD_BYE, NULL, TAG_END()); i_bye = s2_wait_for_event(nua_i_bye, 100); fail_if(!i_bye); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 200)); fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_handle_destroy(nh); fail_unless(s2_check_response(500, SIP_METHOD_BYE));}END_TESTSTART_TEST(bye_4_1_6){ nua_handle_t *nh; struct message *bye, *r486; s2_case("4.1.6", "Send BYE after INVITE has been received", "NUA receives INVITE, sends BYE at same time"); nh = invite_to_nua(TAG_END()); nua_set_hparams(nh, NUTAG_AUTOANSWER(0), TAG_END()); fail_unless(s2_check_event(nua_r_set_params, 200)); s2_flush_events(); request_with_sdp(dialog, SIP_METHOD_INVITE, NULL, TAG_END()); fail_unless(s2_check_response(100, SIP_METHOD_INVITE)); nua_bye(nh, TAG_END()); fail_unless(s2_check_event(nua_i_invite, 100)); fail_unless(s2_check_callstate(nua_callstate_received)); do { r486 = s2_wait_for_response(0, SIP_METHOD_INVITE); } while (r486->sip->sip_status->st_status < 200); s2_update_dialog(dialog, r486); /* send ACK */ fail_unless(r486->sip->sip_status->st_status == 486); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_1_7){ nua_handle_t *nh; struct message *bye, *r486; s2_case("4.1.7", "Send BYE after INVITE has been received", "NUA receives INVITE, sends BYE at same time"); nh = invite_to_nua(TAG_END()); nua_set_hparams(nh, NUTAG_AUTOANSWER(0), TAG_END()); fail_unless(s2_check_event(nua_r_set_params, 200)); s2_flush_events(); request_with_sdp(dialog, SIP_METHOD_INVITE, NULL, TAG_END()); fail_unless(s2_check_response(100, SIP_METHOD_INVITE)); nua_bye(nh, TAG_END()); fail_unless(s2_check_event(nua_i_invite, 100)); fail_unless(s2_check_callstate(nua_callstate_received)); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); do { r486 = s2_wait_for_response(0, SIP_METHOD_INVITE); } while (r486->sip->sip_status->st_status < 200); s2_update_dialog(dialog, r486); /* send ACK */ fail_unless(r486->sip->sip_status->st_status == 486); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_1_8){ nua_handle_t *nh; struct message *bye, *r486; s2_case("4.1.8", "BYE followed by response to INVITE", "NUA receives INVITE, sends BYE at same time"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); invite_by_nua(nh, NUTAG_AUTOANSWER(0), TAG_END()); s2_flush_events(); request_with_sdp(dialog, SIP_METHOD_INVITE, NULL, TAG_END()); fail_unless(s2_check_response(100, SIP_METHOD_INVITE)); nua_bye(nh, TAG_END()); fail_unless(s2_check_event(nua_i_invite, 100)); fail_unless(s2_check_callstate(nua_callstate_received)); nua_respond(nh, SIP_486_BUSY_HERE, TAG_END()); do { r486 = s2_wait_for_response(0, SIP_METHOD_INVITE); } while (r486->sip->sip_status->st_status < 200); s2_update_dialog(dialog, r486); /* send ACK */ fail_unless(r486->sip->sip_status->st_status == 486); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_1_9){ nua_handle_t *nh; struct message *bye; struct event *i_bye; s2_case("4.1.6", "Send BYE, receive BYE, destroy", "NUA sends BYE, receives BYE and handle gets destroyed"); nh = invite_to_nua(TAG_END()); mark_point(); s2_flush_events(); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_request_to(dialog, SIP_METHOD_BYE, NULL, TAG_END()); i_bye = s2_wait_for_event(nua_i_bye, 200); fail_if(!i_bye); s2_free_event(i_bye), i_bye = NULL; fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_unless(s2_check_response(200, SIP_METHOD_BYE)); nua_handle_destroy(nh); mark_point(); su_root_step(s2->root, 10); su_root_step(s2->root, 10); su_root_step(s2->root, 10); mark_point(); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); mark_point(); while (su_home_check_alloc((su_home_t *)nua, (void *)nh)) { su_root_step(s2->root, 10); }}END_TESTSTART_TEST(bye_4_1_10){ nua_handle_t *nh; struct message *invite, *bye; struct event *i_bye; s2_case("4.1.6", "Send auto-BYE upon receiving 501, receive BYE, destroy", "NUA sends BYE, receives BYE and handle gets destroyed"); nh = invite_to_nua(TAG_END()); mark_point(); s2_flush_events(); nua_invite(nh, TAG_END()); invite = s2_wait_for_request(SIP_METHOD_INVITE); fail_if(!invite); s2_respond_to(invite, dialog, SIP_501_NOT_IMPLEMENTED, TAG_END()); s2_free_message(invite); fail_unless(s2_check_request(SIP_METHOD_ACK)); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); fail_unless(s2_check_callstate(nua_callstate_calling)); fail_unless(s2_check_event(nua_r_invite, 501)); fail_unless(s2_check_callstate(nua_callstate_terminating)); s2_request_to(dialog, SIP_METHOD_BYE, NULL, TAG_END()); i_bye = s2_wait_for_event(nua_i_bye, 200); fail_if(!i_bye); s2_free_event(i_bye), i_bye = NULL; fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_unless(s2_check_response(200, SIP_METHOD_BYE)); nua_handle_destroy(nh); su_root_step(s2->root, 10); su_root_step(s2->root, 10); su_root_step(s2->root, 10); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); while (su_home_check_alloc((su_home_t *)nua, (void *)nh)) { su_root_step(s2->root, 10); }}END_TESTSTART_TEST(bye_4_2_1){ nua_handle_t *nh; struct message *bye; s2_case("4.2.1", "BYE in progress while call timer expires", "NUA receives INVITE, " "activates call timers, " "sends BYE, BYE challenged, " "waits until session expires."); nh = invite_to_nua( SIPTAG_SESSION_EXPIRES_STR("300;refresher=uas"), SIPTAG_REQUIRE_STR("timer"), TAG_END()); s2_fast_forward(300); invite_timer_round(nh, "300"); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_407_PROXY_AUTH_REQUIRED, SIPTAG_PROXY_AUTHENTICATE_STR(s2_auth_digest_str), TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 407)); s2_fast_forward(300); nua_authenticate(nh, NUTAG_AUTH("Digest:\"s2test\":abc:abc"), TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 200)); fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_if(s2->events); nua_handle_destroy(nh);}END_TESTSTART_TEST(bye_4_2_2){ nua_handle_t *nh; struct message *bye; s2_case("4.2.2", "BYE in progress while call timer expires", "NUA receives INVITE, " "activates call timers, " "sends BYE, BYE challenged, " "waits until session expires."); nh = invite_to_nua( SIPTAG_SESSION_EXPIRES_STR("300;refresher=uas"), SIPTAG_REQUIRE_STR("timer"), TAG_END()); s2_fast_forward(300); invite_timer_round(nh, "300"); s2_fast_forward(300); nua_bye(nh, TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_407_PROXY_AUTH_REQUIRED, SIPTAG_PROXY_AUTHENTICATE_STR(s2_auth_digest_str), TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 407)); s2_fast_forward(300); nua_authenticate(nh, NUTAG_AUTH(s2_auth_credentials), TAG_END()); bye = s2_wait_for_request(SIP_METHOD_BYE); fail_if(!bye); s2_respond_to(bye, dialog, SIP_200_OK, TAG_END()); s2_free_message(bye); fail_unless(s2_check_event(nua_r_bye, 200)); fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_if(s2->events); nua_handle_destroy(nh);}END_TESTTCase *termination_tcase(void){ TCase *tc = tcase_create("4 - Call Termination"); tcase_add_checked_fixture(tc, call_setup, call_teardown); { tcase_add_test(tc, bye_4_1_1); tcase_add_test(tc, bye_4_1_2); tcase_add_test(tc, bye_4_1_3); tcase_add_test(tc, bye_4_1_4); tcase_add_test(tc, bye_4_1_5); tcase_add_test(tc, bye_4_1_6); tcase_add_test(tc, bye_4_1_7); tcase_add_test(tc, bye_4_1_8); tcase_add_test(tc, bye_4_1_9); tcase_add_test(tc, bye_4_1_10); tcase_add_test(tc, bye_4_2_1); tcase_add_test(tc, bye_4_2_2); tcase_set_timeout(tc, 5); } return tc;}/* ====================================================================== *//* Test case template */START_TEST(empty){ s2_case("0.0.0", "Empty test case", "Detailed explanation for empty test case."); tport_set_params(s2->master, TPTAG_LOG(1), TAG_END()); s2_setup_logs(7); s2_setup_logs(0); tport_set_params(s2->master, TPTAG_LOG(0), TAG_END());}END_TESTTCase *empty_tcase(void){ TCase *tc = tcase_create("0 - Empty"); tcase_add_checked_fixture(tc, call_setup, call_teardown); tcase_add_test(tc, empty); return tc;}/* ====================================================================== */void check_session_cases(Suite *suite){ suite_add_tcase(suite, invite_tcase()); suite_add_tcase(suite, cancel_tcase()); suite_add_tcase(suite, session_timer_tcase()); suite_add_tcase(suite, invite_100rel_tcase()); suite_add_tcase(suite, invite_error_tcase()); suite_add_tcase(suite, termination_tcase()); if (0) /* Template */ suite_add_tcase(suite, empty_tcase());}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -