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

📄 test_nua.c

📁 sip协议栈
💻 C
📖 第 1 页 / 共 5 页
字号:
  TEST_1(!e->next);  free_events_in_list(ctx, a->events);  if (print_headings)    printf("TEST NUA-2.5.1: PASSED\n");    (void)b; (void)c; (void)sip;  END();}int test_unregister(struct context *ctx){  if (!ctx->proxy_tests)    return 0;			/* No proxy */  BEGIN();  struct endpoint *a = &ctx->a,  *b = &ctx->b, *c = &ctx->c;  struct event *e;  sip_t const *sip;/* un-REGISTER test   A			B   |----un-REGISTER---->|   |<-------200---------|   |			|*/  if (print_headings)    printf("TEST NUA-13.1: un-REGISTER a\n");  if (a->reg->nh) {    UNREGISTER(a, NULL, a->reg->nh, TAG_END());    run_a_until(ctx, -1, save_until_final_response);    TEST_1(e = a->events->head);    TEST_E(e->data->e_event, nua_r_unregister);    TEST(e->data->e_status, 200);    TEST_1(sip = sip_object(e->data->e_msg));    TEST_1(!sip->sip_contact);    TEST_1(!e->next);    free_events_in_list(ctx, a->events);    nua_handle_destroy(a->reg->nh), a->reg->nh = NULL;  }  if (print_headings)    printf("TEST NUA-13.1: PASSED\n");  if (print_headings)    printf("TEST NUA-13.2: un-REGISTER b\n");  if (b->reg->nh) {    UNREGISTER(b, NULL, b->reg->nh, TAG_END());    run_b_until(ctx, -1, save_until_final_response);    TEST_1(e = b->events->head);    TEST_E(e->data->e_event, nua_r_unregister);    TEST(e->data->e_status, 200);    TEST_1(sip = sip_object(e->data->e_msg));    TEST_1(!sip->sip_contact);    TEST_1(!e->next);    free_events_in_list(ctx, b->events);    nua_handle_destroy(b->reg->nh), b->reg->nh = NULL;  }  if (print_headings)    printf("TEST NUA-13.2: PASSED\n");  if (print_headings)    printf("TEST NUA-13.3: un-REGISTER c\n");  /* Unregister using another handle */  TEST_1(c->call->nh = nua_handle(c->nua, c->call, TAG_END()));  UNREGISTER(c, c->call, c->call->nh, SIPTAG_TO(c->to), TAG_END());  run_c_until(ctx, -1, save_until_final_response);  TEST_1(e = c->events->head);  TEST_E(e->data->e_event, nua_r_unregister);  TEST_1(sip = sip_object(e->data->e_msg));  TEST(e->data->e_status, 401);  TEST(sip->sip_status->st_status, 401);  TEST_1(!sip->sip_contact);  TEST_1(!e->next);  free_events_in_list(ctx, c->events);  AUTHENTICATE(c, c->call, c->call->nh,	       NUTAG_AUTH("Digest:\"test-proxy\":charlie:secret"), TAG_END());  run_c_until(ctx, -1, save_until_final_response);  TEST_1(e = c->events->head);  TEST_E(e->data->e_event, nua_r_unregister);  TEST(e->data->e_status, 200);  TEST_1(sip = sip_object(e->data->e_msg));  TEST_1(!sip->sip_contact);  TEST_1(!e->next);  free_events_in_list(ctx, c->events);  nua_handle_destroy(c->call->nh), c->call->nh = NULL;  if (c->reg->nh) {    UNREGISTER(c, NULL, c->reg->nh, TAG_END());    run_c_until(ctx, -1, save_until_final_response);    TEST_1(e = c->events->head);    TEST_E(e->data->e_event, nua_r_unregister);    TEST(e->data->e_status, 200);    TEST_1(sip = sip_object(e->data->e_msg));    TEST_1(!sip->sip_contact);    TEST_1(!e->next);    free_events_in_list(ctx, c->events);    nua_handle_destroy(c->reg->nh), c->reg->nh = NULL;  }  if (print_headings)    printf("TEST NUA-13.3: PASSED\n");  END();}/* ======================================================================== */int until_terminated(CONDITION_PARAMS){  if (!check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR))    return 0;  save_event_in_list(ctx, event, ep, call);  return event == nua_i_state && callstate(tags) == nua_callstate_terminated;}/* X     accept_call    ep |                    | |-------INVITE------>| |<----100 Trying-----| |                    | |<----180 Ringing----| |                    | |<--------200--------| |---------ACK------->|*/int accept_call(CONDITION_PARAMS){  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))    return 0;  save_event_in_list(ctx, event, ep, call);  switch (callstate(tags)) {  case nua_callstate_received:    RESPOND(ep, call, nh, SIP_180_RINGING, TAG_END());    return 0;  case nua_callstate_early:    RESPOND(ep, call, nh, SIP_200_OK,	    TAG_IF(call->sdp, SOATAG_USER_SDP_STR(call->sdp)),	    TAG_END());    return 0;  case nua_callstate_ready:    return 1;  case nua_callstate_terminated:    if (call)      nua_handle_destroy(call->nh), call->nh = NULL;    return 1;  default:    return 0;  }}/* accept_call_immediately                      X |                    | |-------INVITE------>| |<----100 Trying-----| |                    | |<--------200--------| |---------ACK------->|*/int accept_call_immediately(CONDITION_PARAMS){  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))    return 0;  save_event_in_list(ctx, event, ep, call);  switch (callstate(tags)) {  case nua_callstate_received:    RESPOND(ep, call, nh, SIP_200_OK,	    TAG_IF(call->sdp, SOATAG_USER_SDP_STR(call->sdp)),	    TAG_END());    return 0;  case nua_callstate_ready:    return 1;  case nua_callstate_terminated:    if (call)      nua_handle_destroy(call->nh), call->nh = NULL;    return 1;  default:    return 0;  }}/* X      INVITE |                    | |-------INVITE------>| |<--------200--------| |---------ACK------->|*/int until_ready(CONDITION_PARAMS){  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))    return 0;  save_event_in_list(ctx, event, ep, call);  switch (callstate(tags)) {  case nua_callstate_ready:    return 1;  case nua_callstate_terminated:    if (call)      nua_handle_destroy(call->nh), call->nh = NULL;    return 1;  default:    return 0;  }}/* INVITE without auto-ack X |                    | |-------INVITE------>| |<--------200--------| |                    | |---------ACK------->|*/int ack_when_completing(CONDITION_PARAMS){  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))    return 0;  save_event_in_list(ctx, event, ep, call);  switch (callstate(tags)) {  case nua_callstate_completing:    ACK(ep, call, nh, TAG_END());    return 0;  case nua_callstate_ready:    return 1;  case nua_callstate_terminated:    if (call)      nua_handle_destroy(call->nh), call->nh = NULL;    return 1;  default:    return 0;  }}/* ======================================================================== *//* Basic call:   A			B   |-------INVITE------>|   |<----100 Trying-----|   |			|   |<----180 Ringing----|   |			|   |<------200 OK-------|   |--------ACK-------->|   |			|   |<-------BYE---------|   |-------200 OK------>|   |			|   Client transitions:   INIT -(C1)-> CALLING -(C2a)-> PROCEEDING -(C3+C4)-> READY   Server transitions:   INIT -(S1)-> RECEIVED -(S2a)-> EARLY -(S3b)-> COMPLETED -(S4)-> READY   B sends BYE:   READY -(T2)-> TERMINATING -(T3)-> TERMINATED   A receives BYE:   READY -(T1)-> TERMINATED   See @page nua_call_model in nua.docs for more information*/int test_basic_call(struct context *ctx){  BEGIN();  struct endpoint *a = &ctx->a,  *b = &ctx->b;  struct call *a_call = a->call, *b_call = b->call;  struct event *e;  if (print_headings)    printf("TEST NUA-3.1: Basic call\n");  a_call->sdp = "m=audio 5008 RTP/AVP 8";  b_call->sdp = "m=audio 5010 RTP/AVP 0 8";  TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END()));  TEST_1(!nua_handle_has_active_call(a_call->nh));  TEST_1(!nua_handle_has_call_on_hold(a_call->nh));  INVITE(a, a_call, a_call->nh,	 TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)),	 SOATAG_USER_SDP_STR(a_call->sdp),	 TAG_END());  run_ab_until(ctx, -1, until_ready, -1, accept_call);  /* Client transitions:     INIT -(C1)-> CALLING: nua_invite(), nua_i_state     CALLING -(C2)-> PROCEEDING: nua_r_invite, nua_i_state     PROCEEDING -(C3+C4)-> READY: nua_r_invite, nua_i_state  */  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */  TEST_1(is_offer_sent(e->data->e_tags));  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite);  TEST(e->data->e_status, 180);  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_proceeding); /* PROCEEDING */  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite);  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_ready); /* READY */  TEST_1(is_answer_recv(e->data->e_tags));  TEST_1(!e->next);  free_events_in_list(ctx, a->events);  TEST_1(nua_handle_has_active_call(a_call->nh));  TEST_1(!nua_handle_has_call_on_hold(a_call->nh));  /*   Server transitions:   INIT -(S1)-> RECEIVED: nua_i_invite, nua_i_state   RECEIVED -(S2a)-> EARLY: nua_respond(), nua_i_state   EARLY -(S3b)-> COMPLETED: nua_respond(), nua_i_state   COMPLETED -(S4)-> READY: nua_i_ack, nua_i_state  */  TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_invite);  TEST(e->data->e_status, 100);  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_received); /* RECEIVED */  TEST_1(is_offer_recv(e->data->e_tags));  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_early); /* EARLY */  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_completed); /* COMPLETED */  TEST_1(is_answer_sent(e->data->e_tags));  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_ack);  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_ready); /* READY */  TEST_1(!e->next);  free_events_in_list(ctx, b->events);  TEST_1(nua_handle_has_active_call(b_call->nh));  TEST_1(!nua_handle_has_call_on_hold(b_call->nh));  BYE(b, b_call, b_call->nh, TAG_END());  run_ab_until(ctx, -1, until_terminated, -1, until_terminated);  /* B transitions:   READY --(T2)--> TERMINATING: nua_bye()   TERMINATING --(T3)--> TERMINATED: nua_r_bye, nua_i_state  */  TEST_1(e = b->events->head);  TEST_E(e->data->e_event, nua_r_bye);  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */  TEST_1(!e->next);  free_events_in_list(ctx, b->events);  TEST_1(!nua_handle_has_active_call(b_call->nh));  /* A transitions:     READY -(T1)-> TERMINATED: nua_i_bye, nua_i_state  */  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_bye);  TEST(e->data->e_status, 200);  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */  TEST_1(!e->next);  free_events_in_list(ctx, a->events);  TEST_1(!nua_handle_has_active_call(a_call->nh));  nua_handle_destroy(a_call->nh), a_call->nh = NULL;  nua_handle_destroy(b_call->nh), b_call->nh = NULL;  if (print_headings)    printf("TEST NUA-3.1: PASSED\n");  END();}/* ======================================================================== *//* Tests NUA-4: Call rejections *//* A      reject-1      B |                    | |-------INVITE------>| |<----100 Trying-----| |                    | |<--------486--------| |---------ACK------->|*/int reject_1(CONDITION_PARAMS){  if (!(check_handle(ep, call, nh, SIP_500_INTERNAL_SERVER_ERROR)))    return 0;  save_event_in_list(ctx, event, ep, call);  switch (callstate(tags)) {  case nua_callstate_received:    RESPOND(ep, call, nh, SIP_486_BUSY_HERE, TAG_END());    return 0;  case nua_callstate_terminated:    if (call)      nua_handle_destroy(call->nh), call->nh = NULL;    return 1;  default:    return 0;  }}int test_reject_a(struct context *ctx){  BEGIN();  struct endpoint *a = &ctx->a, *b = &ctx->b;  struct call *a_call = a->call, *b_call = b->call;  struct event *e;  if (print_headings)    printf("TEST NUA-4.1: reject before ringing\n");  /*   A      reject-1      B   |			|   |-------INVITE------>|   |<----100 Trying-----|   |			|   |<--------486--------|   |---------ACK------->|  */  a_call->sdp = "m=audio 5008 RTP/AVP 8";  b_call->sdp = "m=audio 5010 RTP/AVP 0 8";  TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END()));  INVITE(a, a_call, a_call->nh,	 TAG_IF(!ctx->proxy_tests, NUTAG_URL(b->contact->m_url)),	 SIPTAG_SUBJECT_STR("reject-1"),	 SOATAG_USER_SDP_STR(a_call->sdp),	 TAG_END());  run_ab_until(ctx, -1, until_terminated, -1, reject_1);  /*   Client transitions in reject-1:   INIT -(C1)-> CALLING -(C6a)-> TERMINATED  */  TEST_1(e = a->events->head); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_calling); /* CALLING */  TEST_1(is_offer_sent(e->data->e_tags));  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_r_invite);  TEST(e->data->e_status, 486);  TEST_1(e = e->next); TEST_E(e->data->e_event, nua_i_state);  TEST(callstate(e->data->e_tags), nua_callstate_terminated); /* TERMINATED */  TEST_1(!e->next);  /*   Server transitions in reject-1:   INIT -(S1)-> RECEIVED -(S6a)-> TERMINATED  */  TEST_1(e = b->events->head); TEST_E(e->data->e_event, nua_i_invite);  TEST(e->data->e_status, 100);  TEST_1(e = e->next); TEST_E(e->data-

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -