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