X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=test.c;h=8c8a80ec68600a432480d11711418f42f77550f2;hp=dfa80dde5446f1446f1ab13d0fb232e370fc434c;hb=73c86127f7001cc6d5bb8e911a2e89f5abcfdf44;hpb=4580dcf1eacfce517e95b654b73d6e72db366273 diff --git a/test.c b/test.c index dfa80dd..8c8a80e 100644 --- a/test.c +++ b/test.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -121,29 +121,12 @@ FILE ** task_popen(const char *command, const char *mode) { close(2), dup(errhandle[1]); execvp(*argv, argv); - exit(1); + exit(EXIT_FAILURE); } else { /* fork failed */ goto task_popen_error_3; } - /* - * clang is stupid, it doesn't understand that yes, this code - * is actually reachable. - */ -# ifdef __clang__ -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wunreachable-code" -# endif - if (argv) - vec_free(argv); - -# ifdef __clang__ -# pragma clang diagnostic pop -# endif - - return data->handles; - task_popen_error_3: close(errhandle[0]), close(errhandle[1]); task_popen_error_2: close(outhandle[0]), close(outhandle[1]); task_popen_error_1: close(inhandle [0]), close(inhandle [1]); @@ -169,12 +152,12 @@ int task_pclose(FILE **handles) { return status; } #else -# define _WIN32_LEAN_AND_MEAN -# define popen _popen -# define pclose _pclose -# include -# include -# include +# define _WIN32_LEAN_AND_MEAN +# define popen _popen +# define pclose _pclose +# include +# include +# include /* * Bidirectional piping implementation for windows using CreatePipe and DuplicateHandle + * other hacks. @@ -199,10 +182,10 @@ int task_pclose(FILE **handles) { return; } -# ifdef __MINGW32__ +# ifdef __MINGW32__ /* mingw32 has dirent.h */ -# include -# elif defined (_MSC_VER) +# include +# elif defined (_WIN32) /* * visual studio lacks dirent.h it's a posix thing * so we emulate it with the WinAPI. @@ -280,9 +263,9 @@ int task_pclose(FILE **handles) { * Visual studio also lacks S_ISDIR for sys/stat.h, so we emulate this as well * which is not hard at all. */ -# undef S_ISDIR /* undef just incase */ -# define S_ISDIR(X) ((X)&_S_IFDIR) -# endif +# undef S_ISDIR /* undef just incase */ +# define S_ISDIR(X) ((X)&_S_IFDIR) +# endif #endif #define TASK_COMPILE 0 @@ -763,6 +746,7 @@ bool task_propagate(const char *curdir) { if (strcmp(files->d_name + strlen(files->d_name) - 5, ".tmpl") == 0) { task_template_t *template = task_template_compile(files->d_name, curdir); char buf[4096]; /* one page should be enough */ + char *qcflags = NULL; task_t task; util_debug("TEST", "compiling task template: %s/%s\n", curdir, files->d_name); @@ -778,19 +762,37 @@ bool task_propagate(const char *curdir) { */ template->tempfilename = tempnam(curdir, "TMPDAT"); + /* + * Additional QCFLAGS enviroment variable may be used + * to test compile flags for all tests. This needs to be + * BEFORE other flags (so that the .tmpl can override them) + */ + qcflags = getenv("QCFLAGS"); + /* * Generate the command required to open a pipe to a process * which will be refered to with a handle in the task for * reading the data from the pipe. */ - memset (buf,0,sizeof(buf)); - snprintf(buf, sizeof(buf), "%s %s/%s %s -o %s", - task_bins[TASK_COMPILE], - curdir, - template->sourcefile, - template->compileflags, - template->tempfilename - ); + memset (buf,0,sizeof(buf)); + if (qcflags) { + snprintf(buf, sizeof(buf), "%s %s/%s %s %s -o %s", + task_bins[TASK_COMPILE], + curdir, + template->sourcefile, + qcflags, + template->compileflags, + template->tempfilename + ); + } else { + snprintf(buf, sizeof(buf), "%s %s/%s %s -o %s", + task_bins[TASK_COMPILE], + curdir, + template->sourcefile, + template->compileflags, + template->tempfilename + ); + } /* * The task template was compiled, now lets create a task from @@ -838,31 +840,6 @@ bool task_propagate(const char *curdir) { return success; } -/* - * Removes all temporary 'progs.dat' files created during compilation - * of all tests' - */ -void task_cleanup(const char *curdir) { - DIR *dir; - struct dirent *files; - char buffer[4096]; - - dir = opendir(curdir); - - while ((files = readdir(dir))) { - memset(buffer, 0, sizeof(buffer)); - if (strstr(files->d_name, "TMP")) { - snprintf(buffer, sizeof(buffer), "%s/%s", curdir, files->d_name); - if (remove(buffer)) - con_err("error removing temporary file: %s\n", buffer); - else - util_debug("TEST", "removed temporary file: %s\n", buffer); - } - } - - closedir(dir); -} - /* * Task precleanup removes any existing temporary files or log files * left behind from a previous invoke of the test-suite. @@ -891,7 +868,7 @@ void task_precleanup(const char *curdir) { closedir(dir); } -void task_destroy(const char *curdir) { +void task_destroy(void) { /* * Free all the data in the task list and finally the list itself * then proceed to cleanup anything else outside the program like @@ -917,11 +894,12 @@ void task_destroy(const char *curdir) { con_err("error removing stdout log file: %s\n", task_tasks[i].stdoutlogfile); else util_debug("TEST", "removed stdout log file: %s\n", task_tasks[i].stdoutlogfile); - if (remove(task_tasks[i].stderrlogfile)) con_err("error removing stderr log file: %s\n", task_tasks[i].stderrlogfile); else util_debug("TEST", "removed stderr log file: %s\n", task_tasks[i].stderrlogfile); + + remove(task_tasks[i].template->tempfilename); } /* free util_strdup data for log files */ @@ -931,11 +909,6 @@ void task_destroy(const char *curdir) { task_template_destroy(&task_tasks[i].template); } vec_free(task_tasks); - - /* - * Cleanup outside stuff like temporary files. - */ - task_cleanup(curdir); } /* @@ -1189,7 +1162,7 @@ bool test_perform(const char *curdir) { task_precleanup(curdir); if (!task_propagate(curdir)) { con_err("error: failed to propagate tasks\n"); - task_destroy(curdir); + task_destroy(); return false; } /* @@ -1200,7 +1173,7 @@ bool test_perform(const char *curdir) { * issues. */ task_schedualize(); - task_destroy(curdir); + task_destroy(); return true; }