Suite: support multiple base directories

It is needed if, for example, rec and exu files are not stored in the
same place while an unique tests file is used.
This commit is contained in:
Daniel Zaoui 2018-05-13 11:26:38 +03:00
parent d049f0cc2c
commit 1f063e3715
1 changed files with 62 additions and 49 deletions

View File

@ -29,10 +29,10 @@ typedef enum
RUN_INIT RUN_INIT
} Run_Mode; } Run_Mode;
static unsigned short _running_jobs, _max_jobs; static unsigned short _running_jobs = 0, _max_jobs = 1;
static char *_base_dir; static Eina_List *_base_dirs = NULL;
static char *_dest_dir; static char *_dest_dir;
static char *_wrap_command; static char *_wrap_command = NULL;
static int _verbose = 0; static int _verbose = 0;
static Eina_Bool _scan_objs = EINA_FALSE; static Eina_Bool _scan_objs = EINA_FALSE;
@ -57,14 +57,27 @@ _printf(int verbose, const char *fmt, ...)
} }
#define CONFIG "ELM_SCALE=1 ELM_FINGER_SIZE=10" #define CONFIG "ELM_SCALE=1 ELM_FINGER_SIZE=10"
static void static Eina_Bool
_run_command_prepare(const List_Entry *ent, char *buf) _run_command_prepare(const List_Entry *ent, char *buf)
{ {
char scn_path[EXACTNESS_PATH_MAX]; char scn_path[EXACTNESS_PATH_MAX];
Eina_Strbuf *sbuf = eina_strbuf_new(); Eina_Strbuf *sbuf;
sprintf(scn_path, "%s/%s.exu", _base_dir, ent->name); const char *base_dir;
if (!ecore_file_exists(scn_path)) Eina_List *itr;
sprintf(scn_path, "%s/%s.rec", _base_dir, ent->name); EINA_LIST_FOREACH(_base_dirs, itr, base_dir)
{
sprintf(scn_path, "%s/%s.exu", base_dir, ent->name);
if (ecore_file_exists(scn_path)) goto ok;
else
{
sprintf(scn_path, "%s/%s.rec", base_dir, ent->name);
if (ecore_file_exists(scn_path)) goto ok;
}
}
fprintf(stderr, "Test %s not found in the provided base directories\n", ent->name);
return EINA_FALSE;
ok:
sbuf = eina_strbuf_new();
eina_strbuf_append_printf(sbuf, eina_strbuf_append_printf(sbuf,
"%s %s exactness_play %s %s%.*s %s-t '%s' ", "%s %s exactness_play %s %s%.*s %s-t '%s' ",
CONFIG, _wrap_command ? _wrap_command : "", CONFIG, _wrap_command ? _wrap_command : "",
@ -81,6 +94,7 @@ _run_command_prepare(const List_Entry *ent, char *buf)
strncpy(buf, eina_strbuf_string_get(sbuf), SCHEDULER_CMD_SIZE-1); strncpy(buf, eina_strbuf_string_get(sbuf), SCHEDULER_CMD_SIZE-1);
eina_strbuf_free(sbuf); eina_strbuf_free(sbuf);
_printf(1, "Command: %s\n", buf); _printf(1, "Command: %s\n", buf);
return EINA_TRUE;
} }
static Eina_Bool static Eina_Bool
@ -142,47 +156,46 @@ _job_consume()
{ {
static Ecore_Event_Handler *job_del_callback_handler = NULL; static Ecore_Event_Handler *job_del_callback_handler = NULL;
char buf[SCHEDULER_CMD_SIZE]; char buf[SCHEDULER_CMD_SIZE];
Ecore_Exe *exe;
List_Entry *ent = _next_test_to_run; List_Entry *ent = _next_test_to_run;
if (_running_jobs == _max_jobs) return EINA_FALSE; if (_running_jobs == _max_jobs) return EINA_FALSE;
if (!ent) return EINA_FALSE; if (!ent) return EINA_FALSE;
_running_jobs++; if (_run_command_prepare(ent, buf))
_tests_executed++;
_run_command_prepare(ent, buf);
switch (_mode)
{ {
case RUN_PLAY: _running_jobs++;
{ _tests_executed++;
_run_test_prefix_rm(CURRENT_SUBDIR, ent->name);
_printf(1, "Running %s\n", ent->name); switch (_mode)
break; {
} case RUN_PLAY:
case RUN_INIT: {
{ _run_test_prefix_rm(CURRENT_SUBDIR, ent->name);
_run_test_prefix_rm(ORIG_SUBDIR, ent->name); _printf(1, "Running %s\n", ent->name);
break; break;
} }
default: break; case RUN_INIT:
{
_run_test_prefix_rm(ORIG_SUBDIR, ent->name);
break;
}
default: break;
}
if (!job_del_callback_handler)
{
job_del_callback_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
_job_deleted_cb, NULL);
}
if (!ecore_exe_pipe_run(buf, ECORE_EXE_TERM_WITH_PARENT, ent))
{
fprintf(stderr, "Failed executing test '%s'\n", ent->name);
}
} }
if (!job_del_callback_handler)
{
job_del_callback_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
_job_deleted_cb, NULL);
}
exe = ecore_exe_pipe_run(buf, ECORE_EXE_TERM_WITH_PARENT, ent);
_next_test_to_run = EINA_INLIST_CONTAINER_GET( _next_test_to_run = EINA_INLIST_CONTAINER_GET(
EINA_INLIST_GET(ent)->next, List_Entry); EINA_INLIST_GET(ent)->next, List_Entry);
if (!exe)
{
fprintf(stderr, "Failed executing test '%s'\n", ent->name);
}
return EINA_TRUE; return EINA_TRUE;
} }
@ -361,7 +374,7 @@ static const Ecore_Getopt optdesc = {
"A pixel perfect test suite for EFL based applications.", "A pixel perfect test suite for EFL based applications.",
0, 0,
{ {
ECORE_GETOPT_STORE_STR('b', "base-dir", "The location of the exu/rec files."), ECORE_GETOPT_APPEND('b', "base-dir", "The location of the exu/rec files.", ECORE_GETOPT_TYPE_STR),
ECORE_GETOPT_STORE_STR('o', "output", "The location of the images."), ECORE_GETOPT_STORE_STR('o', "output", "The location of the images."),
ECORE_GETOPT_STORE_STR('w', "wrap", "Use a custom command to launch the tests (e.g valgrind)."), ECORE_GETOPT_STORE_STR('w', "wrap", "Use a custom command to launch the tests (e.g valgrind)."),
ECORE_GETOPT_STORE_USHORT('j', "jobs", "The number of jobs to run in parallel."), ECORE_GETOPT_STORE_USHORT('j', "jobs", "The number of jobs to run in parallel."),
@ -385,12 +398,14 @@ main(int argc, char *argv[])
int ret = 0; int ret = 0;
List_Entry *test_list; List_Entry *test_list;
int args = 0; int args = 0;
const char *list_file = ""; const char *list_file;
Eina_List *itr;
const char *base_dir;
char tmp[EXACTNESS_PATH_MAX]; char tmp[EXACTNESS_PATH_MAX];
Eina_Bool mode_play = EINA_FALSE, mode_init = EINA_FALSE, mode_simulation = EINA_FALSE; Eina_Bool mode_play = EINA_FALSE, mode_init = EINA_FALSE, mode_simulation = EINA_FALSE;
Eina_Bool want_quit = EINA_FALSE, scan_objs = EINA_FALSE; Eina_Bool want_quit = EINA_FALSE, scan_objs = EINA_FALSE;
Ecore_Getopt_Value values[] = { Ecore_Getopt_Value values[] = {
ECORE_GETOPT_VALUE_STR(_base_dir), ECORE_GETOPT_VALUE_LIST(_base_dirs),
ECORE_GETOPT_VALUE_STR(_dest_dir), ECORE_GETOPT_VALUE_STR(_dest_dir),
ECORE_GETOPT_VALUE_STR(_wrap_command), ECORE_GETOPT_VALUE_STR(_wrap_command),
ECORE_GETOPT_VALUE_USHORT(_max_jobs), ECORE_GETOPT_VALUE_USHORT(_max_jobs),
@ -410,11 +425,7 @@ main(int argc, char *argv[])
ecore_init(); ecore_init();
mode_play = mode_init = mode_simulation = EINA_FALSE; mode_play = mode_init = mode_simulation = EINA_FALSE;
want_quit = EINA_FALSE; want_quit = EINA_FALSE;
_base_dir = "./recordings";
_dest_dir = "./"; _dest_dir = "./";
_wrap_command = "";
_max_jobs = 1;
_verbose = 0;
_scan_objs = scan_objs; _scan_objs = scan_objs;
args = ecore_getopt_parse(&optdesc, values, argc, argv); args = ecore_getopt_parse(&optdesc, values, argc, argv);
@ -444,8 +455,9 @@ main(int argc, char *argv[])
goto end; goto end;
} }
list_file = argv[args]; if (!_base_dirs) _base_dirs = eina_list_append(NULL, "./recordings");
list_file = argv[args];
/* Load the list file and start iterating over the records. */ /* Load the list file and start iterating over the records. */
test_list = _list_file_load(list_file); test_list = _list_file_load(list_file);
@ -462,7 +474,9 @@ main(int argc, char *argv[])
fprintf(stderr, "Running with settings:\n"); fprintf(stderr, "Running with settings:\n");
fprintf(stderr, "\tConcurrent jobs: %d\n", _max_jobs); fprintf(stderr, "\tConcurrent jobs: %d\n", _max_jobs);
fprintf(stderr, "\tTest list: %s\n", list_file); fprintf(stderr, "\tTest list: %s\n", list_file);
fprintf(stderr, "\tBase dir: %s\n", _base_dir); fprintf(stderr, "\tBase dirs:\n");
EINA_LIST_FOREACH(_base_dirs, itr, base_dir)
fprintf(stderr, "\t\t%s\n", base_dir);
fprintf(stderr, "\tDest dir: %s\n", _dest_dir); fprintf(stderr, "\tDest dir: %s\n", _dest_dir);
if (mode_play) if (mode_play)
@ -538,7 +552,6 @@ main(int argc, char *argv[])
{ {
fprintf(report_file, fprintf(report_file,
"<h1>Tests that failed execution:</h1><ul>"); "<h1>Tests that failed execution:</h1><ul>");
Eina_List *itr;
List_Entry *ent; List_Entry *ent;
printf("List of tests that failed execution:\n"); printf("List of tests that failed execution:\n");
EINA_LIST_FOREACH(_errors, itr, ent) EINA_LIST_FOREACH(_errors, itr, ent)