Skip to content

Commit

Permalink
Added: -testjar supports jar file with no testng.xml file
Browse files Browse the repository at this point in the history
  • Loading branch information
cbeust committed Apr 6, 2008
1 parent ee84a0e commit 01f7479
Show file tree
Hide file tree
Showing 12 changed files with 133 additions and 18 deletions.
4 changes: 3 additions & 1 deletion CHANGES.txt
@@ -1,6 +1,8 @@
===========================================================================
5.9
TESTNG-231: NullPointerException thrown converting a suite to XML (Mark)

Added: -testjar supports jar file with no testng.xml file
Fixed: TESTNG-231: NullPointerException thrown converting a suite to XML (Mark)

===========================================================================
5.8
Expand Down
2 changes: 1 addition & 1 deletion build.properties
Expand Up @@ -22,7 +22,7 @@ concurrent.jar=backport-util-concurrent-2.2.jar
# Names of distributions
#
testng.basename=testng
testng.version=5.8
testng.version=5.9beta
jdk14.testng.jar=${testng.basename}-${testng.version}-jdk14.jar
jdk15.testng.jar=${testng.basename}-${testng.version}-jdk15.jar
other.jars.dir=other-jars
Expand Down
60 changes: 45 additions & 15 deletions src/main/org/testng/TestNG.java
Expand Up @@ -37,10 +37,13 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

/**
* This class is the main entry point for running tests in the TestNG framework.
Expand Down Expand Up @@ -312,28 +315,55 @@ public void setTestJar(String jarPath) {
}

File jarFile = new File(jarPath);


try {
URL jarfile = new URL("jar", "", "file:" + jarFile.getAbsolutePath() + "!/");
URLClassLoader jarLoader = new URLClassLoader(new URL[] { jarfile });
URL jarfileUrl = new URL("jar", "", "file:" + jarFile.getAbsolutePath() + "!/");
URLClassLoader jarLoader = new URLClassLoader(new URL[] { jarfileUrl });
Thread.currentThread().setContextClassLoader(jarLoader);

m_suites.addAll(new Parser().parse());
JarFile jf = new JarFile(jarFile);
Enumeration<JarEntry> entries = jf.entries();
List<String> classes = new ArrayList<String>();
boolean foundTestngXml = false;
while (entries.hasMoreElements()) {
JarEntry je = entries.nextElement();
if (je.getName().equals("testng.xml")) {
Parser parser = new Parser(jf.getInputStream(je));
m_suites.addAll(parser.parse());
foundTestngXml = true;
break;
}
else if (je.getName().endsWith(".class")) {
int n = je.getName().length() - ".class".length();
classes.add(je.getName().replace("/", ".").substring(0, n));
}
}
if (! foundTestngXml) {
XmlSuite xmlSuite = new XmlSuite();
xmlSuite.setVerbose(1);
xmlSuite.setName("Jar suite");
XmlTest xmlTest = new XmlTest(xmlSuite);
List<XmlClass> xmlClasses = new ArrayList<XmlClass>();
for (String cls : classes) {
XmlClass xmlClass = new XmlClass(cls);
xmlClasses.add(xmlClass);
}
xmlTest.setXmlClasses(xmlClasses);
m_suites.add(xmlSuite);
}
}
catch(MalformedURLException mfurle) {
System.err.println("could not find jar file named: " + jarFile.getAbsolutePath());
catch(ParserConfigurationException ex) {
ex.printStackTrace();
}
catch(IOException ioe) {
System.out.println("An exception occurred while trying to load testng.xml from within jar "
+ jarFile.getAbsolutePath());
catch(SAXException ex) {
ex.printStackTrace();
}
catch(SAXException saxe) {
System.out.println("testng.xml from within jar "
+ jarFile.getAbsolutePath()
+ " is not well formatted");
saxe.printStackTrace(System.out);
catch(MalformedURLException ex) {
ex.printStackTrace();
}
catch(ParserConfigurationException pce) {
pce.printStackTrace(System.out);
catch(IOException ex) {
ex.printStackTrace();
}
}

Expand Down
9 changes: 9 additions & 0 deletions test/src/test/jar/A.java
@@ -0,0 +1,9 @@
package test.jar;

import org.testng.annotations.Test;

public class A {

@Test
public void f() {}
}
9 changes: 9 additions & 0 deletions test/src/test/jar/B.java
@@ -0,0 +1,9 @@
package test.jar;

import org.testng.annotations.Test;

public class B {

@Test
public void g() {}
}
42 changes: 42 additions & 0 deletions test/src/test/jar/JarTest.java
@@ -0,0 +1,42 @@
package test.jar;

import org.testng.Assert;
import org.testng.TestListenerAdapter;
import org.testng.TestNG;
import org.testng.annotations.Test;

import java.io.File;

public class JarTest {
private TestListenerAdapter init(String jarFile) {
TestNG tng = new TestNG();
File currentDir = new File(".");
String path = currentDir.getAbsolutePath();
char s = File.separatorChar;
path = path + s + "test" + s + "src" + s + "test" + s + "jar" + s;
String finalPath = path + jarFile;
tng.setTestJar(finalPath);
TestListenerAdapter result = new TestListenerAdapter();
tng.addListener(result);
tng.run();

return result;
}

@Test
public void jarWithTestngXml() {
TestListenerAdapter tla = init("withtestngxml.jar");
Assert.assertEquals(tla.getPassedTests().size(), 1);
Assert.assertEquals(tla.getPassedTests().get(0).getName(), "f");
}

@Test
public void jarWithoutTestngXml() {
TestListenerAdapter tla = init("withouttestngxml.jar");
Assert.assertEquals(tla.getPassedTests().size(), 2);
String first = tla.getPassedTests().get(0).getName();
String second = tla.getPassedTests().get(1).getName();
Assert.assertTrue("f".equals(first) || "g".equals(first));
Assert.assertTrue("f".equals(second) || "g".equals(second));
}
}
9 changes: 9 additions & 0 deletions test/src/test/jar/build
@@ -0,0 +1,9 @@
v=5.9beta

javac -cp ~/java/TestNG/testng-${v}-jdk15.jar:$CLASSPATH A.java B.java -d .
jar cvf withtestngxml.jar testng.xml test
jar cvf withouttestngxml.jar test

java -cp ~/java/TestNG/testng-${v}-jdk15.jar:$CLASSPATH org.testng.TestNG -testjar withtestngxml.jar
java -cp ~/java/TestNG/testng-${v}-jdk15.jar:$CLASSPATH org.testng.TestNG -testjar withouttestngxml.jar

12 changes: 12 additions & 0 deletions test/src/test/jar/testng.xml
@@ -0,0 +1,12 @@
<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" >

<suite name="Single" verbose="10">


<test name="test2">
<classes>
<class name="test.jar.A" />
</classes>
</test>
</suite>

Binary file added test/src/test/jar/withouttestngxml.jar
Binary file not shown.
Binary file added test/src/test/jar/withtestngxml.jar
Binary file not shown.
3 changes: 2 additions & 1 deletion test/testng-single.xml
Expand Up @@ -13,9 +13,10 @@
</suite-files>
-->

<parameter name="factory-param" value="FactoryParam" />
<test name="test2">
<classes>
<class name="priority.PriorityTest" />
<class name="test.jar.JarTest" />
</classes>
</test>

Expand Down
1 change: 1 addition & 0 deletions test/testng.xml
Expand Up @@ -76,6 +76,7 @@
<class name="test.annotationtransformer.AnnotationTransformerTest" />
<class name="test.configuration.MultipleBeforeGroupTest" />
<class name="test.configuration.BaseGroupsTest" />
<class name="test.jar.JarTest" />
</classes>
</test>

Expand Down

0 comments on commit 01f7479

Please sign in to comment.