svn update: 56239 (latest:56239)
authorWooHyun Jung <wh0705.jung@samsung.com>
Mon, 24 Jan 2011 03:18:25 +0000 (12:18 +0900)
committerWooHyun Jung <wh0705.jung@samsung.com>
Mon, 24 Jan 2011 03:18:25 +0000 (12:18 +0900)
26 files changed:
Makefile.am
configure.ac
src/Makefile.am
src/lib/ecore/ecore_exe.c
src/lib/ecore_con/ecore_con_info.c
src/lib/ecore_con/ecore_con_url.c
src/lib/ecore_evas/ecore_evas_x.c
src/lib/ecore_file/ecore_file_monitor_inotify.c
src/lib/ecore_win32/ecore_win32_event.c
src/lib/ecore_wince/ecore_wince_event.c
src/lib/ecore_x/xlib/ecore_x.c
src/lib/ecore_x/xlib/ecore_x_dnd.c
src/lib/ecore_x/xlib/ecore_x_e.c
src/lib/ecore_x/xlib/ecore_x_events.c
src/lib/ecore_x/xlib/ecore_x_netwm.c
src/lib/ecore_x/xlib/ecore_x_randr.c
src/lib/ecore_x/xlib/ecore_x_randr_11.c
src/lib/ecore_x/xlib/ecore_x_screensaver.c
src/lib/ecore_x/xlib/ecore_x_selection.c
src/lib/ecore_x/xlib/ecore_x_window.c
src/tests/Makefile.am [new file with mode: 0644]
src/tests/ecore_suite.c [new file with mode: 0644]
src/tests/ecore_suite.h [new file with mode: 0644]
src/tests/ecore_test_ecore.c [new file with mode: 0644]
src/tests/ecore_test_ecore_con.c [new file with mode: 0644]
src/tests/ecore_test_ecore_x.c [new file with mode: 0644]

index 83cfa15..d05ddcf 100644 (file)
@@ -180,3 +180,17 @@ endif
 doc:
        @echo "entering doc/"
        make -C doc doc
+
+# Unit tests
+
+if EFL_ENABLE_TESTS
+
+check-local:
+       @./src/tests/ecore_suite
+
+else
+
+check-local:
+       @echo "reconfigure with --enable-tests"
+
+endif
index 1e6c8b2..ff3d7c3 100644 (file)
@@ -307,6 +307,10 @@ if test "x${want_xim}" = "xyes" ; then
    AC_DEFINE([ENABLE_XIM], [1], [Enable X Input Method])
 fi
 
+# Unit tests
+
+EFL_CHECK_TESTS([enable_tests="yes"], [enable_tests="no"])
+
 ### Checks for programs
 
 m4_ifdef([AC_PROG_OBJC],
@@ -1431,6 +1435,7 @@ src/lib/ecore_wince/Makefile
 src/lib/ecore_x/Makefile
 src/lib/ecore_x/xlib/Makefile
 src/lib/ecore_x/xcb/Makefile
+src/tests/Makefile
 README
 ecore.spec
 $po_makefile_in
@@ -1564,6 +1569,7 @@ if test "x${have_ecore_evas}" = "xyes" ; then
   echo "    Software 16bit WinCE.......: $have_ecore_evas_software_16_wince"
 fi
 echo
+echo "  Tests................: ${enable_tests}"
 echo "  Maximum log level....: ${with_max_log_level}"
 echo "Documentation..........: ${build_doc}"
 echo
index a8590b2..a6fc38f 100644 (file)
@@ -1,3 +1,3 @@
 MAINTAINERCLEANFILES = Makefile.in
 
-SUBDIRS = lib bin
+SUBDIRS = lib bin tests
index f03ceb8..aaed793 100644 (file)
@@ -1500,14 +1500,6 @@ _ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags)
           }
      }
 
-   if ((!args) || (!args[0]))
-     {
-        IF_FREE(buf);
-        IF_FREE(args);
-        ERR("arg[0] is NULL!");
-        return;
-     }
-
    if (!(flags & ECORE_EXE_NOT_LEADER)) setsid();
    if ((flags & ECORE_EXE_USE_SH))
      {
@@ -1527,6 +1519,13 @@ _ecore_exe_exec_it(const char *exe_cmd, Ecore_Exe_Flags flags)
      }
    else
      {                                /* We can run this directly. */
+        if (!args)
+          {
+             IF_FREE(buf);
+             IF_FREE(args);
+             ERR("arg[0] is NULL!");
+             return;
+          }
         errno = 0;
         execvp(args[0], args);
      }
index 8e40629..055218f 100644 (file)
@@ -278,7 +278,6 @@ ecore_con_info_get(Ecore_Con_Server *svr,
              err = write(fd[1], tosend, tosend_len);
           }
 
-on_error:
         if (result)
           freeaddrinfo(result);
 
index 751c2b6..d110538 100644 (file)
@@ -304,7 +304,7 @@ ecore_con_url_new(const char *url)
    curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSFUNCTION,
                     _ecore_con_url_progress_cb);
    curl_easy_setopt(url_con->curl_easy, CURLOPT_PROGRESSDATA, url_con);
-   curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_FALSE);
+   curl_easy_setopt(url_con->curl_easy, CURLOPT_NOPROGRESS, EINA_TRUE);
 
    curl_easy_setopt(url_con->curl_easy, CURLOPT_HEADERFUNCTION,
                     _ecore_con_url_header_cb);
index 091fb0d..50ccb33 100644 (file)
@@ -3507,6 +3507,7 @@ ecore_evas_gl_x11_options_new(const char *disp_name, Ecore_X_Window parent,
    ee->engine.func = (Ecore_Evas_Engine_Func *)&_ecore_x_engine_func;
 
    ee->driver = "opengl_x11";
+   ee->no_comp_sync = 1; // gl engine doesnt need to sync - its whole swaps
    if (disp_name) ee->name = strdup(disp_name);
 
    if (w < 1) w = 1;
index 71e0cab..e9bb595 100644 (file)
@@ -209,6 +209,11 @@ _ecore_file_monitor_inotify_events(Ecore_File_Monitor *em, char *file, int mask)
         if (!isdir)
           em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
      }
+   if (mask & IN_MODIFY)
+     {
+        if (!isdir)
+          em->func(em->data, em, ECORE_FILE_EVENT_MODIFIED, buf);
+     }
    if (mask & IN_MOVED_FROM)
      {
         if (isdir)
@@ -268,14 +273,20 @@ _ecore_file_monitor_inotify_events(Ecore_File_Monitor *em, char *file, int mask)
 static int
 _ecore_file_monitor_inotify_monitor(Ecore_File_Monitor *em, const char *path)
 {
-   int mask;
-   mask = IN_ATTRIB|IN_CLOSE_WRITE|
-          IN_MOVED_FROM|IN_MOVED_TO|
-          IN_DELETE|IN_CREATE|
-          IN_DELETE_SELF|IN_MOVE_SELF|
-          IN_UNMOUNT;
-   ECORE_FILE_MONITOR_INOTIFY(em)->wd = inotify_add_watch(ecore_main_fd_handler_fd_get(_fdh),
-                                                          path, mask);
+   int mask = 
+      IN_ATTRIB | 
+      IN_CLOSE_WRITE |
+      IN_MOVED_FROM | 
+      IN_MOVED_TO |
+      IN_DELETE | 
+      IN_CREATE |
+      IN_MODIFY |
+      IN_DELETE_SELF | 
+      IN_MOVE_SELF |
+      IN_UNMOUNT;
+   
+   ECORE_FILE_MONITOR_INOTIFY(em)->wd = 
+      inotify_add_watch(ecore_main_fd_handler_fd_get(_fdh), path, mask);
    if (ECORE_FILE_MONITOR_INOTIFY(em)->wd < 0)
      {
         ERR("inotify_add_watch error");
index 3bca213..ed467d3 100644 (file)
@@ -798,6 +798,10 @@ _ecore_win32_event_keystroke_get(int    key,
            kc = "KP_Delete";
          }
        break;
+     case VK_SPACE:
+       kn = "space";
+       ks = "space";
+       kc = "space";
      case VK_F1:
        kn = "F1";
        ks = "F1";
@@ -986,6 +990,11 @@ _ecore_win32_event_char_get(int    key,
        strncpy(ks, "Escape", 32);
        strncpy(kc, "Escape", 32);
        break;
+     case VK_SPACE:
+       strncpy(kn, "space", 32);
+       strncpy(ks, "space", 32);
+       strncpy(kc, "space", 32);
+       break;
      default:
        /* displayable characters */
        printf (" * key : %d\n", key);
index b1a2a2f..bbab07f 100644 (file)
@@ -123,6 +123,11 @@ _ecore_wince_event_keystroke_get(int    key,
        ks = "Delete";
        kc = "Delete";
        break;
+     case VK_SPACE:
+       kn = "space";
+       ks = "space";
+       kc = "space";
+       break;
      case VK_F1:
        kn = "F1";
        ks = "F1";
@@ -329,6 +334,11 @@ _ecore_wince_event_char_get(int    key,
        strncpy(ks, "Escape", 32);
        strncpy(kc, "Escape", 32);
        break;
+     case VK_SPACE:
+       strncpy(kn, "space", 32);
+       strncpy(ks, "space", 32);
+       strncpy(kc, "space", 32);
+       break;
      default:
        /* displayable characters */
        printf (" * key : %d\n", key);
index 9426f41..dc3f0cf 100644 (file)
@@ -1464,6 +1464,7 @@ ecore_x_window_button_grab(Ecore_X_Window win, int button,
    unsigned int m;
    unsigned int locks[8];
    int i, ev;
+   Window *t;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    b = button;
@@ -1487,8 +1488,10 @@ ecore_x_window_button_grab(Ecore_X_Window win, int button,
       XGrabButton(_ecore_x_disp, b, m | locks[i],
                   win, False, ev, GrabModeSync, GrabModeAsync, None, None);
    _ecore_window_grabs_num++;
-   _ecore_window_grabs = realloc(_ecore_window_grabs,
-                                 _ecore_window_grabs_num * sizeof(Window));
+   t = realloc(_ecore_window_grabs,
+               _ecore_window_grabs_num * sizeof(Window));
+   if (!t) return;
+   _ecore_window_grabs = t;
    _ecore_window_grabs[_ecore_window_grabs_num - 1] = win;
 } /* ecore_x_window_button_grab */
 
@@ -1514,7 +1517,8 @@ void
 _ecore_x_window_grab_remove(Ecore_X_Window win)
 {
    int i, shuffle = 0;
-
+   Window *t;
+   
    if (_ecore_window_grabs_num > 0)
      {
         for (i = 0; i < _ecore_window_grabs_num; i++)
@@ -1528,9 +1532,17 @@ _ecore_x_window_grab_remove(Ecore_X_Window win)
         if (shuffle)
           {
              _ecore_window_grabs_num--;
-             _ecore_window_grabs = realloc(_ecore_window_grabs,
-                                           _ecore_window_grabs_num *
-                                           sizeof(Window));
+             if (_ecore_window_grabs_num <= 0)
+               {
+                  free(_ecore_window_grabs);
+                  _ecore_window_grabs = NULL;
+                  return;
+               }
+             t = realloc(_ecore_window_grabs,
+                         _ecore_window_grabs_num *
+                         sizeof(Window));
+             if (!t) return;
+             _ecore_window_grabs = t;
           }
      }
 } /* _ecore_x_window_grab_remove */
@@ -1578,6 +1590,7 @@ ecore_x_window_key_grab(Ecore_X_Window win, const char *key,
    unsigned int m;
    unsigned int locks[8];
    int i;
+   Window *t;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (!strncmp(key, "Keycode-", 8))
@@ -1610,8 +1623,10 @@ ecore_x_window_key_grab(Ecore_X_Window win, const char *key,
       XGrabKey(_ecore_x_disp, keycode, m | locks[i],
                win, False, GrabModeSync, GrabModeAsync);
    _ecore_key_grabs_num++;
-   _ecore_key_grabs = realloc(_ecore_key_grabs,
-                              _ecore_key_grabs_num * sizeof(Window));
+   t = realloc(_ecore_key_grabs,
+               _ecore_key_grabs_num * sizeof(Window));
+   if (!t) return;
+   _ecore_key_grabs = t;
    _ecore_key_grabs[_ecore_key_grabs_num - 1] = win;
 } /* ecore_x_window_key_grab */
 
@@ -1619,7 +1634,8 @@ void
 _ecore_x_key_grab_remove(Ecore_X_Window win)
 {
    int i, shuffle = 0;
-
+   Window *t;
+   
    if (_ecore_key_grabs_num > 0)
      {
         for (i = 0; i < _ecore_key_grabs_num; i++)
@@ -1633,8 +1649,16 @@ _ecore_x_key_grab_remove(Ecore_X_Window win)
         if (shuffle)
           {
              _ecore_key_grabs_num--;
-             _ecore_key_grabs = realloc(_ecore_key_grabs,
-                                        _ecore_key_grabs_num * sizeof(Window));
+             if (_ecore_key_grabs_num <= 0)
+               {
+                  free(_ecore_key_grabs);
+                  _ecore_key_grabs = NULL;
+                  return;
+               }
+             t = realloc(_ecore_key_grabs,
+                         _ecore_key_grabs_num * sizeof(Window));
+             if (!t) return;
+             _ecore_key_grabs = t;
           }
      }
 } /* _ecore_x_key_grab_remove */
index 74d5740..0f1d8bb 100644 (file)
@@ -37,6 +37,7 @@ _ecore_x_dnd_init(void)
    if (!_ecore_x_dnd_init_count)
      {
         _source = calloc(1, sizeof(Ecore_X_DND_Source));
+        if (!_source) return;
         _source->version = ECORE_X_DND_VERSION;
         _source->win = None;
         _source->dest = None;
@@ -44,6 +45,12 @@ _ecore_x_dnd_init(void)
         _source->prev.window = 0;
 
         _target = calloc(1, sizeof(Ecore_X_DND_Target));
+        if (!_target)
+          {
+             free(_source);
+             _source = NULL;
+             return;
+          }
         _target->win = None;
         _target->source = None;
         _target->state = ECORE_X_DND_TARGET_IDLE;
@@ -106,6 +113,11 @@ _ecore_x_dnd_converter_copy(char *target  __UNUSED__,
      {
         int bufsize = strlen((char *)text_prop.value) + 1;
         *data_ret = malloc(bufsize);
+        if (!*data_ret)
+          {
+             free(mystr);
+             return EINA_FALSE;
+          }
         memcpy(*data_ret, text_prop.value, bufsize);
         *size_ret = bufsize;
         XFree(text_prop.value);
@@ -137,6 +149,7 @@ ecore_x_dnd_version_get(Ecore_X_Window win)
 {
    unsigned char *prop_data;
    int num;
+   Version_Cache_Item *t;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    // this looks hacky - and it is, but we need a way of caching info about
@@ -166,9 +179,11 @@ ecore_x_dnd_version_get(Ecore_X_Window win)
              if (_version_cache_num > _version_cache_alloc)
                 _version_cache_alloc += 16;
 
-             _version_cache = realloc(_version_cache,
-                                      _version_cache_alloc *
-                                      sizeof(Version_Cache_Item));
+             t = realloc(_version_cache,
+                         _version_cache_alloc *
+                         sizeof(Version_Cache_Item));
+             if (!t) return 0;
+             _version_cache = t;
              _version_cache[_version_cache_num - 1].win = win;
              _version_cache[_version_cache_num - 1].ver = version;
           }
@@ -182,9 +197,10 @@ ecore_x_dnd_version_get(Ecore_X_Window win)
         if (_version_cache_num > _version_cache_alloc)
            _version_cache_alloc += 16;
 
-        _version_cache =
-           realloc(_version_cache, _version_cache_alloc *
-                   sizeof(Version_Cache_Item));
+        t = realloc(_version_cache, _version_cache_alloc *
+                    sizeof(Version_Cache_Item));
+        if (!t) return 0;
+        _version_cache = t;
         _version_cache[_version_cache_num - 1].win = win;
         _version_cache[_version_cache_num - 1].ver = 0;
      }
index 035d98a..f31135b 100644 (file)
@@ -151,7 +151,7 @@ _ecore_x_e_vkbd_atom_get(Ecore_X_Virtual_Keyboard_State state)
       case ECORE_X_VIRTUAL_KEYBOARD_STATE_J2ME:
          return ECORE_X_ATOM_E_VIRTUAL_KEYBOARD_J2ME;
 
-      default: return 0;
+      default: break;
      } /* switch */
    return 0;
 } /* _ecore_x_e_vkbd_atom_get */
@@ -207,7 +207,7 @@ _ecore_x_e_illume_atom_get(Ecore_X_Illume_Mode mode)
          return ECORE_X_ATOM_E_ILLUME_MODE_DUAL_LEFT;
 
       default:
-         return ECORE_X_ILLUME_MODE_UNKNOWN;
+         break;
      } /* switch */
    return ECORE_X_ILLUME_MODE_UNKNOWN;
 } /* _ecore_x_e_illume_atom_get */
@@ -589,7 +589,7 @@ _ecore_x_e_quickpanel_atom_get(Ecore_X_Illume_Quickpanel_State state)
          return ECORE_X_ATOM_E_ILLUME_QUICKPANEL_OFF;
 
       default:
-         return 0;
+         break;
      } /* switch */
    return 0;
 } /* _ecore_x_e_quickpanel_atom_get */
index dfa1aa2..c232d95 100644 (file)
@@ -226,8 +226,6 @@ _ecore_key_press(int event, XKeyEvent *xevent)
                  "Keycode-%i",
                  xevent->keycode);
         keyname = keyname_buffer;
-        if (!keyname)
-           return;
      }
 
    sym = 0;
@@ -320,9 +318,6 @@ _ecore_key_press(int event, XKeyEvent *xevent)
    if (!key)
       key = keyname;
 
-   if (!key)
-      goto on_error;
-
    e =
       malloc(sizeof(Ecore_Event_Key) + strlen(key) + strlen(keyname) +
              (compose ? strlen(compose) : 0) + 3);
@@ -1302,14 +1297,14 @@ _ecore_x_event_handle_property_notify(XEvent *xevent)
 void
 _ecore_x_event_handle_selection_clear(XEvent *xevent)
 {
-   Ecore_X_Selection_Intern *d;
+//   Ecore_X_Selection_Intern *d;
    Ecore_X_Event_Selection_Clear *e;
    Ecore_X_Atom sel;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    _ecore_x_last_event_mouse_move = 0;
-   d = _ecore_x_selection_get(xevent->xselectionclear.selection);
 /* errr..... why? paranoia.
+   d = _ecore_x_selection_get(xevent->xselectionclear.selection);
    if (d && (xevent->xselectionclear.time > d->time))
      {
         _ecore_x_selection_set(None, NULL, 0,
index fa56135..6de9080 100644 (file)
@@ -179,7 +179,7 @@ EAPI void
 ecore_x_netwm_desk_names_set(Ecore_X_Window root,
                              const char **names, unsigned int n_desks)
 {
-   char ss[32], *buf;
+   char ss[32], *buf, *t;
    const char *s;
    unsigned int i;
    int l, len;
@@ -199,8 +199,12 @@ ecore_x_netwm_desk_names_set(Ecore_X_Window root,
           }
 
         l = strlen(s) + 1;
-        buf = realloc(buf, len + l);
-        memcpy(buf + len, s, l);
+        t = realloc(buf, len + l);
+        if (t)
+          {
+             buf = t;
+             memcpy(buf + len, s, l);
+          }
         len += l;
      }
 
index c585ee5..9d406b1 100644 (file)
@@ -80,8 +80,9 @@ ecore_x_randr_version_get(void)
    {
       return Ecore_X_Randr_Unset;
    }
-#endif
+#else   
    return -1;
+#endif
 }
 
 Eina_Bool
index 1266d44..0de28e0 100644 (file)
@@ -115,6 +115,7 @@ ecore_x_randr_screen_primary_output_sizes_get(Ecore_X_Window root, int *num)
    sizes =
       XRRSizes(_ecore_x_disp, XRRRootToScreen(_ecore_x_disp,
                                                     root), &n);
+   if ((!sizes) || (n <= 0)) return NULL;
    ret = calloc(n, sizeof(Ecore_X_Randr_Screen_Size_MM));
    if (!ret)
       return NULL;
index 33f31af..86232c8 100644 (file)
@@ -54,9 +54,9 @@ ecore_x_screensaver_idle_time_get(void)
    XFree(xss);
 
    return idle;
-#endif /* ifdef ECORE_XSS */
-
+#else   
    return 0;
+#endif /* ifdef ECORE_XSS */
 } /* ecore_x_screensaver_idle_time_get */
 
 EAPI void
index f54ea93..aeb30d3 100644 (file)
@@ -151,6 +151,7 @@ _ecore_x_selection_set(Window       w,
         selections[in].time = _ecore_x_event_last_time;
 
         buf = malloc(size);
+        if (!buf) return EINA_FALSE;
         memcpy(buf, data, size);
         selections[in].data = buf;
      }
@@ -416,11 +417,13 @@ ecore_x_selection_converter_atom_add(Ecore_X_Atom target,
           }
 
         cnv->next = calloc(1, sizeof(Ecore_X_Selection_Converter));
+        if (!cnv->next) return;
         cnv = cnv->next;
      }
    else
      {
         converters = calloc(1, sizeof(Ecore_X_Selection_Converter));
+        if (!converters) return;
         cnv = converters;
      }
 
@@ -606,6 +609,11 @@ _ecore_x_selection_converter_text(char         *target,
      {
         int bufsize = strlen((char *)text_prop.value) + 1;
         *data_ret = malloc(bufsize);
+        if (!*data_ret)
+          {
+             free(mystr);
+             return EINA_FALSE;
+          }
         memcpy(*data_ret, text_prop.value, bufsize);
         *size_ret = bufsize;
         XFree(text_prop.value);
@@ -619,6 +627,7 @@ _ecore_x_selection_converter_text(char         *target,
      {
         int bufsize = strlen(text_prop.value) + 1;
         *data_ret = malloc(bufsize);
+        if (!*data_ret) return EINA_FALSE;
         memcpy(*data_ret, text_prop.value, bufsize);
         *size_ret = bufsize;
         XFree(text_prop.value);
@@ -661,11 +670,13 @@ ecore_x_selection_parser_add(const char *target,
           }
 
         prs->next = calloc(1, sizeof(Ecore_X_Selection_Parser));
+        if (!prs->next) return;
         prs = prs->next;
      }
    else
      {
         parsers = calloc(1, sizeof(Ecore_X_Selection_Parser));
+        if (!parsers) return;
         prs = parsers;
      }
 
@@ -725,6 +736,7 @@ _ecore_x_selection_parse(const char *target, void *data, int size, int format)
 
    /* Default, just return the data */
    sel = calloc(1, sizeof(Ecore_X_Selection_Data));
+   if (!sel) return NULL;
    sel->free = _ecore_x_selection_data_default_free;
    sel->length = size;
    sel->format = format;
@@ -750,26 +762,39 @@ _ecore_x_selection_parser_files(const char *target,
                                 int format  __UNUSED__)
 {
    Ecore_X_Selection_Data_Files *sel;
-   char *data = _data;
+   char *t, *data = _data;
    int i, is;
    char *tmp;
+   char **t2;
 
    if (strcmp(target, "text/uri-list") &&
        strcmp(target, "_NETSCAPE_URL"))
       return NULL;
 
    sel = calloc(1, sizeof(Ecore_X_Selection_Data_Files));
+   if (!sel) return NULL;
    ECORE_X_SELECTION_DATA(sel)->free = _ecore_x_selection_data_files_free;
 
    if (data[size - 1])
      {
         /* Isn't nul terminated */
         size++;
-        data = realloc(data, size);
+        t = realloc(data, size);
+        if (!t)
+          {
+             free(sel);
+             return NULL;
+          }
+        data = t;
         data[size - 1] = 0;
      }
 
    tmp = malloc(size);
+   if (!tmp)
+     {
+        free(sel);
+        return NULL;
+     }
    i = 0;
    is = 0;
    while ((is < size) && (data[is]))
@@ -786,9 +811,12 @@ _ecore_x_selection_parser_files(const char *target,
                   while ((data[is] == '\r') || (data[is] == '\n')) is++;
                   tmp[i] = 0;
                   sel->num_files++;
-                  sel->files =
-                     realloc(sel->files, sel->num_files * sizeof(char *));
-                  sel->files[sel->num_files - 1] = strdup(tmp);
+                  t2 = realloc(sel->files, sel->num_files * sizeof(char *));
+                  if (t2)
+                    {
+                       sel->files = t2;
+                       sel->files[sel->num_files - 1] = strdup(tmp);
+                    }
                   tmp[0] = 0;
                   i = 0;
                }
@@ -798,8 +826,12 @@ _ecore_x_selection_parser_files(const char *target,
      {
         tmp[i] = 0;
         sel->num_files++;
-        sel->files = realloc(sel->files, sel->num_files * sizeof(char *));
-        sel->files[sel->num_files - 1] = strdup(tmp);
+        t2 = realloc(sel->files, sel->num_files * sizeof(char *));
+        if (t2)
+          {
+             sel->files = t2;
+             sel->files[sel->num_files - 1] = strdup(tmp);
+          }
      }
 
    free(tmp);
@@ -837,14 +869,21 @@ _ecore_x_selection_parser_text(const char *target __UNUSED__,
 {
    Ecore_X_Selection_Data_Text *sel;
    unsigned char *data = _data;
+   void *t;
 
    sel = calloc(1, sizeof(Ecore_X_Selection_Data_Text));
-
+   if (!sel) return NULL;
    if (data[size - 1])
      {
         /* Isn't nul terminated */
         size++;
-        data = realloc(data, size);
+        t = realloc(data, size);
+        if (!t)
+          {
+             free(sel);
+             return NULL;
+          }
+        data = t;
         data[size - 1] = 0;
      }
 
@@ -878,10 +917,16 @@ _ecore_x_selection_parser_targets(const char *target __UNUSED__,
    int i;
 
    sel = calloc(1, sizeof(Ecore_X_Selection_Data_Targets));
+   if (!sel) return NULL;
    targets = (unsigned long *)data;
 
    sel->num_targets = size - 2;
    sel->targets = malloc((size - 2) * sizeof(char *));
+   if (!sel->targets)
+     {
+        free(sel);
+        return NULL;
+     }
    for (i = 2; i < size; i++)
       sel->targets[i - 2] = XGetAtomName(_ecore_x_disp, targets[i]);
 
index 34274a5..f8e730b 100644 (file)
@@ -309,6 +309,7 @@ EAPI void
 ecore_x_window_ignore_set(Ecore_X_Window win, int ignore)
 {
    int i, j;
+   Ecore_X_Window *t;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
    if (ignore)
@@ -320,18 +321,17 @@ ecore_x_window_ignore_set(Ecore_X_Window win, int ignore)
                   if (win == ignore_list[i])
                      return;
                }
-             ignore_list =
-                realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
-             if (!ignore_list)
-                return;
-
+             t = realloc(ignore_list, (ignore_num + 1) * sizeof(Ecore_X_Window));
+             if (!t) return;
+             ignore_list = t;
              ignore_list[ignore_num++] = win;
           }
         else
           {
              ignore_num = 0;
              ignore_list = malloc(sizeof(Ecore_X_Window));
-             ignore_list[ignore_num++] = win;
+             if (ignore_list)
+                ignore_list[ignore_num++] = win;
           }
      }
    else
@@ -346,7 +346,14 @@ ecore_x_window_ignore_set(Ecore_X_Window win, int ignore)
              else
                 ignore_num--;
           }
-        ignore_list = realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
+        if (ignore_num <= 0)
+          {
+             free(ignore_list);
+             ignore_list = NULL;
+             return;
+          }
+        t = realloc(ignore_list, ignore_num * sizeof(Ecore_X_Window));
+        if (t) ignore_list = t;
      }
 } /* ecore_x_window_ignore_set */
 
diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am
new file mode 100644 (file)
index 0000000..dbec564
--- /dev/null
@@ -0,0 +1,34 @@
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_con \
+-I$(top_srcdir)/src/lib/ecore_x \
+@EINA_CFLAGS@ \
+@CHECK_CFLAGS@
+
+if EFL_ENABLE_TESTS
+
+noinst_PROGRAMS = ecore_suite
+
+check_PROGRAMS = ecore_suite
+
+ecore_suite_SOURCES = \
+ecore_suite.c \
+ecore_test_ecore.c \
+ecore_test_ecore_con.c \
+ecore_test_ecore_x.c
+
+ecore_suite_LDADD = \
+@CHECK_LIBS@ \
+$(top_builddir)/src/lib/ecore/libecore.la \
+$(top_builddir)/src/lib/ecore_con/libecore_con.la
+
+if BUILD_ECORE_X
+ecore_suite_LDADD += \
+$(top_builddir)/src/lib/ecore_x/libecore_x.la
+endif
+
+endif
+
+EXTRA_DIST = ecore_suite.h
diff --git a/src/tests/ecore_suite.c b/src/tests/ecore_suite.c
new file mode 100644 (file)
index 0000000..fd51750
--- /dev/null
@@ -0,0 +1,103 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <Ecore.h>
+
+#include "ecore_suite.h"
+
+typedef struct _Ecore_Test_Case Ecore_Test_Case;
+
+struct _Ecore_Test_Case
+{
+   const char *test_case;
+   void      (*build)(TCase *tc);
+};
+
+static const Ecore_Test_Case etc[] = {
+  { "Ecore", ecore_test_ecore },
+  { "Ecore_Con", ecore_test_ecore_con },
+  { "Ecore_X", ecore_test_ecore_x },
+  { NULL, NULL }
+};
+
+static void
+_list_tests(void)
+{
+  const Ecore_Test_Case *itr;
+
+   itr = etc;
+   fputs("Available Test Cases:\n", stderr);
+   for (; itr->test_case; itr++)
+     fprintf(stderr, "\t%s\n", itr->test_case);
+}
+static Eina_Bool
+_use_test(int argc, const char **argv, const char *test_case)
+{
+   if (argc < 1)
+     return 1;
+
+   for (; argc > 0; argc--, argv++)
+     if (strcmp(test_case, *argv) == 0)
+       return 1;
+   return 0;
+}
+
+static Suite *
+ecore_suite_build(int argc, const char **argv)
+{
+   TCase *tc;
+   Suite *s;
+   int i;
+
+   s = suite_create("Ecore");
+
+   for (i = 0; etc[i].test_case; ++i)
+     {
+       if (!_use_test(argc, argv, etc[i].test_case)) continue;
+       tc = tcase_create(etc[i].test_case);
+
+       etc[i].build(tc);
+
+       suite_add_tcase(s, tc);
+       tcase_set_timeout(tc, 0);
+     }
+
+   return s;
+}
+
+int
+main(int argc, char **argv)
+{
+   Suite *s;
+   SRunner *sr;
+   int i, failed_count;
+
+   for (i = 1; i < argc; i++)
+     if ((strcmp(argv[i], "-h") == 0) ||
+        (strcmp(argv[i], "--help") == 0))
+       {
+         fprintf(stderr, "Usage:\n\t%s [test_case1 .. [test_caseN]]\n",
+                 argv[0]);
+         _list_tests();
+         return 0;
+       }
+     else if ((strcmp(argv[i], "-l") == 0) ||
+             (strcmp(argv[i], "--list") == 0))
+       {
+         _list_tests();
+         return 0;
+       }
+
+   s = ecore_suite_build(argc - 1, (const char **)argv + 1);
+   sr = srunner_create(s);
+
+   srunner_run_all(sr, CK_ENV);
+   failed_count = srunner_ntests_failed(sr);
+   srunner_free(sr);
+
+   return (failed_count == 0) ? 0 : 255;
+}
diff --git a/src/tests/ecore_suite.h b/src/tests/ecore_suite.h
new file mode 100644 (file)
index 0000000..0c7dfef
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef _ECORE_SUITE_H
+#define _ECORE_SUITE_H
+
+#include <check.h>
+
+void ecore_test_ecore(TCase *tc);
+void ecore_test_ecore_con(TCase *tc);
+void ecore_test_ecore_x(TCase *tc);
+
+
+#endif /* _ECORE_SUITE_H */
diff --git a/src/tests/ecore_test_ecore.c b/src/tests/ecore_test_ecore.c
new file mode 100644 (file)
index 0000000..8fa9e9c
--- /dev/null
@@ -0,0 +1,366 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "ecore_suite.h"
+
+#include <Ecore.h>
+#include <Eina.h>
+#include <unistd.h>
+#include <stdio.h>
+
+static int _log_dom;
+#define INF(...) EINA_LOG_DOM_INFO(_log_dom, __VA_ARGS__)
+
+static Eina_Bool
+_quit_cb(void *data)
+{
+   Eina_Bool *val = data;
+   *val = EINA_TRUE;
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_dummy_cb(void *data)
+{
+   return !!data;
+}
+
+START_TEST(ecore_test_ecore_init)
+{
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Timer *timer;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   timer = ecore_timer_add(0.0, _quit_cb, &did);
+   fail_if(timer == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_idler)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Idler *idler;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   idler = ecore_idler_add(_quit_cb, &did);
+   fail_if(idler == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_idle_enterer)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Idle_Enterer *idle_enterer;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   idle_enterer = ecore_idle_enterer_add(_quit_cb, &did);
+   fail_if(idle_enterer == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_idle_exiter)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Timer *timer;
+   Ecore_Idle_Exiter *idle_exiter;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   /* make system exit idle */
+   timer = ecore_timer_add(0.0, _dummy_cb, (void *)(long)0);
+   fail_if(timer == NULL);
+
+   idle_exiter = ecore_idle_exiter_add(_quit_cb, &did);
+   fail_if(idle_exiter == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_main_loop_timer)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Timer *timer;
+   double start, end, elapsed;
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   timer = ecore_timer_add(2.0, _quit_cb, &did);
+   fail_if(timer == NULL);
+
+   start = ecore_time_get();
+   ecore_main_loop_begin();
+   end = ecore_time_get();
+   elapsed = end - start;
+
+   fail_if(did == EINA_FALSE);
+   fail_if(elapsed < 2.0);
+   fail_if(elapsed > 3.0); /* 1 second "error margin" */
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+static Eina_Bool _timer3(void *data)
+{
+   /* timer 3, do nothing */
+   return EINA_FALSE;
+}
+
+static Eina_Bool _timer2(void *data)
+{
+   /* timer 2, quit inner mainloop */
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+static Eina_Bool _timer1(void *data)
+{
+   /* timer 1, begin inner mainloop */
+   int *times = data;
+   (*times)++;
+
+   ecore_timer_add(0.3, _timer2, NULL);
+   ecore_timer_add(0.1, _timer3, NULL);
+   ecore_main_loop_begin();
+
+   ecore_main_loop_quit();
+
+   return EINA_FALSE;
+}
+
+START_TEST(ecore_test_ecore_main_loop_timer_inner)
+{
+   Ecore_Timer *timer;
+   int ret;
+   int times = 0;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   timer = ecore_timer_add(1.0, _timer1, &times);
+   fail_if(timer == NULL);
+
+   /* BEGIN: outer mainloop */
+   ecore_main_loop_begin();
+   /*END: outer mainloop */
+
+   fail_if(times != 1);
+}
+END_TEST
+
+static Eina_Bool
+_fd_handler_cb(void *data, Ecore_Fd_Handler *handler __UNUSED__)
+{
+   /* FIXME: why setting val if it is overwritten just after and what is its purpose ??? */
+   Eina_Bool *val = data;
+
+   *val = EINA_TRUE;
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+START_TEST(ecore_test_ecore_main_loop_fd_handler)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Fd_Handler *fd_handler;
+   int comm[2];
+   int ret;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   ret = pipe(comm);
+   fail_if(ret != 0);
+
+   fd_handler = ecore_main_fd_handler_add
+     (comm[0], ECORE_FD_READ, _fd_handler_cb, &did, NULL, NULL);
+   fail_if(fd_handler == NULL);
+
+   ret = write(comm[1], &did, 1);
+   fail_if(ret != 1);
+
+   ecore_main_loop_begin();
+
+   close(comm[0]);
+   close(comm[1]);
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+static Eina_Bool
+_event_handler_cb(void *data, int type __UNUSED__, void *event __UNUSED__)
+{
+   /* FIXME: why setting val if it is overwritten just after and what is its purpose ??? */
+   Eina_Bool *val = data;
+
+   *val = EINA_TRUE;
+   ecore_main_loop_quit();
+   return EINA_FALSE;
+}
+
+START_TEST(ecore_test_ecore_main_loop_event)
+{
+   Eina_Bool did = EINA_FALSE;
+   Ecore_Event_Handler *handler;
+   Ecore_Event *event;
+   int ret, type;
+
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+   type = ecore_event_type_new();
+   fail_if(type < 1);
+
+   handler = ecore_event_handler_add(type, _event_handler_cb, &did);
+   fail_if(handler == NULL);
+
+   event = ecore_event_add(type, NULL, NULL, NULL);
+   fail_if(event == NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(did == EINA_FALSE);
+
+   ret = ecore_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+static Eina_Bool
+_timer_quit_recursive(void *data)
+{
+   INF("   _timer_quit_recursive: begin");
+   ecore_main_loop_quit(); /* quits inner main loop */
+   INF("   _timer_quit_recursive: end");
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_event_recursive_cb(void *data, int type, void *event)
+{
+   Ecore_Event *e;
+   static int guard = 0;
+
+   /* If we enter this callback more than once, it's wrong! */
+   fail_if(guard != 0);
+   guard++;
+
+   INF("  event_recursive_cb: begin");
+
+   ecore_timer_add(1.0, _timer_quit_recursive, NULL);
+   INF("   add 1.0s timer (once) to trigger _timer_quit_recursive");
+
+   INF("   inner main loop begin (recurse)");
+   ecore_main_loop_begin();
+   INF("   inner main loop end (recurse)");
+
+   ecore_main_loop_quit(); /* quits outer main loop */
+
+   INF("   guard = %d", guard);
+   INF("  event_recursive_cb: end");
+   return EINA_FALSE;
+}
+
+
+START_TEST(ecore_test_ecore_main_loop_event_recursive)
+{
+   /* This test tests if the event handlers are really called only once when
+    * recursive main loops are used and any number of events may have occurred
+    * between the beginning and the end of recursive main loop.
+    */
+   Ecore_Event *e;
+   int type;
+   int ret;
+
+   _log_dom = eina_log_domain_register("test", EINA_COLOR_CYAN);
+
+   INF("main: begin");
+   ret = ecore_init();
+   fail_if(ret != 1);
+
+
+   type = ecore_event_type_new();
+   ecore_event_handler_add(type, _event_recursive_cb, NULL);
+   e = ecore_event_add(type, NULL, NULL, NULL);
+   INF(" add event to trigger cb1: event=%p", e);
+   INF(" main loop begin");
+   ecore_main_loop_begin();
+   INF(" main loop end");
+
+   INF("main: end");
+   ecore_shutdown();
+}
+END_TEST
+
+void ecore_test_ecore(TCase *tc)
+{
+   tcase_add_test(tc, ecore_test_ecore_init);
+   tcase_add_test(tc, ecore_test_ecore_main_loop);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_idler);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_idle_enterer);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_idle_exiter);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_timer);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_fd_handler);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_event);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_timer_inner);
+   tcase_add_test(tc, ecore_test_ecore_main_loop_event_recursive);
+}
diff --git a/src/tests/ecore_test_ecore_con.c b/src/tests/ecore_test_ecore_con.c
new file mode 100644 (file)
index 0000000..3eba612
--- /dev/null
@@ -0,0 +1,25 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Ecore_Con.h>
+
+#include "ecore_suite.h"
+
+
+START_TEST(ecore_test_ecore_con_init)
+{
+   int ret;
+
+   ret = ecore_con_init();
+   fail_if(ret != 1);
+
+   ret = ecore_con_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+void ecore_test_ecore_con(TCase *tc)
+{
+   tcase_add_test(tc, ecore_test_ecore_con_init);
+}
diff --git a/src/tests/ecore_test_ecore_x.c b/src/tests/ecore_test_ecore_x.c
new file mode 100644 (file)
index 0000000..4b9e126
--- /dev/null
@@ -0,0 +1,56 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Ecore_X.h>
+
+#include "ecore_suite.h"
+
+
+/* TODO: change to HAVE_ECORE_X when xcb implementation is done */
+#ifdef HAVE_ECORE_X_XLIB
+
+START_TEST(ecore_test_ecore_x_init)
+{
+   int ret;
+
+   ret = ecore_x_init(NULL);
+   fail_if(ret != 1);
+
+   ret = ecore_x_shutdown();
+   fail_if(ret != 0);
+}
+END_TEST
+
+START_TEST(ecore_test_ecore_x_bell)
+{
+   int i;
+   int ret;
+
+   ret = ecore_x_init(NULL);
+   fail_if(ret != 1);
+
+   printf("You should hear 3 beeps now.\n");
+   for (i = 0; i < 3; i++)
+     {
+       ret = ecore_x_bell(0);
+       fail_if(ret != EINA_TRUE);
+       ecore_x_sync();
+       sleep(1);
+     }
+
+   ecore_x_shutdown();
+}
+END_TEST
+
+#endif
+
+void ecore_test_ecore_x(TCase *tc)
+{
+
+/* TODO: change to HAVE_ECORE_X when xcb implementation is done */
+#ifdef HAVE_ECORE_X_XLIB
+   tcase_add_test(tc, ecore_test_ecore_x_init);
+   tcase_add_test(tc, ecore_test_ecore_x_bell);
+#endif
+}