📄 test_soa.c
字号:
/* ---------------------------------------------------------------------- */ /* Re-O/A: add a common codec */ /* Accept media without common codecs */ TEST_1(soa_set_params(a, SOATAG_RTP_MISMATCH(0), SOATAG_USER_SDP_STR( "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 96 3\r\n" "a=rtpmap:96 G729/8000\n" ), SOATAG_RTP_SORT(SOA_RTP_SORT_REMOTE), SOATAG_RTP_SELECT(SOA_RTP_SELECT_ALL), TAG_END())); TEST_1(soa_set_params(b, SOATAG_RTP_MISMATCH(0), SOATAG_USER_SDP_STR( "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 5004 RTP/AVP 96 3 97\r\n" "a=rtpmap:96 G7231/8000\n" "a=rtpmap:97 G729/8000\n" ), SOATAG_RTP_SORT(SOA_RTP_SORT_LOCAL), SOATAG_RTP_SELECT(SOA_RTP_SELECT_COMMON), 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); n = soa_get_local_sdp(a, &a_sdp, NULL, NULL); TEST(n, 1); 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 = a_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 3); TEST_S(rm->rm_encoding, "GSM"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G729"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 0); TEST_S(rm->rm_encoding, "PCMU"); TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 8); TEST_S(rm->rm_encoding, "PCMA"); TEST_1(!rm->rm_next); TEST_1(m = b_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 3); TEST_S(rm->rm_encoding, "GSM"); /* Using payload type 96 from offer */ TEST_1(rm = rm->rm_next); TEST(rm->rm_pt, 96); TEST_S(rm->rm_encoding, "G729"); TEST_1(!rm->rm_next); /* ---------------------------------------------------------------------- */ /* Re-O/A: prune down to single codec. */ TEST_1(soa_set_params(a, SOATAG_USER_SDP_STR( "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 96\r\n" "a=rtpmap:96 G729/8000\n" "a=rtpmap:97 GSM/8000\n" ), SOATAG_RTP_MISMATCH(0), SOATAG_RTP_SELECT(SOA_RTP_SELECT_COMMON), TAG_END())); TEST_1(soa_set_params(b, SOATAG_RTP_MISMATCH(0), SOATAG_RTP_SORT(SOA_RTP_SORT_LOCAL), SOATAG_RTP_SELECT(SOA_RTP_SELECT_SINGLE), 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); n = soa_get_local_sdp(a, &a_sdp, &offer, &offerlen); TEST(n, 1); 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 = a_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 97); TEST_S(rm->rm_encoding, "GSM"); TEST_1(!rm->rm_next); /* Answering end matches payload types then sorts by local preference, then select best codec => GSM with pt 9 */ TEST_1(m = b_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 97); TEST_S(rm->rm_encoding, "GSM"); TEST_1(!rm->rm_next); /* ---------------------------------------------------------------------- */ /* Re-O/A: A generates new SDP offer with single codec only */ 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); TEST_1(m = a_sdp->sdp_media); TEST_1(!m->m_rejected); TEST_1(rm = m->m_rtpmaps); TEST(rm->rm_pt, 97); TEST_S(rm->rm_encoding, "GSM"); TEST_1(!rm->rm_next); n = soa_set_remote_sdp(b, 0, offer, offerlen); TEST(n, 1); /* Answer from B is identical to previous one */ 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); TEST_VOID(soa_terminate(a, NULL)); TEST_VOID(soa_terminate(b, NULL)); TEST_VOID(soa_destroy(a)); TEST_VOID(soa_destroy(b)); END();}int test_asynch_offer_answer(struct context *ctx){ BEGIN();#if 0 int n; char const *caps = NONE, *offer = NONE, *answer = NONE; int capslen = -1, offerlen = -1, answerlen = -1; char const a[] = "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 5004 RTP/AVP 0 8\r\n"; char const b[] = "v=0\n" "o=right 93298573265 321974 IN IP4 127.0.0.3\n" "c=IN IP4 127.0.0.3\n" "m=audio 5006 RTP/AVP 96\n" "m=rtpmap:96 GSM/8000\n"; n = soa_set_capability_sdp(ctx->asynch.a, 0, "m=audio 5004 RTP/AVP 0 8", -1); TEST(n, 1); n = soa_set_capability_sdp(ctx->asynch.a, 0, a, strlen(a)); TEST(n, 1); n = soa_get_capability_sdp(ctx->asynch.a, 0, &caps, &capslen); TEST(n, 1); TEST_1(caps != NULL && caps != NONE); TEST_1(capslen > 0); n = soa_set_capability_sdp(ctx->asynch.b, 0, b, strlen(b)); TEST(n, 1); n = soa_generate_offer(ctx->asynch.a, 1, test_completed); TEST(n, 1); su_root_run(ctx->root); TEST(ctx->completed, ctx->asynch.a); ctx->completed = NULL; n = soa_get_local_sdp(ctx->asynch.a, 0, &offer, &offerlen); TEST(n, 1); n = soa_set_remote_sdp(ctx->asynch.b, 0, offer, offerlen); TEST(n, 1); n = soa_generate_answer(ctx->asynch.b, test_completed); TEST(n, 1); su_root_run(ctx->root); TEST(ctx->completed, ctx->asynch.b); ctx->completed = NULL; TEST_1(soa_is_complete(ctx->asynch.b)); TEST(soa_activate(ctx->asynch.b, NULL), 0); n = soa_get_local_sdp(ctx->asynch.b, 0, &answer, &answerlen); TEST(n, 1); n = soa_set_remote_sdp(ctx->asynch.a, 0, answer, answerlen); TEST(n, 1); n = soa_process_answer(ctx->asynch.a, test_completed); TEST(n, 1); su_root_run(ctx->root); TEST(ctx->completed, ctx->asynch.a); ctx->completed = NULL; TEST_1(soa_is_complete(ctx->asynch.a)); TEST(soa_activate(ctx->asynch.a, NULL), 0); TEST(soa_is_audio_active(ctx->asynch.a), SOA_ACTIVE_SENDRECV); TEST(soa_is_video_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST(soa_is_image_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST(soa_is_chat_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_audio_active(ctx->asynch.a), SOA_ACTIVE_SENDRECV); TEST(soa_is_remote_video_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_image_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_chat_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST(soa_deactivate(ctx->asynch.a, NULL), 0); TEST(soa_deactivate(ctx->asynch.b, NULL), 0); TEST_VOID(soa_terminate(ctx->asynch.a, NULL)); TEST(soa_is_audio_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST(soa_is_remote_audio_active(ctx->asynch.a), SOA_ACTIVE_DISABLED); TEST_VOID(soa_terminate(ctx->asynch.b, NULL));#endif END();}int test_deinit(struct context *ctx){ BEGIN(); END();}#if HAVE_ALARMstatic RETSIGTYPE sig_alarm(int s){ fprintf(stderr, "%s: FAIL! test timeout!\n", name); exit(1);}#endifvoid usage(void){ fprintf(stderr, "usage: %s [-v|-q] [-l level] [-p outbound-proxy-uri]\n", name); exit(1);}int main(int argc, char *argv[]){ int retval = 0, quit_on_single_failure = 0; int i, o_attach = 0, o_alarm = 1; struct context ctx[1] = {{{ SU_HOME_INIT(ctx) }}}; for (i = 1; argv[i]; i++) { if (strcmp(argv[i], "-v") == 0) tstflags |= tst_verbatim; else if (strcmp(argv[i], "-q") == 0) tstflags &= ~tst_verbatim; else if (strcmp(argv[i], "-1") == 0) quit_on_single_failure = 1; else if (strncmp(argv[i], "-l", 2) == 0) { int level = 3; char *rest = NULL; if (argv[i][2]) level = strtol(argv[i] + 2, &rest, 10); else if (argv[i + 1]) level = strtol(argv[i + 1], &rest, 10), i++; else level = 3, rest = ""; if (rest == NULL || *rest) usage(); su_log_set_level(soa_log, level); } else if (strcmp(argv[i], "--attach") == 0) { o_attach = 1; } else if (strcmp(argv[i], "--no-alarm") == 0) { o_alarm = 0; } else if (strcmp(argv[i], "-") == 0) { i++; break; } else if (argv[i][0] != '-') { break; } else usage(); } if (o_attach) { char line[10]; printf("%s: pid %u\n", name, getpid()); printf("<Press RETURN to continue>\n"); fgets(line, sizeof line, stdin); }#if HAVE_ALARM else if (o_alarm) { alarm(60); signal(SIGALRM, sig_alarm); }#endif su_init(); if (!(TSTFLAGS & tst_verbatim)) { su_log_soft_set_level(soa_log, 0); }#define SINGLE_FAILURE_CHECK() \ do { fflush(stdout); \ if (retval && quit_on_single_failure) { su_deinit(); return retval; } \ } while(0) retval |= test_api_errors(ctx); SINGLE_FAILURE_CHECK(); retval |= test_init(ctx, argv + i); SINGLE_FAILURE_CHECK(); if (retval == 0) { retval |= test_params(ctx); SINGLE_FAILURE_CHECK(); retval |= test_static_offer_answer(ctx); SINGLE_FAILURE_CHECK(); retval |= test_codec_selection(ctx); SINGLE_FAILURE_CHECK(); retval |= test_asynch_offer_answer(ctx); SINGLE_FAILURE_CHECK(); } retval |= test_deinit(ctx); SINGLE_FAILURE_CHECK(); su_deinit(); return retval;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -