package com.technophobia.substeps.ant; import java.io.File; import java.util.ArrayList; import java.util.List; import junit.framework.Assert; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.technophobia.substeps.execution.node.RootNode; import com.technophobia.substeps.report.ExecutionReportBuilder; import com.technophobia.substeps.runner.BuildFailureManager; import com.technophobia.substeps.runner.ExecutionNodeRunnerFactory; import com.technophobia.substeps.runner.SubstepExecutionFailure; import com.technophobia.substeps.runner.SubstepsExecutionConfig; import com.technophobia.substeps.runner.SubstepsRunner; public class SubStepsTask extends Task { private final Logger log = LoggerFactory.getLogger(SubStepsTask.class); private final List<AntExecutionConfig> configs = new ArrayList<AntExecutionConfig>(); private ExecutionReportBuilder executionReportBuilder = null; private String outputDir; private static final String REPORT_DIR_DEFAULT = "."; @Override public void execute() throws BuildException { final BuildFailureManager buildFailureManager = new BuildFailureManager(); List<SubstepsExecutionConfig> configs = new ArrayList<SubstepsExecutionConfig>(); for (AntExecutionConfig c : this.configs) { configs.add(c); } executeInternal(buildFailureManager, configs); } public void addConfiguredExecutionConfig(AntExecutionConfig config) { this.configs.add(config); } public void setOutputDir(String outputDir) { this.outputDir = outputDir; } private void executeInternal(final BuildFailureManager buildFailureManager, final List<SubstepsExecutionConfig> executionConfigList) throws RuntimeException { Assert.assertNotNull("executionConfigs cannot be null", executionConfigList); Assert.assertFalse("executionConfigs can't be empty", executionConfigList.isEmpty()); executionReportBuilder = ExecutionReportBuilder.createDefaultExecutionReportBuilder(); executionReportBuilder .setOutputDirectory(new File(this.outputDir == null ? REPORT_DIR_DEFAULT : this.outputDir)); for (final SubstepsExecutionConfig executionConfig : executionConfigList) { final List<SubstepExecutionFailure> failures = new ArrayList<SubstepExecutionFailure>(); final RootNode rootNode = runExecutionConfig(executionConfig, failures); if (executionConfig.getDescription() != null) { rootNode.setLine(executionConfig.getDescription()); } buildFailureManager.addExecutionResult(rootNode); executionReportBuilder.addRootExecutionNode(rootNode); } executionReportBuilder.buildReport(); if (buildFailureManager.testSuiteFailed()) { throw new RuntimeException("Substep Execution failed:\n" + buildFailureManager.getBuildFailureInfo()); } else if (!buildFailureManager.testSuiteCompletelyPassed()) { // print out the failure string (but won't include any failures) log.info(buildFailureManager.getBuildFailureInfo()); } // else - we're all good } private RootNode runExecutionConfig(final SubstepsExecutionConfig theConfig, final List<SubstepExecutionFailure> failures) { final SubstepsRunner runner = ExecutionNodeRunnerFactory.createRunner(); runner.prepareExecutionConfig(theConfig); final RootNode rootNode = runner.run(); final List<SubstepExecutionFailure> localFailures = runner.getFailures(); failures.addAll(localFailures); return rootNode; } }