diff dstress.c @ 251:6cd84461e17b

enabled new "dstress.c" test tool
author thomask
date Tue, 25 Jan 2005 20:10:03 +0000
parents
children a39162afcc94
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dstress.c	Tue Jan 25 20:10:03 2005 +0000
@@ -0,0 +1,296 @@
+/* 
+ * core test tool for the DStress test suite 
+ * http://dstress.kuehne.cn
+ *
+ * Copyright (C) 2005 Thomas Kuehne <thomas@kuehne.cn>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * $HeadURL$
+ * $Date$
+ * $Author$
+ *
+ */                                             
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#define TAG 		"__DSTRESS_DFLAGS__"
+#define OBJ		"-odobj "
+#define TLOG		"log.tmp"
+
+#define RUN		1
+#define NORUN		2
+#define COMPILE		4
+#define NOCOMPILE	8
+
+/* Query the environment for the compiler name */
+char* getCompiler(){
+	char* back = getenv("DMD");
+	if(back == NULL){
+		back = getenv("dmd");
+		if(back==NULL){
+			back = "dmd";
+		}
+	}
+	return back;
+}
+
+/* Query the environment for general flags */
+char* getGeneralFlags(){
+	char* back = getenv("DFLAGS");
+	if(back == NULL){
+		back = getenv("dflags");
+		if(back==NULL){
+			back = "";
+		}
+	}
+	return back;
+}
+
+#ifdef __GNU_LIBRARY__
+#define USE_POSIX_LOAD
+#endif
+
+#ifdef __GLIBC__
+#define USE_POSIX_LOAD
+#endif
+
+#ifdef linux
+#define USE_POSIX_LOAD
+#endif
+
+#ifdef USE_POSIX_LOAD
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+char* loadFile(char* filename){
+	char* back = NULL;
+	struct stat fileInfo;
+	int file = open(filename, O_RDONLY);
+	if(errno == 0 && file != 0 && file != -1){
+		if(0==fstat(file, &fileInfo)){
+			back=malloc(fileInfo.st_size+1);
+			fileInfo.st_size = read(file, back, fileInfo.st_size);
+			if(fileInfo.st_size != -1){
+				*(back+fileInfo.st_size+1) = '\x00';
+			}else{
+				*back = '\x00';
+			}
+		}
+		close(file);
+	}
+	errno = 0;
+	return back;
+}
+#else
+#error no loadFile adaptation for this system available
+#endif
+
+int main(int argc, char* arg[]){
+
+	char* compiler;
+	char* general;
+	char* spezial;
+	char* cmd;
+	int modus;
+	int res;
+	
+	/* check arguments */
+	if(argc != 3){
+err:		if(argc!=0)		
+			fprintf(stderr,"%s <run|norun|compile|nocompile> <source>\n", arg[0]);
+		else
+			fprintf(stderr,"dstress.exe <run|norun|compile|nocompile> <source>\n");
+		exit(-1);
+	}
+	
+	if(0==strcmp(arg[1], "run") || 0==strcmp(arg[1], "RUN")){
+		modus = RUN;
+	}else if(0==strcmp(arg[1], "norun") || 0==strcmp(arg[1], "NORUN")){
+		modus = NORUN;
+	}else if(0==strcmp(arg[1], "compile") || 0==strcmp(arg[1], "COMPILE")){
+		modus = COMPILE;
+	}else if(0==strcmp(arg[1], "nocompile") || 0==strcmp(arg[1], "NOCOMPILE")){
+		modus = NOCOMPILE;
+	}else{
+		goto err;
+	}
+
+	/* gen flags */
+	compiler = getCompiler();
+	general = getGeneralFlags();
+	cmd = loadFile(arg[2]);
+	if(cmd==NULL){
+		spezial="";
+	}else{
+		cmd = strstr(cmd, TAG);
+		if(cmd==NULL){
+			spezial="";
+		}else{
+			spezial = cmd + strlen(TAG);
+			cmd = strstr(spezial, "\n");
+			if(cmd!=NULL){
+				*cmd='\x00';
+			}
+			cmd = strstr(spezial, "\r");
+			if(cmd!=NULL){
+				*cmd='\x00';
+			}
+		}
+	}
+
+	if(modus==COMPILE || modus==NOCOMPILE){
+		/* gen command */
+		cmd = malloc(strlen(compiler)+strlen(general)+strlen(spezial)+strlen(OBJ)
+			+strlen(arg[2])+strlen(TLOG)+64);
+		cmd[0]='\x00';
+		strcat(cmd, compiler);
+		strcat(cmd, " ");
+		strcat(cmd, general);
+		strcat(cmd, " ");
+		strcat(cmd, spezial);
+		strcat(cmd, " -c ");
+		if(NULL==strstr(cmd, "-od")){
+			strcat(cmd, OBJ);
+			strcat(cmd, " ");
+		}
+		strcat(cmd, arg[2]);
+		strcat(cmd, " 1> ");
+		strcat(cmd, TLOG);
+		strcat(cmd, " 2>&1");
+
+		/* test */
+		if(modus==COMPILE){
+			fprintf(stderr, "compile: %s\n", cmd);
+		}else{
+			fprintf(stderr, "nocompile: %s\n", cmd);
+		}
+		res = system(cmd);
+
+		/* diagnostic output */
+		cmd = loadFile(TLOG);
+		fprintf(stderr, "%s\n", cmd);
+		if(strstr(cmd, "Internal error")!= NULL || strstr(cmd, "gcc.gnu.org/bugs")!=NULL){
+			printf("ERROR:\t%s (Internal compiler error)\n", arg[2]);
+		}else if(modus==COMPILE){
+			if(res==0){
+				printf("PASS: \t%s\n", arg[2]);
+			}else if(res==256){
+				printf("FAIL: \t%s [%d]\n", arg[2], res);
+			}else{
+				printf("ERROR:\t%s [%d]\n", arg[2], res);
+			}
+		}else{
+			if(res==256){
+				printf("XFAIL:\t%s\n", arg[2]);
+			}else if(res==0){
+				printf("XPASS:\t%s\n", arg[2]);
+			}else{
+				printf("ERROR:\t%s [%d]\n", arg[2], res);
+			}
+		}
+		fprintf(stderr,"--------\n");
+	}else if(modus==RUN || modus==NORUN){
+		/* gen command */
+		cmd = malloc(strlen(compiler)+strlen(general)+strlen(spezial)+strlen(OBJ)
+			+strlen(arg[2])*2+strlen(TLOG)+64);
+		cmd[0]='\x00';
+		strcat(cmd, compiler);
+		strcat(cmd, " ");
+		strcat(cmd, general);
+		strcat(cmd, " ");
+		strcat(cmd, spezial);
+		strcat(cmd, " ");
+		if(NULL==strstr(cmd, "-od")){
+			strcat(cmd, OBJ);
+			strcat(cmd, " ");
+		}
+		if(NULL==strstr(cmd, "-of")){
+			strcat(cmd, "-of");
+			strcat(cmd, arg[2]);
+			strcat(cmd, ".exe ");
+		}
+		strcat(cmd, arg[2]);
+		strcat(cmd, " 1> ");
+		strcat(cmd, TLOG);
+		strcat(cmd, " 2>&1");
+
+		/* test 1/2 */
+		if(modus==RUN){
+			fprintf(stderr, "run: %s\n", cmd);
+		}else{
+			fprintf(stderr, "norun: %s\n", cmd);
+		}
+		res = system(cmd);
+		
+		/* diagnostic 1/2 */
+		cmd = loadFile(TLOG);
+		fprintf(stderr, "%s", cmd);
+		if(strstr(cmd, "Internal error")!= NULL || strstr(cmd, "gcc.gnu.org/bugs")!=NULL){
+			printf("ERROR:\t%s (Internal compiler error)\n", arg[2]);
+			fprintf(stderr, "\n--------\n");
+			return 0;
+		}else if(res==256){
+			printf("FAIL: \t%s [%d]\n", arg[2], res);
+			fprintf(stderr, "\n--------\n");
+			return 0;
+		}else if(res!=0){
+			printf("ERROR:\t%s [%d]\n", arg[2], res);
+			fprintf(stderr, "\n--------\n");
+			return 0;
+		}
+		
+		/* test 2/2 */
+		*cmd = '\x00';
+		strcat(cmd, arg[2]);
+		strcat(cmd, ".exe 1> ");
+		strcat(cmd, TLOG);
+		strcat(cmd, " 2>&1");
+		fprintf(stderr, "%s\n", cmd);
+		res=system(cmd);
+		
+		/* diagnostic 2/2 */
+		cmd = loadFile(TLOG);
+		if(cmd==NULL || strlen(cmd)<2){
+			cmd="";
+		}
+		fprintf(stderr, "%s\n", cmd);
+		if(modus==RUN){
+			if(res==0){
+				printf("PASS: \t%s\n", arg[2]);
+			}else if(res==256){
+				printf("FAIL: \t%s [run: %d]\n", arg[2], res);
+			}else{
+				printf("ERROR:\t%s [run: %d]\n", arg[2], res);
+			}
+		}else{
+			if(res==256){
+				printf("XFAIL:\t%s\n", arg[2]);
+			}else if(res==0){
+				printf("XPASS:\t%s [norun: %d]\n", arg[2], res);
+			}else{
+				printf("ERROR:\t%s [norun: %d]\n", arg[2], res);
+			}
+		}
+		fprintf(stderr, "--------\n");
+	}else{
+		printf("@toto@ %d (%s)\n", modus, arg[2]);
+	}
+	return 0;
+}