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

📄 test_nua.c

📁 Internet Phone, Chat, Conferencing
💻 C
📖 第 1 页 / 共 5 页
字号:
}int test_connectivity(struct context *ctx){  if (!ctx->p)    return 0;			/* No proxy */  BEGIN();  struct endpoint *a = &ctx->a,  *b = &ctx->b, *c = &ctx->c;  struct call *a_call = a->call, *b_call = b->call, *c_call = c->call;  struct event *e;  sip_t const *sip;  /* Connectivity test using OPTIONS */  if (print_headings)    printf("TEST NUA-2.4.1: OPTIONS from A to B\n");  TEST_1(a_call->nh = nua_handle(a->nua, a_call, SIPTAG_TO(b->to), TAG_END()));  options(a, a_call, a_call->nh,	  TAG_IF(!ctx->p, NUTAG_URL(b->contact->m_url)),	  TAG_END());  run_ab_until(ctx, -1, save_until_final_response, -1, save_until_received);  /* Client events: nua_options(), nua_r_options */  TEST_1(e = a_call->events.head); TEST_E(e->data->e_event, nua_r_options);  TEST(e->data->e_status, 200);  TEST_1(sip = sip_object(e->data->e_msg));  TEST_1(sip->sip_allow); TEST_1(sip->sip_accept); TEST_1(sip->sip_supported);  /* TEST_1(sip->sip_content_type); */  /* TEST_1(sip->sip_payload); */  TEST_1(!e->next);  free_events_in_list(ctx, a_call);  nua_handle_destroy(a_call->nh), a_call->nh = NULL;  /* Server events: nua_i_options */  TEST_1(e = b_call->events.head); TEST_E(e->data->e_event, nua_i_options);  TEST(e->data->e_status, 200);  TEST_1(!e->next);  free_events_in_list(ctx, b_call);  nua_handle_destroy(b_call->nh), b_call->nh = NULL;  if (print_headings)    printf("TEST NUA-2.4.1: PASSED\n");  if (print_headings)    printf("TEST NUA-2.4.2: OPTIONS from B to C\n");  TEST_1(b_call->nh = nua_handle(b->nua, b_call, SIPTAG_TO(c->to), TAG_END()));  options(b, b_call, b_call->nh,	  TAG_IF(!ctx->p, NUTAG_URL(c->contact->m_url)),	  TAG_END());  run_abc_until(ctx, -1, NULL, 		-1, save_until_final_response,		-1, save_until_received);  /* Client events: nua_options(), nua_r_options */  TEST_1(e = b_call->events.head); TEST_E(e->data->e_event, nua_r_options);  TEST(e->data->e_status, 200);  TEST_1(sip = sip_object(e->data->e_msg));  TEST_1(sip->sip_allow); TEST_1(sip->sip_accept); TEST_1(sip->sip_supported);  /* TEST_1(sip->sip_content_type); */  /* TEST_1(sip->sip_payload); */  TEST_1(!e->next);  free_events_in_list(ctx, b_call);  nua_handle_destroy(b_call->nh), b_call->nh = NULL;  /* Server events: nua_i_options */  TEST_1(e = c_call->events.head); TEST_E(e->data->e_event, nua_i_options);  TEST(e->data->e_status, 200);  TEST_1(!e->next);  free_events_in_list(ctx, c_call);  nua_handle_destroy(c_call->nh), c_call->nh = NULL;  if (print_headings)    printf("TEST NUA-2.4.2: PASSED\n");  if (print_headings)    printf("TEST NUA-2.4.3: OPTIONS from C to A\n");  TEST_1(c_call->nh = nua_handle(c->nua, c_call, SIPTAG_TO(a->to), TAG_END()));  options(c, c_call, c_call->nh,	  TAG_IF(!ctx->p, NUTAG_URL(a->contact->m_url)),	  TAG_END());  run_abc_until(ctx, -1, save_until_received, 		-1, NULL,		-1, save_until_final_response);  /* Client events: nua_options(), nua_r_options */  TEST_1(e = c_call->events.head); TEST_E(e->data->e_event, nua_r_options);  TEST(e->data->e_status, 200);  TEST_1(sip = sip_object(e->data->e_msg));  TEST_1(sip->sip_allow); TEST_1(sip->sip_accept); TEST_1(sip->sip_supported);  /* TEST_1(sip->sip_content_type); */  /* TEST_1(sip->sip_payload); */  TEST_1(!e->next);  free_events_in_list(ctx, c_call);  nua_handle_destroy(c_call->nh), c_call->nh = NULL;  /* Server events: nua_i_options */  TEST_1(e = a_call->events.head); TEST_E(e->data->e_event, nua_i_options);  TEST(e->data->e_status, 200);  TEST_1(!e->next);  free_events_in_list(ctx, a_call);  nua_handle_destroy(a_call->nh), a_call->nh = NULL;  if (print_headings)    printf("TEST NUA-2.4.3: PASSED\n");  END();}int test_unregister(struct context *ctx){  if (!ctx->p)    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->call->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->call);    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->call->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->call);    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->call->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->call);  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->call->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->call);  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->call->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->call);    nua_handle_destroy(c->reg->nh), c->reg->nh = NULL;  }  if (print_headings)    printf("TEST NUA-13.3: PASSED\n");  END();}/* ======================================================================== */int save_events(CONDITION_PARAMS){  return save_event_in_list(ctx, event, ep, ep->call) > 0;}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->p, 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_call->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_call);  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_call->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_call);  TEST_1(nua_handle_has_active_call(b_call->nh));  TEST_1(!nua_handle_has_call_on_hold(b_call->nh));

⌨️ 快捷键说明

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