Support unit test tool 11/101711/1 accepted/tizen/3.0/common/20161206.125855 accepted/tizen/3.0/ivi/20161206.000538 accepted/tizen/3.0/mobile/20161206.000439 accepted/tizen/3.0/tv/20161206.000513 accepted/tizen/3.0/wearable/20161206.000527 submit/tizen_3.0/20161205.053058 submit/tizen_3.0/20161205.131352
authorHwankyu Jhun <h.jhun@samsung.com>
Fri, 2 Dec 2016 05:02:04 +0000 (14:02 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Fri, 2 Dec 2016 05:02:04 +0000 (14:02 +0900)
- Add extra data on debugger option

Change-Id: I511302dea6a999e8154a84ee73affe3c1c0b2269
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
inc/debugger_info.h
inc/launchpad_debug.h
packaging/default.debugger.in
src/debugger_info.c
src/launchpad.c
src/launchpad_debug.c

index 7f61846..22bd253 100644 (file)
@@ -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__ */
index 8bdb6ef..a866270 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdbool.h>
 #include <bundle.h>
 
+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);
index ee2e717..7b8428d 100644 (file)
@@ -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__
+
index 4af4a2d..8e7d446 100644 (file)
 #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;
+}
index 4cf0919..a1d4618 100755 (executable)
@@ -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;
index 0065f1f..4ead375 100644 (file)
 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);
 }