📄 check_session.c
字号:
fail_unless(s2_check_event(nua_r_bye, 200)); fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_handle_destroy(nh);}END_TESTSTART_TEST(call_2_1_7){ nua_handle_t *nh, *nh2; sip_replaces_t *replaces; s2_case("2.1.7", "Call lookup", "Test dialog and call-id lookup"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); invite_by_nua(nh, TAG_END()); nh2 = nua_handle_by_call_id(nua, dialog->call_id->i_id); fail_if(!nh2); fail_if(nh != nh2); nua_handle_unref(nh2); replaces = sip_replaces_format(NULL, "%s;from-tag=%s;to-tag=%s", dialog->call_id->i_id, dialog->local->a_tag, dialog->remote->a_tag); fail_if(!replaces); nh2 = nua_handle_by_replaces(nua, replaces); fail_if(!nh2); fail_if(nh != nh2); nua_handle_unref(nh2); msg_header_free_all(NULL, (msg_header_t *)replaces); bye_by_nua(nh, TAG_END()); nua_handle_destroy(nh);}END_TESTTCase *invite_tcase(void){ TCase *tc = tcase_create("2.1 - Basic INVITE"); tcase_add_checked_fixture(tc, call_setup, call_teardown); { tcase_add_test(tc, call_2_1_1); tcase_add_test(tc, call_2_1_2); tcase_add_test(tc, call_2_1_3); tcase_add_test(tc, call_2_1_4); tcase_add_test(tc, call_2_1_5); tcase_add_test(tc, call_2_1_6); tcase_add_test(tc, call_2_1_7); } return tc;}/* ---------------------------------------------------------------------- *//* 2.2 - Call CANCEL cases */START_TEST(cancel_outgoing){ nua_handle_t *nh; struct message *invite, *cancel; s2_case("2.2.1", "Cancel call", "NUA is callee, NUA sends CANCEL immediately"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); nua_invite(nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); fail_unless(s2_check_callstate(nua_callstate_calling)); nua_cancel(nh, TAG_END()); invite = s2_wait_for_request(SIP_METHOD_INVITE); fail_if(!invite); fail_if(s2->received != NULL); s2_respond_to(invite, dialog, SIP_100_TRYING, TAG_END()); cancel = s2_wait_for_request(SIP_METHOD_CANCEL); fail_if(!cancel); s2_respond_to(invite, dialog, SIP_487_REQUEST_CANCELLED, TAG_END()); s2_respond_to(cancel, dialog, SIP_200_OK, TAG_END()); fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_event(nua_r_invite, 487)); fail_unless(s2_check_callstate(nua_callstate_terminated)); fail_unless(s2_check_event(nua_r_cancel, 200)); fail_if(s2->events != NULL); nua_handle_destroy(nh);}END_TESTSTART_TEST(cancel_outgoing_after_100){ nua_handle_t *nh; struct message *invite; s2_case("2.2.2", "Canceled call", "NUA is callee, NUA sends CANCEL after receiving 100"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); nua_invite(nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); process_offer(invite); s2_respond_to(invite, dialog, SIP_100_TRYING, TAG_END()); cancel_by_nua(nh, invite, dialog, TAG_END()); fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_handle_destroy(nh);}END_TESTSTART_TEST(cancel_outgoing_after_180){ nua_handle_t *nh; struct message *invite; s2_case("2.2.3", "Canceled call", "NUA is callee, NUA sends CANCEL after receiving 180"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); nua_invite(nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); process_offer(invite); respond_with_sdp( invite, dialog, SIP_180_RINGING, SIPTAG_CONTENT_DISPOSITION_STR("session;handling=optional"), TAG_END()); fail_unless(s2_check_event(nua_r_invite, 180)); fail_unless(s2_check_callstate(nua_callstate_proceeding)); cancel_by_nua(nh, invite, dialog, TAG_END()); fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_handle_destroy(nh);}END_TESTSTART_TEST(cancel_outgoing_glare){ nua_handle_t *nh; struct message *invite, *cancel; s2_case("2.2.4", "Cancel and 200 OK glare", "NUA is callee, NUA sends CANCEL after receiving 180 " "but UAS already sent 200 OK."); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); nua_invite(nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); process_offer(invite); respond_with_sdp( invite, dialog, SIP_180_RINGING, SIPTAG_CONTENT_DISPOSITION_STR("session;handling=optional"), TAG_END()); fail_unless(s2_check_event(nua_r_invite, 180)); fail_unless(s2_check_callstate(nua_callstate_proceeding)); nua_cancel(nh, TAG_END()); cancel = s2_wait_for_request(SIP_METHOD_CANCEL); fail_if(!cancel); respond_with_sdp(invite, dialog, SIP_200_OK, TAG_END()); s2_respond_to(cancel, dialog, SIP_481_NO_TRANSACTION, TAG_END()); s2_free_message(cancel); fail_unless(s2_check_event(nua_r_cancel, 481)); fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_callstate(nua_callstate_ready)); bye_by_nua(nh, TAG_END()); nua_handle_destroy(nh);}END_TESTTCase *cancel_tcase(void){ TCase *tc = tcase_create("2.2 - CANCEL"); tcase_add_checked_fixture(tc, call_setup, call_teardown); tcase_add_test(tc, cancel_outgoing); tcase_add_test(tc, cancel_outgoing_after_100); tcase_add_test(tc, cancel_outgoing_after_180); tcase_add_test(tc, cancel_outgoing_glare); return tc;}/* ---------------------------------------------------------------------- *//* 2.3 - Session timers */static void invite_timer_round(nua_handle_t *nh, char const *session_expires){ struct message *invite, *ack; fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); process_offer(invite); respond_with_sdp( invite, dialog, SIP_200_OK, SIPTAG_SESSION_EXPIRES_STR(session_expires), SIPTAG_REQUIRE_STR("timer"), TAG_END()); s2_free_message(invite); fail_unless(s2_check_event(nua_r_invite, 200)); fail_unless(s2_check_callstate(nua_callstate_ready)); ack = s2_wait_for_request(SIP_METHOD_ACK); s2_free_message(ack);}START_TEST(call_to_nua_with_timer){ nua_handle_t *nh; s2_case("2.3.1", "Incoming call with call timers", "NUA receives INVITE, " "activates call timers, " "sends re-INVITE twice, " "sends BYE."); 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;refresher=uac"); s2_fast_forward(300); invite_timer_round(nh, "300;refresher=uac"); bye_by_nua(nh, TAG_END()); nua_handle_destroy(nh);}END_TESTSTART_TEST(call_to_nua_with_timer_2){ nua_handle_t *nh; s2_case("2.3.2", "Incoming call with call timers", "NUA receives INVITE, " "activates call timers, " "sends re-INVITE, " "sends BYE."); 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); invite_timer_round(nh, "300"); bye_by_nua(nh, TAG_END()); nua_handle_destroy(nh);}END_TESTTCase *session_timer_tcase(void){ TCase *tc = tcase_create("2.3 - Session timers"); tcase_add_checked_fixture(tc, call_setup, call_teardown); { tcase_add_test(tc, call_to_nua_with_timer); tcase_add_test(tc, call_to_nua_with_timer_2); } return tc;}/* ====================================================================== *//* 2.4 - 100rel */START_TEST(call_with_prack_by_nua){ nua_handle_t *nh; struct message *invite, *prack; s2_case("2.4.1", "Call with 100rel", "NUA sends INVITE, " "receives 183, sends PRACK, receives 200 for it, " "receives 180, sends PRACK, receives 200 for it, " "receives 200, send ACK."); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); invite = invite_sent_by_nua( nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); process_offer(invite); prack = respond_with_100rel(invite, dialog, 1, SIP_183_SESSION_PROGRESS, TAG_END()); s2_free_message(prack), prack = NULL; fail_unless(s2_check_callstate(nua_callstate_proceeding)); fail_unless(s2_check_event(nua_r_prack, 200)); prack = respond_with_100rel(invite, dialog, 0, SIP_180_RINGING, TAG_END()); s2_free_message(prack), prack = NULL; fail_unless(s2_check_callstate(nua_callstate_proceeding)); fail_unless(s2_check_event(nua_r_prack, 200)); s2_respond_to(invite, dialog, SIP_200_OK, TAG_END()); s2_free_message(invite); fail_unless(s2_check_event(nua_r_invite, 200)); fail_unless(s2_check_callstate(nua_callstate_ready)); fail_unless(s2_check_request(SIP_METHOD_ACK)); bye_to_nua(nh, TAG_END()); nua_handle_destroy(nh);}END_TESTSTART_TEST(call_with_prack_sans_soa){ nua_handle_t *nh; struct message *invite, *prack; s2_case("2.4.1", "Call with 100rel", "NUA sends INVITE, " "receives 183, sends PRACK, receives 200 for it, " "receives 180, sends PRACK, receives 200 for it, " "receives 200, send ACK."); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); invite = invite_sent_by_nua( nh, NUTAG_MEDIA_ENABLE(0), SIPTAG_CONTENT_TYPE_STR("application/sdp"), SIPTAG_PAYLOAD_STR( "v=0" CRLF "o=- 6805647540234172778 5821668777690722690 IN IP4 127.0.0.1" CRLF "s=-" CRLF "c=IN IP4 127.0.0.1" CRLF "m=audio 5004 RTP/AVP 0 8" CRLF), TAG_END()); prack = respond_with_100rel(invite, dialog, 0, SIP_183_SESSION_PROGRESS, TAG_END()); s2_free_message(prack), prack = NULL; fail_unless(s2_check_callstate(nua_callstate_proceeding)); fail_unless(s2_check_event(nua_r_prack, 200)); prack = respond_with_100rel(invite, dialog, 0, SIP_180_RINGING, TAG_END()); s2_free_message(prack), prack = NULL; fail_unless(s2_check_callstate(nua_callstate_proceeding)); fail_unless(s2_check_event(nua_r_prack, 200)); s2_respond_to(invite, dialog, SIP_200_OK, TAG_END()); s2_free_message(invite); fail_unless(s2_check_event(nua_r_invite, 200)); fail_unless(s2_check_callstate(nua_callstate_ready)); fail_unless(s2_check_request(SIP_METHOD_ACK)); bye_to_nua(nh, TAG_END()); nua_handle_destroy(nh);}END_TESTTCase *invite_100rel_tcase(void){ TCase *tc = tcase_create("2.4 - INVITE with 100rel"); tcase_add_checked_fixture(tc, call_setup, call_teardown); { tcase_add_test(tc, call_with_prack_by_nua); tcase_add_test(tc, call_with_prack_sans_soa); } return tc;}/* ====================================================================== *//* 3.1 - Call error cases */START_TEST(call_forbidden){ nua_handle_t *nh; struct message *invite; s2_case("3.1.1", "Call failure", "Call fails with 403 response"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); nua_invite(nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); fail_if(!invite); s2_respond_to(invite, NULL, SIP_403_FORBIDDEN, TAG_END()); s2_free_message(invite); fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_event(nua_r_invite, 403)); fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_handle_destroy(nh);}END_TESTSTART_TEST(too_many_retrys){ nua_handle_t *nh; struct message *invite; int i; s2_case("3.1.2", "Call fails after too many retries", "Call fails after 4 times 500 Retry-After"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), NUTAG_RETRY_COUNT(3), TAG_END()); nua_invite(nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); for (i = 0;; i++) { fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); fail_if(!invite); s2_respond_to(invite, NULL, SIP_500_INTERNAL_SERVER_ERROR, SIPTAG_RETRY_AFTER_STR("5"), TAG_END()); s2_free_message(invite); fail_unless(s2_check_request(SIP_METHOD_ACK)); if (i == 3) break; fail_unless(s2_check_event(nua_r_invite, 100)); s2_fast_forward(5); } fail_unless(s2_check_event(nua_r_invite, 500)); fail_unless(s2_check_callstate(nua_callstate_terminated)); nua_handle_destroy(nh);}END_TESTSTART_TEST(reinvite_forbidden){ nua_handle_t *nh; struct message *invite; s2_case("3.2.1", "Re-INVITE failure", "Re-INVITE fails with 403 response"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), TAG_END()); invite_by_nua(nh, TAG_END()); nua_invite(nh, TAG_END()); fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); fail_if(!invite); s2_respond_to(invite, NULL, SIP_403_FORBIDDEN, TAG_END()); s2_free_message(invite); fail_unless(s2_check_request(SIP_METHOD_ACK)); fail_unless(s2_check_event(nua_r_invite, 403)); /* Return to previous state */ fail_unless(s2_check_callstate(nua_callstate_ready)); bye_by_nua(nh, TAG_END());}END_TESTSTART_TEST(reinvite_too_many_retrys){ nua_handle_t *nh; struct message *invite, *bye; int i; s2_case("3.2.2", "Re-INVITE fails after too many retries", "Call fails after 4 times 500 Retry-After"); nh = nua_handle(nua, NULL, SIPTAG_TO(s2->local), NUTAG_RETRY_COUNT(3), TAG_END()); invite_by_nua(nh, TAG_END()); nua_invite(nh, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8"), TAG_END()); for (i = 0;; i++) { fail_unless(s2_check_callstate(nua_callstate_calling)); invite = s2_wait_for_request(SIP_METHOD_INVITE); fail_if(!invite); s2_respond_to(invite, NULL, SIP_500_INTERNAL_SERVER_ERROR, SIPTAG_RETRY_AFTER_STR("5"), TAG_END()); s2_free_message(invite); fail_unless(s2_check_request(SIP_METHOD_ACK)); if (i == 3) break; fail_unless(s2_check_event(nua_r_invite, 100)); s2_fast_forward(5); } fail_unless(s2_check_event(nua_r_invite, 500)); /* Graceful termination */ fail_unless(s2_check_callstate(nua_callstate_terminating)); 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);}END_TESTTCase *invite_error_tcase(void){ TCase *tc = tcase_create("3 - Call Errors"); tcase_add_checked_fixture(tc, call_setup, call_teardown); { tcase_add_test(tc, call_forbidden); tcase_add_test(tc, too_many_retrys); tcase_add_test(tc, reinvite_forbidden); tcase_add_test(tc, reinvite_too_many_retrys); tcase_set_timeout(tc, 5);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -