Home | History | Annotate | Download | only in thread
      1 package test.thread;
      2 
      3 import org.testng.Assert;
      4 import org.testng.TestNG;
      5 import org.testng.annotations.Test;
      6 import org.testng.xml.XmlSuite;
      7 
      8 import test.SimpleBaseTest;
      9 
     10 import java.util.Arrays;
     11 import java.util.List;
     12 
     13 /**
     14  * Attempt to make sure that we are truly running methods in parallel. The best I can think
     15  * of right now is to run the tests a few times in a row and verify the ordering is never
     16  * the same.
     17  */
     18 public class TrueParallelTest extends SimpleBaseTest {
     19 
     20   @Test
     21   public void shouldRunInParallel() {
     22     boolean success = false;
     23     for (int i = 0, count = Runtime.getRuntime().availableProcessors() * 4; i < count; i++) {
     24       XmlSuite s = createXmlSuite("TrueParallel");
     25       createXmlTest(s, "Test", TrueParallelSampleTest.class.getName());
     26       TestNG tng = create();
     27       s.setParallel(XmlSuite.ParallelMode.METHODS);
     28       tng.setXmlSuites(Arrays.asList(s));
     29       BaseThreadTest.initThreadLog();
     30       tng.run();
     31 
     32       // A sequential result will look like "m1 m1 m3 m3 m2 m2 m4 m4 m5 m5". A properly
     33       // multithreaded result will have at least one non-consecutive different pair:
     34       // "m1 m1 m3 m2 m4 m4 m2 m3 m5 m5"
     35       List<String> strings = TrueParallelSampleTest.getStrings();
     36       boolean ii = isInterleaved(strings);
     37       success = success || ii;
     38 //      System.out.println(strings + " -> " + ii);
     39     }
     40     Assert.assertTrue(success, "Couldn't find any interleaved test method run");
     41   }
     42 
     43   private boolean isInterleaved(List<String> strings) {
     44     for (int i = 0; i < strings.size(); i += 2) {
     45       if (! strings.get(i).equals(strings.get(i + 1))) {
     46         return true;
     47       }
     48     }
     49     return false;
     50   }
     51 }
     52