X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=test.c;h=4c149316acb90689010e4918d9911a8d13f74e6c;hb=9908209f5825821eb8c73ff4926bc2b504848792;hp=e4873e0e83d79fa1d8d3f1b59add6aa6b7ba813e;hpb=772dbfae26460d361ba0ee60e3becc377517b099;p=xonotic%2Fgmqcc.git diff --git a/test.c b/test.c index e4873e0..4c14931 100644 --- a/test.c +++ b/test.c @@ -166,8 +166,8 @@ static int task_pclose(FILE **handles) { tmpnam(open->name_err); tmpnam(open->name_out); #else - tmpnam_s(open->name_err, L_tmpnam); - tmpnam_s(open->name_out, L_tmpnam); + tmpnam_s(open->name_err, L_tmpnam); + tmpnam_s(open->name_out, L_tmpnam); #endif (void)mode; /* excluded */ @@ -184,7 +184,7 @@ static int task_pclose(FILE **handles) { return open->handles; } - static void task_pclose(FILE **files) { + static int task_pclose(FILE **files) { popen_t *open = ((popen_t*)files); fs_file_close(files[1]); fs_file_close(files[2]); @@ -192,9 +192,11 @@ static int task_pclose(FILE **handles) { remove(open->name_out); mem_d(open); + + return EXIT_SUCCESS; } -# define popen _popen -# define pclose _pclose +# define popen _popen +# define pclose _pclose #endif /*! _WIN32 */ #define TASK_COMPILE 0 @@ -443,9 +445,6 @@ static bool task_template_parse(const char *file, task_template_t *tmpl, FILE *f goto failure; } - if (value && (*value == ' ' || *value == '\t')) - value++; - /* * Value will contain a newline character at the end, we need to strip * this otherwise kaboom, seriously, kaboom :P @@ -622,17 +621,17 @@ failure: return NULL; } -static void task_template_destroy(task_template_t **tmpl) { +static void task_template_destroy(task_template_t *tmpl) { if (!tmpl) return; - if ((*tmpl)->description) mem_d((*tmpl)->description); - if ((*tmpl)->proceduretype) mem_d((*tmpl)->proceduretype); - if ((*tmpl)->compileflags) mem_d((*tmpl)->compileflags); - if ((*tmpl)->executeflags) mem_d((*tmpl)->executeflags); - if ((*tmpl)->sourcefile) mem_d((*tmpl)->sourcefile); - if ((*tmpl)->rulesfile) mem_d((*tmpl)->rulesfile); - if ((*tmpl)->testflags) mem_d((*tmpl)->testflags); + if (tmpl->description) mem_d(tmpl->description); + if (tmpl->proceduretype) mem_d(tmpl->proceduretype); + if (tmpl->compileflags) mem_d(tmpl->compileflags); + if (tmpl->executeflags) mem_d(tmpl->executeflags); + if (tmpl->sourcefile) mem_d(tmpl->sourcefile); + if (tmpl->rulesfile) mem_d(tmpl->rulesfile); + if (tmpl->testflags) mem_d(tmpl->testflags); /* * Delete all allocated string for task tmpl then destroy the @@ -640,18 +639,18 @@ static void task_template_destroy(task_template_t **tmpl) { */ { size_t i = 0; - for (; i < vec_size((*tmpl)->comparematch); i++) - mem_d((*tmpl)->comparematch[i]); + for (; i < vec_size(tmpl->comparematch); i++) + mem_d(tmpl->comparematch[i]); - vec_free((*tmpl)->comparematch); + vec_free(tmpl->comparematch); } /* * Nullify all the template members otherwise NULL comparision * checks will fail if tmpl pointer is reused. */ - mem_d((*tmpl)->tempfilename); - mem_d(*tmpl); + mem_d(tmpl->tempfilename); + mem_d(tmpl); } /* @@ -684,7 +683,7 @@ static bool task_propagate(const char *curdir, size_t *pad, const char *defs) { char **directories = NULL; char *claim = util_strdup(curdir); size_t i; - + vec_push(directories, claim); dir = fs_dir_open(claim); @@ -716,7 +715,7 @@ static bool task_propagate(const char *curdir, size_t *pad, const char *defs) { */ for (i = 0; i < vec_size(directories); i++) { dir = fs_dir_open(directories[i]); - + while ((files = fs_dir_read(dir))) { util_snprintf(buffer, sizeof(buffer), "%s/%s", directories[i], files->d_name); if (stat(buffer, &directory) == -1) { @@ -871,7 +870,7 @@ static bool task_propagate(const char *curdir, size_t *pad, const char *defs) { vec_push(task_tasks, task); } } - + fs_dir_close(dir); mem_d(directories[i]); /* free claimed memory */ } @@ -924,7 +923,6 @@ static void task_destroy(void) { * Close any open handles to files or processes here. It's mighty * annoying to have to do all this cleanup work. */ - if (task_tasks[i].runhandles) task_pclose(task_tasks[i].runhandles); if (task_tasks[i].stdoutlog) fs_file_close (task_tasks[i].stdoutlog); if (task_tasks[i].stderrlog) fs_file_close (task_tasks[i].stderrlog); @@ -950,7 +948,7 @@ static void task_destroy(void) { mem_d(task_tasks[i].stdoutlogfile); mem_d(task_tasks[i].stderrlogfile); - task_template_destroy(&task_tasks[i].tmpl); + task_template_destroy(task_tasks[i].tmpl); } vec_free(task_tasks); } @@ -964,10 +962,11 @@ static void task_destroy(void) { static bool task_trymatch(size_t i, char ***line) { bool success = true; bool process = true; + int retval = EXIT_SUCCESS; FILE *execute; char buffer[4096]; task_template_t *tmpl = task_tasks[i].tmpl; - + memset (buffer,0,sizeof(buffer)); if (!strcmp(tmpl->proceduretype, "-execute")) { @@ -1013,7 +1012,7 @@ static bool task_trymatch(size_t i, char ***line) { */ if (!(execute = fs_file_open(task_tasks[i].stderrlogfile, "r"))) return false; - + process = false; } @@ -1025,7 +1024,7 @@ static bool task_trymatch(size_t i, char ***line) { char *data = NULL; size_t size = 0; size_t compare = 0; - + while (fs_file_getline(&data, &size, execute) != EOF) { if (!strcmp(data, "No main function found\n")) { con_err("test failure: `%s` (No main function found) [%s]\n", @@ -1045,7 +1044,7 @@ static bool task_trymatch(size_t i, char ***line) { */ if (strrchr(data, '\n')) *strrchr(data, '\n') = '\0'; - + /* * We remove the file/directory and stuff from the error * match messages when testing diagnostics. @@ -1061,10 +1060,11 @@ static bool task_trymatch(size_t i, char ***line) { } /* - * If data is just null now, that means the line was an empty - * one and for that, we just ignore it. + * We need to ignore null lines for when -pp is used (preprocessor), since + * the preprocessor is likely to create empty newlines in certain macro + * instantations, otherwise it's in the wrong nature to ignore empty newlines. */ - if (!*data) + if (!strcmp(tmpl->proceduretype, "-pp") && !*data) continue; if (vec_size(tmpl->comparematch) > compare) { @@ -1085,16 +1085,20 @@ static bool task_trymatch(size_t i, char ***line) { data = NULL; size = 0; } + + if (compare != vec_size(tmpl->comparematch)) + success = false; + mem_d(data); data = NULL; } if (process) - pclose(execute); + retval = pclose(execute); else fs_file_close(execute); - return success; + return success && retval == EXIT_SUCCESS; } static const char *task_type(task_template_t *tmpl) { @@ -1139,7 +1143,7 @@ static size_t task_schedualize(size_t *pad) { * Generate a task from thin air if it requires execution in * the QCVM. */ - + /* diagnostic is not executed, but compare tested instead, like preproessor */ execute = !! (!strcmp(task_tasks[i].tmpl->proceduretype, "-execute")) || (!strcmp(task_tasks[i].tmpl->proceduretype, "-pp")) || @@ -1193,6 +1197,18 @@ static size_t task_schedualize(size_t *pad) { continue; } + if (task_pclose(task_tasks[i].runhandles) != EXIT_SUCCESS && strcmp(task_tasks[i].tmpl->proceduretype, "-fail")) { + con_out("failure: `%s` %*s %*s\n", + task_tasks[i].tmpl->description, + (pad[0] + pad[1] - strlen(task_tasks[i].tmpl->description)) + (strlen(task_tasks[i].tmpl->rulesfile) - pad[1]), + task_tasks[i].tmpl->rulesfile, + (pad[1] + pad[2] - strlen(task_tasks[i].tmpl->rulesfile)) + (strlen("(compiler didn't return exit success)") - pad[2]), + "(compiler didn't return exit success)" + ); + failed++; + continue; + } + if (!execute) { con_out("succeeded: `%s` %*s %*s\n", task_tasks[i].tmpl->description, @@ -1270,7 +1286,7 @@ static size_t task_schedualize(size_t *pad) { failed++; continue; } - + for (j = 0; j < vec_size(match); j++) mem_d(match[j]); vec_free(match); @@ -1419,6 +1435,5 @@ int main(int argc, char **argv) { succeed = test_perform("tests", defs); stat_info(); - return (succeed) ? EXIT_SUCCESS : EXIT_FAILURE; }