| package test.thread; |
| |
| import org.testng.Assert; |
| import org.testng.TestNG; |
| import org.testng.annotations.Test; |
| import org.testng.xml.XmlSuite; |
| |
| import test.SimpleBaseTest; |
| |
| import java.util.Arrays; |
| import java.util.List; |
| |
| /** |
| * Attempt to make sure that we are truly running methods in parallel. The best I can think |
| * of right now is to run the tests a few times in a row and verify the ordering is never |
| * the same. |
| */ |
| public class TrueParallelTest extends SimpleBaseTest { |
| |
| @Test |
| public void shouldRunInParallel() { |
| boolean success = false; |
| for (int i = 0, count = Runtime.getRuntime().availableProcessors() * 4; i < count; i++) { |
| XmlSuite s = createXmlSuite("TrueParallel"); |
| createXmlTest(s, "Test", TrueParallelSampleTest.class.getName()); |
| TestNG tng = create(); |
| s.setParallel(XmlSuite.ParallelMode.METHODS); |
| tng.setXmlSuites(Arrays.asList(s)); |
| BaseThreadTest.initThreadLog(); |
| tng.run(); |
| |
| // A sequential result will look like "m1 m1 m3 m3 m2 m2 m4 m4 m5 m5". A properly |
| // multithreaded result will have at least one non-consecutive different pair: |
| // "m1 m1 m3 m2 m4 m4 m2 m3 m5 m5" |
| List<String> strings = TrueParallelSampleTest.getStrings(); |
| boolean ii = isInterleaved(strings); |
| success = success || ii; |
| // System.out.println(strings + " -> " + ii); |
| } |
| Assert.assertTrue(success, "Couldn't find any interleaved test method run"); |
| } |
| |
| private boolean isInterleaved(List<String> strings) { |
| for (int i = 0; i < strings.size(); i += 2) { |
| if (! strings.get(i).equals(strings.get(i + 1))) { |
| return true; |
| } |
| } |
| return false; |
| } |
| } |