183cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustpackage test.thread; 283cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust 383cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustimport org.testng.Assert; 483cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustimport org.testng.TestNG; 583cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustimport org.testng.annotations.Test; 683cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustimport org.testng.xml.XmlSuite; 783cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust 883cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustimport test.SimpleBaseTest; 983cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust 1083cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustimport java.util.Arrays; 1183cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustimport java.util.List; 1283cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust 1383cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust/** 1483cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust * Attempt to make sure that we are truly running methods in parallel. The best I can think 1583cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust * of right now is to run the tests a few times in a row and verify the ordering is never 1683cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust * the same. 1783cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust */ 1883cf45e71273f79e2c513d3c87c9d5190364323dCédric Beustpublic class TrueParallelTest extends SimpleBaseTest { 1983cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust 2083cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust @Test 2183cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust public void shouldRunInParallel() { 2283cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust boolean success = false; 239c5f0e07b97f76a659914208528b2e57f1ae3439Xiaoguang Sun for (int i = 0, count = Runtime.getRuntime().availableProcessors() * 4; i < count; i++) { 2483cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust XmlSuite s = createXmlSuite("TrueParallel"); 2583cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust createXmlTest(s, "Test", TrueParallelSampleTest.class.getName()); 2683cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust TestNG tng = create(); 279ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr s.setParallel(XmlSuite.ParallelMode.METHODS); 2883cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust tng.setXmlSuites(Arrays.asList(s)); 2983cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust BaseThreadTest.initThreadLog(); 3083cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust tng.run(); 3183cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust 3283cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust // A sequential result will look like "m1 m1 m3 m3 m2 m2 m4 m4 m5 m5". A properly 3383cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust // multithreaded result will have at least one non-consecutive different pair: 3483cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust // "m1 m1 m3 m2 m4 m4 m2 m3 m5 m5" 3583cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust List<String> strings = TrueParallelSampleTest.getStrings(); 3683cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust boolean ii = isInterleaved(strings); 3783cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust success = success || ii; 3883cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust// System.out.println(strings + " -> " + ii); 3983cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust } 4083cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust Assert.assertTrue(success, "Couldn't find any interleaved test method run"); 4183cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust } 4283cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust 4383cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust private boolean isInterleaved(List<String> strings) { 4483cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust for (int i = 0; i < strings.size(); i += 2) { 4583cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust if (! strings.get(i).equals(strings.get(i + 1))) { 4683cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust return true; 4783cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust } 4883cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust } 4983cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust return false; 5083cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust } 5183cf45e71273f79e2c513d3c87c9d5190364323dCédric Beust} 52