/*- * Copyright (c) 2011 Michael Tuexen tuexen@fh-muenster.de * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: run-sua-test.c,v 1.1 2011/03/20 16:48:30 tuexen Exp $ */ #include #include #include #include #include #include #define TIMEOUT 0 #define COMMAND_LENGTH 2048 #define RED(string) "\033[31m"string"\033[0m" #define GREEN(string) "\033[32m"string"\033[0m" #define YELLOW(string) "\033[33m"string"\033[0m" #define BLUE(string) "\033[34m"string"\033[0m" char command_skel[] = "(load-from-path \"%s/.guile\")" "(let ((test-name \"%s\"))" " (if (defined? (string->symbol test-name))" " (exit ((eval-string test-name)" " tester-addr tester-port sut-addr sut-port))" " (exit 254)))"; char usage[] = "Usage: runm2patest [options] testname\n" "Options:\n" " -h display this help\n" " -t time maximum runtime in seconds (default: no limit)\n"; pid_t pid; void handler(int n) { kill(pid, SIGKILL); } void print_usage() { fprintf(stderr, "%s", usage); } int main(int argc, char *argv[]) { unsigned int timeout; int status, c; char command[COMMAND_LENGTH]; char *dir = getenv("HOME"); timeout = TIMEOUT; while ((c = getopt(argc, argv, "t:d:")) != -1) { switch(c) { case 'h': print_usage(); return 0; break; case 't': timeout = (unsigned int)atoi(optarg); break; case 'd': dir = optarg; break; default: print_usage(); return 1; } } if (optind == argc - 1) { snprintf(command, COMMAND_LENGTH, command_skel, dir, argv[optind]); } else { print_usage(); return 1; } if ((pid = fork()) == 0) { #if defined(__APPLE__) || defined(__FreeBSD__) execlp("/usr/local/bin/guile", "guile", "-L", dir, "-c", command, NULL); #else execlp("/usr/bin/guile", "guile", "-L", dir, "-c", command, NULL); #endif fprintf(stderr, "%s\n", "Couln't start guile."); } printf("Test %-40.40s ", argv[optind]); fflush(stdout); if (timeout > 0) { signal(SIGALRM, handler); alarm(timeout); } if (wait(&status) == -1) { fprintf(stderr, "%s\n", "Couln't start guile."); } if (WIFSIGNALED(status)) { printf("%-29.29s\n", YELLOW("TIMEOUT")); } else { switch (WEXITSTATUS(status)) { case 0: printf("%-29.29s\n", GREEN("PASSED")); break; case 1: printf("%-29.29s\n", RED("FAILED")); break; case 2: printf("%-29.29s\n", YELLOW("UNKNOWN")); break; case 253: printf("%-29.29s\n", BLUE("NON-APPLICABLE")); break; case 254: printf("%-29.29s\n", YELLOW("NON-EXISTENT")); break; default: printf("%-29.29s\n", YELLOW("BUG")); break; } } return 0; }