X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/07c319ec54d6fc778ee3cc5e75a747242006723e..fc4b0d44a9da64f74e4df9f56d8f1d5dd3a2bad4:/tools/tesh/run_context.c diff --git a/tools/tesh/run_context.c b/tools/tesh/run_context.c index 41af0d5efd..f58c80edc9 100644 --- a/tools/tesh/run_context.c +++ b/tools/tesh/run_context.c @@ -13,6 +13,7 @@ #include #include #include +#include /* floor */ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh); @@ -52,7 +53,7 @@ static void *armageddon_sigwaiter(_XBT_GNUC_UNUSED void *arg) /* Wait for ending signal... */ xbt_os_cond_wait(sigwaiter_cond, sigwaiter_mutex); if (armageddon_requested) { - ERROR2("Test suite `%s': caught signal %d", testsuite_name, caught_signum); + XBT_ERROR("Test suite `%s': caught signal %d", testsuite_name, caught_signum); rctx_armageddon(rctx, 3); } xbt_os_mutex_release(sigwaiter_mutex); @@ -61,7 +62,7 @@ static void *armageddon_sigwaiter(_XBT_GNUC_UNUSED void *arg) static void wait_it(rctx_t rctx) { - VERB2("Join thread %p which were running background cmd <%s>", + XBT_VERB("Join thread %p which were running background cmd <%s>", rctx->runner, rctx->filepos); xbt_os_thread_join(rctx->runner, NULL); } @@ -78,7 +79,7 @@ void rctx_init(void) struct sigaction newact; int i; fg_job = 0; - bg_jobs = xbt_dynar_new_sync(sizeof(rctx_t), kill_it); + bg_jobs = xbt_dynar_new(sizeof(rctx_t), kill_it); armageddon_mutex = xbt_os_mutex_init(); armageddon_initiator = NULL; sigwaiter_mutex = xbt_os_mutex_init(); @@ -115,7 +116,7 @@ void rctx_wait_bg(void) { /* Do not use xbt_dynar_free or it will lock the dynar, preventing armageddon * from working */ - while (xbt_dynar_length(bg_jobs)) { + while (!xbt_dynar_is_empty(bg_jobs)) { rctx_t rctx = xbt_dynar_getlast_as(bg_jobs, rctx_t); wait_it(rctx); xbt_dynar_pop(bg_jobs, &rctx); @@ -128,12 +129,15 @@ static void rctx_armageddon_kill_one(rctx_t initiator, const char *filepos, rctx_t rctx) { if (rctx != initiator) { - INFO2("Kill <%s> because <%s> failed", rctx->filepos, filepos); + XBT_INFO("Kill <%s> because <%s> failed", rctx->filepos, filepos); xbt_os_mutex_acquire(rctx->interruption); if (!rctx->reader_done) { rctx->interrupted = 1; kill(rctx->pid, SIGTERM); - usleep(100); + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (100e-6 - floor(100e-6)) * 1e9; + nanosleep (&ts, NULL); kill(rctx->pid, SIGKILL); } xbt_os_mutex_release(rctx->interruption); @@ -147,14 +151,14 @@ void rctx_armageddon(rctx_t initiator, int exitcode) const char *filepos = initiator && initiator->filepos ? initiator->filepos : "(master)"; - DEBUG2("Armageddon request by <%s> (exit=%d)", filepos, exitcode); + XBT_DEBUG("Armageddon request by <%s> (exit=%d)", filepos, exitcode); xbt_os_mutex_acquire(armageddon_mutex); if (armageddon_initiator != NULL) { - VERB0("Armageddon already started. Let it go"); + XBT_VERB("Armageddon already started. Let it go"); xbt_os_mutex_release(armageddon_mutex); return; } - DEBUG1("Armageddon request by <%s> got the lock. Let's go amok", + XBT_DEBUG("Armageddon request by <%s> got the lock. Let's go amok", filepos); armageddon_initiator = initiator; xbt_os_mutex_release(armageddon_mutex); @@ -169,13 +173,16 @@ void rctx_armageddon(rctx_t initiator, int exitcode) } /* Give runner threads a chance to acknowledge the processes deaths */ - usleep(10000); + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (10000e-6 - floor(10000e-6)) * 1e9; + nanosleep (&ts, NULL); /* Ensure that nobody is running rctx_wait on exit */ if (fg_job) xbt_os_mutex_acquire(rctx->interruption); xbt_dynar_foreach(bg_jobs, cursor, job) xbt_os_mutex_acquire(job->interruption); - VERB0("Shut everything down!"); + XBT_VERB("Shut everything down!"); exit(exitcode); } @@ -189,14 +196,12 @@ void rctx_empty(rctx_t rc) char **env_it; void *filepos; - if (rc->cmd) - free(rc->cmd); + free(rc->cmd); rc->cmd = NULL; /* avoid race with rctx_armageddon log messages */ filepos = rc->filepos; rc->filepos = NULL; - if (filepos) - free(filepos); + free(filepos); for (i = 0, env_it = environ; *env_it; i++, env_it++); if (rc->env) { for (env_it = rctx->env + i; *env_it; env_it++) @@ -236,15 +241,13 @@ rctx_t rctx_new() void rctx_free(rctx_t rctx) { - DEBUG1("RCTX: Free %p", rctx); + XBT_DEBUG("RCTX: Free %p", rctx); rctx_dump(rctx, "free"); if (!rctx) return; - if (rctx->cmd) - free(rctx->cmd); - if (rctx->filepos) - free(rctx->filepos); + free(rctx->cmd); + free(rctx->filepos); if (rctx->env) { int i; char **env_it; @@ -262,12 +265,12 @@ void rctx_free(rctx_t rctx) void rctx_dump(rctx_t rctx, const char *str) { - DEBUG9("%s RCTX %p={in%p={%d,%10s}, want={%d,%10s}, out={%d,%10s}}", + XBT_DEBUG("%s RCTX %p={in%p={%d,%10s}, want={%d,%10s}, out={%d,%10s}}", str, rctx, rctx->input, rctx->input->used, rctx->input->data, rctx->output_wanted->used, rctx->output_wanted->data, rctx->output_got->used, rctx->output_got->data); - DEBUG5("%s RCTX %p=[cmd%p=%10s, pid=%d]", + XBT_DEBUG("%s RCTX %p=[cmd%p=%10s, pid=%d]", str, rctx, rctx->cmd, rctx->cmd, rctx->pid); } @@ -284,16 +287,16 @@ void rctx_pushline(const char *filepos, char kind, char *line) case '&': if (rctx->cmd) { if (!rctx->is_empty) { - ERROR2 + XBT_ERROR ("[%s] More than one command in this chunk of lines (previous: %s).\n" " Cannot guess which input/output belongs to which command.", filepos, rctx->cmd); - ERROR1("Test suite `%s': NOK (syntax error)", testsuite_name); + XBT_ERROR("Test suite `%s': NOK (syntax error)", testsuite_name); rctx_armageddon(rctx, 1); return; } rctx_start(); - VERB1("[%s] More than one command in this chunk of lines", filepos); + XBT_VERB("[%s] More than one command in this chunk of lines", filepos); } if (kind == '&') rctx->is_background = 1; @@ -302,7 +305,12 @@ void rctx_pushline(const char *filepos, char kind, char *line) rctx->cmd = xbt_strdup(line); rctx->filepos = xbt_strdup(filepos); - INFO3("[%s] %s%s", filepos, rctx->cmd, + if (option){ + char *newcmd = bprintf("%s %s", rctx->cmd, option); + free(rctx->cmd); + rctx->cmd = newcmd; + } + XBT_INFO("[%s] %s%s", filepos, rctx->cmd, ((rctx->is_background) ? " (background command)" : "")); break; @@ -317,6 +325,7 @@ void rctx_pushline(const char *filepos, char kind, char *line) rctx->is_empty = 0; xbt_strbuff_append(rctx->output_wanted, line); xbt_strbuff_append(rctx->output_wanted, "\n"); + XBT_DEBUG("wanted:%s",rctx->output_wanted->data); break; case '!': @@ -324,50 +333,53 @@ void rctx_pushline(const char *filepos, char kind, char *line) rctx_start(); if (!strncmp(line, "timeout no", strlen("timeout no"))) { - VERB1("[%s] (disable timeout)", filepos); + XBT_VERB("[%s] (disable timeout)", filepos); timeout_value = -1; } else if (!strncmp(line, "timeout ", strlen("timeout "))) { timeout_value = atoi(line + strlen("timeout")); - VERB2("[%s] (new timeout value: %d)", filepos, timeout_value); + XBT_VERB("[%s] (new timeout value: %d)", filepos, timeout_value); } else if (!strncmp(line, "expect signal ", strlen("expect signal "))) { rctx->expected_signal = strdup(line + strlen("expect signal ")); xbt_str_trim(rctx->expected_signal, " \n"); - VERB2("[%s] (next command must raise signal %s)", + XBT_VERB("[%s] (next command must raise signal %s)", filepos, rctx->expected_signal); } else if (!strncmp(line, "expect return ", strlen("expect return "))) { rctx->expected_return = atoi(line + strlen("expect return ")); - VERB2("[%s] (next command must return code %d)", + XBT_VERB("[%s] (next command must return code %d)", filepos, rctx->expected_return); } else if (!strncmp(line, "output sort", strlen("output sort"))) { + sort_len = atoi(line + strlen("output sort")); + if (sort_len==0) + sort_len=SORT_LEN_DEFAULT; rctx->output_sort = 1; - VERB1("[%s] (sort output of next command)", filepos); + XBT_VERB("[%s] (sort output of next command)", filepos); } else if (!strncmp(line, "output ignore", strlen("output ignore"))) { rctx->output = e_output_ignore; - VERB1("[%s] (ignore output of next command)", filepos); + XBT_VERB("[%s] (ignore output of next command)", filepos); } else if (!strncmp(line, "output display", strlen("output display"))) { rctx->output = e_output_display; - VERB1("[%s] (ignore output of next command)", filepos); + XBT_VERB("[%s] (ignore output of next command)", filepos); } else if (!strncmp(line, "setenv ", strlen("setenv "))) { int len = strlen("setenv "); char *eq = strchr(line + len, '='); char *key = bprintf("%.*s", (int) (eq - line - len), line + len); - xbt_dict_set(env, key, xbt_strdup(eq + 1), xbt_free_f); + xbt_dict_set(env, key, xbt_strdup(eq + 1), NULL); free(key); rctx->env = realloc(rctx->env, ++(rctx->env_size) * sizeof(char *)); rctx->env[rctx->env_size - 2] = xbt_strdup(line + len); rctx->env[rctx->env_size - 1] = NULL; - VERB2("[%s] setenv %s", filepos, line + len); + XBT_VERB("[%s] setenv %s", filepos, line + len); } else { - ERROR2("%s: Malformed metacommand: %s", filepos, line); - ERROR1("Test suite `%s': NOK (syntax error)", testsuite_name); + XBT_ERROR("%s: Malformed metacommand: %s", filepos, line); + XBT_ERROR("Test suite `%s': NOK (syntax error)", testsuite_name); rctx_armageddon(rctx, 1); return; } @@ -388,7 +400,7 @@ static void *thread_writer(void *r) rctx_t rctx = (rctx_t) r; for (posw = 0; posw < rctx->input->used && !rctx->brokenpipe;) { int got; - DEBUG1("Still %d chars to write", rctx->input->used - posw); + XBT_DEBUG("Still %d chars to write", rctx->input->used - posw); got = write(rctx->child_to, rctx->input->data + posw, rctx->input->used - posw); @@ -399,15 +411,19 @@ static void *thread_writer(void *r) rctx->brokenpipe = 1; } else if (errno != EINTR && errno != EAGAIN && errno != EPIPE) { perror("Error while writing input to child"); - ERROR1("Test suite `%s': NOK (system error)", testsuite_name); + XBT_ERROR("Test suite `%s': NOK (system error)", testsuite_name); rctx_armageddon(rctx, 4); return NULL; } } - DEBUG1("written %d chars so far", posw); + XBT_DEBUG("written %d chars so far", posw); - if (got <= 0) - usleep(100); + if (got <= 0){ + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (100e-6 - floor(100e-6)) * 1e9; + nanosleep (&ts, NULL); + } } rctx->input->data[0] = '\0'; rctx->input->used = 0; @@ -426,7 +442,7 @@ static void *thread_reader(void *r) posr = read(rctx->child_from, buffout, 4095); if (posr < 0 && errno != EINTR && errno != EAGAIN) { perror("Error while reading output of child"); - ERROR1("Test suite `%s': NOK (system error)", testsuite_name); + XBT_ERROR("Test suite `%s': NOK (system error)", testsuite_name); rctx_armageddon(rctx, 4); return NULL; } @@ -434,7 +450,10 @@ static void *thread_reader(void *r) buffout[posr] = '\0'; xbt_strbuff_append(rctx->output_got, buffout); } else { - usleep(100); + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (100e-6 - floor(100e-6)) * 1e9; + nanosleep (&ts, NULL); } } while (!rctx->timeout && posr != 0); free(buffout); @@ -446,7 +465,7 @@ static void *thread_reader(void *r) ("(%s) Cannot wait for the child %s (got pid %d where pid %d were expected;status=%d)", xbt_thread_self_name(), rctx->cmd, (int) got_pid, (int) rctx->pid, rctx->status)); - ERROR1("Test suite `%s': NOK (system error)", testsuite_name); + XBT_ERROR("Test suite `%s': NOK (system error)", testsuite_name); rctx_armageddon(rctx, 4); return NULL; } @@ -464,13 +483,13 @@ static void rctx_mkfile(void) xbt_str_trim(filename, NULL); OUT = fopen(filename, "w"); if (!OUT) { - THROW3(system_error, errno, "%s: Cannot create file %s: %s", + THROWF(system_error, errno, "%s: Cannot create file %s: %s", rctx->filepos, filename, strerror(errno)); } err = (fprintf(OUT, "%s", rctx->input->data) < 0); err = (fclose(OUT) == -1) || err; if (err) { - THROW3(system_error, errno, "%s: Cannot write file %s: %s", + THROWF(system_error, errno, "%s: Cannot write file %s: %s", rctx->filepos, filename, strerror(errno)); } free(filename); @@ -520,12 +539,11 @@ static void start_command(rctx_t rctx) xbt_dynar_t path = xbt_str_split(environ[i] + 5, ":"); xbt_dynar_foreach(path, it, str) { - if (binary_name) - free(binary_name); + free(binary_name); binary_name = bprintf("%s/%s", str, args[0]); if (!stat(binary_name, &stat_buf)) { /* Found. */ - DEBUG1("Looked in the PATH for the binary. Found %s", + XBT_DEBUG("Looked in the PATH for the binary. Found %s", binary_name); xbt_dynar_free(&path); break; @@ -558,19 +576,21 @@ void rctx_start(void) int child_in[2]; int child_out[2]; - DEBUG1("Cmd before rewriting %s", rctx->cmd); - rctx->cmd = xbt_str_varsubst(rctx->cmd, env); - VERB2("Start %s %s", rctx->cmd, + XBT_DEBUG("Cmd before rewriting %s", rctx->cmd); + char *newcmd = xbt_str_varsubst(rctx->cmd, env); + free(rctx->cmd); + rctx->cmd = newcmd; + XBT_VERB("Start %s %s", rctx->cmd, (rctx->is_background ? "(background job)" : "")); xbt_os_mutex_acquire(armageddon_mutex); if (armageddon_initiator) { - VERB0("Armageddon in progress. Do not start job."); + XBT_VERB("Armageddon in progress. Do not start job."); xbt_os_mutex_release(armageddon_mutex); return; } if (pipe(child_in) || pipe(child_out)) { perror("Cannot open the pipes"); - ERROR1("Test suite `%s': NOK (system error)", testsuite_name); + XBT_ERROR("Test suite `%s': NOK (system error)", testsuite_name); xbt_os_mutex_release(armageddon_mutex); rctx_armageddon(rctx, 4); } @@ -578,7 +598,7 @@ void rctx_start(void) rctx->pid = fork(); if (rctx->pid < 0) { perror("Cannot fork the command"); - ERROR1("Test suite `%s': NOK (system error)", testsuite_name); + XBT_ERROR("Test suite `%s': NOK (system error)", testsuite_name); xbt_os_mutex_release(armageddon_mutex); rctx_armageddon(rctx, 4); return; @@ -628,12 +648,12 @@ void rctx_start(void) xbt_os_thread_t runner; rctx = rctx_new(); - DEBUG2("RCTX: new bg=%p, new fg=%p", old, rctx); + XBT_DEBUG("RCTX: new bg=%p, new fg=%p", old, rctx); - DEBUG2("Launch a thread to wait for %s %d", old->cmd, old->pid); + XBT_DEBUG("Launch a thread to wait for %s %d", old->cmd, old->pid); runner = xbt_os_thread_create(old->cmd, rctx_wait, (void *) old, NULL); old->runner = runner; - VERB3("Launched thread %p to wait for %s %d", runner, old->cmd, + XBT_VERB("Launched thread %p to wait for %s %d", runner, old->cmd, old->pid); xbt_dynar_push(bg_jobs, &old); xbt_os_mutex_release(armageddon_mutex); @@ -642,20 +662,35 @@ void rctx_start(void) /* Helper function to sort the output */ static int cmpstringp(const void *p1, const void *p2) { - /* Sort only using the 19 first chars (date+pid) - * If the dates are the same, then, sort using pointer address (be stable wrt output of each process) + /* Sort only using the sort_len first chars + * If they are the same, then, sort using pointer address + * (be stable wrt output of each process) */ - const char *s1 = *((const char**) p1); - const char *s2 = *((const char**) p2); + const char **s1 = *(const char***)p1; + const char **s2 = *(const char***)p2; - DEBUG2("Compare strings '%s' and '%s'", s1, s2); + XBT_DEBUG("Compare strings '%s' and '%s'", *s1, *s2); - int res = strncmp(s1, s2, 19); + int res = strncmp(*s1, *s2, sort_len); if (res == 0) - return p1>p2; + res = s1 > s2 ? 1 : (s1 < s2 ? -1 : 0); return res; } +static void stable_sort(xbt_dynar_t a) +{ + unsigned long len = xbt_dynar_length(a); + void **b = xbt_new(void*, len); + unsigned long i; + for (i = 0 ; i < len ; i++) /* fill the array b with pointers to strings */ + b[i] = xbt_dynar_get_ptr(a, i); + qsort(b, len, sizeof *b, cmpstringp); /* sort it */ + for (i = 0 ; i < len ; i++) /* dereference the pointers to get the strings */ + b[i] = *(char**)b[i]; + for (i = 0 ; i < len ; i++) /* put everything in place */ + xbt_dynar_set_as(a, i, char*, b[i]); + xbt_free(b); +} /* Waits for the child to end (or to timeout), and check its ending conditions. This is launched from rctx_start but either in main @@ -671,22 +706,28 @@ void *rctx_wait(void *r) rctx_dump(rctx, "wait"); if (!rctx->is_stoppable) - THROW1(unknown_error, 0, "Cmd '%s' not started yet. Cannot wait it", + THROWF(unknown_error, 0, "Cmd '%s' not started yet. Cannot wait it", rctx->cmd); /* Wait for the child to die or the timeout to happen (or an armageddon to happen) */ while (!rctx->reader_done && (rctx->end_time < 0 || rctx->end_time >= now)) { - usleep(100); + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (100e-6 - floor(100e-6)) * 1e9; + nanosleep (&ts, NULL); now = time(NULL); } xbt_os_mutex_acquire(rctx->interruption); if (!rctx->interrupted && rctx->end_time > 0 && rctx->end_time < now) { - INFO1("<%s> timeouted. Kill the process.", rctx->filepos); + XBT_INFO("<%s> timeouted. Kill the process.", rctx->filepos); rctx->timeout = 1; kill(rctx->pid, SIGTERM); - usleep(100); + struct timespec ts; + ts.tv_sec = 0; + ts.tv_nsec = (100e-6 - floor(100e-6)) * 1e9; + nanosleep (&ts, NULL); kill(rctx->pid, SIGKILL); } @@ -701,6 +742,41 @@ void *rctx_wait(void *r) return NULL; xbt_os_mutex_acquire(rctx->interruption); */ + { + xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n"); + xbt_dynar_t b = xbt_dynar_new(sizeof(char *), NULL); + unsigned cpt; + char *str; + xbt_dynar_foreach(a, cpt, str) { + if (strncmp(str, "TESH_ERROR ", (sizeof "TESH_ERROR ") - 1) == 0) { + XBT_CRITICAL("%s", str); + errcode = 1; + } else if (coverage && + strncmp(str, "profiling:", (sizeof "profiling:") - 1) == 0) { + XBT_DEBUG("Remove line [%u]: '%s'", cpt, str); + } else { + xbt_dynar_push_as(b, char *, str); + } + } + + if (rctx->output_sort) { + stable_sort(b); + /* If empty lines moved in first position, remove them */ + while (!xbt_dynar_is_empty(b) && *xbt_dynar_getfirst_as(b, char*) == '\0') + xbt_dynar_shift(b, NULL); + } + + if (rctx->output_sort || xbt_dynar_length(b) != xbt_dynar_length(a)) { + char *newbuf = xbt_str_join(b, "\n"); + strcpy(rctx->output_got->data, newbuf); + rctx->output_got->used = strlen(newbuf); + xbt_free(newbuf); + } + + xbt_dynar_free(&b); + xbt_dynar_free(&a); + } + xbt_strbuff_chomp(rctx->output_got); xbt_strbuff_chomp(rctx->output_wanted); xbt_strbuff_trim(rctx->output_got); @@ -708,19 +784,19 @@ void *rctx_wait(void *r) /* Check for broken pipe */ if (rctx->brokenpipe) - VERB0 + XBT_VERB ("Warning: Child did not consume all its input (I got broken pipe)"); /* Check for timeouts */ if (rctx->timeout) { if (rctx->output_got->data[0]) - INFO2("<%s> Output on timeout:\n%s", + XBT_INFO("<%s> Output on timeout:\n%s", rctx->filepos, rctx->output_got->data); else - INFO1("<%s> No output before timeout", rctx->filepos); - ERROR3("Test suite `%s': NOK (<%s> timeout after %d sec)", + XBT_INFO("<%s> No output before timeout", rctx->filepos); + XBT_ERROR("Test suite `%s': NOK (<%s> timeout after %d sec)", testsuite_name, rctx->filepos, timeout_value); - DEBUG2("<%s> Interrupted = %d", rctx->filepos, rctx->interrupted); + XBT_DEBUG("<%s> Interrupted = %d", rctx->filepos, (int)rctx->interrupted); if (!rctx->interrupted) { xbt_os_mutex_release(rctx->interruption); rctx_armageddon(rctx, 3); @@ -728,12 +804,12 @@ void *rctx_wait(void *r) } } - DEBUG2("RCTX=%p (pid=%d)", rctx, rctx->pid); - DEBUG3("Status(%s|%d)=%d", rctx->cmd, rctx->pid, rctx->status); + XBT_DEBUG("RCTX=%p (pid=%d)", rctx, rctx->pid); + XBT_DEBUG("Status(%s|%d)=%d", rctx->cmd, rctx->pid, rctx->status); if (!rctx->interrupted) { if (WIFSIGNALED(rctx->status) && !rctx->expected_signal) { - ERROR3("Test suite `%s': NOK (<%s> got signal %s)", + XBT_ERROR("Test suite `%s': NOK (<%s> got signal %s)", testsuite_name, rctx->filepos, signal_name(WTERMSIG(rctx->status), NULL)); errcode = WTERMSIG(rctx->status) + 4; @@ -742,7 +818,7 @@ void *rctx_wait(void *r) if (WIFSIGNALED(rctx->status) && rctx->expected_signal && strcmp(signal_name(WTERMSIG(rctx->status), rctx->expected_signal), rctx->expected_signal)) { - ERROR4("Test suite `%s': NOK (%s got signal %s instead of %s)", + XBT_ERROR("Test suite `%s': NOK (%s got signal %s instead of %s)", testsuite_name, rctx->filepos, signal_name(WTERMSIG(rctx->status), rctx->expected_signal), rctx->expected_signal); @@ -750,7 +826,7 @@ void *rctx_wait(void *r) } if (!WIFSIGNALED(rctx->status) && rctx->expected_signal) { - ERROR3("Test suite `%s': NOK (child %s expected signal %s)", + XBT_ERROR("Test suite `%s': NOK (child %s expected signal %s)", testsuite_name, rctx->filepos, rctx->expected_signal); errcode = 5; } @@ -758,58 +834,28 @@ void *rctx_wait(void *r) if (WIFEXITED(rctx->status) && WEXITSTATUS(rctx->status) != rctx->expected_return) { if (rctx->expected_return) - ERROR4 + XBT_ERROR ("Test suite `%s': NOK (<%s> returned code %d instead of %d)", testsuite_name, rctx->filepos, WEXITSTATUS(rctx->status), rctx->expected_return); else - ERROR3("Test suite `%s': NOK (<%s> returned code %d)", + XBT_ERROR("Test suite `%s': NOK (<%s> returned code %d)", testsuite_name, rctx->filepos, WEXITSTATUS(rctx->status)); errcode = 40 + WEXITSTATUS(rctx->status); } rctx->expected_return = 0; - if (rctx->expected_signal) { - free(rctx->expected_signal); - rctx->expected_signal = NULL; - } - } - while (rctx->output_got->used - && !strncmp(rctx->output_got->data, "TESH_ERROR ", - strlen("TESH_ERROR "))) { - int marklen = strlen("TESH_ERROR "); - char *endline = strchr(rctx->output_got->data, '\n'); - - CRITICAL2("%.*s", (int) (endline - rctx->output_got->data - marklen), - rctx->output_got->data + marklen); - memmove(rctx->output_got->data, rctx->output_got->data + marklen, - rctx->output_got->used - marklen); - rctx->output_got->used -= endline - rctx->output_got->data + 1; - rctx->output_got->data[rctx->output_got->used] = '\0'; - errcode = 1; + free(rctx->expected_signal); + rctx->expected_signal = NULL; } - if (rctx->output_sort) { - xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n"); - xbt_dynar_sort(a,cmpstringp); - char *sorted_output = xbt_str_join(a, "\n"); - strcpy(rctx->output_got->data, sorted_output); - xbt_free(sorted_output); - xbt_dynar_free(&a); - /* If an empty line moved in first position, move it back to the end */ - if (rctx->output_got->data[0]=='\n') { - fprintf(stderr,"XXX"); - memmove(rctx->output_got->data,rctx->output_got->data+1,rctx->output_got->used-1); - rctx->output_got->data[rctx->output_got->used-1] = '\n'; - } - } if ((errcode && errcode != 1) || rctx->interrupted) { /* checking output, and matching */ xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n"); char *out = xbt_str_join(a, "\n||"); xbt_dynar_free(&a); - INFO2("Output of <%s> so far: \n||%s", rctx->filepos, out); + XBT_INFO("Output of <%s> so far: \n||%s", rctx->filepos, out); free(out); } else if (rctx->output == e_output_check && (rctx->output_got->used != rctx->output_wanted->used @@ -818,20 +864,20 @@ void *rctx_wait(void *r) if (XBT_LOG_ISENABLED(tesh, xbt_log_priority_info)) { char *diff = xbt_str_diff(rctx->output_wanted->data, rctx->output_got->data); - ERROR2("Output of <%s> mismatch:\n%s", rctx->filepos, diff); + XBT_ERROR("Output of <%s> mismatch:\n%s", rctx->filepos, diff); free(diff); } - ERROR2("Test suite `%s': NOK (<%s> output mismatch)", + XBT_ERROR("Test suite `%s': NOK (<%s> output mismatch)", testsuite_name, rctx->filepos); errcode = 2; } else if (rctx->output == e_output_ignore) { - INFO1("(ignoring the output of <%s> as requested)", rctx->filepos); + XBT_INFO("(ignoring the output of <%s> as requested)", rctx->filepos); } else if (rctx->output == e_output_display) { xbt_dynar_t a = xbt_str_split(rctx->output_got->data, "\n"); char *out = xbt_str_join(a, "\n||"); xbt_dynar_free(&a); - INFO1("Here is the (ignored) command output: \n||%s", out); + XBT_INFO("Here is the (ignored) command output: \n||%s", out); free(out); }