Mercurial > projects > dstress
annotate dstress.c @ 490:d091ff903fa4
added crashRun for POSIX systems
author | thomask |
---|---|
date | Wed, 27 Apr 2005 11:54:12 +0000 |
parents | ada646149a3b |
children | 1418f225a81e |
rev | line source |
---|---|
438 | 1 /* |
2 * core test tool for the DStress test suite | |
251 | 3 * http://dstress.kuehne.cn |
4 * | |
5 * Copyright (C) 2005 Thomas Kuehne <thomas@kuehne.cn> | |
6 * | |
7 * This program is free software; you can redistribute it and/or modify | |
8 * it under the terms of the GNU General Public License as published by | |
9 * the Free Software Foundation; either version 2 of the License, or | |
10 * (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 * GNU General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License | |
18 * along with this program; if not, write to the Free Software | |
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
20 * | |
21 * $HeadURL$ | |
22 * $Date$ | |
23 * $Author$ | |
24 * | |
438 | 25 */ |
251 | 26 |
438 | 27 /* Beware: the code doesn't care about freeing allocated memory etc... */ |
432 | 28 |
251 | 29 #include <stdlib.h> |
30 #include <stdio.h> | |
31 #include <string.h> | |
32 #include <errno.h> | |
33 | |
34 #define TAG "__DSTRESS_DFLAGS__" | |
35 #define OBJ "-odobj " | |
36 #define TLOG "log.tmp" | |
490 | 37 #define CRASH_RUN "./crashRun__" |
251 | 38 |
39 #define RUN 1 | |
40 #define NORUN 2 | |
41 #define COMPILE 4 | |
42 #define NOCOMPILE 8 | |
43 | |
490 | 44 /* secure malloc */ |
45 void *xmalloc(size_t size){ | |
46 void *p; | |
47 if (p < 0){ | |
48 fprintf(stderr,"Failed to allocate %zd bytes!\n", size); | |
49 exit(EXIT_FAILURE); | |
50 } | |
51 p = malloc(size); | |
52 if (p == NULL){ | |
53 fprintf(stderr,"Failed to allocate %zd bytes!\n", size); | |
54 exit(EXIT_FAILURE); | |
55 } | |
56 return p; | |
57 } | |
58 #define malloc xmalloc | |
59 | |
251 | 60 #ifdef __GNU_LIBRARY__ |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
61 #define USE_POSIX |
251 | 62 #endif |
63 | |
64 #ifdef __GLIBC__ | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
65 #define USE_POSIX |
251 | 66 #endif |
67 | |
68 #ifdef linux | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
69 #define USE_POSIX |
251 | 70 #endif |
71 | |
273 | 72 #if defined(__APPLE__) && defined(__MACH__) |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
73 #define USE_POSIX |
273 | 74 #endif |
75 | |
76 #ifdef __FreeBSD__ | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
77 #define USE_POSIX |
273 | 78 #endif |
79 | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
80 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
81 #ifdef USE_POSIX |
254 | 82 |
251 | 83 #include <sys/types.h> |
84 #include <sys/stat.h> | |
85 #include <fcntl.h> | |
86 #include <unistd.h> | |
490 | 87 |
88 #else | |
89 #ifdef WIN32 | |
90 | |
91 #include <windows.h> | |
92 | |
93 #endif /* WIN 32 */ | |
94 #endif /* USE_POSIX else */ | |
95 | |
96 | |
251 | 97 char* loadFile(char* filename){ |
490 | 98 #ifdef USE_POSIX |
251 | 99 char* back = NULL; |
100 struct stat fileInfo; | |
101 int file = open(filename, O_RDONLY); | |
102 if(errno == 0 && file != 0 && file != -1){ | |
103 if(0==fstat(file, &fileInfo)){ | |
104 back=malloc(fileInfo.st_size+1); | |
105 fileInfo.st_size = read(file, back, fileInfo.st_size); | |
440 | 106 if(fileInfo.st_size>=0){ |
251 | 107 *(back+fileInfo.st_size+1) = '\x00'; |
108 }else{ | |
436 | 109 back = NULL; |
251 | 110 } |
111 } | |
112 close(file); | |
113 } | |
436 | 114 |
115 if(back){ | |
116 return back; | |
117 } | |
440 | 118 if(0==strcmp(filename, TLOG)){ |
119 return calloc(1,sizeof(char)); | |
120 } | |
436 | 121 |
122 fprintf(stderr, "File not found \"%s\"\n", filename); | |
123 exit(EXIT_FAILURE); | |
490 | 124 #else |
254 | 125 #ifdef WIN32 |
126 | |
127 char* back=NULL; | |
128 DWORD size, numread; | |
129 HANDLE file=CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, | |
130 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); | |
131 if (file != INVALID_HANDLE_VALUE){ | |
132 size = GetFileSize(file, NULL); | |
133 if (size != INVALID_FILE_SIZE){ | |
134 back=malloc((size+1)*sizeof(char)); | |
292 | 135 if (ReadFile(file,back,size,&numread,NULL) == 1){ |
136 if (numread==size){ | |
254 | 137 *(back+size+1) = '\x00'; |
292 | 138 }else{ |
438 | 139 back = NULL; |
292 | 140 } |
141 }else{ | |
438 | 142 back = NULL; |
292 | 143 } |
254 | 144 } |
145 CloseHandle(file); | |
146 } | |
438 | 147 if(back){ |
148 errno = 0; | |
149 return back; | |
150 } | |
151 | |
152 fprintf(stderr, "File not found \"%s\"\n", filename); | |
153 exit(EXIT_FAILURE); | |
490 | 154 #else |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
155 |
490 | 156 #error "no loadFile implementation present" |
361 | 157 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
158 #endif /* WIN32 else */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
159 #endif /* USE_POSIX else */ |
490 | 160 } |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
161 |
438 | 162 /* cleanup "/" versus "\" in filenames */ |
163 char* cleanPathSeperator(char* filename){ | |
164 char* pos; | |
165 #ifdef USE_POSIX | |
166 for(pos=strchr(filename, '\\'); pos; pos=strchr(filename, '\\')){ | |
167 *pos='/'; | |
168 } | |
439 | 169 #else |
170 #if WIN32 | |
438 | 171 for(pos=strchr(filename, '/'); pos; pos=strchr(filename, '/')){ |
172 *pos='\\'; | |
173 } | |
174 #else | |
439 | 175 #error no cleanPathSeperator available for this system |
176 #endif /* WIN32 else */ | |
177 #endif /* USE_POSIX else */ | |
438 | 178 return filename; |
179 } | |
180 | |
490 | 181 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
182 /* Query the environment for the compiler name */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
183 char* getCompiler(){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
184 char* back = getenv("DMD"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
185 if(back == NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
186 back = getenv("dmd"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
187 if(back==NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
188 back = "dmd"; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
189 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
190 } |
438 | 191 return cleanPathSeperator(back); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
192 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
193 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
194 /* Query the environment for general flags */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
195 char* getGeneralFlags(){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
196 char* back = getenv("DFLAGS"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
197 if(back == NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
198 back = getenv("dflags"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
199 if(back==NULL){ |
432 | 200 back = calloc(1,1); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
201 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
202 } |
438 | 203 return cleanPathSeperator(back); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
204 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
205 |
490 | 206 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
207 /* extract the FIRST occurance of a given FLAG until the next linebreak */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
208 char* getCaseFlag(const char* data, const char* tag){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
209 char* begin; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
210 char* end1; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
211 char* end2; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
212 char* back; |
438 | 213 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
214 if(data!=NULL && tag!=NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
215 begin = strstr(data, tag); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
216 if(begin!=NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
217 begin = begin+strlen(tag); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
218 end1 = strstr(begin, "\n"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
219 end2 = strstr(begin, "\r"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
220 if(end2!=NULL && ((end1!=NULL && end2<end1) || end1==NULL)){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
221 end1=end2; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
222 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
223 if(end1==NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
224 end1 = begin + strlen(begin); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
225 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
226 back = malloc(end1-begin+1); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
227 strncpy(back, begin, end1-begin); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
228 back[end1-begin+1]='\x00'; |
438 | 229 return cleanPathSeperator(back); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
230 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
231 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
232 |
429 | 233 return calloc(1,1); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
234 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
235 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
236 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
237 int checkErrorMessage(const char* file_, const char* line_, const char* buffer){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
238 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
239 char* file; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
240 char* line; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
241 char* dmd; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
242 char* gdc; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
243 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
244 int back=0; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
245 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
246 /* clean arguments */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
247 if(strcmp(file_, "")!=0){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
248 file = malloc(strlen(file_)+1); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
249 strcpy(file, file_); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
250 }else{ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
251 file=NULL; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
252 } |
438 | 253 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
254 if(strcmp(line_, "")!=0){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
255 line = malloc(strlen(line_)+1); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
256 strcpy(line, line_); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
257 }else{ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
258 line=NULL; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
259 } |
438 | 260 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
261 /* gen patterns*/ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
262 if(file!=NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
263 if(line!=NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
264 dmd = malloc(strlen(file)+strlen(line)+5); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
265 dmd[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
266 strcat(dmd, file); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
267 strcat(dmd, "("); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
268 strcat(dmd, line); |
405
7df87732c662
fixed DMD's pattern generator for in-message location
thomask
parents:
373
diff
changeset
|
269 strcat(dmd, ")"); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
270 gdc = malloc(strlen(file)+strlen(line)+4); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
271 gdc[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
272 strcat(gdc, file); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
273 strcat(gdc, ":"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
274 strcat(gdc, line); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
275 strcat(gdc, ": "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
276 }else{ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
277 dmd = malloc(strlen(file)+2); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
278 dmd[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
279 strcat(dmd, file); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
280 strcat(dmd, "("); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
281 gdc = malloc(strlen(file)+2); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
282 gdc[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
283 strcat(gdc, file); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
284 strcat(gdc, ":"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
285 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
286 }else if(line!=NULL){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
287 dmd = malloc(strlen(line)+5); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
288 dmd[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
289 strcat(dmd, "("); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
290 strcat(dmd, line); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
291 strcat(dmd, "): "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
292 gdc = malloc(strlen(line)+4); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
293 gdc[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
294 strcat(gdc, ":"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
295 strcat(gdc, line); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
296 strcat(gdc, ": "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
297 }else{ |
432 | 298 return 1; |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
299 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
300 |
438 | 301 /* specific error messages */ |
251 | 302 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
303 if( (dmd!=NULL && strstr(buffer, dmd)) |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
304 || (gdc!=NULL && strstr(buffer, gdc)) |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
305 || (dmd==NULL && gdc==NULL)){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
306 back=1; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
307 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
308 |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
309 return back; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
310 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
311 |
432 | 312 int checkRuntimeErrorMessage(const char* file_, const char* line_, const char* buffer){ |
438 | 313 /* PhobosLong dir/file.d(2) |
490 | 314 * Phobos package.module(2) |
438 | 315 */ |
432 | 316 |
317 char* file; | |
318 char* line; | |
319 char* phobos; | |
320 char* phobosLong; | |
321 | |
322 char* begin; | |
439 | 323 char* end; |
432 | 324 |
325 int back=0; | |
326 | |
327 /* clean arguments */ | |
328 if(strcmp(file_, "")!=0){ | |
329 file = malloc(strlen(file_)+1); | |
330 strcpy(file, file_); | |
331 }else{ | |
332 file=NULL; | |
333 } | |
438 | 334 |
432 | 335 if(strcmp(line_, "")!=0){ |
336 line = malloc(strlen(line_)+1); | |
337 strcpy(line, line_); | |
338 }else{ | |
339 line=NULL; | |
340 } | |
438 | 341 |
432 | 342 /* gen patterns*/ |
343 if(file!=NULL){ | |
344 if(line!=NULL){ | |
345 phobos = malloc(strlen(file)+strlen(line)+5); | |
346 phobos[0]='\x00'; | |
438 | 347 begin=strrchr(file,'/'); |
348 if(begin){ | |
432 | 349 begin++; |
350 }else{ | |
438 | 351 begin=strrchr(file,'\\'); |
352 if(begin){ | |
353 begin++; | |
354 }else{ | |
355 begin=file; | |
356 } | |
432 | 357 } |
439 | 358 end=strrchr(file,'.'); |
359 strncat(phobos, begin, end-begin); | |
432 | 360 strcat(phobos, "("); |
361 strcat(phobos, line); | |
362 strcat(phobos, ")"); | |
363 | |
364 phobosLong = malloc(strlen(file)+strlen(line)+5); | |
365 phobosLong[0]='\x00'; | |
366 strcat(phobosLong, file); | |
367 strcat(phobosLong, "("); | |
368 strcat(phobosLong, line); | |
369 strcat(phobosLong, ")"); | |
370 | |
371 }else{ | |
372 phobos = malloc(strlen(file)+2); | |
373 phobos[0]='\x00'; | |
438 | 374 begin=strrchr(file,'/'); |
375 if(begin){ | |
432 | 376 begin++; |
377 }else{ | |
438 | 378 begin=strrchr(file,'\\'); |
379 if(begin){ | |
380 begin++; | |
381 }else{ | |
382 begin=file; | |
383 } | |
432 | 384 } |
439 | 385 end=strrchr(file,'.'); |
386 strncat(phobos, begin, end-begin); | |
432 | 387 strcat(phobos, "("); |
388 | |
389 phobosLong = malloc(strlen(file)+2); | |
390 phobosLong[0]='\x00'; | |
391 strcat(phobosLong, file); | |
392 strcat(phobosLong, "("); | |
393 } | |
394 }else if(line!=NULL){ | |
395 phobos = malloc(strlen(line)+3); | |
396 phobos[0]='\x00'; | |
397 strcat(phobos, "("); | |
398 strcat(phobos, line); | |
399 strcat(phobos, ")"); | |
438 | 400 |
432 | 401 phobosLong=NULL; |
402 }else{ | |
403 return 1; | |
404 } | |
405 | |
438 | 406 /* specific error messages */ |
432 | 407 |
408 if( (phobos && strstr(buffer, phobos)) | |
409 || (phobosLong && strstr(buffer, phobosLong))) | |
410 { | |
411 back=1; | |
412 } | |
438 | 413 |
414 return back; | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
415 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
416 |
490 | 417 int hadExecCrash(const char* buffer){ |
418 if(strstr(buffer, "Segmentation fault")!=NULL | |
419 || strstr(buffer, "Internal error")!= NULL | |
420 || strstr(buffer, "gcc.gnu.org/bugs")!=NULL) | |
421 { | |
422 return 1; | |
423 } | |
424 return 0; | |
425 } | |
426 | |
427 /* segfault resitant system call with time out */ | |
428 int crashRun(const char* cmd){ | |
429 #ifdef USE_POSIX | |
430 char* buffer=malloc(4+strlen(CRASH_RUN)+strlen(cmd)); | |
431 buffer[0]='\x00'; | |
432 strcat(buffer, "\""); | |
433 strcat(buffer, CRASH_RUN); | |
434 strcat(buffer, "\" "); | |
435 strcat(buffer, cmd); | |
436 system(buffer); | |
437 buffer=loadFile(TLOG); | |
438 | |
439 if(strstr(buffer, "EXIT CODE: 0")){ | |
440 return EXIT_SUCCESS; | |
441 }else if(strstr(buffer, "EXIT CODE: 256") | |
442 || strstr(buffer, "EXIT CODE: timeout")) | |
443 { | |
444 return EXIT_FAILURE; | |
445 }else{ | |
446 return RAND_MAX; | |
447 } | |
448 #else | |
449 | |
450 #error no crashRun implementation present | |
451 | |
452 #endif /* USE_POSIX else */ | |
453 } | |
454 | |
254 | 455 |
251 | 456 int main(int argc, char* arg[]){ |
438 | 457 char* compiler; /* the compiler - from enviroment flag "DMD" */ |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
458 char* cmd_arg_general; /* additional arguments - from enviroment flag "DFLAGS" */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
459 char* cmd_arg_case; /* additional arguments - from the testcase file */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
460 char* buffer; /* general purpos buffer */ |
438 | 461 int modus; /* test modus: RUN NORUN COMPILE NOCOMPILE */ |
462 int res; /* return code from external executions */ | |
463 char* case_file; | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
464 char* error_file; /* expected sourcefile containing the error */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
465 char* error_line; /* expected error line */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
466 int good_error; /* error contained file and line and matched the expectations */ |
438 | 467 |
251 | 468 /* check arguments */ |
469 if(argc != 3){ | |
438 | 470 err: |
471 if(argc!=0) | |
251 | 472 fprintf(stderr,"%s <run|norun|compile|nocompile> <source>\n", arg[0]); |
473 else | |
438 | 474 fprintf(stderr,"dstress <run|norun|compile|nocompile> <source>\n"); |
475 exit(EXIT_FAILURE); | |
251 | 476 } |
438 | 477 |
251 | 478 if(0==strcmp(arg[1], "run") || 0==strcmp(arg[1], "RUN")){ |
479 modus = RUN; | |
480 }else if(0==strcmp(arg[1], "norun") || 0==strcmp(arg[1], "NORUN")){ | |
481 modus = NORUN; | |
482 }else if(0==strcmp(arg[1], "compile") || 0==strcmp(arg[1], "COMPILE")){ | |
483 modus = COMPILE; | |
484 }else if(0==strcmp(arg[1], "nocompile") || 0==strcmp(arg[1], "NOCOMPILE")){ | |
485 modus = NOCOMPILE; | |
486 }else{ | |
487 goto err; | |
488 } | |
489 | |
490 /* gen flags */ | |
438 | 491 case_file = cleanPathSeperator(strdup(arg[2])); |
251 | 492 compiler = getCompiler(); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
493 cmd_arg_general = getGeneralFlags(); |
438 | 494 buffer = loadFile(case_file); |
495 | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
496 cmd_arg_case = getCaseFlag(buffer, "__DSTRESS_DFLAGS__"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
497 error_line = getCaseFlag(buffer, "__DSTRESS_ELINE__"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
498 error_file = getCaseFlag(buffer, "__DSTRESS_EFILE__"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
499 |
438 | 500 #if 0 |
501 fprintf(stderr, "case: \"%s\"\n", case_file); | |
502 fprintf(stderr, "compiler: \"%s\"\n", compiler); | |
503 fprintf(stderr, "DFLAGS G: \"%s\"\n", cmd_arg_general); | |
504 fprintf(stderr, "DFLAGS C: \"%s\"\n", cmd_arg_case); | |
505 fprintf(stderr, "ELINE : \"%s\"\n", error_line); | |
506 fprintf(stderr, "EFILE : \"%s\"\n", error_file); | |
507 #endif | |
508 | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
509 /* strip spaces */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
510 while(error_line[0]==' '){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
511 error_line++; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
512 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
513 for(buffer=error_line+strlen(error_line)-1; buffer && buffer[0]==' '; buffer=error_line+strlen(error_line)-1){ |
438 | 514 buffer[0]='\x00'; |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
515 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
516 while(error_file[0]==' '){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
517 error_file++; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
518 } |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
519 for(buffer=error_file+strlen(error_file)-1; buffer && buffer[0]==' '; buffer=error_file+strlen(error_file)-1){ |
438 | 520 buffer[0]='\x00'; |
251 | 521 } |
522 | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
523 /* set implicit source file */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
524 if(strcmp(error_line, "")!=0 && strcmp(error_file, "")==0){ |
438 | 525 error_file=case_file; |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
526 } |
438 | 527 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
528 /* start working */ |
251 | 529 if(modus==COMPILE || modus==NOCOMPILE){ |
530 /* gen command */ | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
531 buffer = malloc(strlen(compiler)+strlen(cmd_arg_general)+strlen(cmd_arg_case)+strlen(OBJ) |
438 | 532 +strlen(case_file)+strlen(TLOG)+64); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
533 buffer[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
534 strcat(buffer, compiler); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
535 strcat(buffer, " "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
536 strcat(buffer, cmd_arg_general); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
537 strcat(buffer, " "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
538 strcat(buffer, cmd_arg_case); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
539 strcat(buffer, " -c "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
540 if(NULL==strstr(buffer, "-od")){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
541 strcat(buffer, OBJ); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
542 strcat(buffer, " "); |
251 | 543 } |
438 | 544 strcat(buffer, case_file); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
545 strcat(buffer, " 1> "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
546 strcat(buffer, TLOG); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
547 strcat(buffer, " 2>&1"); |
251 | 548 |
549 /* test */ | |
550 if(modus==COMPILE){ | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
551 fprintf(stderr, "compile: %s\n", buffer); |
251 | 552 }else{ |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
553 fprintf(stderr, "nocompile: %s\n", buffer); |
251 | 554 } |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
555 res = crashRun(buffer); |
251 | 556 |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
557 /* diagnostic */ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
558 buffer = loadFile(TLOG); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
559 fprintf(stderr, "%s\n", buffer); |
438 | 560 good_error = checkErrorMessage(error_file, error_line, buffer); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
561 |
490 | 562 if(hadExecCrash(buffer)){ |
438 | 563 printf("ERROR:\t%s (Internal compiler error)\n", case_file); |
251 | 564 }else if(modus==COMPILE){ |
490 | 565 if(res==EXIT_SUCCESS){ |
438 | 566 printf("PASS: \t%s\n", case_file); |
490 | 567 }else if(res==EXIT_FAILURE && good_error){ |
438 | 568 if(checkErrorMessage(case_file, "", buffer)){ |
569 printf("FAIL: \t%s [%d]\n", case_file, res); | |
373
177ce8d13eac
test cases that unexpectetly fail and in addition fail to provide file/line information are now treated as ERROR instead of FAIL
thomask
parents:
361
diff
changeset
|
570 }else{ |
438 | 571 printf("ERROR:\t%s [%d] [bad error message]\n", case_file, res); |
373
177ce8d13eac
test cases that unexpectetly fail and in addition fail to provide file/line information are now treated as ERROR instead of FAIL
thomask
parents:
361
diff
changeset
|
572 } |
437 | 573 }else if(good_error){ |
438 | 574 printf("ERROR:\t%s [%d]\n", case_file, res); |
251 | 575 }else{ |
438 | 576 printf("ERROR:\t%s [%d] [bad error message]\n", case_file, res); |
251 | 577 } |
578 }else{ | |
490 | 579 if(res==EXIT_FAILURE){ |
361 | 580 if(good_error){ |
438 | 581 printf("XFAIL:\t%s\n", case_file); |
361 | 582 }else{ |
438 | 583 printf("FAIL: \t%s [bad error message]\n", case_file); |
361 | 584 } |
490 | 585 }else if(res==EXIT_SUCCESS){ |
438 | 586 printf("XPASS:\t%s\n", case_file); |
251 | 587 }else{ |
438 | 588 printf("ERROR:\t%s [%d]\n", case_file, res); |
251 | 589 } |
590 } | |
591 fprintf(stderr,"--------\n"); | |
592 }else if(modus==RUN || modus==NORUN){ | |
593 /* gen command */ | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
594 buffer = malloc(strlen(compiler)+strlen(cmd_arg_general)+strlen(cmd_arg_case)+strlen(OBJ) |
438 | 595 +strlen(case_file)*2+strlen(TLOG)+64); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
596 buffer[0]='\x00'; |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
597 strcat(buffer, compiler); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
598 strcat(buffer, " "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
599 strcat(buffer, cmd_arg_general); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
600 strcat(buffer, " "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
601 strcat(buffer, cmd_arg_case); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
602 strcat(buffer, " "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
603 if(NULL==strstr(buffer, "-od")){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
604 strcat(buffer, OBJ); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
605 strcat(buffer, " "); |
251 | 606 } |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
607 if(NULL==strstr(buffer, "-of")){ |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
608 strcat(buffer, "-of"); |
438 | 609 strcat(buffer, case_file); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
610 strcat(buffer, ".exe "); |
251 | 611 } |
438 | 612 strcat(buffer, case_file); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
613 strcat(buffer, " 1> "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
614 strcat(buffer, TLOG); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
615 strcat(buffer, " 2>&1"); |
251 | 616 |
617 /* test 1/2 */ | |
618 if(modus==RUN){ | |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
619 fprintf(stderr, "run: %s\n", buffer); |
251 | 620 }else{ |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
621 fprintf(stderr, "norun: %s\n", buffer); |
251 | 622 } |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
623 res = crashRun(buffer); |
438 | 624 |
251 | 625 /* diagnostic 1/2 */ |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
626 buffer = loadFile(TLOG); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
627 fprintf(stderr, "%s", buffer); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
628 good_error = checkErrorMessage(error_file, error_line, buffer); |
490 | 629 if(hadExecCrash(buffer)){ |
438 | 630 printf("ERROR:\t%s (Internal compiler error)\n", case_file); |
251 | 631 fprintf(stderr, "\n--------\n"); |
437 | 632 return EXIT_SUCCESS; |
490 | 633 }else if(res==EXIT_FAILURE && good_error){ |
438 | 634 printf("FAIL: \t%s [%d]\n", case_file, res); |
251 | 635 fprintf(stderr, "\n--------\n"); |
437 | 636 return EXIT_SUCCESS; |
490 | 637 }else if(res!=EXIT_SUCCESS){ |
437 | 638 if(good_error){ |
438 | 639 printf("ERROR:\t%s [%d]\n", case_file, res); |
437 | 640 }else{ |
438 | 641 printf("ERROR:\t%s [%d] [bad error message]\n", case_file, res); |
437 | 642 } |
251 | 643 fprintf(stderr, "\n--------\n"); |
437 | 644 return EXIT_SUCCESS; |
251 | 645 } |
438 | 646 |
251 | 647 /* test 2/2 */ |
438 | 648 buffer = malloc(strlen(case_file) + strlen(TLOG) + 24); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
649 *buffer = '\x00'; |
438 | 650 strcat(buffer, case_file); |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
651 strcat(buffer, ".exe 1> "); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
652 strcat(buffer, TLOG); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
653 strcat(buffer, " 2>&1"); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
654 fprintf(stderr, "%s\n", buffer); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
655 res=crashRun(buffer); |
438 | 656 |
251 | 657 /* diagnostic 2/2 */ |
339
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
658 buffer = loadFile(TLOG); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
659 fprintf(stderr, "%s\n", buffer); |
a74c84e75682
added error line tests (__DSTRESS_ELINE__ / __DSTRESS_EFILE__)
thomask
parents:
292
diff
changeset
|
660 good_error = checkRuntimeErrorMessage(error_file, error_line, buffer); |
251 | 661 if(modus==RUN){ |
490 | 662 if(res==EXIT_SUCCESS){ |
438 | 663 printf("PASS: \t%s\n", case_file); |
490 | 664 }else if(res==EXIT_FAILURE && good_error){ |
438 | 665 printf("FAIL: \t%s [run: %d]\n", case_file, res); |
251 | 666 }else{ |
437 | 667 if(good_error){ |
438 | 668 printf("ERROR:\t%s [run: %d]\n", case_file, res); |
437 | 669 }else{ |
438 | 670 printf("ERROR:\t%s [run: %d] [bad error message]\n", case_file, res); |
437 | 671 } |
251 | 672 } |
673 }else{ | |
490 | 674 if(res==EXIT_FAILURE){ |
361 | 675 if(good_error){ |
438 | 676 printf("XFAIL:\t%s\n", case_file); |
361 | 677 }else{ |
438 | 678 printf("FAIL: \t%s [bad errror message]\n", case_file); |
361 | 679 } |
490 | 680 }else if(res==EXIT_SUCCESS){ |
438 | 681 printf("XPASS:\t%s [norun: %d]\n", case_file, res); |
251 | 682 }else{ |
438 | 683 printf("ERROR:\t%s [norun: %d]\n", case_file, res); |
251 | 684 } |
685 } | |
686 fprintf(stderr, "--------\n"); | |
687 }else{ | |
438 | 688 printf("@bug@ %d (%s)\n", modus, case_file); |
436 | 689 return EXIT_FAILURE; |
251 | 690 } |
436 | 691 return EXIT_SUCCESS; |
251 | 692 } |