From d02f99ee21f6920102ea23da5ecc438290c22752 Mon Sep 17 00:00:00 2001 From: Felipe Magno de Almeida Date: Thu, 9 Apr 2015 22:46:24 -0300 Subject: [PATCH] eio-model: Fix Eio model races in tests Removed sleep and implemented a deterministic way to test if the test has really finished. --- src/lib/eio/eio_model.c | 11 ++-- src/tests/eio/eio_model_test_file.c | 37 +++++-------- src/tests/eio/eio_model_test_monitor_add.c | 61 ++++++++++++++++++---- 3 files changed, 65 insertions(+), 44 deletions(-) diff --git a/src/lib/eio/eio_model.c b/src/lib/eio/eio_model.c index 0a93658331..6abddb284d 100644 --- a/src/lib/eio/eio_model.c +++ b/src/lib/eio/eio_model.c @@ -122,7 +122,7 @@ _eio_error_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, int error) { if (error != 0) { - ERR("%d: %s.", error, strerror(error)); + WRN("%d: %s.", error, strerror(error)); } } @@ -131,7 +131,7 @@ _eio_prop_set_error_cb(void *data EINA_UNUSED, Eio_File *handler EINA_UNUSED, in { if (error != 0) { - ERR("%d: %s.", error, strerror(error)); + WRN("%d: %s.", error, strerror(error)); } } @@ -432,7 +432,7 @@ _eio_error_children_load_cb(void *data, Eio_File *handler EINA_UNUSED, int error Eio_Model_Data *priv = data; Eo *child; - ERR("%d: %s.", error, strerror(error)); + WRN("%d: %s.", error, strerror(error)); EINA_LIST_FREE(priv->children_list, child) eo_unref(child); @@ -545,11 +545,6 @@ _eio_model_efl_model_base_child_del(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, E Eio_Model_Data *child_priv; EINA_SAFETY_ON_NULL_RETURN_VAL(child, EFL_MODEL_LOAD_STATUS_ERROR); - if (priv->children_list != NULL) - { - priv->children_list = eina_list_remove(priv->children_list, child); - } - child_priv = eo_data_scope_get(child, MY_CLASS); EINA_SAFETY_ON_NULL_RETURN_VAL(child_priv, EFL_MODEL_LOAD_STATUS_ERROR); diff --git a/src/tests/eio/eio_model_test_file.c b/src/tests/eio/eio_model_test_file.c index af5269d033..b54ef1592b 100644 --- a/src/tests/eio/eio_model_test_file.c +++ b/src/tests/eio/eio_model_test_file.c @@ -16,14 +16,6 @@ #define EFL_MODEL_TEST_FILENAME_PATH "/tmp" #define EFL_MODEL_MAX_TEST_CHILDS 16 -/** - * The following test works however - * it is going to rename (move) the original directory to - * new one so '/tmp' as root dir doesn't work , you'll need to use - * '/tmp/some_other_dir' as root instead. - */ -//#define _RUN_LOCAL_TEST - struct reqs_t { /* property change */ int changed_is_dir; @@ -44,6 +36,9 @@ struct reqs_t { int children; int child_add; int child_del; + + /* load status */ + int properties_loaded; }; static struct reqs_t reqs; @@ -72,7 +67,12 @@ _load_status_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *des printf("Children is Loaded\n"); if (st->status & EFL_MODEL_LOAD_STATUS_LOADED_PROPERTIES) - printf("Properties is Loaded\n"); + { + fprintf(stderr, "Properties are Loaded\n"); fflush(stderr); + if(!reqs.properties_loaded) + ecore_main_loop_quit(); + reqs.properties_loaded = 1; + } if ((st->status & EFL_MODEL_LOAD_STATUS_LOADED) == EFL_MODEL_LOAD_STATUS_LOADED) { @@ -104,8 +104,6 @@ _load_status_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *des /**< get full list */ eo_do(obj, status = efl_model_children_slice_get(0 ,0 ,(Eina_Accessor **)&accessor)); eina_accessor_free(accessor); - eo_do(obj, status = efl_model_children_slice_get(5 ,5 ,(Eina_Accessor **)&accessor)); - eina_accessor_free(accessor); ecore_main_loop_quit(); } return EINA_TRUE; @@ -155,15 +153,12 @@ START_TEST(eio_model_test_test_file) Eo *filemodel = NULL; const Eina_Value *value_prop; Efl_Model_Load_Status status; -#ifdef _RUN_LOCAL_TEST - Eina_Value nameset_value; -#endif Eina_Array *properties_list; Eina_Array_Iterator iterator; char *str; unsigned int i; - memset(&reqs, -1, sizeof(struct reqs_t)); + memset(&reqs, 0, sizeof(struct reqs_t)); fail_if(!eina_init(), "ERROR: Cannot init Eina!\n"); fail_if(!ecore_init(), "ERROR: Cannot init Ecore!\n"); @@ -180,6 +175,8 @@ START_TEST(eio_model_test_test_file) handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, exit_func, NULL); + ecore_main_loop_begin(); + eo_do(filemodel, status = efl_model_property_get("filename", &value_prop)); str = eina_value_to_string(value_prop); printf("efl_model_test filename %s, load status %d\n", str, status); @@ -207,16 +204,6 @@ START_TEST(eio_model_test_test_file) ecore_main_loop_begin(); -#ifdef _RUN_LOCAL_TEST - eina_value_setup(&nameset_value, EINA_VALUE_TYPE_STRING); - eina_value_setup(&value_prop, EINA_VALUE_TYPE_STRING); - eina_value_set(&nameset_value, "/tmp/efl_model_test"); - eo_do(filemodel, efl_model_property_set("path", &nameset_value)); - eina_value_flush(&nameset_value); - eo_do(filemodel, status = efl_model_property_get("path", &value_prop)); -#endif - - sleep(1); /**< EIO is asynchrounous so I must give some time for deletions to execute */ eo_unref(filemodel); ecore_shutdown(); eina_shutdown(); diff --git a/src/tests/eio/eio_model_test_monitor_add.c b/src/tests/eio/eio_model_test_monitor_add.c index af95ae8f75..11d9e172a3 100644 --- a/src/tests/eio/eio_model_test_monitor_add.c +++ b/src/tests/eio/eio_model_test_monitor_add.c @@ -13,9 +13,9 @@ #include -#define EFL_MODEL_TEST_FILENAME_PATH "/tmp" - Eina_Bool children_added = EINA_FALSE; +Eina_Tmpstr* temp_filename = NULL; +const char* tmpdir = NULL; static Eina_Bool _load_monitor_status_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info) @@ -28,24 +28,49 @@ _load_monitor_status_cb(void *data, Eo *obj, const Eo_Event_Description *desc EI if (!(st->status & EFL_MODEL_LOAD_STATUS_LOADED_PROPERTIES)) return EINA_TRUE; - eo_do(obj, efl_model_property_get("filename", &value_prop)); + eo_do(obj, efl_model_property_get("path", &value_prop)); fail_if(!value_prop, "ERROR: Cannot get property!\n"); str = eina_value_to_string(value_prop); fail_if(!str, "ERROR: Cannot convert value to string!\n"); fprintf(stderr, "new children filename %s\n", str); - if(strcmp(str, "test_file_monitor_add") == 0) + if(strcmp(str, temp_filename) == 0) { fprintf(stderr, "is child that we want\n"); eo_do(obj, eo_event_callback_del(EFL_MODEL_BASE_EVENT_LOAD_STATUS, _load_monitor_status_cb, data)); children_added = EINA_TRUE; eo_do(parent, efl_model_child_del(obj)); - ecore_main_loop_quit(); } return EINA_FALSE; } +static Eina_Bool +_children_removed_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void* event_info EINA_UNUSED) +{ + if(children_added) + { + Efl_Model_Children_Event* evt = event_info; + + Eina_Bool b; + eo_do(evt->child, b = efl_model_load_status_get() & EFL_MODEL_LOAD_STATUS_LOADED_PROPERTIES); + if(b) + { + const Eina_Value* value_prop = NULL; + const char* str = NULL; + + eo_do(evt->child, efl_model_property_get("path", &value_prop)); + fail_if(!value_prop, "ERROR: Cannot get property!\n"); + + str = eina_value_to_string(value_prop); + fail_if(!str, "ERROR: Cannot convert value to string!\n"); + if(strcmp(str, temp_filename) == 0) + ecore_main_loop_quit(); + } + } + return EINA_TRUE; +} + static Eina_Bool _children_added_cb(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info) { @@ -67,6 +92,7 @@ _children_count_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description * Efl_Model_Load_Status status; Eo *child; unsigned int i = 0; + int fd = 0; fprintf(stderr, "Children count number=%d\n", *len); @@ -78,7 +104,10 @@ _children_count_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description * fprintf(stdout, "Got %d childs from Accessor. status=%d\n", i, status); } - fclose(fopen(EFL_MODEL_TEST_FILENAME_PATH "/test_file_monitor_add", "w+")); + if((fd = eina_file_mkstemp("prefixXXXXXX.ext", &temp_filename)) > 0) + { + close(fd); + } return EINA_TRUE; } @@ -93,20 +122,30 @@ START_TEST(eio_model_test_test_monitor_add) fail_if(!ecore_init(), "ERROR: Cannot init Ecore!\n"); fail_if(!eio_init(), "ERROR: Cannot init EIO!\n"); - filemodel = eo_add(EIO_MODEL_CLASS, NULL, eio_model_path_set(EFL_MODEL_TEST_FILENAME_PATH)); +#ifndef HAVE_EVIL +#if defined(HAVE_GETUID) && defined(HAVE_GETEUID) + if (getuid() == geteuid()) +#endif + { + tmpdir = getenv("TMPDIR"); + if (!tmpdir) tmpdir = getenv("XDG_RUNTIME_DIR"); + } + if (!tmpdir) tmpdir = "/tmp"; +#else + tmpdir = (char *)evil_tmpdir_get(); +#endif /* ! HAVE_EVIL */ + + filemodel = eo_add(EIO_MODEL_CLASS, NULL, eio_model_path_set(tmpdir)); fail_if(!filemodel, "ERROR: Cannot init model!\n"); eo_do(filemodel, eo_event_callback_add(EFL_MODEL_BASE_EVENT_CHILD_ADDED, _children_added_cb, NULL)); + eo_do(filemodel, eo_event_callback_add(EFL_MODEL_BASE_EVENT_CHILD_REMOVED, _children_removed_cb, NULL)); eo_do(filemodel, eo_event_callback_add(EFL_MODEL_BASE_EVENT_CHILDREN_COUNT_CHANGED, _children_count_cb, NULL)); eo_do(filemodel, efl_model_load()); ecore_main_loop_begin(); - sleep(1); /**< EIO is asynchrounous so I must give some time for deletions to execute */ - - ecore_main_loop_iterate(); /**< Give time to unlink file */ - eo_unref(filemodel); eio_shutdown();