diff --git a/build/android/liblinphone_tester.mk b/build/android/liblinphone_tester.mk
index 8e5221e20..e9a2c8718 100644
--- a/build/android/liblinphone_tester.mk
+++ b/build/android/liblinphone_tester.mk
@@ -12,21 +12,22 @@ common_SRC_FILES := \
stun_tester.c \
flexisip_tester.c \
tester.c \
- remote_provisioning_tester.c
-
+ remote_provisioning_tester.c \
+ quality_reporting_tester.c
+
common_C_INCLUDES += \
$(LOCAL_PATH) \
$(LOCAL_PATH)/../include \
$(LOCAL_PATH)/../coreapi \
$(LOCAL_PATH)/../oRTP/include \
- $(LOCAL_PATH)/../mediastreamer2/include
+ $(LOCAL_PATH)/../mediastreamer2/include
include $(CLEAR_VARS)
-LOCAL_MODULE := liblinphone_tester
+LOCAL_MODULE := liblinphone_tester
LOCAL_MODULE_FILENAME := liblinphone_tester-$(TARGET_ARCH_ABI)
-LOCAL_SRC_FILES += $(common_SRC_FILES)
+LOCAL_SRC_FILES += $(common_SRC_FILES)
LOCAL_C_INCLUDES = $(common_C_INCLUDES)
LOCAL_CFLAGS = -DIN_LINPHONE
LOCAL_LDLIBS := -llog
diff --git a/coreapi/quality_reporting.c b/coreapi/quality_reporting.c
index 1cd9c9152..52c60f446 100644
--- a/coreapi/quality_reporting.c
+++ b/coreapi/quality_reporting.c
@@ -321,16 +321,19 @@ static int send_report(const LinphoneCall* call, reporting_session_report_t * re
in that case, we abort the report since it's not useful data*/
if (report->info.local_addr.ip == NULL || strlen(report->info.local_addr.ip) == 0
|| report->info.remote_addr.ip == NULL || strlen(report->info.remote_addr.ip) == 0) {
- ms_warning("QualityReporting: Trying to submit a %s too early (call duration: %d sec) and IP could "
+ ms_warning("QualityReporting[%p]: Trying to submit a %s too early (call duration: %d sec) but %s IP could "
"not be retrieved so dropping this report"
+ , report
, report_event
- , linphone_call_get_duration(call));
+ , linphone_call_get_duration(call)
+ , (report->info.local_addr.ip == NULL || strlen(report->info.local_addr.ip) == 0) ? "local" : "remote");
return 1;
}
addr = linphone_address_new(linphone_proxy_config_get_quality_reporting_collector(call->dest_proxy));
if (addr == NULL) {
- ms_warning("QualityReporting: Asked to submit reporting statistics but no collector address found");
+ ms_warning("QualityReporting[%p]: Asked to submit reporting statistics but no collector address found"
+ , report);
return 2;
}
@@ -383,33 +386,32 @@ static const SalStreamDescription * get_media_stream_for_desc(const SalMediaDesc
}
}
}
-
- ms_warning("QualityReporting: Could not find the associated stream of type %d", sal_stream_type);
return NULL;
}
static void update_ip(LinphoneCall * call, int stats_type) {
SalStreamType sal_stream_type = (stats_type == LINPHONE_CALL_STATS_AUDIO) ? SalAudio : SalVideo;
- if (media_report_enabled(call,stats_type)) {
- const SalStreamDescription * local_desc = get_media_stream_for_desc(call->localdesc, sal_stream_type);
- const SalStreamDescription * remote_desc = get_media_stream_for_desc(sal_call_get_remote_media_description(call->op), sal_stream_type);
+ const SalStreamDescription * local_desc = get_media_stream_for_desc(call->localdesc, sal_stream_type);
+ const SalStreamDescription * remote_desc = get_media_stream_for_desc(sal_call_get_remote_media_description(call->op), sal_stream_type);
- /*local info are always up-to-date and correct*/
- if (local_desc != NULL) {
+ if (local_desc != NULL) {
+ /*since this function might be called for video stream AFTER it has been uninitialized, local description might
+ be invalid. In any other case, IP/port should be always filled and valid*/
+ if (local_desc->rtp_addr != NULL && strlen(local_desc->rtp_addr) > 0) {
call->log->reporting.reports[stats_type]->info.local_addr.port = local_desc->rtp_port;
STR_REASSIGN(call->log->reporting.reports[stats_type]->info.local_addr.ip, ms_strdup(local_desc->rtp_addr));
}
+ }
- if (remote_desc != NULL) {
- /*port is always stored in stream description struct*/
- call->log->reporting.reports[stats_type]->info.remote_addr.port = remote_desc->rtp_port;
+ if (remote_desc != NULL) {
+ /*port is always stored in stream description struct*/
+ call->log->reporting.reports[stats_type]->info.remote_addr.port = remote_desc->rtp_port;
- /*for IP it can be not set if we are using a direct route*/
- if (remote_desc->rtp_addr != NULL && strlen(remote_desc->rtp_addr) > 0) {
- STR_REASSIGN(call->log->reporting.reports[stats_type]->info.remote_addr.ip, ms_strdup(remote_desc->rtp_addr));
- } else {
- STR_REASSIGN(call->log->reporting.reports[stats_type]->info.remote_addr.ip, ms_strdup(sal_call_get_remote_media_description(call->op)->addr));
- }
+ /*for IP it can be not set if we are using a direct route*/
+ if (remote_desc->rtp_addr != NULL && strlen(remote_desc->rtp_addr) > 0) {
+ STR_REASSIGN(call->log->reporting.reports[stats_type]->info.remote_addr.ip, ms_strdup(remote_desc->rtp_addr));
+ } else {
+ STR_REASSIGN(call->log->reporting.reports[stats_type]->info.remote_addr.ip, ms_strdup(sal_call_get_remote_media_description(call->op)->addr));
}
}
}
@@ -650,18 +652,12 @@ void linphone_reporting_call_state_updated(LinphoneCall *call){
bool_t enabled=media_report_enabled(call, LINPHONE_CALL_STATS_VIDEO);
switch (state){
case LinphoneCallStreamsRunning:
- if (enabled!=call->log->reporting.was_video_running){
- if (enabled){
- linphone_reporting_update_ip(call);
- }else{
- ms_message("Send midterm report with status %d",
- send_report(call, call->log->reporting.reports[LINPHONE_CALL_STATS_VIDEO], "VQSessionReport")
- );
- }
- }else{
- linphone_reporting_update_ip(call);
+ linphone_reporting_update_ip(call);
+ if (!enabled && call->log->reporting.was_video_running){
+ ms_message("Send midterm report with status %d",
+ send_report(call, call->log->reporting.reports[LINPHONE_CALL_STATS_VIDEO], "VQSessionReport")
+ );
}
-
call->log->reporting.was_video_running=enabled;
break;
case LinphoneCallEnd:
diff --git a/mediastreamer2 b/mediastreamer2
index 7bf89d430..24427ed56 160000
--- a/mediastreamer2
+++ b/mediastreamer2
@@ -1 +1 @@
-Subproject commit 7bf89d4302afb266bb359d7af8c16907ae8c327e
+Subproject commit 24427ed565a93f523b44b43ed9b2d20f8cea5385
diff --git a/tester/Makefile.am b/tester/Makefile.am
index 46ffb12cd..afa7f77a9 100644
--- a/tester/Makefile.am
+++ b/tester/Makefile.am
@@ -20,7 +20,8 @@ liblinphonetester_la_SOURCES = tester.c \
eventapi_tester.c \
flexisip_tester.c \
stun_tester.c \
- remote_provisioning_tester.c
+ remote_provisioning_tester.c \
+ quality_reporting_tester.c
liblinphonetester_la_LDFLAGS= -no-undefined
liblinphonetester_la_LIBADD= ../coreapi/liblinphone.la $(CUNIT_LIBS)
@@ -32,14 +33,14 @@ if !BUILD_IOS
noinst_PROGRAMS = liblinphone_tester
-liblinphone_tester_SOURCES = liblinphone_tester.c
-liblinphone_tester_LDADD = $(top_builddir)/coreapi/liblinphone.la liblinphonetester.la
+liblinphone_tester_SOURCES = liblinphone_tester.c
+liblinphone_tester_LDADD = $(top_builddir)/coreapi/liblinphone.la liblinphonetester.la
endif
test: liblinphone_tester
- ./liblinphone_tester --config $(abs_srcdir)
+ ./liblinphone_tester --config $(abs_srcdir)
else !BUILD_CUNIT_TESTS
diff --git a/tester/call_tester.c b/tester/call_tester.c
index b8a66f82e..534065a7a 100644
--- a/tester/call_tester.c
+++ b/tester/call_tester.c
@@ -2171,120 +2171,6 @@ static void call_rejected_without_403_because_wrong_credentials_no_auth_req_cb()
call_rejected_because_wrong_credentials_with_params("tester-no-403",FALSE);
}
-void create_call_for_quality_reporting_tests(
- LinphoneCoreManager* marie,
- LinphoneCoreManager* pauline,
- LinphoneCall** call_marie,
- LinphoneCall** call_pauline) {
- CU_ASSERT_TRUE(call(pauline,marie));
- *call_marie = linphone_core_get_current_call(marie->lc);
- *call_pauline = linphone_core_get_current_call(pauline->lc);
- CU_ASSERT_PTR_NOT_NULL(*call_marie);
- CU_ASSERT_PTR_NOT_NULL(*call_pauline);
-}
-
-static void quality_reporting_not_used_without_config() {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCall* call_marie = NULL;
- LinphoneCall* call_pauline = NULL;
-
- create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
-
- // marie has stats collection enabled since pauline has not
- CU_ASSERT_TRUE(linphone_proxy_config_quality_reporting_enabled(call_marie->dest_proxy));
- CU_ASSERT_FALSE(linphone_proxy_config_quality_reporting_enabled(call_pauline->dest_proxy));
-
- CU_ASSERT_EQUAL(strcmp("sip:collector@sip.example.org",
- linphone_proxy_config_get_quality_reporting_collector(call_marie->dest_proxy)), 0);
-
- // this field should be already filled
- CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->info.local_addr.ip);
- CU_ASSERT_PTR_NULL(call_pauline->log->reporting.reports[0]->info.local_addr.ip);
-
- // but not this one since it is updated at the end of call
- CU_ASSERT_PTR_NULL(call_marie->log->reporting.reports[0]->dialog_id);
-
- linphone_core_manager_destroy(marie);
- linphone_core_manager_destroy(pauline);
-}
-static void quality_reporting_not_sent_if_call_not_started() {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCallLog* out_call_log;
- LinphoneCall* out_call;
-
- linphone_core_set_max_calls(pauline->lc,0);
- out_call = linphone_core_invite(marie->lc,"pauline");
- linphone_call_ref(out_call);
-
- CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallError,1, 10000));
- CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1);
-
- if (ms_list_size(linphone_core_get_call_logs(marie->lc))>0) {
- CU_ASSERT_PTR_NOT_NULL(out_call_log=(LinphoneCallLog*)(linphone_core_get_call_logs(marie->lc)->data));
- CU_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted);
- }
- linphone_call_unref(out_call);
-
- // wait a few time...
- wait_for(marie->lc,NULL,NULL,0);
- // since the callee was busy, there should be no publish to do
- CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0);
- CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
-
- linphone_core_manager_destroy(marie);
- linphone_core_manager_destroy(pauline);
-}
-static void quality_reporting_at_call_termination() {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCall* call_marie = NULL;
- LinphoneCall* call_pauline = NULL;
-
- create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
-
- linphone_core_terminate_all_calls(marie->lc);
-
- // now dialog id should be filled
- CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->dialog_id);
-
- CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1, 10000));
- CU_ASSERT_TRUE(wait_for_until(pauline->lc,NULL,&pauline->stat.number_of_LinphoneCallReleased,1, 10000));
-
- CU_ASSERT_PTR_NULL(linphone_core_get_current_call(marie->lc));
- CU_ASSERT_PTR_NULL(linphone_core_get_current_call(pauline->lc));
-
-
- // PUBLISH submission to the collector should be ok
- CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishProgress,1));
- CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishOk,1));
-
- linphone_core_manager_destroy(marie);
- linphone_core_manager_destroy(pauline);
-}
-
-static void quality_reporting_interval_report() {
- LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
- LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
- LinphoneCall* call_marie = NULL;
- LinphoneCall* call_pauline = NULL;
-
- create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
- linphone_proxy_config_set_quality_reporting_interval(call_marie->dest_proxy, 3);
-
- CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(marie->lc));
- CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(pauline->lc));
-
- // PUBLISH submission to the collector should be ok
- CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,3,25000));
- CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,3,25000));
-
- linphone_core_manager_destroy(marie);
- linphone_core_manager_destroy(pauline);
-}
-
-
#ifdef VIDEO_ENABLED
/*this is call forking with early media managed at client side (not by flexisip server)*/
static void multiple_early_media(void) {
@@ -2362,7 +2248,7 @@ static void multiple_early_media(void) {
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,2000));
-
+
linphone_core_terminate_all_calls(pauline->lc);
CU_ASSERT_TRUE(wait_for_list(lcs,&pauline->stat.number_of_LinphoneCallEnd,1,2000));
CU_ASSERT_TRUE(wait_for_list(lcs,&marie1->stat.number_of_LinphoneCallEnd,1,2000));
@@ -2438,10 +2324,6 @@ test_t call_tests[] = {
{ "Call established with rejected incoming RE-INVITE", call_established_with_rejected_incoming_reinvite },
{ "Call established with rejected RE-INVITE in error", call_established_with_rejected_reinvite_with_error},
{ "Call redirected by callee", call_redirect},
- { "Quality reporting not used if no config", quality_reporting_not_used_without_config},
- { "Quality reporting session report not sent if call did not start", quality_reporting_not_sent_if_call_not_started},
- { "Quality reporting session report sent if call ended normally", quality_reporting_at_call_termination},
- { "Quality reporting interval report if interval is configured", quality_reporting_interval_report},
{ "Call with specified codec bitrate", call_with_specified_codec_bitrate}
};
diff --git a/tester/liblinphone_tester.c b/tester/liblinphone_tester.c
index 825e16727..b11cbefaf 100644
--- a/tester/liblinphone_tester.c
+++ b/tester/liblinphone_tester.c
@@ -147,7 +147,7 @@ return -1; \
int main (int argc, char *argv[])
{
- int i,j;
+ int i;
int ret;
const char *suite_name=NULL;
const char *test_name=NULL;
@@ -189,10 +189,7 @@ int main (int argc, char *argv[])
CHECK_ARG("--suite", ++i, argc);
suite_name=argv[i];
} else if (strcmp(argv[i],"--list-suites")==0){
- for(j=0;j.
+*/
+
+#include
+#include "CUnit/Basic.h"
+#include "linphonecore.h"
+#include "private.h"
+#include "liblinphone_tester.h"
+
+void create_call_for_quality_reporting_tests(
+ LinphoneCoreManager* marie,
+ LinphoneCoreManager* pauline,
+ LinphoneCall** call_marie,
+ LinphoneCall** call_pauline) {
+ CU_ASSERT_TRUE(call(pauline,marie));
+ *call_marie = linphone_core_get_current_call(marie->lc);
+ *call_pauline = linphone_core_get_current_call(pauline->lc);
+ CU_ASSERT_PTR_NOT_NULL(*call_marie);
+ CU_ASSERT_PTR_NOT_NULL(*call_pauline);
+}
+
+static void quality_reporting_not_used_without_config() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+
+ create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
+
+ // marie has stats collection enabled since pauline has not
+ CU_ASSERT_TRUE(linphone_proxy_config_quality_reporting_enabled(call_marie->dest_proxy));
+ CU_ASSERT_FALSE(linphone_proxy_config_quality_reporting_enabled(call_pauline->dest_proxy));
+
+ CU_ASSERT_EQUAL(strcmp("sip:collector@sip.example.org",
+ linphone_proxy_config_get_quality_reporting_collector(call_marie->dest_proxy)), 0);
+
+ // this field should be already filled
+ CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->info.local_addr.ip);
+
+ // but not this one since it is updated at the end of call
+ CU_ASSERT_PTR_NULL(call_marie->log->reporting.reports[0]->dialog_id);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+static void quality_reporting_not_sent_if_call_not_started() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCallLog* out_call_log;
+ LinphoneCall* out_call;
+
+ linphone_core_set_max_calls(pauline->lc,0);
+ out_call = linphone_core_invite(marie->lc,"pauline");
+ linphone_call_ref(out_call);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallError,1, 10000));
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1);
+
+ if (ms_list_size(linphone_core_get_call_logs(marie->lc))>0) {
+ out_call_log=(LinphoneCallLog*)(linphone_core_get_call_logs(marie->lc)->data);
+ CU_ASSERT_PTR_NOT_NULL(out_call_log);
+ CU_ASSERT_EQUAL(linphone_call_log_get_status(out_call_log),LinphoneCallAborted);
+ }
+ linphone_call_unref(out_call);
+
+ // wait a few time...
+ wait_for_until(marie->lc,NULL,NULL,0,1000);
+
+ // since the callee was busy, there should be no publish to do
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0);
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+static void quality_reporting_at_call_termination() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+
+ create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
+
+ linphone_core_terminate_all_calls(marie->lc);
+
+ // now dialog id should be filled
+ CU_ASSERT_PTR_NOT_NULL(call_marie->log->reporting.reports[0]->dialog_id);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphoneCallReleased,1, 10000));
+ CU_ASSERT_TRUE(wait_for_until(pauline->lc,NULL,&pauline->stat.number_of_LinphoneCallReleased,1, 10000));
+
+ CU_ASSERT_PTR_NULL(linphone_core_get_current_call(marie->lc));
+ CU_ASSERT_PTR_NULL(linphone_core_get_current_call(pauline->lc));
+
+
+ // PUBLISH submission to the collector should be ok
+ CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishProgress,1));
+ CU_ASSERT_TRUE(wait_for(marie->lc,NULL,&marie->stat.number_of_LinphonePublishOk,1));
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void quality_reporting_interval_report() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+
+ create_call_for_quality_reporting_tests(marie, pauline, &call_marie, &call_pauline);
+ linphone_proxy_config_set_quality_reporting_interval(call_marie->dest_proxy, 3);
+
+ CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(marie->lc));
+ CU_ASSERT_PTR_NOT_NULL(linphone_core_get_current_call(pauline->lc));
+
+ // PUBLISH submission to the collector should be ok
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,3,25000));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,3,25000));
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+static void quality_reporting_session_report_if_video_stopped() {
+ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc");
+ LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc");
+ LinphoneCall* call_marie = NULL;
+ LinphoneCall* call_pauline = NULL;
+ LinphoneCallParams* pauline_params;
+ LinphoneCallParams* marie_params;
+
+ linphone_core_enable_video_capture(marie->lc, TRUE);
+ linphone_core_enable_video_display(marie->lc, FALSE);
+ linphone_core_enable_video_capture(pauline->lc, TRUE);
+ linphone_core_enable_video_display(pauline->lc, FALSE);
+ marie_params=linphone_core_create_default_call_parameters(marie->lc);
+ linphone_call_params_enable_video(marie_params,TRUE);
+ pauline_params=linphone_core_create_default_call_parameters(pauline->lc);
+ linphone_call_params_enable_video(pauline_params,TRUE);
+ CU_ASSERT_TRUE(call_with_params(pauline,marie,pauline_params,marie_params));
+ call_marie=linphone_core_get_current_call(marie->lc);
+ call_pauline=linphone_core_get_current_call(pauline->lc);
+
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishProgress,0);
+ CU_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,0);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,NULL,0,3000));
+ CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline)));
+
+ /*remove video*/
+ linphone_call_params_enable_video(pauline_params,FALSE);
+ linphone_core_update_call(pauline->lc,call_pauline,pauline_params);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,1,5000));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,1,5000));
+
+ CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(call_pauline)));
+
+ linphone_core_terminate_all_calls(marie->lc);
+
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishProgress,2,5000));
+ CU_ASSERT_TRUE(wait_for_until(marie->lc,pauline->lc,&marie->stat.number_of_LinphonePublishOk,2,5000));
+
+ linphone_core_manager_destroy(marie);
+ linphone_core_manager_destroy(pauline);
+}
+
+
+test_t quality_reporting_tests[] = {
+ { "Not used if no config", quality_reporting_not_used_without_config},
+ { "Call term session report not sent if call did not start", quality_reporting_not_sent_if_call_not_started},
+ { "Call term session report sent if call ended normally", quality_reporting_at_call_termination},
+ { "Interval report if interval is configured", quality_reporting_interval_report},
+ { "Session report sent if video stopped during call", quality_reporting_session_report_if_video_stopped},
+};
+
+test_suite_t quality_reporting_test_suite = {
+ "QualityReporting",
+ NULL,
+ NULL,
+ sizeof(quality_reporting_tests) / sizeof(quality_reporting_tests[0]),
+ quality_reporting_tests
+};
diff --git a/tester/tester.c b/tester/tester.c
index 1f1c8d725..268a0f302 100644
--- a/tester/tester.c
+++ b/tester/tester.c
@@ -291,6 +291,13 @@ int liblinphone_tester_test_suite_index(const char *suite_name) {
return -1;
}
+void liblinphone_tester_list_suites() {
+ int j;
+ for(j=0;jpName);
+ return -2;
+ } else {
+ CU_ErrorCode err= CU_basic_run_test(suite, test);
+ if (err != CUE_SUCCESS) ms_error("CU_basic_run_test error %d", err);
+ }
+ } else {
CU_basic_run_suite(suite);
+ }
} else
{
#if HAVE_CU_CURSES