📄 test_nua.c
字号:
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_call->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_call); 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_call->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_call); 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->p, 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_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, 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_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_terminated); /* TERMINATED */ TEST_1(!e->next); free_events_in_list(ctx, a_call); nua_handle_destroy(a_call->nh), a_call->nh = NULL; free_events_in_list(ctx, b_call); nua_handle_destroy(b_call->nh), b_call->nh = NULL; if (print_headings) printf("TEST NUA-4.1: PASSED\n"); END();}/* A reject-2 B | | |-------INVITE------>| |<----100 Trying-----| | | |<----180 Ringing----| | | |<--------602--------| |---------ACK------->|*/int reject_2(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, 602, "Rejected 2", 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_b(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; /* ------------------------------------------------------------------------ */ /* A reject-2 B | | |-------INVITE------>| |<----100 Trying-----| | | |<----180 Ringing----| | | |<--------602--------| |---------ACK------->| */ if (print_headings) printf("TEST NUA-4.2: reject after ringing\n"); a_call->sdp = "m=audio 5008 RTP/AVP 8"; b_call->sdp = "m=audio 5010 RTP/AVP 0 8"; /* Make call reject-2 */ 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->p, NUTAG_URL(b->contact->m_url)), SIPTAG_SUBJECT_STR("reject-2"), SOATAG_USER_SDP_STR(a_call->sdp), TAG_END()); run_ab_until(ctx, -1, until_terminated, -1, reject_2); /* Client transitions in reject-2: INIT -(C1)-> CALLING -(C2)-> PROCEEDING -(C6b)-> TERMINATED */ 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_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(e->data->e_status, 602); 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-2: INIT -(S1)-> RECEIVED -(S2)-> EARLY -(S6a)-> TERMINATED */ 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_terminated); /* TERMINATED */ TEST_1(!e->next); free_events_in_list(ctx, a_call); nua_handle_destroy(a_call->nh), a_call->nh = NULL; free_events_in_list(ctx, b_call); nua_handle_destroy(b_call->nh), b_call->nh = NULL; if (print_headings) printf("TEST NUA-4.2: PASSED\n"); END();}/* ------------------------------------------------------------------------ */int reject_302(CONDITION_PARAMS);int reject_604(CONDITION_PARAMS);/* A reject-302 B | | |-------INVITE------>| |<----100 Trying-----| | | |<-----302 Other-----| |--------ACK-------->| | | |-------INVITE------>| |<----100 Trying-----| | | |<----180 Ringing----| | | |<---604 Nowhere-----| |--------ACK-------->|*/int reject_302(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: { sip_contact_t m[1]; *m = *ep->contact; m->m_url->url_user = "302"; respond(ep, call, nh, SIP_302_MOVED_TEMPORARILY, SIPTAG_CONTACT(m), TAG_END()); } return 0; case nua_callstate_terminated: if (call) nua_handle_destroy(call->nh), call->nh = NULL; ep->next_condition = reject_604; return 0; default: return 0; }}int reject_604(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_604_DOES_NOT_EXIST_ANYWHERE, 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_302(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; /* Make call reject-3 */ if (print_headings) printf("TEST NUA-4.3: redirect then reject\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())); invite(a, a_call, a_call->nh, TAG_IF(!ctx->p, NUTAG_URL(b->contact->m_url)), SIPTAG_SUBJECT_STR("reject-3"), SOATAG_USER_SDP_STR(a_call->sdp), TAG_END()); run_ab_until(ctx, -1, until_terminated, -1, reject_302); /* A reject-3 B | | |-------INVITE------>| |<----100 Trying-----| | | |<-----302 Other-----| |--------ACK-------->| | | |-------INVITE------>| |<----100 Trying-----| | | |<----180 Ringing----| | | |<---604 Nowhere-----| |--------ACK-------->| */ /* Client transitions in reject-3: INIT -(C1)-> PROCEEDING -(C6a)-> TERMINATED/INIT INIT -(C1)-> CALLING -(C2)-> PROCEEDING -(C6b)-> TERMINATED */ 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, 100); TEST(sip_object(e->data->e_msg)->sip_status->st_status, 302); TEST_1(e = e->next); 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(e->data->e_status, 604); 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: INIT -(S1)-> RECEIVED -(S6a)-> TERMINATED/INIT INIT -(S1)-> RECEIVED -(S2)-> EARLY -(S6b)-> TERMINATED */ 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_terminated); /* TERMINATED */ TEST_1(e = e->next); 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_terminated); /* TERMINATED */ TEST_1(!e->next); free_events_in_list(ctx, a_call); nua_handle_destroy(a_call->nh), a_call->nh = NULL; free_events_in_list(ctx, b_call); nua_handle_destroy(b_call->nh), b_call->nh = NULL; if (print_headings) printf("TEST NUA-4.3: PASSED\n"); END();}/* ------------------------------------------------------------------------ *//* Reject call with 407, then 401 */int reject_407(CONDITION_PARAMS);int reject_401(CONDITION_PARAMS);int authenticate_call(CONDITION_PARAMS);int reject_403(CONDITION_PARAMS);/* A reject-401 B | | |-------INVITE------>| |<----100 Trying-----| |<--------407--------| |---------ACK------->| | | |-------INVITE------>| |<----100 Trying-----| | | |<----180 Ringing----| | | |<--------401--------| |---------ACK------->| | | |-------INVITE------>| |<----100 Trying-----| |<-------403---------| |--------ACK-------->|*/int reject_407(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_407_PROXY_AUTH_REQUIRED, SIPTAG_PROXY_AUTHENTICATE_STR("Digest realm=\"test_nua\", " "nonce=\"nsdhfuds\", algorithm=MD5, " "qop=\"auth-int\""), TAG_END()); return 0; case nua_callstate_terminated: if (call) nua_handle_destroy(call->nh), call->nh = NULL; ep->next_condition = reject_401; return 0; default: return 0; }}int reject_401(CONDITION_PARAMS){ if (!(check_hand
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -