From 19200a878ad53a37b6d6533037553fe9e6945473 Mon Sep 17 00:00:00 2001 From: plamot Date: Mon, 23 Feb 2015 14:44:48 +0100 Subject: [PATCH] eio: add unit tests for eio file and directory monitoring. this patch adds units test to check the behavior of eio file and directory monitoring module Signed-off-by: Cedric BAIL --- src/Makefile_Eio.am | 26 +++ src/tests/eio/eio_suite.c | 107 +++++++++ src/tests/eio/eio_suite.h | 8 + src/tests/eio/eio_test_monitor.c | 452 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 593 insertions(+) create mode 100644 src/tests/eio/eio_suite.c create mode 100644 src/tests/eio/eio_suite.h create mode 100644 src/tests/eio/eio_test_monitor.c diff --git a/src/Makefile_Eio.am b/src/Makefile_Eio.am index ff0f442..d314439 100644 --- a/src/Makefile_Eio.am +++ b/src/Makefile_Eio.am @@ -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 index 0000000..08deb05 --- /dev/null +++ b/src/tests/eio/eio_suite.c @@ -0,0 +1,107 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include + +#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 index 0000000..2212f8e --- /dev/null +++ b/src/tests/eio/eio_suite.h @@ -0,0 +1,8 @@ +#ifndef _EIO_SUITE_H +#define _EIO_SUITE_H + +#include + +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 index 0000000..c1f10a4 --- /dev/null +++ b/src/tests/eio/eio_test_monitor.c @@ -0,0 +1,452 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include + +#include +#include +#include + +#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); + +} -- 2.7.4