package hudson.plugins.testng.parser;
import hudson.plugins.testng.results.*;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
import org.xmlpull.v1.XmlPullParser;
public class ResultsParser {
/**
*
* @param file
* @return
*/
public static Collection<TestResults> parse(File file) {
ResultPullParserHelper xmlParserHelper = new ResultPullParserHelper();
Collection<TestResults> results = new ArrayList<TestResults>();
FileInputStream fileInputStream = xmlParserHelper.createFileInputStream(file);
BufferedInputStream bufferedInputStream;
if (file != null) {
bufferedInputStream = new BufferedInputStream(fileInputStream);
XmlPullParser xmlPullParser = xmlParserHelper.createXmlPullParser(bufferedInputStream);
if (xmlPullParser != null) {
// check that the first tag is <testng-results>
if (xmlParserHelper.parseToTagIfFound(xmlPullParser, "testng-results", 0)) {
// skip until we get to the <suite> tag
while (xmlParserHelper.parseToTagIfFound(xmlPullParser, "suite", 1)) {
TestResults testNGTestResults = new TestResults(UUID.randomUUID().toString()
+ "_TestNGResults");
List<TestResult> testNGTestList = new ArrayList<TestResult>();
int suiteDepth = xmlPullParser.getDepth();
// skip until we get to the <test> tag
while (xmlParserHelper.parseToTagIfFound(xmlPullParser, "test", suiteDepth)) {
//for-each <test> tag
int testDepth = xmlPullParser.getDepth();
TestResult testngTest = new TestResult();
String name = xmlPullParser.getAttributeValue(null, "name");
testngTest.setName(name);
List<ClassResult> testNGClassList = new ArrayList<ClassResult>();
while (xmlParserHelper.parseToTagIfFound(xmlPullParser, "class", testDepth)) {
int classDepth = xmlPullParser.getDepth();
ClassResult testNGTestClass = new ClassResult();
testNGTestClass.setName(xmlPullParser.getAttributeValue(null,
"name"));
testNGTestClass.setFullName(xmlPullParser.getAttributeValue(null,
"name"));
List<MethodResult> testMethodList = new ArrayList<MethodResult>();
while (xmlParserHelper.parseToTagIfFound(xmlPullParser, "test-method", classDepth)) {
MethodResult testNGTestMethod = xmlParserHelper.createTestMethod(xmlPullParser,testNGTestClass);
if (testNGTestMethod != null) {
MethodResultException exception =
xmlParserHelper.createExceptionObject(xmlPullParser);
if (exception != null) {
testNGTestMethod.setException(exception);
}
ResultsParser.updateTestMethodLists(testNGTestResults, testNGTestMethod);
// add to test methods list for each class
testMethodList.add(testNGTestMethod);
}
}
testNGTestClass.setTestMethodList(testMethodList);
testNGClassList.add(testNGTestClass);
}
testngTest.setClassList(testNGClassList);
testNGTestList.add(testngTest);
}
testNGTestResults.setTestList(testNGTestList);
testNGTestResults.tally();
results.add(testNGTestResults);
}
}
}
try {
bufferedInputStream.close();
} catch (IOException e) {
//ignore
e.printStackTrace();
}
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
//ignore
e.printStackTrace();
}
}
}
return results;
}
private static void updateTestMethodLists(TestResults testResults, MethodResult testNGTestMethod) {
if (testNGTestMethod.isConfig()) {
if ("FAIL".equals(testNGTestMethod.getStatus())) {
testResults.getFailedConfigurationMethods().add(testNGTestMethod);
} else {
if ("SKIP".equals(testNGTestMethod.getStatus())) {
testResults.getSkippedConfigurationMethods().add(testNGTestMethod);
}
}
} else {
if ("FAIL".equals(testNGTestMethod.getStatus())) {
testResults.getFailedTests().add(testNGTestMethod);
} else {
if ("SKIP".equals(testNGTestMethod.getStatus())) {
testResults.getSkippedTests().add(testNGTestMethod);
} else {
if ("PASS".equals(testNGTestMethod.getStatus())) {
testResults.getPassedTests().add(testNGTestMethod);
}
}
}
}
}
}