Merge remote-tracking branch 'origin/belle-sip' into wp

Conflicts:
	coreapi/bellesip_sal/sal_impl.c
	coreapi/misc.c
	tester/call_tester.c
	tester/liblinphone_tester.c
This commit is contained in:
Sylvain Berfini 2013-03-01 14:39:38 +01:00
commit 5c30c2a318
18 changed files with 453 additions and 266 deletions

View file

@ -419,8 +419,6 @@ AC_DEFINE_UNQUOTED(PACKAGE_SOUND_DIR, "${package_prefix}/${DATADIRNAME}/sounds/l
dnl check if we have the getifaddrs() sytem call
AC_CHECK_FUNCS(getifaddrs)
dnl check for osip2
LP_CHECK_OSIP2
dnl conditionnal build for ssl
AC_ARG_ENABLE(ssl,
@ -436,8 +434,6 @@ AC_ARG_ENABLE(ssl,
if test "$build_ssl" = "true"; then
PKG_CHECK_MODULES(OPENSSL, libssl >= 0.9.8)
fi
dnl setup flags for exosip library
LP_SETUP_EXOSIP
dnl check exosip support of DSCP in exosip
AC_MSG_CHECKING([for DSCP support in exosip])
@ -685,6 +681,10 @@ if test $USE_BELLESIP_TRUE !='#' ; then
SIPSTACK_LIBS=$BELLESIP_LIBS
AC_DEFINE(USE_BELLESIP,1,[Defined when bellesip is used])
else
dnl check for osip2
LP_CHECK_OSIP2
dnl setup flags for exosip library
LP_SETUP_EXOSIP
SIPSTACK_CFLAGS=$EXOSIP_CFLAGS $OSIP_CFLAGS
SIPSTACK_LIBS=$EXOSIP_LIBS $OSIP_LIBS
fi

View file

@ -244,6 +244,8 @@ static LPC_COMMAND commands[] = {
"'firewall none' : use direct connection.\n"
"'firewall nat' : use nat address given with the 'nat' command.\n"
"'firewall stun' : use stun server given with the 'stun' command.\n"
"'firewall ice' : use ice.\n"
"'firewall upnp' : use uPnP IGD.\n"
},
{ "call-logs", lpc_cmd_call_logs, "Calls history", NULL },
{ "friend", lpc_cmd_friend, "Manage friends",
@ -850,6 +852,10 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args)
{
linphone_core_set_firewall_policy(lc,LinphonePolicyNoFirewall);
}
else if (strcmp(args,"upnp")==0)
{
linphone_core_set_firewall_policy(lc,LinphonePolicyUseUpnp);
}
else if (strcmp(args,"ice")==0)
{
setting = linphone_core_get_stun_server(lc);

View file

@ -181,6 +181,9 @@ static void process_request_event(void *sal, const belle_sip_request_event_t *ev
sal_op_set_remote_ua(op,BELLE_SIP_MESSAGE(req));
}
if (!op->base.call_id) {
op->base.call_id=ms_strdup(belle_sip_header_call_id_get_call_id(BELLE_SIP_HEADER_CALL_ID(belle_sip_message_get_header_by_type(BELLE_SIP_MESSAGE(req), belle_sip_header_call_id_t))));
}
if (op->callbacks.process_request_event) {
op->callbacks.process_request_event(op,event);
} else {
@ -219,7 +222,9 @@ static void process_response_event(void *user_ctx, const belle_sip_response_even
if (!op->base.remote_ua) {
sal_op_set_remote_ua(op,BELLE_SIP_MESSAGE(response));
}
if (!op->base.call_id) {
op->base.call_id=ms_strdup(belle_sip_header_call_id_get_call_id(BELLE_SIP_HEADER_CALL_ID(belle_sip_message_get_header_by_type(BELLE_SIP_MESSAGE(response), belle_sip_header_call_id_t))));
}
if (op->callbacks.process_response_event) {
if (op->base.root->nat_helper_enabled) {
@ -378,7 +383,10 @@ Sal * sal_init(){
sal->nat_helper_enabled=TRUE;
snprintf(stack_string,sizeof(stack_string)-1,"(belle-sip/%s)",belle_sip_version_to_string());
sal->user_agent=belle_sip_header_user_agent_new();
belle_sip_header_user_agent_add_product(sal->user_agent, LINPHONE_PACKAGE_NAME "/" LINPHONE_VERSION);
#if defined(PACKAGE_NAME) && defined(LINPHONE_VERSION)
belle_sip_header_user_agent_add_product(sal->user_agent, PACKAGE_NAME "/" LINPHONE_VERSION);
#endif
belle_sip_header_user_agent_add_product(sal->user_agent,stack_string);
belle_sip_object_ref(sal->user_agent);
belle_sip_set_log_handler(_belle_sip_log);
@ -575,8 +583,8 @@ MSList * sal_get_pending_auths(Sal *sal){
/*misc*/
void sal_get_default_local_ip(Sal *sal, int address_family, char *ip, size_t iplen){
ms_fatal("sal_get_default_local_ip not implemented yet");
return ;
strncpy(ip,address_family==AF_INET6 ? "::1" : "127.0.0.1",iplen);
ms_error("Could not find default routable ip address !");
}
const char *sal_get_root_ca(Sal* ctx) {
@ -604,3 +612,9 @@ void sal_nat_helper_enable(Sal *sal,bool_t enable) {
bool_t sal_nat_helper_enabled(Sal *sal) {
return sal->nat_helper_enabled;
}
void sal_set_dns_timeout(Sal* sal,int timeout) {
belle_sip_stack_set_dns_timeout(sal->stack, timeout);
}
int sal_get_dns_timeout(const Sal* sal) {
return belle_sip_stack_get_dns_timeout(sal->stack);
}

View file

@ -81,7 +81,14 @@ static int set_sdp_from_desc(belle_sip_message_t *msg, const SalMediaDescription
}
static void call_process_io_error(void *user_ctx, const belle_sip_io_error_event_t *event){
ms_error("call_process_io_error not implemented yet");
SalOp* op=(SalOp*)user_ctx;
if (!op->dialog) {
/*call terminated very early*/
op->base.root->callbacks.call_failure(op,SalErrorNoResponse,SalReasonUnknown,"Service Unavailable",503);
op->state=SalOpStateTerminated;
} else {
/*dialog will terminated shortly, nothing to do*/
}
}
static void process_dialog_terminated(void *ctx, const belle_sip_dialog_terminated_event_t *event) {
SalOp* op=(SalOp*)ctx;

View file

@ -169,7 +169,7 @@ static int _sal_op_send_request_with_contact(SalOp* op, belle_sip_request_t* req
}
int sal_op_send_request(SalOp* op, belle_sip_request_t* request) {
bool_t need_ack=FALSE;
bool_t need_contact=FALSE;
/*
Header field where proxy ACK BYE CAN INV OPT REG
___________________________________________________________
@ -179,9 +179,9 @@ int sal_op_send_request(SalOp* op, belle_sip_request_t* request) {
||strcmp(belle_sip_request_get_method(request),"REGISTER")==0
||strcmp(belle_sip_request_get_method(request),"SUBSCRIBE")==0
||strcmp(belle_sip_request_get_method(request),"OPTION")==0)
need_ack=TRUE;
need_contact=TRUE;
return _sal_op_send_request_with_contact(op, request,need_ack);
return _sal_op_send_request_with_contact(op, request,need_contact);
}

View file

@ -47,11 +47,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <net/if.h>
#include <ifaddrs.h>
#endif
#if _MSC_VER
#define snprintf _snprintf
#define popen _popen
#define pclose _pclose
#include <math.h>
#if _MSC_VER
#define snprintf _snprintf
#define popen _popen
#define pclose _pclose
#endif
#if !defined(WIN32)
@ -253,7 +253,7 @@ static double get_audio_payload_bandwidth(LinphoneCore *lc, const PayloadType *p
}
void linphone_core_update_allocated_audio_bandwidth_in_call(LinphoneCall *call, const PayloadType *pt){
call->audio_bw=(int)(get_audio_payload_bandwidth(call->core,pt)/1000.0);
call->audio_bw=(int)(ceil(get_audio_payload_bandwidth(call->core,pt)/1000.0)); /*rounding codec bandwidth should be avoid, specially for AMR*/
ms_message("Audio bandwidth for this call is %i",call->audio_bw);
}

View file

@ -313,10 +313,9 @@ int offer_answer_initiate_incoming(const SalMediaDescription *local_capabilities
}else ms_warning("Unknown protocol for mline %i, declining",i);
if (ls){
initiate_incoming(ls,rs,&result->streams[i],one_matching_codec);
result->n_active_streams++;
}
else {
/* create an inactive stream for the answer, as there where no matching stream a local capability */
if (result->streams[i].rtp_port!=0) result->n_active_streams++;
}else {
/* create an inactive stream for the answer, as there where no matching stream in local capabilities */
result->streams[i].dir=SalStreamInactive;
result->streams[i].rtp_port=0;
result->streams[i].type=rs->type;

View file

@ -309,15 +309,14 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) {
ms_message("uPnP IGD: Wait all pending port bindings ...");
ms_cond_wait(&lupnp->empty_cond, &lupnp->mutex);
}
ms_mutex_unlock(&lupnp->mutex);
if(lupnp->upnp_igd_ctxt != NULL) {
// upnp_igd_destroy is synchronous so the callbacks will be called in the same thread.
// So release the mutex before upnp_igd_destroy call.
ms_mutex_unlock(&lupnp->mutex);
upnp_igd_destroy(lupnp->upnp_igd_ctxt);
ms_mutex_lock(&lupnp->mutex);
lupnp->upnp_igd_ctxt = NULL;
}
/* No more multi threading here */
/* Run one more time configuration update and proxy */
linphone_upnp_update_config(lupnp);
@ -345,8 +344,6 @@ void linphone_upnp_context_destroy(UpnpContext *lupnp) {
ms_list_for_each(lupnp->pending_bindings,(void (*)(void*))linphone_upnp_port_binding_release);
lupnp->pending_bindings = ms_list_free(lupnp->pending_bindings);
ms_mutex_unlock(&lupnp->mutex);
ms_mutex_destroy(&lupnp->mutex);
ms_cond_destroy(&lupnp->empty_cond);

View file

@ -525,4 +525,7 @@ LINPHONE_PUBLIC void sal_set_recv_error(Sal *sal,int value);
/*enable contact fixing*/
void sal_nat_helper_enable(Sal *sal,bool_t enable);
bool_t sal_nat_helper_enabled(Sal *sal);
void sal_set_dns_timeout(Sal* sal,int timeout);
int sal_get_dns_timeout(const Sal* sal);
#endif

@ -1 +1 @@
Subproject commit 7a11d31f5cab97ff0de373d617720bb651d19b7d
Subproject commit 8d85a5ded3b18e2d3d4ba22ee75e0f1ef9c0f739

View file

@ -4,7 +4,7 @@ if BUILD_CUNIT_TESTS
noinst_PROGRAMS=liblinphone_tester
TESTS=$(noinst_PROGRAMS)
liblinphone_tester_SOURCES= liblinphone_tester.c register_tester.c message_tester.c call_tester.c presence_tester.c
liblinphone_tester_SOURCES= liblinphone_tester.c setup_tester.c register_tester.c message_tester.c call_tester.c presence_tester.c
#liblinphone_tester_CFLAGS=$(CUNIT_CFLAGS)

View file

@ -15,6 +15,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include "CUnit/Basic.h"
#include "linphonecore.h"
@ -22,13 +23,6 @@
#include "liblinphone_tester.h"
static int init(void) {
return 0;
}
static int uninit(void) {
return 0;
}
void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState cstate, const char *msg){
char* to=linphone_address_as_string(linphone_call_get_call_log(call)->to);
char* from=linphone_address_as_string(linphone_call_get_call_log(call)->from);
@ -60,6 +54,7 @@ void call_state_changed(LinphoneCore *lc, LinphoneCall *call, LinphoneCallState
CU_FAIL("unexpected event");break;
}
}
void linphone_transfer_state_changed(LinphoneCore *lc, LinphoneCall *transfered, LinphoneCallState new_call_state) {
char* to=linphone_address_as_string(linphone_call_get_call_log(transfered)->to);
char* from=linphone_address_as_string(linphone_call_get_call_log(transfered)->from);
@ -80,6 +75,7 @@ void linphone_transfer_state_changed(LinphoneCore *lc, LinphoneCall *transfered,
CU_FAIL("unexpected event");break;
}
}
static void linphone_call_cb(LinphoneCall *call,void * user_data) {
char* to=linphone_address_as_string(linphone_call_get_call_log(call)->to);
char* from=linphone_address_as_string(linphone_call_get_call_log(call)->from);
@ -91,6 +87,7 @@ static void linphone_call_cb(LinphoneCall *call,void * user_data) {
counters = (stats*)linphone_core_get_user_data(lc);
counters->number_of_IframeDecoded++;
}
static bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr) {
LinphoneProxyConfig* proxy;
int retry=0;
@ -142,7 +139,8 @@ static bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_m
wait_for(callee_mgr->lc,caller_mgr->lc,&callee_mgr->stat.number_of_LinphoneCallStreamsRunning,initial_callee.number_of_LinphoneCallStreamsRunning+1);
}
static void simple_call() {
static void simple_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
@ -182,7 +180,8 @@ static void simple_call() {
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
static void call_canceled() {
static void cancelled_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
@ -199,7 +198,23 @@ static void call_canceled() {
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
static void call_ringing_canceled() {
static void call_with_dns_time_out(void) {
LinphoneCoreManager* marie = linphone_core_manager_new(NULL);
LCSipTransports transport = {9773,0,0,0};
linphone_core_set_sip_transports(marie->lc,&transport);
linphone_core_iterate(marie->lc);
sal_set_dns_timeout(marie->lc->sal,0);
linphone_core_invite(marie->lc,"sip:toto@toto.com");
linphone_core_iterate(marie->lc);
linphone_core_iterate(marie->lc);
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingInit,1);
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallOutgoingProgress,1);
CU_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallError,1);
linphone_core_manager_destroy(marie);
}
static void cancelled_ringing_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
@ -217,7 +232,7 @@ static void call_ringing_canceled() {
linphone_core_manager_destroy(pauline);
}
static void call_early_declined() {
static void early_declined_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
LinphoneCall* in_call;
@ -238,7 +253,7 @@ static void call_early_declined() {
linphone_core_manager_destroy(pauline);
}
static void call_terminated_by_caller() {
static void call_terminated_by_caller(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
@ -252,7 +267,7 @@ static void call_terminated_by_caller() {
linphone_core_manager_destroy(pauline);
}
static void call_paused_resumed() {
static void call_paused_resumed(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
LinphoneCall* call_obj;
@ -289,7 +304,8 @@ static bool_t pause_call_1(LinphoneCoreManager* mgr_1,LinphoneCall* call_1,Linph
CU_ASSERT_EQUAL(linphone_call_get_state(call_2),LinphoneCallPausedByRemote);
return linphone_call_get_state(call_1) == LinphoneCallPaused && linphone_call_get_state(call_2)==LinphoneCallPausedByRemote;
}
static void call_paused_resumed_from_callee() {
static void call_paused_resumed_from_callee(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
LinphoneCall* call_obj;
@ -315,7 +331,7 @@ static void call_paused_resumed_from_callee() {
linphone_core_manager_destroy(pauline);
}
static void call_with_video_added() {
static void call_with_video_added(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
LinphoneCall* call_obj;
@ -357,7 +373,8 @@ static void call_with_video_added() {
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
static void simple_conference() {
static void simple_conference(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
stats initial_marie_stat;
stats initial_pauline_stat;
@ -414,8 +431,7 @@ static void simple_conference() {
ms_list_free(lcs);
}
static void call_srtp() {
static void srtp_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
@ -436,7 +452,7 @@ static void call_srtp() {
linphone_core_manager_destroy(pauline);
}
static void call_early_media() {
static void early_media_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_early_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
@ -454,10 +470,11 @@ static void call_early_media() {
linphone_core_manager_destroy(pauline);
}
static void simple_call_transfer() {
static void simple_call_transfer(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
LinphoneCoreManager* laure = linphone_core_manager_new("./tester/laure_rc");
LinphoneCall* pauline_called_by_marie;
LinphoneCall* marie_call_pauline;
LinphoneCall* pauline_called_by_marie;
@ -469,7 +486,6 @@ static void simple_call_transfer() {
CU_ASSERT_TRUE(call(marie,pauline));
marie_call_pauline=linphone_core_get_current_call(marie->lc);
pauline_called_by_marie=linphone_core_get_current_call(pauline->lc);
reset_counters(&marie->stat);
@ -506,7 +522,7 @@ static void simple_call_transfer() {
ms_list_free(lcs);
}
static void call_transfer_existing_call_outgoing_call() {
static void call_transfer_existing_call_outgoing_call(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
LinphoneCoreManager* laure = linphone_core_manager_new("./tester/laure_rc");
@ -580,49 +596,31 @@ static void call_transfer_existing_call_outgoing_call() {
ms_list_free(lcs);
}
int call_test_suite () {
CU_pSuite pSuite = CU_add_suite("Call", init, uninit);
if (NULL == CU_add_test(pSuite, "call_early_declined", call_early_declined)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_canceled", call_canceled)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_ringing_canceled", call_ringing_canceled)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "simple_call", simple_call)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_early_media", call_early_media)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_terminated_by_caller", call_terminated_by_caller)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_paused_resumed", call_paused_resumed)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_paused_resumed_from_callee", call_paused_resumed_from_callee)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_srtp", call_srtp)) {
return CU_get_error();
}
#ifdef VIDEO_ENABLED
if (NULL == CU_add_test(pSuite, "call_with_video_added", call_with_video_added)) {
return CU_get_error();
}
#endif
if (NULL == CU_add_test(pSuite, "simple_conference", simple_conference)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "simple_call_transfer", simple_call_transfer)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "call_transfer_existing_call_outgoing_call", call_transfer_existing_call_outgoing_call)) {
return CU_get_error();
}
return 0;
}
test_t call_tests[] = {
{ "Early declined call", early_declined_call },
{ "Cancelled call", cancelled_call },
{ "Call with DNS timeout", call_with_dns_time_out },
{ "Cancelled ringing call", cancelled_ringing_call },
{ "Simple call", simple_call },
{ "Early-media call", early_media_call },
{ "Call terminated by caller", call_terminated_by_caller },
{ "Call paused resumed", call_paused_resumed },
{ "Call paused resumed from callee", call_paused_resumed_from_callee },
{ "SRTP call", srtp_call },
{ "Call with video added", call_with_video_added },
{ "Simple conference", simple_conference },
{ "Simple call transfer", simple_call_transfer },
{ "Call transfer existing call outgoing call", call_transfer_existing_call_outgoing_call }
};
test_suite_t call_test_suite = {
"Call",
NULL,
NULL,
sizeof(call_tests) / sizeof(call_tests[0]),
call_tests
};

View file

@ -22,25 +22,21 @@
#include "liblinphone_tester.h"
static test_suite_t **test_suite = NULL;
static int nb_test_suites = 0;
#if HAVE_CU_CURSES
static unsigned char curses = 0;
#endif
static stats global_stat;
const char* test_domain="sipopen.example.org";
const char* auth_domain="sip.example.org";
const char* test_username="liblinphone_tester";
const char* test_password="secret";
static int init(void) {
return 0;
}
static int uninit(void) {
return 0;
}
static void core_init_test(void) {
LinphoneCoreVTable v_table;
LinphoneCore* lc;
memset (&v_table,0,sizeof(v_table));
lc = linphone_core_new(&v_table,NULL,NULL,NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(lc);
linphone_core_destroy(lc);
}
LinphoneAddress * create_linphone_address(const char * domain) {
LinphoneAddress *addr = linphone_address_new(NULL);
@ -55,23 +51,14 @@ LinphoneAddress * create_linphone_address(const char * domain) {
CU_ASSERT_STRING_EQUAL("Mr Tester",linphone_address_get_display_name(addr));
return addr;
}
static void linphone_address_test(void) {
linphone_address_destroy(create_linphone_address(NULL));
}
static stats global_stat;
void auth_info_requested(LinphoneCore *lc, const char *realm, const char *username) {
stats* counters;
LinphoneAuthInfo *info;
ms_message("Auth info requested for user id [%s] at realm [%s]\n"
,username
,realm);
counters = (stats*)linphone_core_get_user_data(lc);
stats* counters = (stats*)linphone_core_get_user_data(lc);
counters->number_of_auth_info_requested++;
info=linphone_auth_info_new(test_username,NULL,test_password,NULL,auth_domain); /*create authentication structure from identity*/
LinphoneAuthInfo *info=linphone_auth_info_new(test_username,NULL,test_password,NULL,auth_domain); /*create authentication structure from identity*/
linphone_core_add_auth_info(lc,info); /*add authentication info to LinphoneCore*/
}
@ -96,10 +83,9 @@ void reset_counters( stats* counters) {
LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* file,int proxy_count) {
LinphoneCore* lc;
int retry=0;
stats* counters;
lc = linphone_core_new(v_table,NULL,file,NULL);
lc = linphone_core_new(v_table,NULL,file,NULL);
linphone_core_set_user_data(lc,&global_stat);
counters = (stats*)linphone_core_get_user_data(lc);
stats* counters = (stats*)linphone_core_get_user_data(lc);
linphone_core_set_ring(lc,"./share/rings/oldphone.wav");
linphone_core_set_ringback(lc,"./share/ringback.wav");
@ -114,19 +100,18 @@ LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* file,in
return lc;
}
bool_t wait_for(LinphoneCore* lc_1, LinphoneCore* lc_2,int* counter,int value) {
MSList* lcs=NULL;
bool_t result;
if (lc_1)
lcs=ms_list_append(lcs,lc_1);
bool_t result;
if (lc_2)
lcs=ms_list_append(lcs,lc_2);
result=wait_for_list(lcs,counter,value,2000);
ms_list_free(lcs);
return result;
}
bool_t wait_for_list(MSList* lcs,int* counter,int value,int timeout_ms) {
int retry=0;
MSList* iterator;
@ -139,19 +124,19 @@ bool_t wait_for_list(MSList* lcs,int* counter,int value,int timeout_ms) {
if(*counter<value) return FALSE;
else return TRUE;
}
static void enable_codec(LinphoneCore* lc,const char* type,int rate) {
MSList* codecs=ms_list_copy(linphone_core_get_audio_codecs(lc));
MSList* codecs_it;
PayloadType* pt;
for (codecs_it=codecs;codecs_it!=NULL;codecs_it=codecs_it->next) {
linphone_core_enable_payload_type(lc,(PayloadType*)codecs_it->data,0);
}
PayloadType* pt;
if((pt = linphone_core_find_payload_type(lc,type,rate,1))) {
linphone_core_enable_payload_type(lc,pt, 1);
}
}
LinphoneCoreManager* linphone_core_manager_new(const char* rc_file) {
LinphoneCoreManager* mgr= malloc(sizeof(LinphoneCoreManager));
LinphoneProxyConfig* proxy;
@ -163,59 +148,170 @@ LinphoneCoreManager* linphone_core_manager_new(const char* rc_file) {
mgr->v_table.new_subscription_request=new_subscribtion_request;
mgr->v_table.notify_presence_recv=notify_presence_received;
mgr->v_table.transfer_state_changed=linphone_transfer_state_changed;
mgr->lc=configure_lc_from(&mgr->v_table,rc_file,1);
mgr->lc=configure_lc_from(&mgr->v_table,rc_file,rc_file?1:0);
enable_codec(mgr->lc,"PCMU",8000);
linphone_core_set_user_data(mgr->lc,&mgr->stat);
linphone_core_get_default_proxy(mgr->lc,&proxy);
mgr->identity = linphone_address_new(linphone_proxy_config_get_identity(proxy));
linphone_address_clean(mgr->identity);
if (proxy) {
mgr->identity = linphone_address_new(linphone_proxy_config_get_identity(proxy));
linphone_address_clean(mgr->identity);
}
return mgr;
}
void linphone_core_manager_destroy(LinphoneCoreManager* mgr) {
linphone_core_destroy(mgr->lc);
linphone_address_destroy(mgr->identity);
if (mgr->identity) linphone_address_destroy(mgr->identity);
free(mgr);
}
int init_test_suite () {
CU_pSuite pSuite = CU_add_suite("Setup", init, uninit);
if (NULL == CU_add_test(pSuite, "linphone address tester", linphone_address_test)) {
return CU_get_error();
static void add_test_suite(test_suite_t *suite) {
if (test_suite == NULL) {
test_suite = (test_suite_t **)malloc(10 * sizeof(test_suite_t *));
}
if (NULL == CU_add_test(pSuite, "linphone core init/uninit tester", core_init_test)) {
return CU_get_error();
test_suite[nb_test_suites] = suite;
nb_test_suites++;
if ((nb_test_suites % 10) == 0) {
test_suite = (test_suite_t **)realloc(test_suite, (nb_test_suites + 10) * sizeof(test_suite_t *));
}
}
register_test_suite();
static int run_test_suite(test_suite_t *suite) {
int i;
call_test_suite();
CU_pSuite pSuite = CU_add_suite(suite->name, suite->init_func, suite->cleanup_func);
message_test_suite();
presence_test_suite();
for (i = 0; i < suite->nb_tests; i++) {
if (NULL == CU_add_test(pSuite, suite->tests[i].name, suite->tests[i].func)) {
return CU_get_error();
}
}
return 0;
}
int main (int argc, char *argv[]) {
static int test_suite_index(const char *suite_name) {
int i;
char *test_name=NULL;
for (i = 0; i < liblinphone_tester_nb_test_suites(); i++) {
if ((strcmp(suite_name, test_suite[i]->name) == 0) && (strlen(suite_name) == strlen(test_suite[i]->name))) {
return i;
}
}
return -1;
}
int liblinphone_tester_nb_test_suites(void) {
return nb_test_suites;
}
int liblinphone_tester_nb_tests(const char *suite_name) {
int i = test_suite_index(suite_name);
if (i < 0) return 0;
return test_suite[i]->nb_tests;
}
const char * liblinphone_tester_test_suite_name(int suite_index) {
if (suite_index >= liblinphone_tester_nb_test_suites()) return NULL;
return test_suite[suite_index]->name;
}
const char * liblinphone_tester_test_name(const char *suite_name, int test_index) {
int suite_index = test_suite_index(suite_name);
if ((suite_index < 0) || (suite_index >= liblinphone_tester_nb_test_suites())) return NULL;
if (test_index >= test_suite[suite_index]->nb_tests) return NULL;
return test_suite[suite_index]->tests[test_index].name;
}
void liblinphone_tester_init(void) {
add_test_suite(&setup_test_suite);
add_test_suite(&register_test_suite);
add_test_suite(&call_test_suite);
add_test_suite(&message_test_suite);
add_test_suite(&presence_test_suite);
}
void liblinphone_tester_uninit(void) {
if (test_suite != NULL) {
free(test_suite);
test_suite = NULL;
nb_test_suites = 0;
}
}
int liblinphone_tester_run_tests(const char *suite_name, const char *test_name) {
int i;
/* initialize the CUnit test registry */
if (CUE_SUCCESS != CU_initialize_registry())
return CU_get_error();
for (i = 0; i < liblinphone_tester_nb_test_suites(); i++) {
run_test_suite(test_suite[i]);
}
#if HAVE_CU_GET_SUITE
if (suite_name){
CU_pSuite suite;
CU_basic_set_mode(CU_BRM_VERBOSE);
suite=CU_get_suite(suite_name);
if (test_name) {
CU_pTest test=CU_get_test_by_name(test_name, suite);
CU_basic_run_test(suite, test);
} else
CU_basic_run_suite(suite);
} else
#endif
{
#if HAVE_CU_CURSES
if (curses) {
/* Run tests using the CUnit curses interface */
CU_curses_run_tests();
}
else
#endif
{
/* Run all tests using the CUnit Basic interface */
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();
}
}
CU_cleanup_registry();
return CU_get_error();
}
#ifndef WINAPI_FAMILY_PHONE_APP
int main (int argc, char *argv[]) {
int i;
int ret;
char *suite_name=NULL;
char *test_name=NULL;
for(i=1;i<argc;++i){
if (strcmp(argv[i],"--help")==0){
fprintf(stderr,"%s \t--help\n\t\t\t--verbose",argv[0]);
return 0;
fprintf(stderr,"%s \t--help\n"
"\t\t\t--verbose\n"
"\t\t\t--domain <test sip domain>\n"
"\t\t\t---auth-domain <test auth domain>\n"
#if HAVE_CU_GET_SUITE
"\t\t\t--suite <suite name>\n"
"\t\t\t--test <test name>\n"
#endif
#if HAVE_CU_CURSES
"\t\t\t--curses\n"
#endif
, argv[0]);
return 0;
}else if (strcmp(argv[i],"--verbose")==0){
linphone_core_enable_logs(NULL);
linphone_core_enable_logs(NULL);
}else if (strcmp(argv[i],"--domain")==0){
i++;
test_domain=argv[i];
} else if (strcmp(argv[i],"--auth-domain")==0){
}else if (strcmp(argv[i],"--auth-domain")==0){
i++;
auth_domain=argv[i];
}else if (strcmp(argv[i],"--test")==0){
@ -227,29 +323,10 @@ int main (int argc, char *argv[]) {
}
}
/* initialize the CUnit test registry */
if (CUE_SUCCESS != CU_initialize_registry())
return CU_get_error();
init_test_suite();
/* Run all tests using the CUnit Basic interface */
CU_basic_set_mode(CU_BRM_VERBOSE);
if (suite_name){
#if 1 /*HAVE_CU_GET_SUITE*/
CU_pSuite suite;
suite=CU_get_suite(suite_name);
if (test_name) {
CU_pTest test=CU_get_test_by_name(test_name, suite);
CU_basic_run_test(suite, test);
} else
CU_basic_run_suite(suite);
#else
fprintf(stderr,"Your CUnit version does not support suite selection.\n");
#endif
} else
CU_basic_run_tests();
CU_cleanup_registry();
return CU_get_error();
liblinphone_tester_init();
ret = liblinphone_tester_run_tests(suite_name, test_name);
liblinphone_tester_uninit();
return ret;
}
#endif

View file

@ -21,6 +21,51 @@
#include "CUnit/Basic.h"
typedef void (*test_function_t)(void);
typedef int (*test_suite_function_t)(const char *name);
typedef struct {
const char *name;
test_function_t func;
} test_t;
typedef struct {
const char *name;
CU_InitializeFunc init_func;
CU_CleanupFunc cleanup_func;
int nb_tests;
test_t *tests;
} test_suite_t;
#ifdef __cplusplus
extern "C" {
#endif
extern test_suite_t setup_test_suite;
extern test_suite_t register_test_suite;
extern test_suite_t call_test_suite;
extern test_suite_t message_test_suite;
extern test_suite_t presence_test_suite;
extern int liblinphone_tester_nb_test_suites(void);
extern int liblinphone_tester_nb_tests(const char *suite_name);
extern const char * liblinphone_tester_test_suite_name(int suite_index);
extern const char * liblinphone_tester_test_name(const char *suite_name, int test_index);
extern void liblinphone_tester_init(void);
extern void liblinphone_tester_uninit(void);
extern int liblinphone_tester_run_tests(const char *suite_name, const char *test_name);
#ifdef __cplusplus
};
#endif
const char* test_domain;
const char* auth_domain;
const char* test_username;
@ -77,6 +122,7 @@ typedef struct _stats {
int number_of_IframeDecoded;
}stats;
typedef struct _LinphoneCoreManager {
LinphoneCoreVTable v_table;
LinphoneCore* lc;
@ -104,9 +150,7 @@ LinphoneAddress * create_linphone_address(const char * domain);
LinphoneCore* configure_lc_from(LinphoneCoreVTable* v_table, const char* file,int proxy_count);
bool_t wait_for(LinphoneCore* lc_1, LinphoneCore* lc_2,int* counter,int value);
bool_t wait_for_list(MSList* lcs,int* counter,int value,int timeout_ms);
int call_test_suite ();
int register_test_suite ();
int message_test_suite ();
int presence_test_suite ();
#endif /* LIBLINPHONE_TESTER_H_ */

View file

@ -15,16 +15,19 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include "CUnit/Basic.h"
#include "linphonecore.h"
#include "private.h"
#include "liblinphone_tester.h"
void text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const LinphoneAddress *from_address, const char *message) {
stats* counters = (stats*)linphone_core_get_user_data(lc);
counters->number_of_LinphoneMessageReceivedLegacy++;
}
void message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage* message) {
char* from=linphone_address_as_string(linphone_chat_message_get_from(message));
stats* counters;
@ -58,7 +61,7 @@ void linphone_chat_message_state_change(LinphoneChatMessage* msg,LinphoneChatMes
}
static void text_message() {
static void text_message(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
char* to = linphone_address_as_string(marie->identity);
@ -70,7 +73,7 @@ static void text_message() {
linphone_core_manager_destroy(pauline);
}
static void text_message_with_ack() {
static void text_message_with_ack(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
char* to = linphone_address_as_string(marie->identity);
@ -83,7 +86,8 @@ static void text_message_with_ack() {
linphone_core_manager_destroy(marie);
linphone_core_manager_destroy(pauline);
}
static void text_message_with_external_body() {
static void text_message_with_external_body(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
char* to = linphone_address_as_string(marie->identity);
@ -100,7 +104,7 @@ static void text_message_with_external_body() {
linphone_core_manager_destroy(pauline);
}
static void text_message_with_send_error() {
static void text_message_with_send_error(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
char* to = linphone_address_as_string(pauline->identity);
@ -119,20 +123,19 @@ static void text_message_with_send_error() {
linphone_core_manager_destroy(pauline);
}
int message_test_suite () {
CU_pSuite pSuite = CU_add_suite("Message", NULL, NULL);
if (NULL == CU_add_test(pSuite, "text_message", text_message)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "text_message_with_ack", text_message_with_ack)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "text_message_with_send_error", text_message_with_send_error)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "text_message_with_external_body", text_message_with_external_body)) {
return CU_get_error();
}
return 0;
}
test_t message_tests[] = {
{ "Text message", text_message },
{ "Text message with ack", text_message_with_ack },
{ "Text message with send error", text_message_with_send_error },
{ "Text message with external body", text_message_with_external_body }
};
test_suite_t message_test_suite = {
"Message",
NULL,
NULL,
sizeof(message_tests) / sizeof(message_tests[0]),
message_tests
};

View file

@ -15,6 +15,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include "CUnit/Basic.h"
#include "linphonecore.h"
@ -30,8 +31,8 @@ void new_subscribtion_request(LinphoneCore *lc, LinphoneFriend *lf, const char *
counters = (stats*)linphone_core_get_user_data(lc);
counters->number_of_NewSubscriptionRequest++;
linphone_core_add_friend(lc,lf); /*accept subscription*/
}
void notify_presence_received(LinphoneCore *lc, LinphoneFriend * lf) {
stats* counters;
char* from=linphone_address_as_string(linphone_friend_get_address(lf));
@ -41,7 +42,7 @@ void notify_presence_received(LinphoneCore *lc, LinphoneFriend * lf) {
counters->number_of_NotifyReceived++;
}
static void simple_publish() {
static void simple_publish(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneProxyConfig* proxy;
linphone_core_get_default_proxy(marie->lc,&proxy);
@ -52,8 +53,7 @@ static void simple_publish() {
linphone_core_manager_destroy(marie);
}
static void simple_subscribe() {
static void simple_subscribe(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneCoreManager* pauline = linphone_core_manager_new("./tester/pauline_rc");
const MSList* marie_friends = linphone_core_get_friend_list(marie->lc);
@ -72,7 +72,8 @@ static void simple_subscribe() {
linphone_core_manager_destroy(pauline);
}
static void unsubscribe_while_subscribing() {
static void unsubscribe_while_subscribing(void) {
LinphoneCoreManager* marie = linphone_core_manager_new("./tester/marie_rc");
LinphoneFriend* friend = linphone_friend_new_with_addr("sip:toto@git.linphone.org"); /*any unexisting address*/
linphone_friend_edit(friend);
@ -81,19 +82,20 @@ static void unsubscribe_while_subscribing() {
linphone_core_add_friend(marie->lc,friend);
linphone_core_iterate(marie->lc);
linphone_core_manager_destroy(marie);
}
int presence_test_suite () {
CU_pSuite pSuite = CU_add_suite("Presence", NULL, NULL);
if (NULL == CU_add_test(pSuite, "simple_subscribe", simple_subscribe)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "simple_publish", simple_publish)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "unsubscribe_while_subscribing", unsubscribe_while_subscribing)) {
return CU_get_error();
}
return 0;
}
test_t presence_tests[] = {
{ "Simple Subscribe", simple_subscribe },
{ "Simple Publish", simple_publish },
{ "Unsubscribe while subscribing", unsubscribe_while_subscribing },
};
test_suite_t presence_test_suite = {
"Presence",
NULL,
NULL,
sizeof(presence_tests) / sizeof(presence_tests[0]),
presence_tests
};

View file

@ -15,6 +15,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include "CUnit/Basic.h"
#include "linphonecore.h"
@ -27,7 +28,6 @@ static LinphoneCore* create_lc() {
return create_lc_with_auth(0);
}
void registration_state_changed(struct _LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState cstate, const char *message){
stats* counters;
ms_message("New registration state %s for user id [%s] at proxy [%s]\n"
@ -46,6 +46,7 @@ void registration_state_changed(struct _LinphoneCore *lc, LinphoneProxyConfig *c
}
}
static void register_with_refresh_base_2(LinphoneCore* lc, bool_t refresh,const char* domain,const char* route,bool_t late_auth_info) {
int retry=0;
LCSipTransports transport = {5070,5070,0,5071};
@ -98,9 +99,11 @@ static void register_with_refresh_base_2(LinphoneCore* lc, bool_t refresh,const
CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0);
}
static void register_with_refresh_base(LinphoneCore* lc, bool_t refresh,const char* domain,const char* route) {
register_with_refresh_base_2(lc,refresh,domain,route,FALSE);
}
static void register_with_refresh(LinphoneCore* lc, bool_t refresh,const char* domain,const char* route) {
stats* counters = (stats*)linphone_core_get_user_data(lc);
register_with_refresh_base(lc,refresh,domain,route);
@ -130,6 +133,7 @@ static void register_with_refresh_with_send_error(void) {
CU_ASSERT_EQUAL(counters->number_of_LinphoneRegistrationCleared,0);
}
static void simple_register(){
LinphoneCore* lc = create_lc();
stats* counters = (stats*)linphone_core_get_user_data(lc);
@ -137,7 +141,6 @@ static void simple_register(){
CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,0);
}
/*take care of min expires configuration from server*/
static void simple_register_with_refresh() {
LinphoneCore* lc = create_lc();
@ -160,6 +163,7 @@ static void simple_tcp_register(){
lc = create_lc();
register_with_refresh(lc,FALSE,NULL,route);
}
static void simple_tls_register(){
char route[256];
LinphoneCore* lc;
@ -193,6 +197,7 @@ static void authenticated_register_with_no_initial_credentials(){
register_with_refresh(lc,FALSE,auth_domain,NULL);
CU_ASSERT_EQUAL(counters->number_of_auth_info_requested,1);
}
static void auth_info_requested2(LinphoneCore *lc, const char *realm, const char *username) {
stats* counters;
ms_message("Auth info requested for user id [%s] at realm [%s]\n"
@ -294,48 +299,28 @@ static void io_recv_error(){
linphone_core_destroy(lc);
}
int register_test_suite () {
CU_pSuite pSuite = CU_add_suite("Register", NULL, NULL);
if (NULL == CU_add_test(pSuite, "simple_register", simple_register)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "tcp register tester", simple_tcp_register)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "tls register tester", simple_tls_register)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "simple_authenticated_register", simple_authenticated_register)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "register with digest auth tester without initial credentials", authenticated_register_with_no_initial_credentials)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "authenticated_register_with_late_credentials", authenticated_register_with_late_credentials)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "simple_register_with_refresh", simple_register_with_refresh)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "simple_auth_register_with_refresh", simple_auth_register_with_refresh)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "register_with_refresh_with_send_error", register_with_refresh_with_send_error)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "multi account", multiple_proxy)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "transport_change", transport_change)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "network_state_change", network_state_change)) {
return CU_get_error();
}
if (NULL == CU_add_test(pSuite, "io_recv_error_0", io_recv_error)) {
return CU_get_error();
}
test_t register_tests[] = {
{ "Simple register", simple_register },
{ "TCP register", simple_tcp_register },
{ "TLS register", simple_tls_register },
{ "Simple authenticated register", simple_authenticated_register },
{ "Digest auth without initial credentials", authenticated_register_with_no_initial_credentials },
{ "Authenticated register with late credentials", authenticated_register_with_late_credentials },
{ "Register with refresh", simple_register_with_refresh },
{ "Authenticated register with refresh", simple_auth_register_with_refresh },
{ "Register with refresh & send error", register_with_refresh_with_send_error },
{ "Multi account", multiple_proxy },
{ "Transport change", transport_change },
{ "Network state change", network_state_change },
{ "io_recv_error_0", io_recv_error }
};
test_suite_t register_test_suite = {
"Register",
NULL,
NULL,
sizeof(register_tests) / sizeof(register_tests[0]),
register_tests
};
return 0;
}

52
tester/setup_tester.c Normal file
View file

@ -0,0 +1,52 @@
/*
belle-sip - SIP (RFC3261) library.
Copyright (C) 2010 Belledonne Communications SARL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include "CUnit/Basic.h"
#include "linphonecore.h"
#include "private.h"
#include "liblinphone_tester.h"
static void core_init_test(void) {
LinphoneCoreVTable v_table;
memset (&v_table,0,sizeof(v_table));
LinphoneCore* lc = linphone_core_new(&v_table,NULL,NULL,NULL);
CU_ASSERT_PTR_NOT_NULL_FATAL(lc);
linphone_core_destroy(lc);
}
static void linphone_address_test(void) {
linphone_address_destroy(create_linphone_address(NULL));
}
test_t setup_tests[] = {
{ "Linphone Address", linphone_address_test },
{ "Linphone core init/uninit", core_init_test },
};
test_suite_t setup_test_suite = {
"Setup",
NULL,
NULL,
sizeof(setup_tests) / sizeof(setup_tests[0]),
setup_tests
};