diff --git a/src/test/java/test/SimpleBaseTest.java b/src/test/java/test/SimpleBaseTest.java index 2168202f30..8fe7096b8d 100644 --- a/src/test/java/test/SimpleBaseTest.java +++ b/src/test/java/test/SimpleBaseTest.java @@ -126,7 +126,7 @@ protected static XmlSuite createXmlSuite(String suiteName, String testName, Clas return suite; } - protected static XmlTest createXmlTestWithPackages(XmlSuite suite, String name, String ...packageName) { + protected static XmlTest createXmlTestWithPackages(XmlSuite suite, String name, String... packageName) { XmlTest result = createXmlTest(suite, name); List xmlPackages = Lists.newArrayList(); @@ -140,6 +140,20 @@ protected static XmlTest createXmlTestWithPackages(XmlSuite suite, String name, return result; } + protected static XmlTest createXmlTestWithPackages(XmlSuite suite, String name, Class... packageName) { + XmlTest result = createXmlTest(suite, name); + List xmlPackages = Lists.newArrayList(); + + for (Class each : packageName) { + XmlPackage xmlPackage = new XmlPackage(); + xmlPackage.setName(each.getPackage().getName()); + xmlPackages.add(xmlPackage); + } + result.setPackages(xmlPackages); + + return result; + } + protected static XmlTest createXmlTest(XmlSuite suite, String name) { XmlTest result = new XmlTest(suite); result.setName(name); diff --git a/src/test/java/test/issue565/Issue565Test.java b/src/test/java/test/issue565/Issue565Test.java new file mode 100644 index 0000000000..bedabf9b2c --- /dev/null +++ b/src/test/java/test/issue565/Issue565Test.java @@ -0,0 +1,41 @@ +package test.issue565; + +import org.testng.Assert; +import org.testng.ITestNGListener; +import org.testng.TestListenerAdapter; +import org.testng.TestNG; +import org.testng.annotations.Test; +import org.testng.xml.XmlSuite; +import org.testng.xml.XmlSuite.ParallelMode; +import org.testng.xml.XmlTest; +import test.SimpleBaseTest; +import test.issue565.deadlock.ClassInGroupB; +import test.issue565.deadlock.GeneratedClassFactory; + +public class Issue565Test extends SimpleBaseTest { + + @Test + public void ThereShouldNotBeDeadlockWhenGroupByInstanceAndGroupDependencyUsed() throws Exception { + + XmlSuite suite = createXmlSuite("Deadlock-Suite"); + suite.setParallel(ParallelMode.CLASSES); + suite.setThreadCount(5); + suite.setVerbose(10); + suite.setGroupByInstances(true); + + XmlTest test = createXmlTestWithPackages(suite, "Deadlock-Test", ClassInGroupB.class); + + // Prevent real deadlock + suite.setTimeOut("1000"); + test.setTimeOut(1_000); + + TestNG tng = create(suite); + TestListenerAdapter tla = new TestListenerAdapter(); + tng.addListener((ITestNGListener) tla); + tng.run(); + + Assert.assertEquals(tla.getFailedTests().size(), 0); + Assert.assertEquals(tla.getSkippedTests().size(), 0); + Assert.assertEquals(tla.getPassedTests().size(), 2 + 4 * GeneratedClassFactory.SIZE); + } +} diff --git a/src/test/java/test/issue565/deadlock/ClassInGroupB.java b/src/test/java/test/issue565/deadlock/ClassInGroupB.java new file mode 100644 index 0000000000..ef65348a9f --- /dev/null +++ b/src/test/java/test/issue565/deadlock/ClassInGroupB.java @@ -0,0 +1,13 @@ +package test.issue565.deadlock; + +import org.testng.annotations.Test; + +@Test(groups = "B", dependsOnGroups = "A") +public class ClassInGroupB { + + @Test + public void groupB_1() { } + + @Test(dependsOnMethods = "groupB_1") + public void groupB_2() { } +} diff --git a/src/test/java/test/issue565/deadlock/GeneratedClassFactory.java b/src/test/java/test/issue565/deadlock/GeneratedClassFactory.java new file mode 100644 index 0000000000..e1ad32f4f0 --- /dev/null +++ b/src/test/java/test/issue565/deadlock/GeneratedClassFactory.java @@ -0,0 +1,25 @@ +package test.issue565.deadlock; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Factory; + +public class GeneratedClassFactory { + + public static final int SIZE = 20; + + @DataProvider(name = "ids", parallel = true) + public Object[][] ids() { + Integer[][] params = new Integer[SIZE][1]; + for (int id = 0; id < params.length; id++) { + params[id] = new Integer[]{id}; + } + return params; + } + + @Factory(dataProvider = "ids") + public Object[] generate(int id) { + return new Object[]{ + new GeneratedClassInGroupA(id) + }; + } +} diff --git a/src/test/java/test/issue565/deadlock/GeneratedClassInGroupA.java b/src/test/java/test/issue565/deadlock/GeneratedClassInGroupA.java new file mode 100644 index 0000000000..4ae77a3f30 --- /dev/null +++ b/src/test/java/test/issue565/deadlock/GeneratedClassInGroupA.java @@ -0,0 +1,33 @@ +package test.issue565.deadlock; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class GeneratedClassInGroupA { + + private final int id; + + public GeneratedClassInGroupA(int id) { + this.id = id; + } + + @BeforeClass(groups = "A") + public void init() { } + + @Test(groups = "A") + public void test1() { } + + @Test(groups = "A", dependsOnMethods = "test4") + public void test2() { } + + @Test(groups = "A") + public void test3() { } + + @Test(groups = "A", dependsOnMethods = "test3") + public void test4() { } + + @Override + public String toString() { + return "GeneratedClassInGroupA{" + id + '}'; + } +} diff --git a/src/test/resources/testng.xml b/src/test/resources/testng.xml index 4644b2f749..39d6f17130 100644 --- a/src/test/resources/testng.xml +++ b/src/test/resources/testng.xml @@ -159,6 +159,7 @@ + @@ -830,5 +831,6 @@ +