sua-testtool/run-sua-test.c

142 lines
3.7 KiB
C

/*-
* 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 <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#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];
timeout = TIMEOUT;
while ((c = getopt(argc, argv, "t:")) != -1) {
switch(c) {
case 'h':
print_usage();
return 0;
break;
case 't':
timeout = (unsigned int)atoi(optarg);
break;
default:
print_usage();
return 1;
}
}
if (optind == argc - 1) {
snprintf(command, COMMAND_LENGTH, command_skel, getenv("HOME"), argv[optind]);
} else {
print_usage();
return 1;
}
if ((pid = fork()) == 0) {
execlp("/usr/local/bin/guile", "guile",
"-c", command,
(char *)0);
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;
}