📄 test_nua.c
字号:
}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 + -