eio: add unit tests for eio file and directory monitoring.
authorplamot <pierre.lamot@openwide.fr>
Mon, 23 Feb 2015 13:44:48 +0000 (14:44 +0100)
committerCedric BAIL <cedric@osg.samsung.com>
Thu, 12 Mar 2015 06:43:58 +0000 (07:43 +0100)
this patch adds units test to check the behavior of eio file
and directory monitoring module

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
src/Makefile_Eio.am
src/tests/eio/eio_suite.c [new file with mode: 0644]
src/tests/eio/eio_suite.h [new file with mode: 0644]
src/tests/eio/eio_test_monitor.c [new file with mode: 0644]

index ff0f442..d314439 100644 (file)
@@ -30,3 +30,29 @@ lib_eio_libeio_la_CPPFLAGS = -I$(top_builddir)/src/lib/efl @EIO_CFLAGS@
 lib_eio_libeio_la_LIBADD = @EIO_LIBS@
 lib_eio_libeio_la_DEPENDENCIES = @EIO_INTERNAL_LIBS@
 lib_eio_libeio_la_LDFLAGS = @EFL_LTLIBRARY_FLAGS@
+
+if EFL_ENABLE_TESTS
+
+check_PROGRAMS += tests/eio/eio_suite
+TESTS += tests/eio/eio_suite
+
+tests_eio_eio_suite_SOURCES = \
+tests/eio/eio_suite.c \
+tests/eio/eio_test_monitor.c
+
+tests_eio_eio_suite_CPPFLAGS = -I$(top_builddir)/src/lib/efl \
+-DTESTS_SRC_DIR=\"$(top_srcdir)/src/tests/eio\" \
+-DTESTS_BUILD_DIR=\"$(top_builddir)/src/tests/eio\" \
+@CHECK_CFLAGS@ \
+@ECORE_FILE_CFLAGS@ \
+@EIO_CFLAGS@
+
+tests_eio_eio_suite_LDADD = \
+@CHECK_LIBS@ \
+@USE_ECORE_FILE_LIBS@ \
+@USE_EIO_LIBS@
+
+tests_eio_eio_suite_DEPENDENCIES = \
+@USE_EIO_INTERNAL_LIBS@
+
+endif
diff --git a/src/tests/eio/eio_suite.c b/src/tests/eio/eio_suite.c
new file mode 100644 (file)
index 0000000..08deb05
--- /dev/null
@@ -0,0 +1,107 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <Eio.h>
+
+#include "eio_suite.h"
+
+typedef struct _Eio_Test_Case Eio_Test_Case;
+
+struct _Eio_Test_Case
+{
+   const char *test_case;
+   void      (*build)(TCase *tc);
+};
+
+static const Eio_Test_Case etc[] = {
+  {"Eio_Monitor", eio_test_monitor},
+  {NULL, NULL}
+};
+
+static void
+_list_tests(void)
+{
+   const Eio_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 *
+eio_suite_build(int argc, const char **argv)
+{
+   TCase *tc;
+   Suite *s;
+   int i;
+
+   s = suite_create("Eio");
+
+   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;
+       }
+
+   putenv("EFL_RUN_IN_TREE=1");
+
+   s = eio_suite_build(argc - 1, (const char **)argv + 1);
+   sr = srunner_create(s);
+
+   srunner_set_xml(sr, TESTS_BUILD_DIR "/check-results.xml");
+
+   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/eio/eio_suite.h b/src/tests/eio/eio_suite.h
new file mode 100644 (file)
index 0000000..2212f8e
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef _EIO_SUITE_H
+#define _EIO_SUITE_H
+
+#include <check.h>
+
+void eio_test_monitor(TCase *tc);
+
+#endif /*  _EIO_SUITE_H */
diff --git a/src/tests/eio/eio_test_monitor.c b/src/tests/eio/eio_test_monitor.c
new file mode 100644 (file)
index 0000000..c1f10a4
--- /dev/null
@@ -0,0 +1,452 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <Eio.h>
+#include <Ecore.h>
+#include <Ecore_File.h>
+
+#include "eio_suite.h"
+
+/////////////////timeout function
+
+#define TEST_TIMEOUT_SEC 10
+#define TEST_OPERATION_DELAY 0.5
+
+static Ecore_Timer * test_timeout_timer;
+
+static Eina_Bool _test_timeout_cb(void* data EINA_UNUSED)
+{
+   ck_abort_msg("test timeout");
+   ecore_main_loop_quit();
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void _cancel_timeout()
+{
+   if (test_timeout_timer != NULL)
+     {
+        ecore_timer_del (test_timeout_timer);
+        test_timeout_timer = NULL;
+     }
+}
+
+///////////////// file and directory operations
+
+typedef struct {
+   const char* src;
+   const char* dst;
+} RenameOperation;
+
+static Eina_Bool _delete_directory(void* data)
+{
+   const char* dirname = (const char*)data;
+   if (ecore_file_is_dir(dirname))
+     {
+        ecore_file_recursive_rm(dirname);
+     }
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _create_directory(void* data)
+{
+   const char* dirname = (const char*)data;
+   ecore_file_mkpath(dirname);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+
+static Eina_Bool _create_file(void* data)
+{
+   FILE* fd = fopen((const char*)data, "w+");
+   ck_assert_ptr_ne(fd, NULL);
+   fprintf(fd, "test test");
+   fclose(fd);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _delete_file(void* data)
+{
+   Eina_Bool file_removed = ecore_file_remove((const char*)data);
+   ck_assert(file_removed);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _modify_file(void* data)
+{
+   FILE* fd = fopen((const char*)data, "a");
+   ck_assert_ptr_ne(fd, NULL);
+   fprintf(fd, "appened");
+   fclose(fd);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool _modify_attrib_file(void* data)
+{
+   int ret = chmod((const char*)data, 0666);
+   ck_assert_int_eq(ret, 0);
+   return ECORE_CALLBACK_CANCEL;
+}
+
+/////// helper functions
+
+static void _check_event_path(void* data, void* event)
+{
+   const char* expected_path = ecore_file_realpath((const char*)data);
+   const char* actual_path = ecore_file_realpath(((Eio_Monitor_Event*)event)->filename);
+   ck_assert_str_eq(actual_path, expected_path);
+}
+
+static Eina_Tmpstr* _common_init()
+{
+   Eina_Tmpstr* dirname;
+   fail_if(eio_init() != 1);
+   ecore_file_init();
+
+   //test timeout
+   test_timeout_timer = ecore_timer_add(TEST_TIMEOUT_SEC, _test_timeout_cb, NULL);
+
+   eina_file_mkdtemp("checkFileCreationXXXXXX", &dirname);
+   return dirname;
+}
+
+static void _common_shutdown(Eina_Tmpstr* dirname)
+{
+   _delete_directory((void*)dirname);
+   ecore_file_shutdown();
+   fail_if(eio_shutdown() != 0);
+   eina_tmpstr_del(dirname);
+}
+
+/////// tests monitoring a directory
+
+static void _file_created_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_FILE_CREATED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+
+START_TEST(eio_test_monitor_directory_file_created_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, (Ecore_Event_Handler_Cb)_file_created_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _create_file, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+static void _file_deleted_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_FILE_DELETED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+START_TEST(eio_test_monitor_directory_file_deleted_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_file((void*)filename);
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, (Ecore_Event_Handler_Cb)_file_deleted_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _delete_file, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+static void _file_modified_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_FILE_MODIFIED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+START_TEST(eio_test_monitor_directory_file_modified_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_file((void*)filename);
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, (Ecore_Event_Handler_Cb)_file_modified_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _modify_file, filename);
+
+   ecore_main_loop_begin();
+
+   //cleanup
+   _common_shutdown(dirname);
+}
+END_TEST
+
+static void _file_closed_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_FILE_CLOSED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+START_TEST(eio_test_monitor_directory_file_closed_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_file((void*)filename);
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_FILE_CLOSED, (Ecore_Event_Handler_Cb)_file_closed_cb, filename);
+   ecore_timer_add(TEST_OPERATION_DELAY, _modify_file, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+static void _directory_created_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_DIRECTORY_CREATED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+START_TEST(eio_test_monitor_directory_directory_created_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/dircreated", dirname);
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_DIRECTORY_CREATED, (Ecore_Event_Handler_Cb)_directory_created_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _create_directory, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+static void _directory_deleted_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_DIRECTORY_DELETED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+START_TEST(eio_test_monitor_directory_directory_deleted_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/dircreated", dirname);
+   _create_directory((void*)filename);
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_DIRECTORY_DELETED, (Ecore_Event_Handler_Cb)_directory_deleted_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _delete_directory, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+static void _directory_modified_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_DIRECTORY_MODIFIED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+
+START_TEST(eio_test_monitor_directory_directory_modified_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_directory((void*)filename);
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_DIRECTORY_MODIFIED, (Ecore_Event_Handler_Cb)_directory_modified_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _modify_attrib_file, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+
+static void _directory_self_deleted_cb(void* data, int type, void* event)
+{
+   ck_assert_int_eq(type, (int)EIO_MONITOR_SELF_DELETED);
+   _check_event_path(data, event);
+   _cancel_timeout();
+   ecore_main_loop_quit();
+}
+
+
+START_TEST(eio_test_monitor_directory_directory_self_deleted_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+
+   //monitor directory
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_SELF_DELETED, (Ecore_Event_Handler_Cb)_directory_self_deleted_cb, dirname);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _delete_directory, dirname);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+//////// test monitoring a single file
+
+START_TEST(eio_test_monitor_file_file_modified_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_file((void*)filename);
+
+   //monitor file
+   eio_monitor_add(filename);
+   ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, (Ecore_Event_Handler_Cb)_file_modified_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _modify_file, filename);
+
+   ecore_main_loop_begin();
+
+   //cleanup
+   _common_shutdown(dirname);
+}
+END_TEST
+
+START_TEST(eio_test_monitor_file_file_attrib_modified_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_file((void*)filename);
+
+   //monitor file
+   eio_monitor_add(filename);
+   ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, (Ecore_Event_Handler_Cb)_file_modified_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _modify_attrib_file, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+
+START_TEST(eio_test_monitor_file_file_closed_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_file((void*)filename);
+
+   //monitor file
+   eio_monitor_add(dirname);
+   ecore_event_handler_add(EIO_MONITOR_FILE_CLOSED, (Ecore_Event_Handler_Cb)_file_closed_cb, filename);
+   ecore_timer_add(TEST_OPERATION_DELAY, _modify_file, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+START_TEST(eio_test_monitor_file_file_self_deleted_notify)
+{
+   Eina_Tmpstr* dirname = _common_init();
+   Eina_Stringshare* filename;
+
+   filename = eina_stringshare_printf("%s/filecreated", dirname);
+   _create_file((void*)filename);
+
+   //monitor file
+   eio_monitor_add(filename);
+   ecore_event_handler_add(EIO_MONITOR_SELF_DELETED, (Ecore_Event_Handler_Cb)_directory_self_deleted_cb, filename);
+
+   ecore_timer_add(TEST_OPERATION_DELAY, _delete_file, filename);
+
+   ecore_main_loop_begin();
+
+   _common_shutdown(dirname);
+}
+END_TEST
+
+void eio_test_monitor(TCase *tc)
+{
+   tcase_add_test(tc, eio_test_monitor_directory_file_created_notify);
+   tcase_add_test(tc, eio_test_monitor_directory_file_deleted_notify);
+   tcase_add_test(tc, eio_test_monitor_directory_file_modified_notify);
+#ifndef _WIN32
+   tcase_add_test(tc, eio_test_monitor_directory_file_closed_notify);
+#endif
+   tcase_add_test(tc, eio_test_monitor_directory_directory_created_notify);
+   tcase_add_test(tc, eio_test_monitor_directory_directory_deleted_notify);
+   tcase_add_test(tc, eio_test_monitor_directory_directory_modified_notify);
+   tcase_add_test(tc, eio_test_monitor_directory_directory_self_deleted_notify);
+
+   tcase_add_test(tc, eio_test_monitor_file_file_modified_notify);
+   tcase_add_test(tc, eio_test_monitor_file_file_attrib_modified_notify);
+#ifndef _WIN32
+   tcase_add_test(tc, eio_test_monitor_file_file_closed_notify);
+#endif
+   tcase_add_test(tc, eio_test_monitor_file_file_self_deleted_notify);
+
+}