⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 check_session.c

📁 Sofia SIP is an open-source SIP User-Agent library, compliant with the IETF RFC3261 specification.
💻 C
📖 第 1 页 / 共 3 页
字号:
  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 + -