summaryrefslogtreecommitdiff
path: root/src/tests/eio/eio_test_job.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests/eio/eio_test_job.c')
-rw-r--r--src/tests/eio/eio_test_job.c287
1 files changed, 287 insertions, 0 deletions
diff --git a/src/tests/eio/eio_test_job.c b/src/tests/eio/eio_test_job.c
new file mode 100644
index 0000000000..1751436d02
--- /dev/null
+++ b/src/tests/eio/eio_test_job.c
@@ -0,0 +1,287 @@
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <Ecore.h>
+#include <Ecore_File.h>
+#include <Eio.h>
+
+#include "eio_suite.h"
+#include "eio_test_common.h"
+
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
+static int test_count = 0;
+
+static int DONE_CALLED = 0xdeadbeef;
+
+static void
+_filter_direct_cb(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ Eio_Filter_Direct_Data *event_info = event->info;
+ char *last_slash = strrchr(event_info->info->path, '/');
+
+ //Check if it is a hidden file
+ if (last_slash != NULL && strlen(last_slash) > 1 && last_slash[1] == '.')
+ event_info->filter = EINA_FALSE;
+ else
+ event_info->filter = EINA_TRUE;
+}
+
+static void
+_main_direct_cb(void *data, const Eina_File_Direct_Info *info)
+{
+ int *number_of_listed_files = (int *)data;
+
+ fprintf(stderr, "Processing file:%s\n", info->path);
+ (*number_of_listed_files)++;
+}
+
+static void
+_filter_cb(void *data EINA_UNUSED, const Eo_Event *event)
+{
+ Eio_Filter_Name_Data *event_info = event->info;
+ char *last_slash = strrchr(event_info->file, '/');
+
+ //Check if it is a hidden file
+ if (last_slash != NULL && strlen(last_slash) > 1 && last_slash[1] == '.')
+ event_info->filter = EINA_FALSE;
+ else
+ event_info->filter = EINA_TRUE;
+}
+
+static void
+_main_cb(void *data, const char *file)
+{
+ int *number_of_listed_files = (int *)data;
+
+ fprintf(stderr, "Processing file:%s\n", file);
+ (*number_of_listed_files)++;
+}
+
+static void
+_done_cb(void *data, Eio_File *handler EINA_UNUSED)
+{
+ int *number_of_listed_files = (int *)data;
+ fail_if((*number_of_listed_files) != test_count);
+ *number_of_listed_files = DONE_CALLED;
+ ecore_main_loop_quit();
+}
+
+static void
+_error_cb(void *data EINA_UNUSED, Eina_Error *error)
+{
+ const char *msg = eina_error_msg_get(*error);
+ EINA_LOG_ERR("error: %s", msg);
+ ecore_main_loop_quit();
+}
+
+static void
+_open_done_cb(void *data, Eina_File **file)
+{
+ Eina_Bool *opened = (Eina_Bool *)data;
+ *opened = EINA_TRUE;
+ eina_file_close(*file);
+ ecore_main_loop_quit();
+}
+
+static void
+_stat_done_cb(void *data, const Eina_Stat **stat)
+{
+ Eina_Bool *is_dir = (Eina_Bool *)data;
+ unsigned int rights;
+ fail_if(eio_file_is_dir(*stat) != *is_dir);
+ fail_if(eio_file_is_lnk(*stat));
+ rights = (*stat)->mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+ fail_if(rights != default_rights);
+ ecore_main_loop_quit();
+}
+
+typedef void (*Eio_Job_Test_Stat_Ls_Func)(Eo *job, const char *path, Eina_Promise **promise);
+
+static void
+_do_ls_test(Eio_Job_Test_Stat_Ls_Func ls_func,
+ const Eo_Event_Description *event,
+ Eo_Event_Cb filter_cb,
+ Eina_Promise_Progress_Cb progress_cb,
+ int expected_test_count,
+ const char* test_dirname)
+{
+ int main_files = 0;
+
+ Eio_Job *job = eo_add(EIO_JOB_CLASS, NULL);
+ Eina_Promise *promise = NULL;
+
+ eo_event_callback_add(job, event, filter_cb, NULL);
+ ls_func(job, test_dirname, &promise);
+ test_count = expected_test_count;
+ eina_promise_progress_cb_add(promise, progress_cb, &main_files, NULL);
+ eina_promise_then(promise,
+ (Eina_Promise_Cb)&_done_cb,
+ (Eina_Promise_Error_Cb)&_error_cb,
+ &main_files);
+
+ ecore_main_loop_begin();
+
+ fail_if(main_files != DONE_CALLED);
+
+ eo_unref(job);
+}
+
+static void
+_do_direct_ls_test(Eio_Job_Test_Stat_Ls_Func ls_func,
+ int expected_test_count,
+ const char *test_dirname)
+{
+ _do_ls_test(ls_func,
+ EIO_JOB_EVENT_FILTER_DIRECT,
+ (Eo_Event_Cb)&_filter_direct_cb,
+ (Eina_Promise_Progress_Cb)&_main_direct_cb,
+ expected_test_count,
+ test_dirname);
+}
+
+START_TEST(eio_job_test_file_direct_stat)
+{
+ Eina_Bool is_dir;
+ int ret;
+
+ ret = ecore_init();
+ fail_if(ret < 1);
+ ret = eio_init();
+ fail_if(ret < 1);
+ ret = eina_init();
+ fail_if(ret < 1);
+ ret = ecore_file_init();
+ fail_if(ret < 1);
+
+ Eina_Tmpstr *test_dirname = get_eio_test_file_tmp_dir();
+ Eina_Tmpstr *nested_dirname = create_test_dirs(test_dirname);
+ Eina_Tmpstr *nested_filename = get_full_path(test_dirname, files[3]);
+
+ Eio_Job *job = eo_add(EIO_JOB_CLASS, NULL);
+ Eina_Promise *promise = NULL;
+ // Start testing
+ is_dir = EINA_TRUE;
+
+ eio_job_file_direct_stat(job, nested_dirname, &promise);
+ eina_promise_then(promise, (Eina_Promise_Cb)&_stat_done_cb, (Eina_Promise_Error_Cb)&_error_cb, &is_dir);
+ ecore_main_loop_begin();
+
+ is_dir = EINA_FALSE;
+ eio_job_file_direct_stat(job, nested_filename, &promise);
+ eina_promise_then(promise, (Eina_Promise_Cb)&_stat_done_cb, (Eina_Promise_Error_Cb)&_error_cb, &is_dir);
+ ecore_main_loop_begin();
+ eo_unref(job);
+
+ // Cleanup
+ fail_if(!ecore_file_recursive_rm(test_dirname));
+
+ eina_tmpstr_del(nested_dirname);
+ eina_tmpstr_del(test_dirname);
+ eina_tmpstr_del(nested_filename);
+ ecore_file_shutdown();
+ eina_shutdown();
+ eio_shutdown();
+ ecore_shutdown();
+}
+END_TEST
+
+START_TEST(eio_job_test_ls_funcs)
+{
+ int ret;
+
+ ret = ecore_init();
+ fail_if(ret < 1);
+ ret = eio_init();
+ fail_if(ret < 1);
+ ret = eina_init();
+ fail_if(ret < 1);
+ ret = ecore_file_init();
+ fail_if(ret < 1);
+
+ Eina_Tmpstr *test_dirname = get_eio_test_file_tmp_dir();
+ Eina_Tmpstr *nested_dirname = create_test_dirs(test_dirname);
+ Eina_Tmpstr *nested_filename = get_full_path(test_dirname, files[3]);
+
+ // Start testing
+
+ _do_ls_test(&eio_job_file_ls,
+ EIO_JOB_EVENT_FILTER_NAME,
+ (Eo_Event_Cb)&_filter_cb,
+ (Eina_Promise_Progress_Cb)&_main_cb,
+ 5,
+ test_dirname);
+
+ _do_direct_ls_test(&eio_job_file_stat_ls, 5, test_dirname);
+
+ _do_direct_ls_test(&eio_job_file_direct_ls, 5, test_dirname);
+
+ _do_direct_ls_test(&eio_job_dir_stat_ls, 8, test_dirname);
+
+ _do_direct_ls_test(&eio_job_dir_direct_ls, 8, test_dirname);
+
+ // Cleanup
+ fail_if(!ecore_file_recursive_rm(test_dirname));
+
+ eina_tmpstr_del(nested_dirname);
+ eina_tmpstr_del(test_dirname);
+ eina_tmpstr_del(nested_filename);
+ ecore_file_shutdown();
+ eina_shutdown();
+ eio_shutdown();
+ ecore_shutdown();
+}
+END_TEST
+
+START_TEST(eio_job_test_open)
+{
+ Eina_Bool opened_file;
+ int ret;
+
+ ret = ecore_init();
+ fail_if(ret < 1);
+ ret = eio_init();
+ fail_if(ret < 1);
+ ret = eina_init();
+ fail_if(ret < 1);
+ ret = ecore_file_init();
+ fail_if(ret < 1);
+
+ Eina_Tmpstr *test_dirname = get_eio_test_file_tmp_dir();
+ Eina_Tmpstr *nested_dirname = create_test_dirs(test_dirname);
+ Eina_Tmpstr *nested_filename = get_full_path(test_dirname, files[3]);
+
+ opened_file = EINA_FALSE;
+ Eio_Job *job = eo_add(EIO_JOB_CLASS, NULL);
+ Eina_Promise *promise = NULL;
+
+ eio_job_file_open(job, nested_filename, EINA_FALSE, &promise);
+ eina_promise_then(promise, (Eina_Promise_Cb)&_open_done_cb, (Eina_Promise_Error_Cb)&_error_cb, &opened_file);
+ ecore_main_loop_begin();
+ eo_unref(job);
+ fail_if(!opened_file);
+
+ // Cleanup
+ fail_if(!ecore_file_recursive_rm(test_dirname));
+
+ eina_tmpstr_del(nested_dirname);
+ eina_tmpstr_del(test_dirname);
+ eina_tmpstr_del(nested_filename);
+ ecore_file_shutdown();
+ eina_shutdown();
+ eio_shutdown();
+ ecore_shutdown();
+}
+END_TEST
+
+void
+eio_test_job(TCase *tc)
+{
+ tcase_add_test(tc, eio_job_test_ls_funcs);
+ tcase_add_test(tc, eio_job_test_file_direct_stat);
+ tcase_add_test(tc, eio_job_test_open);
+}
+; \ No newline at end of file