X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=test.c;h=4c149316acb90689010e4918d9911a8d13f74e6c;hp=629a10e9e711187df4686a03decdfdd114e38896;hb=3b4a5667ea8b1b7aa8a10734c57c02d1561fcdd7;hpb=69c4dce4771fb5720b9f3fa3e0eff0416f3d138e diff --git a/test.c b/test.c index 629a10e..4c14931 100644 --- a/test.c +++ b/test.c @@ -27,8 +27,6 @@ #include "gmqcc.h" -opts_cmd_t opts; - static const char *task_bins[] = { "./gmqcc", "./qcvm" @@ -164,8 +162,13 @@ static int task_pclose(FILE **handles) { char *cmd = NULL; popen_t *open = (popen_t*)mem_a(sizeof(popen_t)); +#ifndef _MSC_VER tmpnam(open->name_err); tmpnam(open->name_out); +#else + tmpnam_s(open->name_err, L_tmpnam); + tmpnam_s(open->name_out, L_tmpnam); +#endif (void)mode; /* excluded */ @@ -181,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]); @@ -189,7 +192,11 @@ static int task_pclose(FILE **handles) { remove(open->name_out); mem_d(open); + + return EXIT_SUCCESS; } +# define popen _popen +# define pclose _pclose #endif /*! _WIN32 */ #define TASK_COMPILE 0 @@ -438,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 @@ -617,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 @@ -635,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); } /* @@ -679,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); @@ -689,9 +693,12 @@ static bool task_propagate(const char *curdir, size_t *pad, const char *defs) { */ while ((files = fs_dir_read(dir))) { util_asprintf(&claim, "%s/%s", curdir, files->d_name); - if (stat(claim, &directory) == -1) + if (stat(claim, &directory) == -1) { + fs_dir_close(dir); + mem_d(claim); return false; - + } + if (S_ISDIR(directory.st_mode) && files->d_name[0] != '.') { vec_push(directories, claim); } else { @@ -708,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) { @@ -863,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 */ } @@ -916,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); @@ -942,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); } @@ -956,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")) { @@ -1005,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; } @@ -1017,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", @@ -1037,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. @@ -1053,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) { @@ -1077,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) { @@ -1131,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")) || @@ -1185,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, @@ -1262,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); @@ -1411,6 +1435,5 @@ int main(int argc, char **argv) { succeed = test_perform("tests", defs); stat_info(); - return (succeed) ? EXIT_SUCCESS : EXIT_FAILURE; }