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

📄 test_soa.c

📁 sip协议栈
💻 C
📖 第 1 页 / 共 3 页
字号:
  /* ---------------------------------------------------------------------- */  /* 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 + -