/*
liblinphone_tester - liblinphone test suite
Copyright (C) 2013 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 2 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 .
*/
#include "linphone/core.h"
#include "private.h"
#include "liblinphone_tester.h"
#if __clang__ || ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || __GNUC__ > 4)
#pragma GCC diagnostic push
#endif
#ifdef _MSC_VER
#pragma warning(disable : 4996)
#else
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#pragma GCC diagnostic ignored "-Wstrict-prototypes"
#endif
#ifdef HAVE_GTK
#include
#endif
#if __clang__ || ((__GNUC__ == 4 && __GNUC_MINOR__ >= 6) || __GNUC__ > 4)
#pragma GCC diagnostic pop
#endif
static FILE * log_file = NULL;
#ifdef __ANDROID__
#include
#include
#define CALLBACK_BUFFER_SIZE 1024
static JNIEnv *current_env = NULL;
static jobject current_obj = 0;
static const char* LogDomain = "liblinphone_tester";
int main(int argc, char** argv);
void liblinphone_android_log_handler(int prio, const char *fmt, va_list args) {
char str[4096];
char *current;
char *next;
vsnprintf(str, sizeof(str) - 1, fmt, args);
str[sizeof(str) - 1] = '\0';
if (strlen(str) < 512) {
__android_log_write(prio, LogDomain, str);
} else {
current = str;
while ((next = strchr(current, '\n')) != NULL) {
*next = '\0';
__android_log_write(prio, LogDomain, current);
current = next + 1;
}
__android_log_write(prio, LogDomain, current);
}
}
static void liblinphone_android_ortp_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args) {
int prio;
switch(lev){
case ORTP_DEBUG: prio = ANDROID_LOG_DEBUG; break;
case ORTP_MESSAGE: prio = ANDROID_LOG_INFO; break;
case ORTP_WARNING: prio = ANDROID_LOG_WARN; break;
case ORTP_ERROR: prio = ANDROID_LOG_ERROR; break;
case ORTP_FATAL: prio = ANDROID_LOG_FATAL; break;
default: prio = ANDROID_LOG_DEFAULT; break;
}
liblinphone_android_log_handler(prio, fmt, args);
}
static void liblinphone_android_bctbx_log_handler(const char *domain, BctbxLogLevel lev, const char *fmt, va_list args) {
int prio;
switch(lev){
case BCTBX_LOG_DEBUG: prio = ANDROID_LOG_DEBUG; break;
case BCTBX_LOG_MESSAGE: prio = ANDROID_LOG_INFO; break;
case BCTBX_LOG_WARNING: prio = ANDROID_LOG_WARN; break;
case BCTBX_LOG_ERROR: prio = ANDROID_LOG_ERROR; break;
case BCTBX_LOG_FATAL: prio = ANDROID_LOG_FATAL; break;
default: prio = ANDROID_LOG_DEFAULT; break;
}
liblinphone_android_log_handler(prio, fmt, args);
}
void bcunit_android_trace_handler(int level, const char *fmt, va_list args) {
char buffer[CALLBACK_BUFFER_SIZE];
jstring javaString;
jclass cls;
jmethodID method;
jint javaLevel = level;
JNIEnv *env = current_env;
if(env == NULL) return;
vsnprintf(buffer, CALLBACK_BUFFER_SIZE, fmt, args);
javaString = (*env)->NewStringUTF(env, buffer);
cls = (*env)->GetObjectClass(env, current_obj);
method = (*env)->GetMethodID(env, cls, "printLog", "(ILjava/lang/String;)V");
(*env)->CallVoidMethod(env, current_obj, method, javaLevel, javaString);
(*env)->DeleteLocalRef(env,javaString);
(*env)->DeleteLocalRef(env,cls);
}
JNIEXPORT jint JNICALL Java_org_linphone_tester_Tester_run(JNIEnv *env, jobject obj, jobjectArray stringArray) {
int i, ret;
int argc = (*env)->GetArrayLength(env, stringArray);
char **argv = (char**) malloc(sizeof(char*) * argc);
for (i=0; iGetObjectArrayElement(env, stringArray, i);
const char *rawString = (const char *) (*env)->GetStringUTFChars(env, string, 0);
argv[i] = strdup(rawString);
(*env)->ReleaseStringUTFChars(env, string, rawString);
}
current_env = env;
current_obj = obj;
bc_set_trace_handler(bcunit_android_trace_handler);
ret = main(argc, argv);
current_env = NULL;
bc_set_trace_handler(NULL);
for (i=0; i\n"
"\t\t\t--domain \n"
"\t\t\t--auth-domain \n"
"\t\t\t--dns-hosts \n"
"\t\t\t--keep-recorded-files\n"
"\t\t\t--disable-leak-detector\n"
"\t\t\t--disable-tls-support\n"
"\t\t\t--no-ipv6 (turn off IPv6 in LinphoneCore, tests requiring IPv6 will be skipped)\n"
"\t\t\t--show-account-manager-logs (show temporary test account creation logs)\n"
;
int main (int argc, char *argv[])
{
int i;
int ret;
#ifdef HAVE_GTK
gtk_init(&argc, &argv);
#if !GLIB_CHECK_VERSION(2,32,0) // backward compatibility with Debian 6 and CentOS 6
g_thread_init(NULL);
#endif
gdk_threads_init();
#endif
liblinphone_tester_init(NULL);
linphone_core_set_log_level(ORTP_ERROR);
for(i = 1; i < argc; ++i) {
if (strcmp(argv[i], "--verbose") == 0) {
linphone_core_set_log_level(ORTP_MESSAGE);
} else if (strcmp(argv[i], "--silent") == 0) {
linphone_core_set_log_level(ORTP_FATAL);
} else if (strcmp(argv[i],"--log-file")==0){
CHECK_ARG("--log-file", ++i, argc);
if (liblinphone_tester_set_log_file(argv[i]) < 0) return -2;
} else if (strcmp(argv[i],"--domain")==0){
CHECK_ARG("--domain", ++i, argc);
test_domain=argv[i];
} else if (strcmp(argv[i],"--auth-domain")==0){
CHECK_ARG("--auth-domain", ++i, argc);
auth_domain=argv[i];
}else if (strcmp(argv[i],"--dns-hosts")==0){
CHECK_ARG("--dns-hosts", ++i, argc);
userhostsfile=argv[i];
} else if (strcmp(argv[i],"--keep-recorded-files")==0){
liblinphone_tester_keep_recorded_files(TRUE);
} else if (strcmp(argv[i],"--disable-leak-detector")==0){
liblinphone_tester_disable_leak_detector(TRUE);
} else if (strcmp(argv[i],"--disable-tls-support")==0){
liblinphone_tester_tls_support_disabled = TRUE;
} else if (strcmp(argv[i],"--no-ipv6")==0){
liblinphonetester_ipv6 = FALSE;
} else if (strcmp(argv[i],"--show-account-manager-logs")==0){
liblinphonetester_show_account_manager_logs=TRUE;
} else {
int bret = bc_tester_parse_args(argc, argv, i);
if (bret>0) {
i += bret - 1;
continue;
} else if (bret<0) {
bc_tester_helper(argv[0], liblinphone_helper);
}
return bret;
}
}
ret = bc_tester_start(argv[0]);
liblinphone_tester_uninit();
return ret;
}
#endif