📄 test_soa.c
字号:
TEST_1(a = soa_clone(ctx->a, ctx->root, ctx)); TEST_1(b = soa_clone(ctx->b, ctx->root, ctx)); n = soa_get_local_sdp(a, NULL, &offer, &offerlen); TEST(n, 0); n = soa_set_user_sdp(a, 0, "m=audio 5004 RTP/AVP 0 8", -1); TEST(n, 1); n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, NULL, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_get_local_sdp(b, NULL, &answer, &answerlen); TEST(n, 0); n = soa_set_params(b, SOATAG_LOCAL_SDP_STR("m=audio 5004 RTP/AVP 8"), TAG_END()); n = soa_generate_answer(b, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); n = soa_get_local_sdp(b, NULL, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 1); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_video_active(a), SOA_ACTIVE_DISABLED); TEST(soa_is_image_active(a), SOA_ACTIVE_DISABLED); TEST(soa_is_chat_active(a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_video_active(a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_image_active(a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_chat_active(a), SOA_ACTIVE_DISABLED); /* 'A' will put call on hold */ offer = NONE; TEST(soa_set_params(a, SOATAG_HOLD("*"), TAG_END()), 1); TEST(soa_generate_offer(a, 1, test_completed), 0); TEST(soa_get_local_sdp(a, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(strstr(offer, "a=sendonly")); TEST(soa_set_remote_sdp(b, 0, offer, offerlen), 1); TEST(soa_generate_answer(b, test_completed), 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(strstr(answer, "a=recvonly")); TEST(soa_set_remote_sdp(a, 0, answer, -1), 1); TEST(soa_process_answer(a, test_completed), 0); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDONLY); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDONLY); /* 'A' will release hold. */ TEST(soa_set_params(a, SOATAG_HOLD(NULL), TAG_END()), 1); TEST(soa_generate_offer(a, 1, test_completed), 0); TEST(soa_get_local_sdp(a, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(!strstr(offer, "a=sendonly")); TEST(soa_set_remote_sdp(b, 0, offer, offerlen), 1); TEST(soa_generate_answer(b, test_completed), 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(!strstr(answer, "a=recvonly")); TEST(soa_set_remote_sdp(a, 0, answer, -1), 1); TEST(soa_process_answer(a, test_completed), 0); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); /* 'A' will put B on hold but this time with c=IN IP4 0.0.0.0 */ TEST(soa_set_params(a, SOATAG_HOLD("*"), TAG_END()), 1); TEST(soa_generate_offer(a, 1, test_completed), 0); { sdp_session_t const *o_sdp; sdp_session_t *sdp; sdp_printer_t *p; sdp_connection_t *c; TEST(soa_get_local_sdp(a, &o_sdp, NULL, NULL), 1); TEST_1(o_sdp != NULL && o_sdp != NONE); TEST_1(sdp = sdp_session_dup(home, o_sdp)); /* Remove mode, change c=, encode offer */ if (sdp->sdp_media->m_connections) c = sdp->sdp_media->m_connections; else c = sdp->sdp_connection; TEST_1(c); c->c_address = "0.0.0.0"; TEST_1(p = sdp_print(home, sdp, NULL, 0, sdp_f_realloc)); TEST_1(sdp_message(p)); offer = sdp_message(p); offerlen = strlen(offer); } TEST(soa_set_remote_sdp(b, 0, offer, -1), 1); TEST(soa_generate_answer(b, test_completed), 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(strstr(answer, "a=recvonly")); TEST(soa_set_remote_sdp(a, 0, answer, -1), 1); TEST(soa_process_answer(a, test_completed), 0); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDONLY); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDONLY); TEST(soa_is_audio_active(b), SOA_ACTIVE_RECVONLY); TEST(soa_is_remote_audio_active(b), SOA_ACTIVE_RECVONLY); /* 'A' will propose adding video. */ /* 'B' will reject. */ TEST(soa_set_params(a, SOATAG_HOLD(NULL), /* 'A' will release hold. */ SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8\r\n" "m=video 5006 RTP/AVP 34\r\n"), TAG_END()), 2); TEST(soa_generate_offer(a, 1, test_completed), 0); TEST(soa_get_local_sdp(a, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(!strstr(offer, "a=sendonly")); TEST_1(strstr(offer, "m=video")); TEST(soa_set_remote_sdp(b, 0, offer, offerlen), 1); TEST(soa_generate_answer(b, test_completed), 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST(soa_get_local_sdp(b, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(!strstr(answer, "a=recvonly")); TEST_1(strstr(answer, "m=video")); TEST(soa_set_remote_sdp(a, 0, answer, -1), 1); TEST(soa_process_answer(a, test_completed), 0); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_video_active(a), SOA_ACTIVE_REJECTED); { /* Test tags */ sdp_session_t const *l = NULL, *u = NULL, *r = NULL; sdp_media_t const *m; TEST(soa_get_params(b, SOATAG_LOCAL_SDP_REF(l), SOATAG_USER_SDP_REF(u), SOATAG_REMOTE_SDP_REF(r), TAG_END()), 3); TEST_1(l); TEST_1(u); TEST_1(r); TEST_1(m = l->sdp_media); TEST(m->m_type, sdp_media_audio); TEST_1(!m->m_rejected); TEST_1(m = m->m_next); TEST(m->m_type, sdp_media_video); TEST_1(m->m_rejected); } /* 'B' will now propose adding video. */ /* 'A' will accept. */ TEST(soa_set_params(b, SOATAG_USER_SDP_STR("m=audio 5004 RTP/AVP 0 8\r\n" "m=video 5006 RTP/AVP 34\r\n"), TAG_END()), 1); TEST(soa_generate_offer(b, 1, test_completed), 0); TEST(soa_get_local_sdp(b, NULL, &offer, &offerlen), 1); TEST_1(offer != NULL && offer != NONE); TEST_1(!strstr(offer, "b=sendonly")); TEST_1(strstr(offer, "m=video")); TEST(soa_set_remote_sdp(a, 0, offer, offerlen), 1); TEST(soa_generate_answer(a, test_completed), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_get_local_sdp(a, NULL, &answer, &answerlen), 1); TEST_1(answer != NULL && answer != NONE); TEST_1(!strstr(answer, "b=recvonly")); TEST_1(strstr(answer, "m=video")); TEST(soa_set_remote_sdp(b, 0, answer, -1), 1); TEST(soa_process_answer(b, test_completed), 0); TEST(soa_activate(b, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_video_active(a), SOA_ACTIVE_SENDRECV); TEST_VOID(soa_terminate(a, NULL)); TEST(soa_is_audio_active(a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_DISABLED); TEST_VOID(soa_terminate(b, NULL)); TEST_VOID(soa_destroy(a)); TEST_VOID(soa_destroy(b)); su_home_deinit(home); END();}int test_codec_selection(struct context *ctx){ BEGIN(); int n; soa_session_t *a, *b; char const *offer = NONE, *answer = NONE; int offerlen = -1, answerlen = -1; sdp_session_t const *a_sdp, *b_sdp; sdp_media_t const *m; sdp_rtpmap_t const *rm; char const a_caps[] = "v=0\r\n" "o=left 219498671 2 IN IP4 127.0.0.2\r\n" "c=IN IP4 127.0.0.2\r\n" "m=audio 5008 RTP/AVP 0 8 97\r\n" "a=rtpmap:97 GSM/8000\n" ; char const b_caps[] = "m=audio 5004 RTP/AVP 96 97\n" "a=rtpmap:96 G7231/8000\n" "a=rtpmap:97 G729/8000\n"; TEST_1(a = soa_create("static", ctx->root, ctx)); TEST_1(b = soa_create("static", ctx->root, ctx)); TEST(soa_set_user_sdp(a, 0, a_caps, strlen(a_caps)), 1); TEST(soa_set_user_sdp(b, 0, b_caps, strlen(b_caps)), 1); n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, NULL, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_get_local_sdp(b, NULL, &answer, &answerlen); TEST(n, 0); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 1); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_REJECTED); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_REJECTED); TEST_1(m = b_sdp->sdp_media); TEST_1(m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G7231"); /* Not using payload type 97 from offer */ TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 98); TEST_S(rm->rm_encoding, "G729"); TEST_1(!rm->rm_next); /* ---------------------------------------------------------------------- */ /* Re-O/A: A generates new SDP */ n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 0); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); /* Re-O/A: no-one regenerates new SDP */ n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 0); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 0); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); /* ---------------------------------------------------------------------- */ /* Re-O/A: accept media without common codecs */ /* Accept media without common codecs */ TEST_1(soa_set_params(a, SOATAG_RTP_MISMATCH(1), TAG_END())); TEST_1(soa_set_params(b, SOATAG_RTP_MISMATCH(1), TAG_END())); n = soa_generate_offer(a, 1, test_completed); TEST(n, 0); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); TEST_1(offer != NULL && offer != NONE); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); n = soa_generate_answer(b, test_completed); TEST(n, 0); n = soa_get_local_sdp(b, &b_sdp, &answer, &answerlen); TEST(n, 1); TEST_1(answer != NULL && answer != NONE); n = soa_set_remote_sdp(a, 0, answer, -1); TEST(n, 1); n = soa_process_answer(a, test_completed); TEST(n, 0); TEST_1(soa_is_complete(b)); TEST(soa_activate(b, NULL), 0); TEST_1(soa_is_complete(a)); TEST(soa_activate(a, NULL), 0); TEST(soa_is_audio_active(a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_audio_active(a), SOA_ACTIVE_SENDRECV); TEST_1(m = b_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G7231"); /* Not using payload type 97 from offer */ TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 98); TEST_S(rm->rm_encoding, "G729"); TEST_1(!rm->rm_next);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -