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

📄 check_session.c

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