001 package edu.rice.cs.cunit.threadCheck.tests;
002
003 import edu.rice.cs.cunit.FileInstrumentor;
004 import edu.rice.cs.cunit.classFile.ClassFile;
005 import edu.rice.cs.cunit.classFile.MethodInfo;
006 import edu.rice.cs.cunit.instrumentors.threadCheck.AddThreadCheckStrategy;
007 import edu.rice.cs.cunit.instrumentors.threadCheck.CompoundThreadCheckStrategy;
008 import edu.rice.cs.cunit.util.Debug;
009 import edu.rice.cs.cunit.util.ExecJVM;
010 import edu.rice.cs.cunit.util.FileOps;
011 import edu.rice.cs.cunit.util.StreamRedirectThread;
012 import edu.rice.cs.cunit.util.NullStream;
013 import junit.framework.TestCase;
014
015 import java.io.*;
016 import java.util.ArrayList;
017 import java.util.List;
018
019 /**
020 * Unit test for thread checker annotations and the AddPredicateThreadCheckStrategy.
021 * @author Mathias Ricken
022 */
023 public class ThreadPredicateCheckTest extends TestCase {
024 File _tempDir;
025 final String LS = System.getProperty("line.separator");
026 final String FS = System.getProperty("file.separator");
027 final String PS = System.getProperty("path.separator");
028
029 public void setUp() throws Exception {
030 super.setUp();
031 _tempDir = FileOps.createTempDirectory("Predicate");
032 // _tempDir = new File(".", "tempDir"+FS+"Predicate");
033 _tempDir.mkdirs();
034 FileOps.copyFile(new File("classes"),_tempDir);
035 }
036
037
038 /**
039 * Tears down the fixture, for example, close a network connection. This method is called after a test is executed.
040 */
041 protected void tearDown() throws Exception {
042 FileOps.deleteDirectory(_tempDir);
043 FileOps.deleteDirectoryOnExit(_tempDir);
044 super.tearDown();
045 }
046
047 public void testTCSample5() throws IOException {
048 File base = new File(_tempDir, "sample"+FS+"threadCheck"+FS+"predicate");
049 assertTrue(base.exists() && base.isDirectory());
050 //List<File> files = FileOps.enumFiles(base);
051 List<File> files = new ArrayList<File>();
052 File cfile = new File(base, "TCSample5.class");
053 assertTrue(cfile.exists() && cfile.isFile());
054 files.add(cfile);
055
056 ArrayList<String> args = new ArrayList<String>();
057 args.add("-i");
058 args.add(CompoundThreadCheckStrategy.class.getName());
059 args.add("-X");
060
061 StringBuilder sb = new StringBuilder();
062 sb.append(AddThreadCheckStrategy.CLASS_PATH_PARAM_PREFIX);
063 sb.append(_tempDir.getAbsolutePath());
064 sb.append(PS);
065 sb.append(System.getProperty("java.class.path"));
066 sb.append(PS);
067 sb.append(FileInstrumentor.getDefaultSourceRtJarName());
068 args.add(sb.toString());
069
070 ArrayList<String> classPath = new ArrayList<String>();
071 for(String p: sb.toString().split(PS)) {
072 classPath.add(p);
073 }
074
075 for(File f: files) {
076 args.add(f.getAbsolutePath());
077 }
078
079 // System.out.println("Parameters:");
080 // for(String a: args) {
081 // System.out.println("\t"+a);
082 // }
083
084 ByteArrayOutputStream baos = new ByteArrayOutputStream();
085 Debug.out.setOutput(new PrintStream(baos));
086 FileInstrumentor.main(args.toArray(new String[0]));
087 String output = baos.toString();
088 // System.out.println(output);
089
090 // check no IOExceptions
091 int ioExcIndex = output.indexOf("IOExceptions: 0");
092 if (ioExcIndex<0) {
093 ioExcIndex = output.indexOf("IOExceptions: ");
094 int newLineIndex = output.indexOf(System.getProperty("line.separator"), ioExcIndex);
095 fail(output.substring(ioExcIndex,newLineIndex));
096 }
097
098 // check scanner results
099 String strScannerRes = "Scanner results: " + LS;
100 int sResultsIndex = output.indexOf(strScannerRes);
101 if (sResultsIndex<0) {
102 sResultsIndex = output.indexOf(strScannerRes);
103 fail(output.substring(sResultsIndex,ioExcIndex));
104 }
105 int nextLineIndex = output.indexOf(strScannerRes, sResultsIndex) + strScannerRes.length();
106 int nextLineEndIndex = output.indexOf(LS, nextLineIndex + 1);
107 String nextLine = output.substring(nextLineIndex, nextLineEndIndex);
108 if (!nextLine.equals("\tThreadChecker Bad Predicate Annotation Warning: Annotation "+
109 "sample.threadCheck.predicate.TCSample5$WrongAnnotation has meta-annotation "+
110 "@PredicateLink, but contains a member that is an annotation or an array of annotations: value"+
111 " (processing sample.threadCheck.predicate.TCSample5)")) {
112 fail("Expected 'Bad Predicate Annotation Warning' about WrongAnnotation, was '"+nextLine+"'");
113 }
114 if (!output.substring(nextLineEndIndex).startsWith(LS)) {
115 fail("Line separator expected after 'Bad Predicate Annotation Warning' about WrongAnnotation");
116 }
117 String remainderStr = output.substring(nextLineEndIndex+LS.length());
118 nextLineEndIndex = remainderStr.indexOf(LS);
119 nextLine = remainderStr.substring(0, nextLineEndIndex);
120 if (!nextLine.startsWith("\tThreadChecker Cache Info")) {
121 fail("Expected 'ThreadChecker Cache Info', was '"+nextLine+"'");
122 }
123 remainderStr = remainderStr.substring(nextLineEndIndex);
124 if (!remainderStr.startsWith(LS+LS+LS+"IOExceptions: 0"+LS)) {
125 fail("Expected '\n\n\nIOExceptions: 0\n', was '"+remainderStr+"'");
126 }
127
128 File cfile_old = new File(base, "TCSample5.class~");
129 assertTrue(cfile.exists() && cfile.isFile());
130 assertTrue(cfile_old.exists() && cfile_old.isFile());
131
132 FileInputStream fis = new FileInputStream(cfile);
133 ClassFile cf = new ClassFile(fis);
134 fis.close();
135 boolean foundInit = false, foundRun = false, foundError = false, foundRunObj = false;
136 boolean foundRunObj2 = false, foundRunIntString = false, foundMain = false;
137 for(MethodInfo mi: cf.getMethods()) {
138 if ((mi.getName().toString().equals("<init>")) &&
139 (mi.getDescriptor().toString().equals("()V"))) {
140 foundInit = true;
141 // int[] found = new int[2];
142 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
143 // int startIndex = getCtorStartIndex(il, cf, classPath);
144 // ++found[1+checkNotRunByGroup(il, startIndex, cf, ".*ai.*", 1)];
145 // assertEquals("Should not have had any misses", 0, found[0]);
146 // for (int i=1; i<found.length; ++i) {
147 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
148 // }
149 // il.setIndex(startIndex+found.length*2-1);
150 // AInstruction instr = il.getInstr();
151 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
152 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
153 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
154 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
155 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
156 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
157 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
158 // fail("Found more checks than expected");
159 // }
160 // }
161 // boolean res = il.advanceIndex();
162 // assertTrue(res);
163 }
164 else if ((mi.getName().toString().equals("main")) &&
165 (mi.getDescriptor().toString().equals("([Ljava/lang/String;)V"))) {
166 foundMain = true;
167 // int[] found = new int[4];
168 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
169 // ++found[1+checkNotRunByName(il, cf, "fum", 3)];
170 // ++found[1+checkNotRunByName(il, cf, "main", 3)];
171 // ++found[1+checkNotRunByName(il, cf, "foo", 3)];
172 // assertEquals("Should not have had any misses", 0, found[0]);
173 // for (int i=1; i<found.length; ++i) {
174 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
175 // }
176 // il.setIndex(found.length*2-1);
177 // AInstruction instr = il.getInstr();
178 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
179 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
180 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
181 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
182 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
183 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
184 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
185 // fail("Found more checks than expected");
186 // }
187 // }
188 // boolean res = il.advanceIndex();
189 // assertTrue(res);
190 }
191 else if ((mi.getName().toString().equals("error")) &&
192 (mi.getDescriptor().toString().equals("()V"))) {
193 foundError = true;
194 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
195 // int[] found = new int[4];
196 // ++found[1+checkNotRunById(il, cf, 1, 3)];
197 // ++found[1+checkNotRunByName(il, cf, "bar", 3)];
198 // ++found[1+checkNotRunByName(il, cf, "foo", 3)];
199 // assertEquals("Should not have had any misses", 0, found[0]);
200 // for (int i=1; i<found.length; ++i) {
201 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
202 // }
203 // il.setIndex(found.length*2-1);
204 // AInstruction instr = il.getInstr();
205 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
206 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
207 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
208 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
209 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
210 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
211 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
212 // fail("Found more checks than expected");
213 // }
214 // }
215 // boolean res = il.advanceIndex();
216 // assertTrue(res);
217 }
218 else if ((mi.getName().toString().equals("run")) &&
219 (mi.getDescriptor().toString().equals("()V"))) {
220 foundRun = true;
221 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
222 // int[] found = new int[4];
223 // ++found[1+checkNotRunById(il, cf, 1, 3)];
224 // ++found[1+checkNotRunByName(il, cf, "bar", 3)];
225 // ++found[1+checkNotRunByName(il, cf, "foo", 3)];
226 // assertEquals("Should not have had any misses", 0, found[0]);
227 // for (int i=1; i<found.length; ++i) {
228 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
229 // }
230 // il.setIndex(found.length*2-1);
231 // AInstruction instr = il.getInstr();
232 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
233 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
234 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
235 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
236 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
237 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
238 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
239 // fail("Found more checks than expected");
240 // }
241 // }
242 // boolean res = il.advanceIndex();
243 // assertTrue(res);
244 }
245 else if ((mi.getName().toString().equals("runObj")) &&
246 (mi.getDescriptor().toString().equals("()V"))) {
247 foundRunObj = true;
248 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
249 // int[] found = new int[4];
250 // ++found[1+checkNotRunById(il, cf, 1, 3)];
251 // ++found[1+checkNotRunByName(il, cf, "bar", 3)];
252 // ++found[1+checkNotRunByName(il, cf, "foo", 3)];
253 // assertEquals("Should not have had any misses", 0, found[0]);
254 // for (int i=1; i<found.length; ++i) {
255 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
256 // }
257 // il.setIndex(found.length*2-1);
258 // AInstruction instr = il.getInstr();
259 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
260 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
261 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
262 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
263 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
264 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
265 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
266 // fail("Found more checks than expected");
267 // }
268 // }
269 // boolean res = il.advanceIndex();
270 // assertTrue(res);
271 }
272 else if ((mi.getName().toString().equals("runObj2")) &&
273 (mi.getDescriptor().toString().equals("()V"))) {
274 foundRunObj2 = true;
275 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
276 // int[] found = new int[4];
277 // ++found[1+checkNotRunById(il, cf, 1, 3)];
278 // ++found[1+checkNotRunByName(il, cf, "bar", 3)];
279 // ++found[1+checkNotRunByName(il, cf, "foo", 3)];
280 // assertEquals("Should not have had any misses", 0, found[0]);
281 // for (int i=1; i<found.length; ++i) {
282 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
283 // }
284 // il.setIndex(found.length*2-1);
285 // AInstruction instr = il.getInstr();
286 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
287 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
288 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
289 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
290 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
291 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
292 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
293 // fail("Found more checks than expected");
294 // }
295 // }
296 // boolean res = il.advanceIndex();
297 // assertTrue(res);
298 }
299 else if ((mi.getName().toString().equals("runIntString")) &&
300 (mi.getDescriptor().toString().equals("()V"))) {
301 foundRunIntString = true;
302 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
303 // int[] found = new int[4];
304 // ++found[1+checkNotRunById(il, cf, 1, 3)];
305 // ++found[1+checkNotRunByName(il, cf, "bar", 3)];
306 // ++found[1+checkNotRunByName(il, cf, "foo", 3)];
307 // assertEquals("Should not have had any misses", 0, found[0]);
308 // for (int i=1; i<found.length; ++i) {
309 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
310 // }
311 // il.setIndex(found.length*2-1);
312 // AInstruction instr = il.getInstr();
313 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
314 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
315 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
316 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
317 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
318 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
319 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
320 // fail("Found more checks than expected");
321 // }
322 // }
323 // boolean res = il.advanceIndex();
324 // assertTrue(res);
325 }
326 }
327
328 assertTrue(foundInit);
329 assertTrue(foundRun);
330 assertTrue(foundError);
331 assertTrue(foundRunObj);
332 assertTrue(foundRunObj2);
333 assertTrue(foundRunIntString);
334 assertTrue(foundMain);
335
336 String className = "sample.threadCheck.predicate.TCSample5";
337 ByteArrayOutputStream stdOutStream = new ByteArrayOutputStream();
338 Process p = runTestClass(className, stdOutStream, NullStream.ONLY);
339 String stdOut = stdOutStream.toString();
340
341 File tcLog = new File(_tempDir, "threadCheck.log");
342 assertTrue(tcLog.exists() && tcLog.isFile());
343 fis = new FileInputStream(tcLog);
344 StringBuilder tcsb = new StringBuilder();
345 int x;
346 byte b[];
347 String s;
348 while((x = fis.available())>0) {
349 x = fis.available();
350 b = new byte[x];
351 fis.read(b);
352 s = new String(b);
353 tcsb.append(s);
354 }
355 fis.close();
356 String tc = tcsb.toString();
357 // System.out.println(tc);
358
359 // assertTrue(0 <= tc.indexOf("Thread Name Violation: NotRunBy (2 check(s), 1 violation(s))"+LS+"\tCurrent thread 'main', id 1, group 'main'"));
360 // assertTrue(0 <= tc.indexOf("Thread Group Name Violation: NotRunBy (4 check(s), 2 violation(s))"+LS+"\tCurrent thread 'main', id 1, group 'main'"));
361 // assertTrue(0 <= tc.indexOf("Thread Id Violation: NotRunBy (5 check(s), 3 violation(s))"+LS+"\tCurrent thread 'main', id 1, group 'main'"));
362
363 int count = 0, index = 0;
364 while((index=tc.indexOf("Violation:", index))>=0) { ++count; ++index; }
365 // System.out.println("Violation count = "+count);
366 assertEquals(43, count);
367
368 // System.out.println("stdout = ");
369 // System.out.println(stdOut);
370
371 int mainPos = stdOut.indexOf("Main!"+LS);
372 assertTrue(0 <= mainPos);
373 int outPos = stdOut.indexOf("thisO = null, value:float = 2.72"+LS);
374 assertTrue(0 <= outPos);
375 assertTrue(mainPos > outPos);
376 outPos = stdOut.indexOf("thisO = null, value:long = 1073741824"+LS);
377 assertTrue(0 <= outPos);
378 assertTrue(mainPos > outPos);
379 outPos = stdOut.indexOf("thisO = null, value:long[] = [1073741824]"+LS);
380 assertTrue(0 <= outPos);
381 assertTrue(mainPos > outPos);
382 outPos = stdOut.indexOf("thisO = null, value:char = a"+LS);
383 assertTrue(0 <= outPos);
384 assertTrue(mainPos > outPos);
385 outPos = stdOut.indexOf("thisO = null, value:byte[] = [123, -128]"+LS);
386 assertTrue(0 <= outPos);
387 assertTrue(mainPos > outPos);
388 outPos = stdOut.indexOf("thisO = null, value:int[] = [42, 100, 200]"+LS);
389 assertTrue(0 <= outPos);
390 assertTrue(mainPos > outPos);
391 outPos = stdOut.indexOf("thisO = null, value:char[] = [a, b, c]"+LS);
392 assertTrue(0 <= outPos);
393 assertTrue(mainPos > outPos);
394 outPos = stdOut.indexOf("thisO = null, value:byte = 123"+LS);
395 assertTrue(0 <= outPos);
396 assertTrue(mainPos > outPos);
397 outPos = stdOut.indexOf("thisO = null, value:int = 42"+LS);
398 assertTrue(0 <= outPos);
399 assertTrue(mainPos > outPos);
400 outPos = stdOut.indexOf("thisO = null, value:double[] = [3.14]"+LS);
401 assertTrue(0 <= outPos);
402 assertTrue(mainPos > outPos);
403 outPos = stdOut.indexOf("thisO = null, value:short[] = [32000, -16000, 0]"+LS);
404 assertTrue(0 <= outPos);
405 assertTrue(mainPos > outPos);
406 outPos = stdOut.indexOf("thisO = null, value:boolean[] = [false, true, false, true, false]"+LS);
407 assertTrue(0 <= outPos);
408 assertTrue(mainPos > outPos);
409 outPos = stdOut.indexOf("thisO = null, value:short = 32000"+LS);
410 assertTrue(0 <= outPos);
411 assertTrue(mainPos > outPos);
412 outPos = stdOut.indexOf("thisO = null, value:double = 3.14"+LS);
413 assertTrue(0 <= outPos);
414 assertTrue(mainPos > outPos);
415 outPos = stdOut.indexOf("thisO = null, value:float[] = [2.72, 1.11, 2.22, 3.33]"+LS);
416 assertTrue(0 <= outPos);
417 assertTrue(mainPos > outPos);
418 outPos = stdOut.indexOf("thisO = null, value:boolean = true"+LS);
419 assertTrue(0 <= outPos);
420 assertTrue(mainPos > outPos);
421
422 int runPos = stdOut.indexOf("Run!"+LS+"Error!"+LS);
423 assertTrue(runPos > mainPos);
424 String prefix = "thisO = sample.threadCheck.predicate.TCSample5@";
425 int prefixPos = stdOut.indexOf(prefix);
426 assertTrue(0 <= prefixPos);
427 assertTrue(prefixPos > mainPos);
428 assertTrue(prefixPos < runPos);
429 String number = stdOut.substring(prefixPos+prefix.length(), stdOut.indexOf(",", prefixPos));
430 // System.out.println("Number = '"+number+"'");
431 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:long = 1073741824"+LS);
432 assertTrue(0 <= outPos);
433 assertTrue(runPos > outPos);
434 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:char[] = []"+LS);
435 assertTrue(0 <= outPos);
436 assertTrue(runPos > outPos);
437 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:float[] = []"+LS);
438 assertTrue(0 <= outPos);
439 assertTrue(runPos > outPos);
440 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:double[] = []"+LS);
441 assertTrue(0 <= outPos);
442 assertTrue(runPos > outPos);
443 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:char = a"+LS);
444 assertTrue(0 <= outPos);
445 assertTrue(runPos > outPos);
446 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:int[] = []"+LS);
447 assertTrue(0 <= outPos);
448 assertTrue(runPos > outPos);
449 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:long[] = []"+LS);
450 assertTrue(0 <= outPos);
451 assertTrue(runPos > outPos);
452 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:short[] = []"+LS);
453 assertTrue(0 <= outPos);
454 assertTrue(runPos > outPos);
455 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:byte = 123"+LS);
456 assertTrue(0 <= outPos);
457 assertTrue(runPos > outPos);
458 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:boolean = true"+LS);
459 assertTrue(0 <= outPos);
460 assertTrue(runPos > outPos);
461 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:boolean[] = []"+LS);
462 assertTrue(0 <= outPos);
463 assertTrue(runPos > outPos);
464 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:short = 32000"+LS);
465 assertTrue(0 <= outPos);
466 assertTrue(runPos > outPos);
467 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:float = 2.72"+LS);
468 assertTrue(0 <= outPos);
469 assertTrue(runPos > outPos);
470 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:double = 3.14"+LS);
471 assertTrue(0 <= outPos);
472 assertTrue(runPos > outPos);
473 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:byte[] = []"+LS);
474 assertTrue(0 <= outPos);
475 assertTrue(runPos > outPos);
476 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:int = 42"+LS);
477 assertTrue(0 <= outPos);
478 assertTrue(runPos > outPos);
479
480 int runObjPos = stdOut.indexOf("Run Obj!"+LS);
481 assertTrue(0 <=runObjPos);
482 assertTrue(runObjPos > runPos);
483 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:enum[] = []"+LS);
484 assertTrue(0 <= outPos);
485 assertTrue(runObjPos > outPos);
486 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:String = foo"+LS);
487 assertTrue(0 <= outPos);
488 assertTrue(runObjPos > outPos);
489 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:Class = class java.lang.String"+LS);
490 assertTrue(0 <= outPos);
491 assertTrue(runObjPos > outPos);
492 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:enum = NOT"+LS);
493 assertTrue(0 <= outPos);
494 assertTrue(runObjPos > outPos);
495 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:Class[] = [class java.lang.Object, class java.lang.Integer]"+LS);
496 assertTrue(0 <= outPos);
497 assertTrue(runObjPos > outPos);
498 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:String[] = [xxx, yyy, zzz]"+LS);
499 assertTrue(0 <= outPos);
500 assertTrue(runObjPos > outPos);
501
502 int runObj2Pos = stdOut.indexOf("Run Obj 2!"+LS);
503 assertTrue(0 <= runObj2Pos);
504 assertTrue(runObj2Pos > runObjPos);
505 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:String[] = []"+LS);
506 assertTrue(0 <= outPos);
507 assertTrue(runObj2Pos > outPos);
508 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:enum[] = []"+LS);
509 assertTrue(0 <= outPos);
510 assertTrue(runObj2Pos > outPos);
511 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", value:Class[] = []"+LS);
512 assertTrue(0 <= outPos);
513 assertTrue(runObj2Pos > outPos);
514
515 int runISPos = stdOut.indexOf("Run Int String!"+LS);
516 assertTrue(0 <= runISPos);
517 assertTrue(runISPos > runObj2Pos);
518 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", i:int = 123, s:String = abc"+LS);
519 assertTrue(0 <= outPos);
520 assertTrue(runISPos > outPos);
521 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample5@"+number+", i:int = 456, s:String = xyz"+LS);
522 assertTrue(0 <= outPos);
523 assertTrue(runISPos > outPos);
524
525 assertEquals(0, p.exitValue());
526 }
527
528 public void testTCSample7() throws IOException {
529 File base = new File(_tempDir, "sample"+FS+"threadCheck"+FS+"predicate");
530 assertTrue(base.exists() && base.isDirectory());
531 //List<File> files = FileOps.enumFiles(base);
532 List<File> files = new ArrayList<File>();
533 File cfile = new File(base, "TCSample7.class");
534 assertTrue(cfile.exists() && cfile.isFile());
535 files.add(cfile);
536
537 ArrayList<String> args = new ArrayList<String>();
538 args.add("-i");
539 args.add(CompoundThreadCheckStrategy.class.getName());
540 args.add("-X");
541
542 StringBuilder sb = new StringBuilder();
543 sb.append(AddThreadCheckStrategy.CLASS_PATH_PARAM_PREFIX);
544 sb.append(_tempDir.getAbsolutePath());
545 sb.append(PS);
546 sb.append(System.getProperty("java.class.path"));
547 sb.append(PS);
548 sb.append(FileInstrumentor.getDefaultSourceRtJarName());
549 args.add(sb.toString());
550
551 ArrayList<String> classPath = new ArrayList<String>();
552 for(String p: sb.toString().split(PS)) {
553 classPath.add(p);
554 }
555
556 for(File f: files) {
557 args.add(f.getAbsolutePath());
558 }
559
560 // System.out.println("Parameters:");
561 // for(String a: args) {
562 // System.out.println("\t"+a);
563 // }
564
565 ByteArrayOutputStream baos = new ByteArrayOutputStream();
566 Debug.out.setOutput(new PrintStream(baos));
567 FileInstrumentor.main(args.toArray(new String[0]));
568 String output = baos.toString();
569 // System.out.println(output);
570
571 // check no IOExceptions
572 int ioExcIndex = output.indexOf("IOExceptions: 0");
573 if (ioExcIndex<0) {
574 ioExcIndex = output.indexOf("IOExceptions: ");
575 int newLineIndex = output.indexOf(System.getProperty("line.separator"), ioExcIndex);
576 fail(output.substring(ioExcIndex,newLineIndex));
577 }
578
579 // check scanner results
580 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$OKPublicStaticPredicate$WrongPublicStaticPrivateStaticPredicate is not accessible from everywhere")>=0);
581 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$OKPublicStaticPredicate$WrongPublicStaticProtectedStaticPredicate is not accessible from everywhere")>=0);
582 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$OKPublicStaticPredicate$WrongPublicStaticStaticPredicate is not accessible from everywhere")>=0);
583 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongPrivateStaticPredicate is not accessible from everywhere")>=0);
584 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongPrivateStaticPredicate$WrongPrivateStaticPrivateStaticPredicate is not accessible from everywhere")>=0);
585 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongPrivateStaticPredicate$WrongPrivateStaticProtectedStaticPredicate is not accessible from everywhere")>=0);
586 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongPrivateStaticPredicate$WrongPrivateStaticPublicStaticPredicate is not accessible from everywhere")>=0);
587 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongPrivateStaticPredicate$WrongPrivateStaticStaticPredicate is not accessible from everywhere")>=0);
588 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongProtectedStaticPredicate is not accessible from everywhere")>=0);
589 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongProtectedStaticPredicate$WrongProtectedStaticPrivateStaticPredicate is not accessible from everywhere")>=0);
590 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongProtectedStaticPredicate$WrongProtectedStaticProtectedStaticPredicate is not accessible from everywhere")>=0);
591 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongProtectedStaticPredicate$WrongProtectedStaticPublicStaticPredicate is not accessible from everywhere")>=0);
592 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$WrongProtectedStaticPredicate$WrongProtectedStaticStaticPredicate is not accessible from everywhere")>=0);
593 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.WrongPackageProtectedPredicate is not accessible from everywhere")>=0);
594 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$OKPublicStaticPredicate$OKPublicStaticPublicStaticAnnotation is not accessible from everywhere")<0);
595 assertTrue(output.indexOf("ThreadChecker Bad Predicate Annotation Warning: Predicate method class sample.threadCheck.predicate.TCSample7$OKPublicStaticPredicate is not accessible from everywhere")<0);
596
597 String strScannerRes = "Scanner results: " + LS;
598 int sResultsIndex = output.indexOf(strScannerRes);
599 if (sResultsIndex<0) {
600 sResultsIndex = output.indexOf(strScannerRes);
601 fail(output.substring(sResultsIndex,ioExcIndex));
602 }
603 String remainderStr = output.substring(sResultsIndex+strScannerRes.length());
604 int nextLineEndIndex;
605 String nextLine;
606 for(int i=0; i<14; ++i) {
607 nextLineEndIndex = remainderStr.indexOf(LS);
608 nextLine = remainderStr.substring(0,nextLineEndIndex+LS.length());
609 if (!nextLine.startsWith("\tThreadChecker Bad Predicate Annotation Warning:")) {
610 fail("Expected 'Bad Predicate Annotation Warning', was '"+nextLine+"'");
611 }
612 if (!remainderStr.substring(nextLineEndIndex).startsWith(LS)) {
613 fail("Line separator expected after 'Bad Predicate Annotation Warning'");
614 }
615 remainderStr = remainderStr.substring(nextLineEndIndex+LS.length());
616 }
617
618 nextLineEndIndex = remainderStr.indexOf(LS);
619 nextLine = remainderStr.substring(0,nextLineEndIndex+LS.length());
620 if (!nextLine.startsWith("\tThreadChecker Cache Info:")) {
621 fail("Expected 'ThreadChecker Cache Info', was '"+nextLine+"'");
622 }
623 if (!remainderStr.substring(nextLineEndIndex).startsWith(LS)) {
624 fail("Line separator expected after 'ThreadChecker Cache Info'");
625 }
626 remainderStr = remainderStr.substring(nextLineEndIndex+LS.length());
627
628 if (!remainderStr.startsWith(LS+LS+"IOExceptions: 0"+LS)) {
629 fail("Expected '\n\nIOExceptions: 0\n', was '"+remainderStr+"'");
630 }
631
632 File cfile_old = new File(base, "TCSample7.class~");
633 assertTrue(cfile.exists() && cfile.isFile());
634 assertTrue(cfile_old.exists() && cfile_old.isFile());
635
636 FileInputStream fis = new FileInputStream(cfile);
637 ClassFile cf = new ClassFile(fis);
638 fis.close();
639 boolean foundInit = false, foundMain = false;
640 for(MethodInfo mi: cf.getMethods()) {
641 if ((mi.getName().toString().equals("<init>")) &&
642 (mi.getDescriptor().toString().equals("()V"))) {
643 foundInit = true;
644 // int[] found = new int[2];
645 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
646 // int startIndex = getCtorStartIndex(il, cf, classPath);
647 // ++found[1+checkNotRunByGroup(il, startIndex, cf, ".*ai.*", 1)];
648 // assertEquals("Should not have had any misses", 0, found[0]);
649 // for (int i=1; i<found.length; ++i) {
650 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
651 // }
652 // il.setIndex(startIndex+found.length*2-1);
653 // AInstruction instr = il.getInstr();
654 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
655 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
656 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
657 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
658 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
659 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
660 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
661 // fail("Found more checks than expected");
662 // }
663 // }
664 // boolean res = il.advanceIndex();
665 // assertTrue(res);
666 }
667 else if ((mi.getName().toString().equals("main")) &&
668 (mi.getDescriptor().toString().equals("([Ljava/lang/String;)V"))) {
669 foundMain = true;
670 // int[] found = new int[4];
671 // InstructionList il = new InstructionList(mi.getCodeAttributeInfo().getCode());
672 // ++found[1+checkNotRunByName(il, cf, "fum", 3)];
673 // ++found[1+checkNotRunByName(il, cf, "main", 3)];
674 // ++found[1+checkNotRunByName(il, cf, "foo", 3)];
675 // assertEquals("Should not have had any misses", 0, found[0]);
676 // for (int i=1; i<found.length; ++i) {
677 // assertEquals("Should have found segment "+i+" once", 1, found[i]);
678 // }
679 // il.setIndex(found.length*2-1);
680 // AInstruction instr = il.getInstr();
681 // if (Opcode.INVOKESTATIC==instr.getOpcode()) {
682 // ReferenceInstruction refInstr = (ReferenceInstruction)instr;
683 // MethodPoolInfo mipi = (MethodPoolInfo)cf.getConstantPoolItem(refInstr.getReference());
684 // if (("edu/rice/cs/cunit/threadCheck/ThreadCheck".equals(mipi.getClassInfo().toString())) &&
685 // (mipi.getNameAndType().getName().toString().startsWith("checkCurrent")) &&
686 // (("(J)V".equals(mipi.getNameAndType().getDescriptor().toString())) ||
687 // ("(Ljava/lang/String;)V".equals(mipi.getNameAndType().getDescriptor().toString())))) {
688 // fail("Found more checks than expected");
689 // }
690 // }
691 // boolean res = il.advanceIndex();
692 // assertTrue(res);
693 }
694 }
695
696 assertTrue(foundInit);
697 assertTrue(foundMain);
698
699 String className = "sample.threadCheck.predicate.TCSample7";
700 ByteArrayOutputStream stdOutStream = new ByteArrayOutputStream();
701 Process p = runTestClass(className, stdOutStream, NullStream.ONLY);
702 String stdOut = stdOutStream.toString();
703
704 File tcLog = new File(_tempDir, "threadCheck.log");
705 assertTrue(tcLog.exists() && tcLog.isFile());
706 fis = new FileInputStream(tcLog);
707 StringBuilder tcsb = new StringBuilder();
708 int x;
709 byte b[];
710 String s;
711 while((x = fis.available())>0) {
712 x = fis.available();
713 b = new byte[x];
714 fis.read(b);
715 s = new String(b);
716 tcsb.append(s);
717 }
718 fis.close();
719 String tc = tcsb.toString();
720 // System.out.println(tc);
721
722 // assertTrue(0 <= tc.indexOf("Thread Name Violation: NotRunBy (2 check(s), 1 violation(s))"+LS+"\tCurrent thread 'main', id 1, group 'main'"));
723 // assertTrue(0 <= tc.indexOf("Thread Group Name Violation: NotRunBy (4 check(s), 2 violation(s))"+LS+"\tCurrent thread 'main', id 1, group 'main'"));
724 // assertTrue(0 <= tc.indexOf("Thread Id Violation: NotRunBy (5 check(s), 3 violation(s))"+LS+"\tCurrent thread 'main', id 1, group 'main'"));
725
726 int count = 0, index = 0;
727 while((index=tc.indexOf("Violation:", index))>=0) { ++count; ++index; }
728 // System.out.println("Violation count = "+count);
729 assertEquals(16, count);
730
731 // System.out.println("stdout = ");
732 // System.out.println(stdOut);
733
734 int mainPos = stdOut.indexOf("main!"+LS);
735 assertTrue(0 <= mainPos);
736 int outPos = stdOut.indexOf("WrongPrivateStaticPrivateStaticAnnotation: thisO = null"+LS);
737 assertTrue(0 <= outPos);
738 assertTrue(mainPos > outPos);
739 outPos = stdOut.indexOf("OKPublicStaticPublicStaticAnnotation: thisO = null"+LS);
740 assertTrue(0 <= outPos);
741 assertTrue(mainPos > outPos);
742 outPos = stdOut.indexOf("OKPublicStaticPredicate: thisO = null"+LS);
743 assertTrue(0 <= outPos);
744 assertTrue(mainPos > outPos);
745 outPos = stdOut.indexOf("WrongPrivateStaticProtectedStaticAnnotation: thisO = null"+LS);
746 assertTrue(0 <= outPos);
747 assertTrue(mainPos > outPos);
748 outPos = stdOut.indexOf("WrongPublicStaticStaticAnnotation: thisO = null"+LS);
749 assertTrue(0 <= outPos);
750 assertTrue(mainPos > outPos);
751 outPos = stdOut.indexOf("WrongPackageProtectedPredicate: thisO = null"+LS);
752 assertTrue(0 <= outPos);
753 assertTrue(mainPos > outPos);
754 outPos = stdOut.indexOf("WrongPublicStaticProtectedStaticAnnotation: thisO = null"+LS);
755 assertTrue(0 <= outPos);
756 assertTrue(mainPos > outPos);
757 outPos = stdOut.indexOf("WrongProtectedStaticPredicate: thisO = null"+LS);
758 assertTrue(0 <= outPos);
759 assertTrue(mainPos > outPos);
760 outPos = stdOut.indexOf("WrongPrivateStaticPublicStaticAnnotation: thisO = null"+LS);
761 assertTrue(0 <= outPos);
762 assertTrue(mainPos > outPos);
763 outPos = stdOut.indexOf("WrongProtectedStaticStaticAnnotation: thisO = null"+LS);
764 assertTrue(0 <= outPos);
765 assertTrue(mainPos > outPos);
766 outPos = stdOut.indexOf("WrongPrivateStaticStaticAnnotation: thisO = null"+LS);
767 assertTrue(0 <= outPos);
768 assertTrue(mainPos > outPos);
769 outPos = stdOut.indexOf("WrongPublicStaticPrivateStaticAnnotation: thisO = null"+LS);
770 assertTrue(0 <= outPos);
771 assertTrue(mainPos > outPos);
772 outPos = stdOut.indexOf("WrongProtectedStaticPublicStaticAnnotation: thisO = null"+LS);
773 assertTrue(0 <= outPos);
774 assertTrue(mainPos > outPos);
775 outPos = stdOut.indexOf("WrongProtectedStaticPrivateStaticAnnotation: thisO = null"+LS);
776 assertTrue(0 <= outPos);
777 assertTrue(mainPos > outPos);
778 outPos = stdOut.indexOf("WrongProtectedStaticProtectedStaticAnnotation: thisO = null"+LS);
779 assertTrue(0 <= outPos);
780 assertTrue(mainPos > outPos);
781 outPos = stdOut.indexOf("WrongPrivateStaticPredicate: thisO = null"+LS);
782 assertTrue(0 <= outPos);
783 assertTrue(mainPos > outPos);
784
785 assertEquals(0, p.exitValue());
786 }
787
788 public void testTCSample4() throws IOException {
789 File base = new File(_tempDir, "sample"+FS+"threadCheck"+FS+"predicate");
790 assertTrue(base.exists() && base.isDirectory());
791 //List<File> files = FileOps.enumFiles(base);
792 List<File> files = new ArrayList<File>();
793 File cfile = new File(base, "TCSample4.class");
794 assertTrue(cfile.exists() && cfile.isFile());
795 files.add(cfile);
796
797 ArrayList<String> args = new ArrayList<String>();
798 args.add("-i");
799 args.add(CompoundThreadCheckStrategy.class.getName());
800 args.add("-X");
801
802 StringBuilder sb = new StringBuilder();
803 sb.append(AddThreadCheckStrategy.CLASS_PATH_PARAM_PREFIX);
804 sb.append(_tempDir.getAbsolutePath());
805 sb.append(PS);
806 sb.append(System.getProperty("java.class.path"));
807 sb.append(PS);
808 sb.append(FileInstrumentor.getDefaultSourceRtJarName());
809 args.add(sb.toString());
810
811 ArrayList<String> classPath = new ArrayList<String>();
812 for(String p: sb.toString().split(PS)) {
813 classPath.add(p);
814 }
815
816 for(File f: files) {
817 args.add(f.getAbsolutePath());
818 }
819
820 // System.out.println("Parameters:");
821 // for(String a: args) {
822 // System.out.println("\t"+a);
823 // }
824
825 ByteArrayOutputStream baos = new ByteArrayOutputStream();
826 Debug.out.setOutput(new PrintStream(baos));
827 FileInstrumentor.main(args.toArray(new String[0]));
828 String output = baos.toString();
829 // System.out.println(output);
830
831 // check no IOExceptions
832 int ioExcIndex = output.indexOf("IOExceptions: 0");
833 if (ioExcIndex<0) {
834 ioExcIndex = output.indexOf("IOExceptions: ");
835 int newLineIndex = output.indexOf(System.getProperty("line.separator"), ioExcIndex);
836 fail(output.substring(ioExcIndex,newLineIndex));
837 }
838
839 // check scanner results
840 String strScannerRes = "Scanner results: " + LS;
841 int sResultsIndex = output.indexOf(strScannerRes);
842 if (sResultsIndex<0) {
843 sResultsIndex = output.indexOf(strScannerRes);
844 fail(output.substring(sResultsIndex,ioExcIndex));
845 }
846 int nextLineIndex = output.indexOf(strScannerRes, sResultsIndex) + strScannerRes.length();
847 int nextLineEndIndex = output.indexOf(LS, nextLineIndex + 1);
848 String nextLine = output.substring(nextLineIndex, nextLineEndIndex);
849 if (!nextLine.equals("\tThreadChecker Bad Predicate Annotation Warning: Annotation sample.threadCheck."
850 + "predicate.ErroneousCombine has meta-annotation @Combine, but contains a member "
851 + "that is not a Thread Checker annotation or an array thereof: value "
852 + "(processing sample.threadCheck.predicate.TCSample4)")) {
853 fail("Expected 'Bad Predicate Annotation Warning' about ErroneousCombine, was '"+nextLine+"'");
854 }
855 if (!output.substring(nextLineEndIndex).startsWith(LS)) {
856 fail("Line separator expected after 'Bad Predicate Annotation Warning' about ErroneousCombine");
857 }
858 String remainderStr = output.substring(nextLineEndIndex+LS.length());
859 nextLineEndIndex = remainderStr.indexOf(LS);
860 nextLine = remainderStr.substring(0, nextLineEndIndex);
861 if (!nextLine.equals("\tThreadChecker Bad Predicate Annotation Warning: java.lang.String is not an "
862 +"annotation (processing sample.threadCheck.predicate.TCSample4)")) {
863 fail("Expected 'Bad Predicate Annotation Warning' about String, was '"+nextLine+"'");
864 }
865 if (!remainderStr.substring(nextLineEndIndex).startsWith(LS)) {
866 fail("Line separator expected after 'Bad Predicate Annotation Warning' about String");
867 }
868 remainderStr = remainderStr.substring(nextLineEndIndex+LS.length());
869 nextLineEndIndex = remainderStr.indexOf(LS);
870 nextLine = remainderStr.substring(0, nextLineEndIndex);
871 if (!nextLine.startsWith("\tThreadChecker Cache Info")) {
872 fail("Expected 'ThreadChecker Cache Info', was '"+nextLine+"'");
873 }
874 remainderStr = remainderStr.substring(nextLineEndIndex);
875 if (!remainderStr.startsWith(LS+LS+LS+"IOExceptions: 0"+LS)) {
876 fail("Expected '\n\n\nIOExceptions: 0\n', was '"+remainderStr+"'");
877 }
878
879 File cfile_old = new File(base, "TCSample4.class~");
880 assertTrue(cfile.exists() && cfile.isFile());
881 assertTrue(cfile_old.exists() && cfile_old.isFile());
882
883 String className = "sample.threadCheck.predicate.TCSample4";
884 ByteArrayOutputStream stdOutStream = new ByteArrayOutputStream();
885 Process p = runTestClass(className, stdOutStream, NullStream.ONLY);
886 String stdOut = stdOutStream.toString();
887 // System.out.println(stdOut);
888
889 File tcLog = new File(_tempDir, "threadCheck.log");
890 assertTrue(tcLog.exists() && tcLog.isFile());
891 FileInputStream fis = new FileInputStream(tcLog);
892 StringBuilder tcsb = new StringBuilder();
893 int x;
894 byte b[];
895 String s;
896 while((x = fis.available())>0) {
897 x = fis.available();
898 b = new byte[x];
899 fis.read(b);
900 s = new String(b);
901 tcsb.append(s);
902 }
903 fis.close();
904 String tc = tcsb.toString();
905 // System.out.println(tc);
906
907 int count = 0, index = 0;
908 while((index=tc.indexOf("Violation:", index))>=0) { ++count; ++index; }
909 // System.out.println("Violation count = "+count);
910 assertEquals(57, count);
911
912 // System.out.println("stdout = ");
913 // System.out.println(stdOut);
914
915 int prevPos = stdOut.indexOf("testAnnArrayx_x_x_x!"+LS+
916 "testAnnArrayx_x_0_0!"+LS+
917 "testAnnArray0_0_x_x!"+LS);
918 assertTrue(0 <= prevPos);
919 String prefix = "thisO = sample.threadCheck.predicate.TCSample4@";
920 int prefixPos = stdOut.indexOf(prefix);
921 assertTrue(0 <= prefixPos);
922 assertTrue(prefixPos > prevPos);
923 String number = stdOut.substring(prefixPos+prefix.length(), stdOut.indexOf(",", prefixPos));
924 int outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_0_0_1a"+LS);
925 assertTrue(0 <= outPos);
926 assertTrue(prevPos < outPos);
927
928 int newPos = stdOut.indexOf("testAnnArrayx_x_0_1!"+LS);
929 assertTrue(newPos > prevPos);
930 prevPos = newPos;
931 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_1a_0"+LS);
932 assertTrue(0 <= outPos);
933 assertTrue(prevPos < outPos);
934
935 newPos = stdOut.indexOf("testAnnArrayx_x_1_0!"+LS);
936 assertTrue(newPos > prevPos);
937 prevPos = newPos;
938 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_1_1a"+LS);
939 assertTrue(0 <= outPos);
940 assertTrue(prevPos < outPos);
941 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_1a_1"+LS);
942 assertTrue(0 <= outPos);
943 assertTrue(prevPos < outPos);
944
945 newPos = stdOut.indexOf("testAnnArrayx_x_1_1!"+LS);
946 assertTrue(newPos > prevPos);
947 prevPos = newPos;
948 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_0_2b"+LS);
949 assertTrue(0 <= outPos);
950 assertTrue(prevPos < outPos);
951 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_0_2a"+LS);
952 assertTrue(0 <= outPos);
953 assertTrue(prevPos < outPos);
954
955 newPos = stdOut.indexOf("testAnnArrayx_x_0_2!"+LS);
956 assertTrue(newPos > prevPos);
957 prevPos = newPos;
958 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2b_0"+LS);
959 assertTrue(0 <= outPos);
960 assertTrue(prevPos < outPos);
961 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2a_0"+LS);
962 assertTrue(0 <= outPos);
963 assertTrue(prevPos < outPos);
964
965 newPos = stdOut.indexOf("testAnnArrayx_x_2_0!"+LS);
966 assertTrue(newPos > prevPos);
967 prevPos = newPos;
968 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_1_2b"+LS);
969 assertTrue(0 <= outPos);
970 assertTrue(prevPos < outPos);
971 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_1_2a"+LS);
972 assertTrue(0 <= outPos);
973 assertTrue(prevPos < outPos);
974 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_1a_2"+LS);
975 assertTrue(0 <= outPos);
976 assertTrue(prevPos < outPos);
977
978 newPos = stdOut.indexOf("testAnnArrayx_x_1_2!"+LS);
979 assertTrue(newPos > prevPos);
980 prevPos = newPos;
981 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2_1a"+LS);
982 assertTrue(0 <= outPos);
983 assertTrue(prevPos < outPos);
984 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2a_1"+LS);
985 assertTrue(0 <= outPos);
986 assertTrue(prevPos < outPos);
987 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2b_1"+LS);
988 assertTrue(0 <= outPos);
989 assertTrue(prevPos < outPos);
990
991 newPos = stdOut.indexOf("testAnnArrayx_x_2_1!"+LS);
992 assertTrue(newPos > prevPos);
993 prevPos = newPos;
994 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2_2a"+LS);
995 assertTrue(0 <= outPos);
996 assertTrue(prevPos < outPos);
997 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2_2b"+LS);
998 assertTrue(0 <= outPos);
999 assertTrue(prevPos < outPos);
1000 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2a_2"+LS);
1001 assertTrue(0 <= outPos);
1002 assertTrue(prevPos < outPos);
1003 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = x_x_2b_2"+LS);
1004 assertTrue(0 <= outPos);
1005 assertTrue(prevPos < outPos);
1006
1007 newPos = stdOut.indexOf("testAnnArrayx_x_2_2!"+LS);
1008 assertTrue(newPos > prevPos);
1009 prevPos = newPos;
1010 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_0_1"+LS);
1011 assertTrue(0 <= outPos);
1012 assertTrue(prevPos < outPos);
1013 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_0_1a"+LS);
1014 assertTrue(0 <= outPos);
1015 assertTrue(prevPos < outPos);
1016
1017 newPos = stdOut.indexOf("testAnnArray0_1_0_1!"+LS);
1018 assertTrue(newPos > prevPos);
1019 prevPos = newPos;
1020 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_1_0"+LS);
1021 assertTrue(0 <= outPos);
1022 assertTrue(prevPos < outPos);
1023 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_1a_0"+LS);
1024 assertTrue(0 <= outPos);
1025 assertTrue(prevPos < outPos);
1026
1027 newPos = stdOut.indexOf("testAnnArray0_1_1_0!"+LS);
1028 assertTrue(newPos > prevPos);
1029 prevPos = newPos;
1030 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_1_1"+LS);
1031 assertTrue(0 <= outPos);
1032 assertTrue(prevPos < outPos);
1033 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_1_1a"+LS);
1034 assertTrue(0 <= outPos);
1035 assertTrue(prevPos < outPos);
1036 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_1a_1"+LS);
1037 assertTrue(0 <= outPos);
1038 assertTrue(prevPos < outPos);
1039
1040 newPos = stdOut.indexOf("testAnnArray0_1_1_1!"+LS);
1041 assertTrue(newPos > prevPos);
1042 prevPos = newPos;
1043 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_0_2"+LS);
1044 assertTrue(0 <= outPos);
1045 assertTrue(prevPos < outPos);
1046 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_0_2a"+LS);
1047 assertTrue(0 <= outPos);
1048 assertTrue(prevPos < outPos);
1049 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_0_2b"+LS);
1050 assertTrue(0 <= outPos);
1051 assertTrue(prevPos < outPos);
1052
1053 newPos = stdOut.indexOf("testAnnArray0_1_0_2!"+LS);
1054 assertTrue(newPos > prevPos);
1055 prevPos = newPos;
1056 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_2_0"+LS);
1057 assertTrue(0 <= outPos);
1058 assertTrue(prevPos < outPos);
1059 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2a_0"+LS);
1060 assertTrue(0 <= outPos);
1061 assertTrue(prevPos < outPos);
1062 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2b_0"+LS);
1063 assertTrue(0 <= outPos);
1064 assertTrue(prevPos < outPos);
1065
1066 newPos = stdOut.indexOf("testAnnArray0_1_2_0!"+LS);
1067 assertTrue(newPos > prevPos);
1068 prevPos = newPos;
1069 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_1_2"+LS);
1070 assertTrue(0 <= outPos);
1071 assertTrue(prevPos < outPos);
1072 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_1_2b"+LS);
1073 assertTrue(0 <= outPos);
1074 assertTrue(prevPos < outPos);
1075 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_1_2a"+LS);
1076 assertTrue(0 <= outPos);
1077 assertTrue(prevPos < outPos);
1078 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_1a_2"+LS);
1079 assertTrue(0 <= outPos);
1080 assertTrue(prevPos < outPos);
1081
1082 newPos = stdOut.indexOf("testAnnArray0_1_1_2!"+LS);
1083 assertTrue(newPos > prevPos);
1084 prevPos = newPos;
1085 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_2_1"+LS);
1086 assertTrue(0 <= outPos);
1087 assertTrue(prevPos < outPos);
1088 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2_1a"+LS);
1089 assertTrue(0 <= outPos);
1090 assertTrue(prevPos < outPos);
1091 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2a_1"+LS);
1092 assertTrue(0 <= outPos);
1093 assertTrue(prevPos < outPos);
1094 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2b_1"+LS);
1095 assertTrue(0 <= outPos);
1096 assertTrue(prevPos < outPos);
1097
1098 newPos = stdOut.indexOf("testAnnArray0_1_2_1!"+LS);
1099 assertTrue(newPos > prevPos);
1100 prevPos = newPos;
1101 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1a_2_2"+LS);
1102 assertTrue(0 <= outPos);
1103 assertTrue(prevPos < outPos);
1104 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2_2b"+LS);
1105 assertTrue(0 <= outPos);
1106 assertTrue(prevPos < outPos);
1107 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2_2a"+LS);
1108 assertTrue(0 <= outPos);
1109 assertTrue(prevPos < outPos);
1110 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2b_2"+LS);
1111 assertTrue(0 <= outPos);
1112 assertTrue(prevPos < outPos);
1113 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 0_1_2a_2"+LS);
1114 assertTrue(0 <= outPos);
1115 assertTrue(prevPos < outPos);
1116
1117 newPos = stdOut.indexOf("testAnnArray0_1_2_2!"+LS);
1118 assertTrue(newPos > prevPos);
1119 prevPos = newPos;
1120 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_0_1"+LS);
1121 assertTrue(0 <= outPos);
1122 assertTrue(prevPos < outPos);
1123 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_0_1a"+LS);
1124 assertTrue(0 <= outPos);
1125 assertTrue(prevPos < outPos);
1126
1127 newPos = stdOut.indexOf("testAnnArray1_0_0_1!"+LS);
1128 assertTrue(newPos > prevPos);
1129 prevPos = newPos;
1130 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_1_0"+LS);
1131 assertTrue(0 <= outPos);
1132 assertTrue(prevPos < outPos);
1133 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_1a_0"+LS);
1134 assertTrue(0 <= outPos);
1135 assertTrue(prevPos < outPos);
1136
1137 newPos = stdOut.indexOf("testAnnArray1_0_1_0!"+LS);
1138 assertTrue(newPos > prevPos);
1139 prevPos = newPos;
1140 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_1_1"+LS);
1141 assertTrue(0 <= outPos);
1142 assertTrue(prevPos < outPos);
1143 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_1_1a"+LS);
1144 assertTrue(0 <= outPos);
1145 assertTrue(prevPos < outPos);
1146 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_1a_1"+LS);
1147 assertTrue(0 <= outPos);
1148 assertTrue(prevPos < outPos);
1149
1150
1151 newPos = stdOut.indexOf("testAnnArray1_0_1_1!"+LS);
1152 assertTrue(newPos > prevPos);
1153 prevPos = newPos;
1154 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_0_2"+LS);
1155 assertTrue(0 <= outPos);
1156 assertTrue(prevPos < outPos);
1157 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_0_2a"+LS);
1158 assertTrue(0 <= outPos);
1159 assertTrue(prevPos < outPos);
1160 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_0_2b"+LS);
1161 assertTrue(0 <= outPos);
1162 assertTrue(prevPos < outPos);
1163
1164 newPos = stdOut.indexOf("testAnnArray1_0_0_2!"+LS);
1165 assertTrue(newPos > prevPos);
1166 prevPos = newPos;
1167 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_2_0"+LS);
1168 assertTrue(0 <= outPos);
1169 assertTrue(prevPos < outPos);
1170 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2b_0"+LS);
1171 assertTrue(0 <= outPos);
1172 assertTrue(prevPos < outPos);
1173 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2a_0"+LS);
1174 assertTrue(0 <= outPos);
1175 assertTrue(prevPos < outPos);
1176
1177 newPos = stdOut.indexOf("testAnnArray1_0_2_0!"+LS);
1178 assertTrue(newPos > prevPos);
1179 prevPos = newPos;
1180 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_1_2"+LS);
1181 assertTrue(0 <= outPos);
1182 assertTrue(prevPos < outPos);
1183 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_1_2b"+LS);
1184 assertTrue(0 <= outPos);
1185 assertTrue(prevPos < outPos);
1186 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_1_2a"+LS);
1187 assertTrue(0 <= outPos);
1188 assertTrue(prevPos < outPos);
1189 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_1a_2"+LS);
1190 assertTrue(0 <= outPos);
1191 assertTrue(prevPos < outPos);
1192
1193 newPos = stdOut.indexOf("testAnnArray1_0_1_2!"+LS);
1194 assertTrue(newPos > prevPos);
1195 prevPos = newPos;
1196 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_2_1"+LS);
1197 assertTrue(0 <= outPos);
1198 assertTrue(prevPos < outPos);
1199 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2_1a"+LS);
1200 assertTrue(0 <= outPos);
1201 assertTrue(prevPos < outPos);
1202 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2a_1"+LS);
1203 assertTrue(0 <= outPos);
1204 assertTrue(prevPos < outPos);
1205 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2b_1"+LS);
1206 assertTrue(0 <= outPos);
1207 assertTrue(prevPos < outPos);
1208
1209 newPos = stdOut.indexOf("testAnnArray1_0_2_1!"+LS);
1210 assertTrue(newPos > prevPos);
1211 prevPos = newPos;
1212 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_0_2_2"+LS);
1213 assertTrue(0 <= outPos);
1214 assertTrue(prevPos < outPos);
1215 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2_2b"+LS);
1216 assertTrue(0 <= outPos);
1217 assertTrue(prevPos < outPos);
1218 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2_2a"+LS);
1219 assertTrue(0 <= outPos);
1220 assertTrue(prevPos < outPos);
1221 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2a_2"+LS);
1222 assertTrue(0 <= outPos);
1223 assertTrue(prevPos < outPos);
1224 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_0_2b_2"+LS);
1225 assertTrue(0 <= outPos);
1226 assertTrue(prevPos < outPos);
1227
1228 newPos = stdOut.indexOf("testAnnArray1_0_2_2!"+LS);
1229 assertTrue(newPos > prevPos);
1230 prevPos = newPos;
1231 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_0_1"+LS);
1232 assertTrue(0 <= outPos);
1233 assertTrue(prevPos < outPos);
1234 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_0_1"+LS);
1235 assertTrue(0 <= outPos);
1236 assertTrue(prevPos < outPos);
1237 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_0_1a"+LS);
1238 assertTrue(0 <= outPos);
1239 assertTrue(prevPos < outPos);
1240
1241 newPos = stdOut.indexOf("testAnnArray1_1_0_1!"+LS);
1242 assertTrue(newPos > prevPos);
1243 prevPos = newPos;
1244 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_1_0"+LS);
1245 assertTrue(0 <= outPos);
1246 assertTrue(prevPos < outPos);
1247 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_1_0"+LS);
1248 assertTrue(0 <= outPos);
1249 assertTrue(prevPos < outPos);
1250 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1a_0"+LS);
1251 assertTrue(0 <= outPos);
1252 assertTrue(prevPos < outPos);
1253
1254 newPos = stdOut.indexOf("testAnnArray1_1_1_0!"+LS);
1255 assertTrue(newPos > prevPos);
1256 prevPos = newPos;
1257 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_1_1"+LS);
1258 assertTrue(0 <= outPos);
1259 assertTrue(prevPos < outPos);
1260 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_1_1"+LS);
1261 assertTrue(0 <= outPos);
1262 assertTrue(prevPos < outPos);
1263 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1_1a"+LS);
1264 assertTrue(0 <= outPos);
1265 assertTrue(prevPos < outPos);
1266 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1a_1"+LS);
1267 assertTrue(0 <= outPos);
1268 assertTrue(prevPos < outPos);
1269
1270 newPos = stdOut.indexOf("testAnnArray1_1_1_1!"+LS);
1271 assertTrue(newPos > prevPos);
1272 prevPos = newPos;
1273 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_0_2"+LS);
1274 assertTrue(0 <= outPos);
1275 assertTrue(prevPos < outPos);
1276 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_0_2"+LS);
1277 assertTrue(0 <= outPos);
1278 assertTrue(prevPos < outPos);
1279 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_0_2a"+LS);
1280 assertTrue(0 <= outPos);
1281 assertTrue(prevPos < outPos);
1282 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_0_2b"+LS);
1283 assertTrue(0 <= outPos);
1284 assertTrue(prevPos < outPos);
1285
1286 newPos = stdOut.indexOf("testAnnArray1_1_0_2!"+LS);
1287 assertTrue(newPos > prevPos);
1288 prevPos = newPos;
1289 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_2_0"+LS);
1290 assertTrue(0 <= outPos);
1291 assertTrue(prevPos < outPos);
1292 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_2_0"+LS);
1293 assertTrue(0 <= outPos);
1294 assertTrue(prevPos < outPos);
1295 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2a_0"+LS);
1296 assertTrue(0 <= outPos);
1297 assertTrue(prevPos < outPos);
1298 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2b_0"+LS);
1299 assertTrue(0 <= outPos);
1300 assertTrue(prevPos < outPos);
1301
1302 newPos = stdOut.indexOf("testAnnArray1_1_2_0!"+LS);
1303 assertTrue(0 <= outPos);
1304 assertTrue(prevPos < outPos);
1305 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_1_2"+LS);
1306 assertTrue(0 <= outPos);
1307 assertTrue(prevPos < outPos);
1308 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_1_2"+LS);
1309 assertTrue(0 <= outPos);
1310 assertTrue(prevPos < outPos);
1311 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1_2b"+LS);
1312 assertTrue(0 <= outPos);
1313 assertTrue(prevPos < outPos);
1314 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1_2a"+LS);
1315 assertTrue(0 <= outPos);
1316 assertTrue(prevPos < outPos);
1317 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1a_2"+LS);
1318 assertTrue(0 <= outPos);
1319 assertTrue(prevPos < outPos);
1320
1321 newPos = stdOut.indexOf("testAnnArray1_1_1_2!"+LS);
1322 assertTrue(newPos > prevPos);
1323 prevPos = newPos;
1324 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_2_1"+LS);
1325 assertTrue(0 <= outPos);
1326 assertTrue(prevPos < outPos);
1327 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_2_1"+LS);
1328 assertTrue(0 <= outPos);
1329 assertTrue(prevPos < outPos);
1330 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2_1a"+LS);
1331 assertTrue(0 <= outPos);
1332 assertTrue(prevPos < outPos);
1333 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2a_1"+LS);
1334 assertTrue(0 <= outPos);
1335 assertTrue(prevPos < outPos);
1336 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2b_1"+LS);
1337 assertTrue(0 <= outPos);
1338 assertTrue(prevPos < outPos);
1339
1340 newPos = stdOut.indexOf("testAnnArray1_1_2_1!"+LS);
1341 assertTrue(newPos > prevPos);
1342 prevPos = newPos;
1343 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_2_2"+LS);
1344 assertTrue(0 <= outPos);
1345 assertTrue(prevPos < outPos);
1346 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_2_2"+LS);
1347 assertTrue(0 <= outPos);
1348 assertTrue(prevPos < outPos);
1349 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2_2b"+LS);
1350 assertTrue(0 <= outPos);
1351 assertTrue(prevPos < outPos);
1352 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2_2a"+LS);
1353 assertTrue(0 <= outPos);
1354 assertTrue(prevPos < outPos);
1355 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2b_2"+LS);
1356 assertTrue(0 <= outPos);
1357 assertTrue(prevPos < outPos);
1358 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_2a_2"+LS);
1359 assertTrue(0 <= outPos);
1360 assertTrue(prevPos < outPos);
1361
1362 newPos = stdOut.indexOf("testAnnArray1_1_2_2!"+LS);
1363 assertTrue(newPos > prevPos);
1364 prevPos = newPos;
1365 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1a_1_0_2_2"+LS);
1366 assertTrue(0 <= outPos);
1367 assertTrue(prevPos < outPos);
1368 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1a_1_1_0_2_2"+LS);
1369 assertTrue(0 <= outPos);
1370 assertTrue(prevPos < outPos);
1371 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1a_0_2_2"+LS);
1372 assertTrue(0 <= outPos);
1373 assertTrue(prevPos < outPos);
1374 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1_0_2_2a"+LS);
1375 assertTrue(0 <= outPos);
1376 assertTrue(prevPos < outPos);
1377 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1_0_2_2b"+LS);
1378 assertTrue(0 <= outPos);
1379 assertTrue(prevPos < outPos);
1380 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1_0_2a_2"+LS);
1381 assertTrue(0 <= outPos);
1382 assertTrue(prevPos < outPos);
1383 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = 1_1_1_0_2b_2"+LS);
1384 assertTrue(0 <= outPos);
1385 assertTrue(prevPos < outPos);
1386
1387 newPos = stdOut.indexOf("testAnnArray1_1_1_0_2_2!"+LS+"testAnnArray0_0!"+LS);
1388 assertTrue(newPos > prevPos);
1389 prevPos = newPos;
1390 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr0_1a"+LS);
1391 assertTrue(0 <= outPos);
1392 assertTrue(prevPos < outPos);
1393
1394 newPos = stdOut.indexOf("testAnnArray0_1!"+LS);
1395 assertTrue(newPos > prevPos);
1396 prevPos = newPos;
1397 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr1a_0"+LS);
1398 assertTrue(0 <= outPos);
1399 assertTrue(prevPos < outPos);
1400
1401 newPos = stdOut.indexOf("testAnnArray1_0!"+LS);
1402 assertTrue(newPos > prevPos);
1403 prevPos = newPos;
1404 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr1_1a"+LS);
1405 assertTrue(0 <= outPos);
1406 assertTrue(prevPos < outPos);
1407 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr1a_1"+LS);
1408 assertTrue(0 <= outPos);
1409 assertTrue(prevPos < outPos);
1410
1411 newPos = stdOut.indexOf("testAnnArray1_1!"+LS);
1412 assertTrue(newPos > prevPos);
1413 prevPos = newPos;
1414 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr1_2b"+LS);
1415 assertTrue(0 <= outPos);
1416 assertTrue(prevPos < outPos);
1417 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr1_2a"+LS);
1418 assertTrue(0 <= outPos);
1419 assertTrue(prevPos < outPos);
1420 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr1a_2"+LS);
1421 assertTrue(0 <= outPos);
1422 assertTrue(prevPos < outPos);
1423
1424 newPos = stdOut.indexOf("testAnnArray1_2!"+LS);
1425 assertTrue(newPos > prevPos);
1426 prevPos = newPos;
1427 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr2_1a"+LS);
1428 assertTrue(0 <= outPos);
1429 assertTrue(prevPos < outPos);
1430 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr2b_1"+LS);
1431 assertTrue(0 <= outPos);
1432 assertTrue(prevPos < outPos);
1433 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr2a_1"+LS);
1434 assertTrue(0 <= outPos);
1435 assertTrue(prevPos < outPos);
1436
1437 newPos = stdOut.indexOf("testAnnArray2_1!"+LS);
1438 assertTrue(newPos > prevPos);
1439 prevPos = newPos;
1440 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr2_2b"+LS);
1441 assertTrue(0 <= outPos);
1442 assertTrue(prevPos < outPos);
1443 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr2_2a"+LS);
1444 assertTrue(0 <= outPos);
1445 assertTrue(prevPos < outPos);
1446 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr2b_2"+LS);
1447 assertTrue(0 <= outPos);
1448 assertTrue(prevPos < outPos);
1449 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = arr2a_2"+LS);
1450 assertTrue(0 <= outPos);
1451 assertTrue(prevPos < outPos);
1452
1453 newPos = stdOut.indexOf("testAnnArray2_2!"+LS);
1454 assertTrue(newPos > prevPos);
1455 prevPos = newPos;
1456 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = test"+LS);
1457 assertTrue(0 <= outPos);
1458 assertTrue(prevPos < outPos);
1459
1460 newPos = stdOut.indexOf("testString!"+LS);
1461 assertTrue(newPos > prevPos);
1462 prevPos = newPos;
1463 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = defaultString"+LS);
1464 assertTrue(0 <= outPos);
1465 assertTrue(prevPos < outPos);
1466
1467 newPos = stdOut.indexOf("testAnnArrayDefault!"+LS+"testAnnArray!"+LS);
1468 assertTrue(newPos > prevPos);
1469 prevPos = newPos;
1470 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = default1-1"+LS);
1471 assertTrue(0 <= outPos);
1472 assertTrue(prevPos < outPos);
1473 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = array1-1"+LS);
1474 assertTrue(0 <= outPos);
1475 assertTrue(prevPos < outPos);
1476
1477 newPos = stdOut.indexOf("testAnnArray1!"+LS);
1478 assertTrue(newPos > prevPos);
1479 prevPos = newPos;
1480 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = default2-1"+LS);
1481 assertTrue(0 <= outPos);
1482 assertTrue(prevPos < outPos);
1483 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = default2-2"+LS);
1484 assertTrue(0 <= outPos);
1485 assertTrue(prevPos < outPos);
1486 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = array2-2"+LS);
1487 assertTrue(0 <= outPos);
1488 assertTrue(prevPos < outPos);
1489 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = array2-1"+LS);
1490 assertTrue(0 <= outPos);
1491 assertTrue(prevPos < outPos);
1492
1493 newPos = stdOut.indexOf("testAnnArray2!"+LS);
1494 assertTrue(newPos > prevPos);
1495 prevPos = newPos;
1496 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = array3-1"+LS);
1497 assertTrue(0 <= outPos);
1498 assertTrue(prevPos < outPos);
1499 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = array3-3"+LS);
1500 assertTrue(0 <= outPos);
1501 assertTrue(prevPos < outPos);
1502 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = array3-2"+LS);
1503 assertTrue(0 <= outPos);
1504 assertTrue(prevPos < outPos);
1505 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = default3-2"+LS);
1506 assertTrue(0 <= outPos);
1507 assertTrue(prevPos < outPos);
1508 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = default3-1"+LS);
1509 assertTrue(0 <= outPos);
1510 assertTrue(prevPos < outPos);
1511 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = default3-3"+LS);
1512 assertTrue(0 <= outPos);
1513 assertTrue(prevPos < outPos);
1514
1515 newPos = stdOut.indexOf("testAnnArray3!"+LS);
1516 assertTrue(newPos > prevPos);
1517 prevPos = newPos;
1518 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = orTwo1"+LS);
1519 assertTrue(0 <= outPos);
1520 assertTrue(prevPos < outPos);
1521 outPos = stdOut.indexOf("thisO = sample.threadCheck.predicate.TCSample4@"+number+", value:String = orTwo2"+LS);
1522 assertTrue(0 <= outPos);
1523 assertTrue(prevPos < outPos);
1524
1525 newPos = stdOut.indexOf("testOrTwo!"+LS);
1526 assertTrue(newPos > prevPos);
1527 prevPos = newPos;
1528
1529 assertEquals("testOrTwo!", stdOut.substring(prevPos).trim());
1530
1531 assertEquals(0, p.exitValue());
1532 }
1533
1534 private Process runTestClass(String className) throws IOException {
1535 return runTestClass(className, NullStream.ONLY, NullStream.ONLY);
1536 }
1537
1538 private Process runTestClass(String className, OutputStream stdOutStream,
1539 OutputStream stdErrStream) throws IOException {
1540 Process p = ExecJVM.runJVM(className,
1541 new String[] {},
1542 new String[] {_tempDir.getAbsolutePath()},
1543 new String[] {},
1544 _tempDir);
1545 StreamRedirectThread stdOut = new StreamRedirectThread("stdout", p.getInputStream(), stdOutStream);
1546 StreamRedirectThread stdErr = new StreamRedirectThread("stderr", p.getErrorStream(), stdErrStream);
1547 stdOut.start();
1548 stdErr.start();
1549 boolean stillWaiting = true;
1550 do {
1551 try {
1552 p.waitFor();
1553 stdErr.join();
1554 stdOut.join();
1555 stillWaiting = false;
1556 }
1557 catch(InterruptedException e) { /* ignore */ }
1558 } while(stillWaiting);
1559 return p;
1560 }
1561
1562 public void testTCSample18() throws IOException {
1563 File base = new File(_tempDir, "sample"+FS+"threadCheck"+FS+"predicate");
1564 assertTrue(base.exists() && base.isDirectory());
1565 //List<File> files = FileOps.enumFiles(base);
1566 List<File> files = new ArrayList<File>();
1567 File cfile = new File(base, "TCSample18.class");
1568 assertTrue(cfile.exists() && cfile.isFile());
1569 files.add(cfile);
1570
1571 ArrayList<String> args = new ArrayList<String>();
1572 args.add("-i");
1573 args.add(CompoundThreadCheckStrategy.class.getName());
1574 args.add("-X");
1575
1576 StringBuilder sb = new StringBuilder();
1577 sb.append(AddThreadCheckStrategy.CLASS_PATH_PARAM_PREFIX);
1578 sb.append(_tempDir.getAbsolutePath());
1579 sb.append(PS);
1580 sb.append(System.getProperty("java.class.path"));
1581 sb.append(PS);
1582 sb.append(FileInstrumentor.getDefaultSourceRtJarName());
1583 args.add(sb.toString());
1584
1585 ArrayList<String> classPath = new ArrayList<String>();
1586 for(String p: sb.toString().split(PS)) {
1587 classPath.add(p);
1588 }
1589
1590 for(File f: files) {
1591 args.add(f.getAbsolutePath());
1592 }
1593
1594 // System.out.println("Parameters:");
1595 // for(String a: args) {
1596 // System.out.println("\t"+a);
1597 // }
1598
1599 ByteArrayOutputStream baos = new ByteArrayOutputStream();
1600 Debug.out.setOutput(new PrintStream(baos));
1601 FileInstrumentor.main(args.toArray(new String[0]));
1602 String output = baos.toString();
1603 // System.out.println(output);
1604
1605 // check no IOExceptions
1606 int ioExcIndex = output.indexOf("IOExceptions: 0");
1607 if (ioExcIndex<0) {
1608 ioExcIndex = output.indexOf("IOExceptions: ");
1609 int newLineIndex = output.indexOf(System.getProperty("line.separator"), ioExcIndex);
1610 fail(output.substring(ioExcIndex,newLineIndex));
1611 }
1612
1613 // check scanner results
1614 String strScannerRes = "Scanner results: " + LS;
1615 int sResultsIndex = output.indexOf(strScannerRes);
1616 if (sResultsIndex<0) {
1617 sResultsIndex = output.indexOf(strScannerRes);
1618 fail(output.substring(sResultsIndex,ioExcIndex));
1619 }
1620 int nextLineIndex = sResultsIndex + strScannerRes.length();
1621 String remainderStr = output.substring(nextLineIndex);
1622 int nextLineEndIndex = remainderStr.indexOf(LS);
1623 String nextLine = remainderStr.substring(0, nextLineEndIndex);
1624 if (!nextLine.startsWith("\tThreadChecker Cache Info")) {
1625 fail("Expected 'ThreadChecker Cache Info', was '"+nextLine+"'");
1626 }
1627 remainderStr = remainderStr.substring(nextLineEndIndex);
1628 if (!remainderStr.startsWith(LS+LS+LS+"IOExceptions: 0"+LS)) {
1629 fail("Expected '\n\n\nIOExceptions: 0\n', was '"+remainderStr+"'");
1630 }
1631
1632 File cfile_old = new File(base, "TCSample18.class~");
1633 assertTrue(cfile.exists() && cfile.isFile());
1634 assertTrue(cfile_old.exists() && cfile_old.isFile());
1635
1636 String className = "sample.threadCheck.predicate.TCSample18";
1637 ByteArrayOutputStream stdOutStream = new ByteArrayOutputStream();
1638 Process p = runTestClass(className, stdOutStream, NullStream.ONLY);
1639 String stdOut = stdOutStream.toString();
1640 assertEquals("Wrong output", "main!"+LS+"t!"+LS+"ta!"+LS+"t2!"+LS+"ta2!"+LS+"end main!"+LS,stdOut);
1641 // System.out.println(stdOut);
1642
1643 File tcLog = new File(_tempDir, "threadCheck.log");
1644 assertTrue(tcLog.exists() && tcLog.isFile());
1645 FileInputStream fis = new FileInputStream(tcLog);
1646 StringBuilder tcsb = new StringBuilder();
1647 int x;
1648 byte b[];
1649 String s;
1650 while((x = fis.available())>0) {
1651 x = fis.available();
1652 b = new byte[x];
1653 fis.read(b);
1654 s = new String(b);
1655 tcsb.append(s);
1656 }
1657 fis.close();
1658 String tc = tcsb.toString();
1659 // System.out.println(tc);
1660
1661 int count = 0, index = 0;
1662 while((index=tc.indexOf("Exception in Thread Predicate Violation:", index))>=0) { ++count; ++index; }
1663 // System.out.println("Violation count = "+count);
1664 assertEquals(4, count);
1665
1666 // System.out.println("stdout = ");
1667 // System.out.println(stdOut);
1668
1669 assertEquals(0, p.exitValue());
1670 }
1671
1672 public void testTCSample19() throws IOException {
1673 File base = new File(_tempDir, "sample"+FS+"threadCheck"+FS+"predicate");
1674 assertTrue(base.exists() && base.isDirectory());
1675 //List<File> files = FileOps.enumFiles(base);
1676 List<File> files = new ArrayList<File>();
1677 File cfile = new File(base, "TCSample19.class");
1678 assertTrue(cfile.exists() && cfile.isFile());
1679 files.add(cfile);
1680
1681 ArrayList<String> args = new ArrayList<String>();
1682 args.add("-i");
1683 args.add(CompoundThreadCheckStrategy.class.getName());
1684 args.add("-X");
1685
1686 StringBuilder sb = new StringBuilder();
1687 sb.append(AddThreadCheckStrategy.CLASS_PATH_PARAM_PREFIX);
1688 sb.append(_tempDir.getAbsolutePath());
1689 sb.append(PS);
1690 sb.append(System.getProperty("java.class.path"));
1691 sb.append(PS);
1692 sb.append(FileInstrumentor.getDefaultSourceRtJarName());
1693 args.add(sb.toString());
1694
1695 ArrayList<String> classPath = new ArrayList<String>();
1696 for(String p: sb.toString().split(PS)) {
1697 classPath.add(p);
1698 }
1699
1700 for(File f: files) {
1701 args.add(f.getAbsolutePath());
1702 }
1703
1704 // System.out.println("Parameters:");
1705 // for(String a: args) {
1706 // System.out.println("\t"+a);
1707 // }
1708
1709 ByteArrayOutputStream baos = new ByteArrayOutputStream();
1710 Debug.out.setOutput(new PrintStream(baos));
1711 FileInstrumentor.main(args.toArray(new String[0]));
1712 String output = baos.toString();
1713 // System.out.println(output);
1714
1715 // check no IOExceptions
1716 int ioExcIndex = output.indexOf("IOExceptions: 0");
1717 if (ioExcIndex<0) {
1718 ioExcIndex = output.indexOf("IOExceptions: ");
1719 int newLineIndex = output.indexOf(System.getProperty("line.separator"), ioExcIndex);
1720 fail(output.substring(ioExcIndex,newLineIndex));
1721 }
1722
1723 // check scanner results
1724 String strScannerRes = "Scanner results: " + LS;
1725 int sResultsIndex = output.indexOf(strScannerRes);
1726 if (sResultsIndex<0) {
1727 sResultsIndex = output.indexOf(strScannerRes);
1728 fail(output.substring(sResultsIndex,ioExcIndex));
1729 }
1730 int nextLineIndex = sResultsIndex + strScannerRes.length();
1731 String remainderStr = output.substring(nextLineIndex);
1732 int nextLineEndIndex = remainderStr.indexOf(LS);
1733 String nextLine = remainderStr.substring(0, nextLineEndIndex);
1734 if (!nextLine.startsWith("\tThreadChecker Cache Info")) {
1735 fail("Expected 'ThreadChecker Cache Info', was '"+nextLine+"'");
1736 }
1737 remainderStr = remainderStr.substring(nextLineEndIndex);
1738 if (!remainderStr.startsWith(LS+LS+LS+"IOExceptions: 0"+LS)) {
1739 fail("Expected '\n\n\nIOExceptions: 0\n', was '"+remainderStr+"'");
1740 }
1741
1742 File cfile_old = new File(base, "TCSample19.class~");
1743 assertTrue(cfile.exists() && cfile.isFile());
1744 assertTrue(cfile_old.exists() && cfile_old.isFile());
1745
1746 String className = "sample.threadCheck.predicate.TCSample19";
1747 ByteArrayOutputStream stdOutStream = new ByteArrayOutputStream();
1748 Process p = runTestClass(className, stdOutStream, NullStream.ONLY);
1749 String stdOut = stdOutStream.toString();
1750 // System.out.println(stdOut);
1751 assertEquals("Wrong output", "main!"+LS+"t!"+LS+"f!"+LS+"fXf!"+LS+"fXt!"+LS+
1752 "tXf!"+LS+"tXt!"+LS+"fXfXf!"+LS+"fXtXf!"+LS+"tXfXf!"+LS+"tXtXf!"+
1753 LS+"fXfXt!"+LS+"fXtXt!"+LS+"tXfXt!"+LS+"tXtXt!"+LS+"end main!"+LS,
1754 stdOut);
1755
1756 File tcLog = new File(_tempDir, "threadCheck.log");
1757 assertTrue(tcLog.exists() && tcLog.isFile());
1758 FileInputStream fis = new FileInputStream(tcLog);
1759 StringBuilder tcsb = new StringBuilder();
1760 int x;
1761 byte b[];
1762 String s;
1763 while((x = fis.available())>0) {
1764 x = fis.available();
1765 b = new byte[x];
1766 fis.read(b);
1767 s = new String(b);
1768 tcsb.append(s);
1769 }
1770 fis.close();
1771 String tc = tcsb.toString();
1772 // System.out.println(tc);
1773
1774 int count = 0, index = 0;
1775 while((index=tc.indexOf("Thread Predicate Violation:", index))>=0) { ++count; ++index; }
1776 // System.out.println("Violation count = "+count);
1777 assertEquals(8, count);
1778
1779 // System.out.println("stdout = ");
1780 // System.out.println(stdOut);
1781
1782 assertEquals(0, p.exitValue());
1783 }
1784
1785
1786 public void testTCSample20() throws IOException {
1787 File base = new File(_tempDir, "sample"+FS+"threadCheck"+FS+"predicate");
1788 assertTrue(base.exists() && base.isDirectory());
1789 //List<File> files = FileOps.enumFiles(base);
1790 List<File> files = new ArrayList<File>();
1791 File cfile = new File(base, "TCSample20.class");
1792 assertTrue(cfile.exists() && cfile.isFile());
1793 files.add(cfile);
1794
1795 ArrayList<String> args = new ArrayList<String>();
1796 args.add("-i");
1797 args.add(CompoundThreadCheckStrategy.class.getName());
1798 args.add("-X");
1799
1800 StringBuilder sb = new StringBuilder();
1801 sb.append(AddThreadCheckStrategy.CLASS_PATH_PARAM_PREFIX);
1802 sb.append(_tempDir.getAbsolutePath());
1803 sb.append(PS);
1804 sb.append(System.getProperty("java.class.path"));
1805 sb.append(PS);
1806 sb.append(FileInstrumentor.getDefaultSourceRtJarName());
1807 args.add(sb.toString());
1808
1809 ArrayList<String> classPath = new ArrayList<String>();
1810 for(String p: sb.toString().split(PS)) {
1811 classPath.add(p);
1812 }
1813
1814 for(File f: files) {
1815 args.add(f.getAbsolutePath());
1816 }
1817
1818 // System.out.println("Parameters:");
1819 // for(String a: args) {
1820 // System.out.println("\t"+a);
1821 // }
1822
1823 ByteArrayOutputStream baos = new ByteArrayOutputStream();
1824 Debug.out.setOutput(new PrintStream(baos));
1825 FileInstrumentor.main(args.toArray(new String[0]));
1826 String output = baos.toString();
1827 // System.out.println(output);
1828
1829 int badImplies = 0;
1830 int index = -1;
1831 do {
1832 index = output.indexOf("BadImpliesAnnotation", index+1);
1833 if (index<0) {
1834 break;
1835 }
1836 ++badImplies;
1837 } while((index>=0)&&(index<output.length()));
1838
1839 int badNot = 0;
1840 index = -1;
1841 do {
1842 index = output.indexOf("BadNotAnnotation", index+1);
1843 if (index<0) {
1844 break;
1845 }
1846 ++badNot;
1847 } while((index>=0)&&(index<output.length()));
1848
1849 assertEquals("Expected 9 bad IMPLIES @Combines", 8, badImplies);
1850 assertEquals("Expected 9 bad IMPLIES @Combines", 3, badNot);
1851
1852 // check no IOExceptions
1853 int ioExcIndex = output.indexOf("IOExceptions: 0");
1854 if (ioExcIndex<0) {
1855 ioExcIndex = output.indexOf("IOExceptions: ");
1856 int newLineIndex = output.indexOf(System.getProperty("line.separator"), ioExcIndex);
1857 fail(output.substring(ioExcIndex,newLineIndex));
1858 }
1859
1860 File cfile_old = new File(base, "TCSample20.class~");
1861 assertTrue(cfile.exists() && cfile.isFile());
1862 assertTrue(cfile_old.exists() && cfile_old.isFile());
1863
1864 String className = "sample.threadCheck.predicate.TCSample20";
1865 ByteArrayOutputStream stdOutStream = new ByteArrayOutputStream();
1866 Process p = runTestClass(className, stdOutStream, NullStream.ONLY);
1867 String stdOut = stdOutStream.toString();
1868 // System.out.println(stdOut);
1869 assertEquals("Wrong output", "main!"+LS+"impliesTxT!"+LS+"impliesTxF!"+LS+"impliesFxT!"+LS+
1870 "impliesFxF!"+LS+"end main!"+LS, stdOut);
1871
1872 File tcLog = new File(_tempDir, "threadCheck.log");
1873 assertTrue(tcLog.exists() && tcLog.isFile());
1874 FileInputStream fis = new FileInputStream(tcLog);
1875 StringBuilder tcsb = new StringBuilder();
1876 int x;
1877 byte b[];
1878 String s;
1879 while((x = fis.available())>0) {
1880 x = fis.available();
1881 b = new byte[x];
1882 fis.read(b);
1883 s = new String(b);
1884 tcsb.append(s);
1885 }
1886 fis.close();
1887 String tc = tcsb.toString();
1888 // System.out.println(tc);
1889
1890 int count = 0;
1891 index = 0;
1892 while((index=tc.indexOf("Thread Predicate Violation:", index))>=0) { ++count; ++index; }
1893 // System.out.println("Violation count = "+count);
1894 assertEquals(1, count);
1895
1896 // make sure that only the T->F case fails
1897 assertTrue(tc.indexOf("Violated predicate @sample.threadCheck.predicate.TCSample20$ImpliesTxFAnnotation")>=0);
1898
1899 // System.out.println("stdout = ");
1900 // System.out.println(stdOut);
1901
1902 assertEquals(0, p.exitValue());
1903 }
1904 }