diff --git a/tester/video_tester.c b/tester/video_tester.c index f21e06989..5418d5873 100644 --- a/tester/video_tester.c +++ b/tester/video_tester.c @@ -394,10 +394,101 @@ static void early_media_video_with_inactive_audio(void) { linphone_core_manager_destroy(pauline); } +static void forked_outgoing_early_media_video_call_with_inactive_audio_test(void) { + LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_tcp_rc"); + LinphoneCoreManager *marie1 = linphone_core_manager_new("marie_early_rc"); + LinphoneCoreManager *marie2 = linphone_core_manager_new("marie_early_rc"); + MSList *lcs = NULL; + LinphoneCallParams *pauline_params; + LinphoneCallParams *marie1_params; + LinphoneCallParams *marie2_params; + LinphoneVideoPolicy pol; + LinphoneCall *marie1_call; + LinphoneCall *marie2_call; + LinphoneCall *pauline_call; + LinphoneInfoMessage *info; + int dummy = 0; + pol.automatically_accept = 1; + pol.automatically_initiate = 1; + + linphone_core_enable_video(pauline->lc, TRUE, TRUE); + linphone_core_enable_video(marie1->lc, TRUE, TRUE); + linphone_core_set_video_policy(marie1->lc, &pol); + linphone_core_enable_video(marie2->lc, TRUE, TRUE); + linphone_core_set_video_policy(marie2->lc, &pol); + linphone_core_set_audio_port_range(marie2->lc, 40200, 40300); + linphone_core_set_video_port_range(marie2->lc, 40400, 40500); + + lcs = ms_list_append(lcs,marie1->lc); + lcs = ms_list_append(lcs,marie2->lc); + lcs = ms_list_append(lcs,pauline->lc); + + pauline_params = linphone_core_create_default_call_parameters(pauline->lc); + linphone_call_params_enable_early_media_sending(pauline_params, TRUE); + linphone_call_params_enable_video(pauline_params, TRUE); + marie1_params = configure_for_early_media_video_receiving_with_inactive_audio(marie1); + marie2_params = configure_for_early_media_video_receiving_with_inactive_audio(marie2); + + linphone_core_invite_address_with_params(pauline->lc, marie1->identity, pauline_params); + linphone_call_params_destroy(pauline_params); + + CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallIncomingEarlyMedia, 1, 3000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallIncomingEarlyMedia, 1, 3000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallOutgoingEarlyMedia, 1, 3000)); + + pauline_call = linphone_core_get_current_call(pauline->lc); + marie1_call = linphone_core_get_current_call(marie1->lc); + marie2_call = linphone_core_get_current_call(marie2->lc); + + CU_ASSERT_PTR_NOT_NULL(pauline_call); + CU_ASSERT_PTR_NOT_NULL(marie1_call); + CU_ASSERT_PTR_NOT_NULL(marie2_call); + + if (pauline_call && marie1_call && marie2_call) { + /* wait a bit that streams are established */ + wait_for_list(lcs, &dummy, 1, 6000); + CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth == 0); + CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth == 0); + CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie2_call)->download_bandwidth == 0); + + linphone_call_params_set_audio_direction(marie1_params, LinphoneMediaDirectionSendRecv); + linphone_core_accept_call_with_params(marie1->lc, linphone_core_get_current_call(marie1->lc), marie1_params); + CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallStreamsRunning, 1, 3000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallStreamsRunning, 1, 3000)); + + /* marie2 should get her call terminated */ + CU_ASSERT_TRUE(wait_for_list(lcs, &marie2->stat.number_of_LinphoneCallEnd, 1, 1000)); + + /*wait a bit that streams are established*/ + wait_for_list(lcs, &dummy, 1, 3000); + CU_ASSERT_TRUE(linphone_call_get_audio_stats(pauline_call)->download_bandwidth > 71); + CU_ASSERT_TRUE(linphone_call_get_audio_stats(marie1_call)->download_bandwidth > 71); + CU_ASSERT_TRUE(linphone_call_get_video_stats(pauline_call)->download_bandwidth > 0); + CU_ASSERT_TRUE(linphone_call_get_video_stats(marie1_call)->download_bandwidth > 0); + + /* send an INFO in reverse side to check that dialogs are properly established */ + info = linphone_core_create_info_message(marie1->lc); + linphone_call_send_info_message(marie1_call, info); + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_inforeceived, 1, 3000)); + } + + linphone_core_terminate_all_calls(pauline->lc); + CU_ASSERT_TRUE(wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallEnd, 1, 3000)); + CU_ASSERT_TRUE(wait_for_list(lcs, &marie1->stat.number_of_LinphoneCallEnd, 1, 3000)); + + linphone_call_params_destroy(marie1_params); + linphone_call_params_destroy(marie2_params); + ms_list_free(lcs); + linphone_core_manager_destroy(marie1); + linphone_core_manager_destroy(marie2); + linphone_core_manager_destroy(pauline); +} + test_t video_tests[] = { { "Early-media video during video call", early_media_video_during_video_call_test }, { "Two incoming early-media video calls", two_incoming_early_media_video_calls_test }, - { "Early-media video with inactive audio", early_media_video_with_inactive_audio } + { "Early-media video with inactive audio", early_media_video_with_inactive_audio }, + { "Forked outgoing early-media video call with inactive audio", forked_outgoing_early_media_video_call_with_inactive_audio_test } }; test_suite_t video_test_suite = {