package com.canoo.ant; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.log4j.Logger; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.taskdefs.Ant; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.resources.FileResource; public class WebTestSuiteTask extends Task { private static final Logger LOG = Logger.getLogger(WebTestSuiteTask.class); private static final String DEFAULT_INCLUDING_FILE_PATTERN = "**/*.xml"; private static final String DEFAULT_EXCLUDING_FILE_PATTERN = "**/*.data"; private File webtestdir; private String excludefilepattern = DEFAULT_EXCLUDING_FILE_PATTERN; private String includefilepattern = DEFAULT_INCLUDING_FILE_PATTERN; private File reportgeneratorfile; @Override public void execute() throws BuildException { checkValidWebTestDir(); runWebTests(buildWebTestList()); } private void checkValidWebTestDir() { if (webtestdir == null || !webtestdir.isDirectory()) { throw new BuildException("webtestDir is not set or is not a directory"); } } private void runWebTests(List webTestFiles) { Map testFailures = new HashMap(); Ant ant = new Ant(this); ant.setInheritRefs(true); ant.setInheritAll(true); for (FileResource webTestFile : webTestFiles) { String testFilename = webTestFile.getFile().getPath(); ant.setAntfile(testFilename); try { LOG.info("Running test '" + testFilename + "'"); ant.execute(); } catch (Exception ex) { testFailures.put(testFilename, ex); } } generateTestResultReport(ant); if (!testFailures.isEmpty()) { throw new BuildException(dumpTestFailureList(testFailures)); } else { LOG.info("All webtests run successfully !"); } } List buildWebTestList() { LOG.info("Webtest dir = " + webtestdir.getAbsolutePath()); FileSet fileSet = new FileSet(); fileSet.setDir(webtestdir); fileSet.setIncludes(includefilepattern); fileSet.setExcludes(excludefilepattern); fileSet.setProject(getProject()); List webTestFiles = new ArrayList(); Iterator resources = fileSet.iterator(); while (resources.hasNext()) { Resource resource = (Resource)resources.next(); if (!resource.isExists()) { continue; } if (resource instanceof FileResource) { FileResource fr = (FileResource)resource; webTestFiles.add(fr); LOG.debug("test added = '" + fr.getFile().getPath() + "'"); } } LOG.info("Found " + webTestFiles.size() + " webtests"); return webTestFiles; } private String dumpTestFailureList(Map testFailures) { StringBuilder strBuilder = new StringBuilder("Some tests have failed : \n"); for (Entry entry : testFailures.entrySet()) { String testFilename = entry.getKey(); Exception exception = entry.getValue(); strBuilder.append(testFilename).append(" : ").append(exception.getMessage()).append("\n"); } return strBuilder.toString(); } private void generateTestResultReport(Ant ant) { if (reportgeneratorfile != null) { LOG.info("Starting generating HTML report."); String testFilename = reportgeneratorfile.getPath(); ant.setAntfile(testFilename); ant.execute(); LOG.info("End generating HTML report."); } else { LOG.info("Skip HTML report generation."); } } public void setWebtestdir(File webtestdir) { this.webtestdir = webtestdir; } public void setReportgeneratorfile(File reportgeneratorfile) { this.reportgeneratorfile = reportgeneratorfile; } public void setExcludefilepattern(String excludefilepattern) { this.excludefilepattern = excludefilepattern; } public void setIncludefilepattern(String includefilepattern) { this.includefilepattern = includefilepattern; } }