From: Hwankyu Jhun Date: Fri, 2 Dec 2016 05:02:04 +0000 (+0900) Subject: Support unit test tool X-Git-Tag: accepted/tizen/3.0/common/20161206.125855^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f328e4d82111555c4b00a90a8b9ed60b5ed607fa;p=platform%2Fcore%2Fappfw%2Flaunchpad.git Support unit test tool - Add extra data on debugger option Change-Id: I511302dea6a999e8154a84ee73affe3c1c0b2269 Signed-off-by: Hwankyu Jhun --- diff --git a/inc/debugger_info.h b/inc/debugger_info.h index 7f61846..22bd253 100644 --- a/inc/debugger_info.h +++ b/inc/debugger_info.h @@ -29,5 +29,6 @@ GList *_debugger_info_get_extra_key_list(debugger_info_h info); GList *_debugger_info_get_extra_env_list(debugger_info_h info); GList *_debugger_info_get_unlink_list(debugger_info_h info); const char *_debugger_info_get_attach(debugger_info_h info); +GList *_debugger_info_get_last_extra_key_list(debugger_info_h info); #endif /* __DEBUGGER_INFO_H__ */ diff --git a/inc/launchpad_debug.h b/inc/launchpad_debug.h index 8bdb6ef..a866270 100644 --- a/inc/launchpad_debug.h +++ b/inc/launchpad_debug.h @@ -20,6 +20,7 @@ #include #include +int _debug_create_extra_argv(int *arg, char ***argv); int _debug_create_argv(int *argc, char ***argv, bool *attach); void _debug_destroy_argv(int argc, char **argv); int _debug_get_caller_pid(bundle *kb); diff --git a/packaging/default.debugger.in b/packaging/default.debugger.in index ee2e717..7b8428d 100644 --- a/packaging/default.debugger.in +++ b/packaging/default.debugger.in @@ -18,3 +18,9 @@ EXE /opt/usr/home/owner/share/tmp/sdk_tools/gdbserver/gdbserver APP_TYPE capp|c++app EXTRA_KEY __DLP_ATTACH_ARG__ ATTACH true + +[DEBUGGER] +NAME UNIT_TEST +APP_TYPE capp|c++app +LAST_EXTRA_KEY __DLP_UNIT_TEST_ARG__ + diff --git a/src/debugger_info.c b/src/debugger_info.c index 4af4a2d..8e7d446 100644 --- a/src/debugger_info.c +++ b/src/debugger_info.c @@ -25,14 +25,15 @@ #include "launchpad_common.h" #include "debugger_info.h" -#define TAG_DEBUGGER "[DEBUGGER]" -#define TAG_NAME "NAME" -#define TAG_EXE "EXE" -#define TAG_APP_TYPE "APP_TYPE" -#define TAG_EXTRA_KEY "EXTRA_KEY" -#define TAG_EXTRA_ENV "EXTRA_ENV" -#define TAG_UNLINK "UNLINK" -#define TAG_ATTACH "ATTACH" +#define TAG_DEBUGGER "[DEBUGGER]" +#define TAG_NAME "NAME" +#define TAG_EXE "EXE" +#define TAG_APP_TYPE "APP_TYPE" +#define TAG_EXTRA_KEY "EXTRA_KEY" +#define TAG_EXTRA_ENV "EXTRA_ENV" +#define TAG_UNLINK "UNLINK" +#define TAG_ATTACH "ATTACH" +#define TAG_LAST_EXTRA_KEY "LAST_EXTRA_KEY" struct debugger_info_s { char *name; @@ -42,6 +43,7 @@ struct debugger_info_s { GList *extra_env_list; GList *unlink_list; char *attach; + GList *last_extra_key_list; }; static struct debugger_info_s *__create_debugger_info(void) @@ -64,6 +66,8 @@ static void __destroy_debugger_info(gpointer data) if (info == NULL) return; + if (info->last_extra_key_list) + g_list_free_full(info->last_extra_key_list, free); if (info->attach) free(info->attach); if (info->unlink_list) @@ -175,6 +179,10 @@ static GList *__parse_file(GList *list, const char *path) info = NULL; break; } + } else if (strcasecmp(TAG_LAST_EXTRA_KEY, tok1) == 0) { + info->last_extra_key_list = g_list_append( + info->last_extra_key_list, + strdup(tok2)); } } fclose(fp); @@ -293,3 +301,11 @@ const char *_debugger_info_get_attach(debugger_info_h info) return info->attach; } + +GList *_debugger_info_get_last_extra_key_list(debugger_info_h info) +{ + if (info == NULL) + return NULL; + + return info->last_extra_key_list; +} diff --git a/src/launchpad.c b/src/launchpad.c index 4cf0919..a1d4618 100755 --- a/src/launchpad.c +++ b/src/launchpad.c @@ -590,6 +590,7 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, struct app_arg debug_arg = {0,}; struct app_arg launcher_arg = {0,}; struct app_arg arg = {0,}; + struct app_arg debug_extra_arg = {0,}; int ret; int i; int c; @@ -606,10 +607,19 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, return 0; } + ret = _debug_create_extra_argv(&debug_extra_arg.argc, + &debug_extra_arg.argv); + if (ret < 0) { + _E("Failed to create debugger extra argv"); + _debug_destroy_argv(debug_arg.argc, debug_arg.argv); + return -1; + } + ret = __create_launcher_argv(&launcher_arg.argc, &launcher_arg.argv, app_type); if (ret < 0) { _E("Failed to create launcher argv"); + _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv); _debug_destroy_argv(debug_arg.argc, debug_arg.argv); return -1; } @@ -618,12 +628,14 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, if (arg.argc <= 0) { _E("Failed to export bundle"); __destroy_launcher_argv(launcher_arg.argc, launcher_arg.argv); + _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv); _debug_destroy_argv(debug_arg.argc, debug_arg.argv); return -1; } arg.argv[LOADER_ARG_PATH] = strdup(app_path); - new_argc = debug_arg.argc + launcher_arg.argc + arg.argc; + new_argc = debug_arg.argc + launcher_arg.argc + arg.argc + + debug_extra_arg.argc; if (new_argc == arg.argc) { *argc = arg.argc; *argv = arg.argv; @@ -636,6 +648,7 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, free(arg.argv[LOADER_ARG_PATH]); bundle_free_exported_argv(arg.argc, &arg.argv); __destroy_launcher_argv(launcher_arg.argc, launcher_arg.argv); + _debug_destroy_argv(debug_extra_arg.argc, debug_extra_arg.argv); _debug_destroy_argv(debug_arg.argc, debug_arg.argv); return -1; } @@ -647,6 +660,8 @@ static int __create_app_argv(int *argc, char ***argv, const char *app_path, new_argv[c++] = launcher_arg.argv[i]; for (i = 0; i < arg.argc; i++) new_argv[c++] = arg.argv[i]; + for (i = 0; i < debug_extra_arg.argc; i++) + new_argv[c++] = debug_extra_arg.argv[i]; *argc = new_argc; *argv = new_argv; diff --git a/src/launchpad_debug.c b/src/launchpad_debug.c index 0065f1f..4ead375 100644 --- a/src/launchpad_debug.c +++ b/src/launchpad_debug.c @@ -34,14 +34,58 @@ static int debug_initialized; static GList *debugger_info_list; static debugger_info_h debugger_info; +static GList *debug_argv_list; static GList *extra_argv_list; +int _debug_create_extra_argv(int *argc, char ***argv) +{ + int new_argc; + char **new_argv; + const char *extra_argv; + GList *iter; + int i; + + if (argc == NULL || argv == NULL) { + _E("[DEBUG] Invalid parameter"); + return -1; + } + + if (debugger_info == NULL) + return 0; + + new_argc = g_list_length(extra_argv_list); + if (new_argc == 0) + return 0; + + new_argv = (char **)calloc(new_argc, sizeof(char *)); + if (new_argv == NULL) { + _E("out of memory"); + return -1; + } + + i = LOADER_ARG_PATH; + iter = g_list_first(extra_argv_list); + while (iter) { + extra_argv = (const char *)iter->data; + if (extra_argv) + new_argv[i++] = strdup(extra_argv); + + iter = g_list_next(iter); + } + + *argc = new_argc; + *argv = new_argv; + _D("[DEBUG] argc: %d, i: %d", argc, i); + + return 0; +} + int _debug_create_argv(int *argc, char ***argv, bool *attach) { int new_argc; char **new_argv; const char *exe; - const char *extra_argv; + const char *debug_argv; const char *attach_str; GList *iter; int i; @@ -56,13 +100,13 @@ int _debug_create_argv(int *argc, char ***argv, bool *attach) exe = _debugger_info_get_exe(debugger_info); if (exe == NULL) - return -1; + return 0; attach_str = _debugger_info_get_attach(debugger_info); if (attach_str && strcasecmp(attach_str, "true") == 0) *attach = true; - new_argc = g_list_length(extra_argv_list) + 1; + new_argc = g_list_length(debug_argv_list) + 1; new_argv = (char **)calloc(new_argc, sizeof(char *)); if (new_argv == NULL) { _E("out of memory"); @@ -72,11 +116,11 @@ int _debug_create_argv(int *argc, char ***argv, bool *attach) i = LOADER_ARG_PATH; new_argv[i++] = strdup(exe); - iter = g_list_first(extra_argv_list); + iter = g_list_first(debug_argv_list); while (iter) { - extra_argv = (const char *)iter->data; - if (extra_argv) - new_argv[i++] = strdup(extra_argv); + debug_argv = (const char *)iter->data; + if (debug_argv) + new_argv[i++] = strdup(debug_argv); iter = g_list_next(iter); } @@ -198,6 +242,41 @@ static void __add_extra_argv(gpointer data, gpointer user_data) bundle_del(kb, key); } +static void __add_debug_argv(gpointer data, gpointer user_data) +{ + const char *key = (const char *)data; + bundle *kb = (bundle *)user_data; + const char *str; + const char **str_arr = NULL; + int len = 0; + int i; + + if (key == NULL || kb == NULL) + return; + + _D("[DEBUG] key: %s", key); + if (bundle_get_type(kb, key) & BUNDLE_TYPE_ARRAY) { + str_arr = bundle_get_str_array(kb, key, &len); + } else { + str = bundle_get_val(kb, key); + if (str) { + str_arr = &str; + len = 1; + } + } + + for (i = 0; i < len; i++) { + if (str_arr[i] == NULL) + break; + + debug_argv_list = g_list_append(debug_argv_list, + strdup(str_arr[i])); + } + + if (str_arr) + bundle_del(kb, key); +} + static void __set_debug_env(gpointer data, gpointer user_data) { const char *key = (const char *)data; @@ -282,6 +361,9 @@ void _debug_prepare_debugger(bundle *kb) g_list_foreach(list, __set_debug_env, kb); list = _debugger_info_get_extra_key_list(debugger_info); + g_list_foreach(list, __add_debug_argv, kb); + + list = _debugger_info_get_last_extra_key_list(debugger_info); g_list_foreach(list, __add_extra_argv, kb); }