142 lines
3.7 KiB
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;
|
||
|
}
|
||
|
|