#include <sys/stat.h>
#include <dirent.h>
-cmd_options opts;
+opts_cmd_t opts;
char *task_bins[] = {
"./gmqcc",
#ifndef _WIN32
#include <sys/types.h>
#include <sys/wait.h>
-
#include <unistd.h>
typedef struct {
FILE *handles[3];
return status;
}
#else
-
+#error "There is no support for windows yet ... this is not a FTBFS bug"
#endif
#define TASK_COMPILE 0
* This simply performs compilation only
* -execute
* This will perform compilation and execution
+ * -fail
+ * This will perform compilation, but requires
+ * the compilation to fail in order to succeed.
*
* This must be provided, this tag is NOT optional.
*
con_err("template compile error: %s missing `M:` tag (use `$null` for exclude)\n", file);
goto failure;
}
+ } else if (!strcmp(template->proceduretype, "-fail")) {
+ if (template->executeflags)
+ con_err("template compile warning: %s erroneous tag `E:` when only failing\n", file);
+ if (template->comparematch)
+ con_err("template compile warning: %s erroneous tag `M:` when only failing\n", file);
+ goto success;
} else {
con_err("template compile error: %s invalid procedure type: %s\n", file, template->proceduretype);
goto failure;
/*
* Only remove the log files if the test actually compiled otherwise
- * forget about it.
+ * forget about it (or if it didn't compile, and the procedure type
+ * was set to -fail (meaning it shouldn't compile) .. stil remove)
*/
- if (task_tasks[i].compiled) {
+ if (task_tasks[i].compiled || !strcmp(task_tasks[i].template->proceduretype, "-fail")) {
if (remove(task_tasks[i].stdoutlogfile))
con_err("error removing stdout log file: %s\n", task_tasks[i].stdoutlogfile);
else
if (strrchr(data, '\n'))
*strrchr(data, '\n') = '\0';
- if (strcmp(data, template->comparematch[compare++]))
- success = false;
+ if (vec_size(template->comparematch) > compare) {
+ if (strcmp(data, template->comparematch[compare++]))
+ success = false;
+ } else {
+ success = false;
+ }
/*
* Copy to output vector for diagnostics if execution match
fflush(task_tasks[i].stdoutlog);
}
- if (!task_tasks[i].compiled) {
+ if (!task_tasks[i].compiled && strcmp(task_tasks[i].template->proceduretype, "-fail")) {
con_err("test failure: `%s` [%s] (failed to compile) see %s.stdout and %s.stderr\n",
task_tasks[i].template->description,
(task_tasks[i].template->failuremessage) ?
* handler for the all the given matches in the template file and
* what was actually returned from executing.
*/
- con_err(" Expected From %u Matches:\n", vec_size(task_tasks[i].template->comparematch));
+ con_err(" Expected From %u Matches: (got %u Matches)\n",
+ vec_size(task_tasks[i].template->comparematch),
+ vec_size(match)
+ );
for (; d < vec_size(task_tasks[i].template->comparematch); d++) {
char *select = task_tasks[i].template->comparematch[d];
size_t length = 40 - strlen(select);
con_err(" ");
con_err("| Got: \"%s\"\n", (d >= vec_size(match)) ? "<<nothing else to compare>>" : match[d]);
}
+
+ /*
+ * Print the non-expected out (since we are simply not expecting it)
+ * This will help track down bugs in template files that fail to match
+ * something.
+ */
+ if (vec_size(match) > vec_size(task_tasks[i].template->comparematch)) {
+ for (d = 0; d < vec_size(match) - vec_size(task_tasks[i].template->comparematch); d++) {
+ con_err(" Expected: Nothing | Got: \"%s\"\n",
+ match[d + vec_size(task_tasks[i].template->comparematch)]
+ );
+ }
+ }
+
+
for (j = 0; j < vec_size(match); j++)
mem_d(match[j]);
vec_free(match);