diff --git a/src/main/java/org/testng/TestNG.java b/src/main/java/org/testng/TestNG.java
index d40c9803e8..c5ed96eb3b 100644
--- a/src/main/java/org/testng/TestNG.java
+++ b/src/main/java/org/testng/TestNG.java
@@ -71,7 +71,7 @@
/**
* This class is the main entry point for running tests in the TestNG framework.
* Users can create their own TestNG object and invoke it in many different
- * ways:
+ * ways
*
* - On an existing testng.xml
*
- On a synthetic testng.xml, created entirely from Java
@@ -275,23 +275,27 @@ public void initializeSuitesAndJarFile() {
m_isInitialized = true;
if (m_suites.size() > 0) {
- //to parse the suite files (), if any
- for (XmlSuite s: m_suites) {
- for (String suiteFile : s.getSuiteFiles()) {
- Path rootPath = Paths.get(s.getFileName()).getParent();
- try {
- Collection childSuites = getParser(rootPath.resolve(suiteFile).normalize().toString()).parse();
- for (XmlSuite cSuite : childSuites){
- cSuite.setParentSuite(s);
- s.getChildSuites().add(cSuite);
- }
- } catch (ParserConfigurationException | IOException | SAXException e) {
- e.printStackTrace(System.out);
- }
- }
-
- }
- return;
+ //to parse the suite files (), if any
+ for (XmlSuite s: m_suites) {
+ for (String suiteFile : s.getSuiteFiles()) {
+ Path suitePath = Paths.get(s.getFileName()).getParent();
+ try {
+ Collection childSuites = getParser(suitePath.resolve(suiteFile).normalize().toString()).parse();
+ for (XmlSuite cSuite : childSuites){
+ Path childSuite = Paths.get(cSuite.getFileName()).normalize();
+ Path parentSuite = Paths.get(suiteFile).normalize();
+ if(!childSuite.getFileName().equals(parentSuite.getFileName()))
+ {
+ cSuite.setParentSuite(s);
+ s.getChildSuites().add(cSuite);
+ }
+ }
+ } catch (ParserConfigurationException | IOException | SAXException e) {
+ e.printStackTrace(System.out);
+ }
+ }
+ }
+ return;
}
//
@@ -1012,13 +1016,13 @@ private void checkSuiteNames(List suites) {
private void checkSuiteNamesInternal(List suites, Set names) {
for (XmlSuite suite : suites) {
final String name = suite.getName();
-
int count = 0;
+
String tmpName = name;
while (names.contains(tmpName)) {
tmpName = name + " (" + count++ + ")";
}
-
+
if (count > 0) {
suite.setName(tmpName);
names.add(tmpName);
diff --git a/src/test/java/test/sanitycheck/CheckSuiteNamesTest.java b/src/test/java/test/sanitycheck/CheckSuiteNamesTest.java
index f8cc1ad65b..269184a6db 100644
--- a/src/test/java/test/sanitycheck/CheckSuiteNamesTest.java
+++ b/src/test/java/test/sanitycheck/CheckSuiteNamesTest.java
@@ -9,9 +9,16 @@
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;
import org.xml.sax.SAXException;
+
import test.SimpleBaseTest;
+
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
import javax.xml.parsers.ParserConfigurationException;
public class CheckSuiteNamesTest extends SimpleBaseTest {
@@ -81,4 +88,26 @@ public void checkXmlSuiteAddition() throws ParserConfigurationException, SAXExce
tng.setXmlSuites(parser.parseToList());
tng.initializeSuitesAndJarFile();
}
+
+ @Test(description = "Verify that same suite is not added multiple times")
+ public void validateDuplicateSuiteAddition() throws ParserConfigurationException, SAXException, IOException
+ {
+ SuiteListner suiteListner = new SuiteListner();
+ TestNG tng = create();
+ String testngXmlPath = getPathToResource("sanitycheck/test-s-b.xml");
+ Parser parser = new Parser(testngXmlPath);
+ tng.setXmlSuites(parser.parseToList());
+ tng.addListener(suiteListner);
+ tng.run();
+
+ Set allSuite = new HashSet();
+ List ranSuites = suiteListner.getAllTestSuite();
+
+ Assert.assertEquals(ranSuites.size(), 3, "Correct number of suites ran");
+ for(XmlSuite suite : ranSuites)
+ {
+ Assert.assertTrue(allSuite.add(suite.getFileName()),
+ String.format("No duplicate of suite %s added", suite.getFileName()));
+ }
+ }
}
diff --git a/src/test/java/test/sanitycheck/SuiteListner.java b/src/test/java/test/sanitycheck/SuiteListner.java
new file mode 100644
index 0000000000..acb4da4933
--- /dev/null
+++ b/src/test/java/test/sanitycheck/SuiteListner.java
@@ -0,0 +1,28 @@
+package test.sanitycheck;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.testng.ISuite;
+import org.testng.ISuiteListener;
+import org.testng.xml.XmlSuite;
+
+public class SuiteListner implements ISuiteListener {
+
+ private List allSuite = new ArrayList();
+
+ @Override
+ public void onStart(ISuite suite) {
+ allSuite.add(suite.getXmlSuite());
+ }
+
+ @Override
+ public void onFinish(ISuite suite) {
+
+ }
+
+ public List getAllTestSuite(){
+ return allSuite;
+ }
+
+}