package org.codehaus.mojos.slimdog;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.plexus.util.DirectoryScanner;
import org.jzonic.webtester.WebTestFileReader;
import org.jzonic.webtester.WebTestResult;
import org.jzonic.webtester.writer.WebTestResultFileWriter;
import org.jzonic.webtester.writer.WebTestResultWriter;
import java.io.File;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/** Run a [set of] slimdog-WebTester test(s).
*
* @goal test
* @phase integration-test
*/
public class WebTesterMojo extends AbstractMojo
{
private static final String[] EMPTY_STRING_ARRAY = {};
private static final String[] DEFAULT_INCLUDES = {"**/**"};
/** The test-resources to scan for tests.
*
* @parameter expression="${project.build.testResources}"
*/
private List testResources;
/** A single test file to be run, assumed to be in the testResources somewhere.
*
* @parameter
*/
private String testFile;
/**
* Base directory where all reports are written to.
*
* @parameter expression="${project.build.directory}/slimdog-reports"
* @required
*/
private String reportsDirectory;
public void execute()
throws MojoExecutionException
{
Map testEntries = null;
if ( testFile != null ) {
testEntries = getTestEntries( testFile );
}
else if ( testResources != null && !testResources.isEmpty() )
{
testEntries = getTestEntries( null );
}
else
{
getLog().info( "No tests found." );
return;
}
// this will NOT be accessed if we don't have a testFile or testResources.
// see above if-then-else logic...
for ( Iterator testEntryIterator = testEntries.entrySet().iterator(); testEntryIterator.hasNext(); )
{
Map.Entry testEntry = (Map.Entry) testEntryIterator.next();
File testFile = (File) testEntry.getKey();
String testName = (String) testEntry.getValue();
runTest( testFile, testName );
}
}
private void runTest( File testFile, String reportFile )
{
getLog().info( "Running test: " + testFile );
WebTestFileReader reader = new WebTestFileReader();
WebTestResult result = reader.parseFile( testFile.getAbsolutePath() );
getLog().info( "Parsed test: " + testFile );
File outputFile = new File( reportsDirectory, reportFile + ".txt" );
File outputDir = outputFile.getParentFile();
if( !outputDir.exists() )
{
outputDir.mkdirs();
}
WebTestResultWriter writer = new WebTestResultFileWriter( outputFile.getAbsolutePath() );
getLog().info( "Generating resulting output for test: " + testFile );
writer.generateResult(result);
getLog().info( "Wrote output to: " + outputFile );
}
private Map getTestEntries( String singleFileInclude )
{
Map resourceEntries = new TreeMap();
// this label marks the outer loop so we can break all the way out if we're only looking for
// a single test file, and we find it before the last of the resources are processed.
allScanning:
for ( Iterator i = testResources.iterator(); i.hasNext(); )
{
Resource resource = (Resource) i.next();
String targetPath = resource.getTargetPath();
File resourceDirectory = new File( resource.getDirectory() );
if ( !resourceDirectory.exists() )
{
continue;
}
DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir( resource.getDirectory() );
if ( singleFileInclude != null )
{
scanner.setIncludes( new String[] { singleFileInclude } );
}
else
{
scanner.addDefaultExcludes();
if ( resource.getIncludes() != null && !resource.getIncludes().isEmpty() )
{
scanner.setIncludes( (String[]) resource.getIncludes().toArray( EMPTY_STRING_ARRAY ) );
}
else
{
scanner.setIncludes( DEFAULT_INCLUDES );
}
if ( resource.getExcludes() != null && !resource.getExcludes().isEmpty() )
{
scanner.setExcludes( (String[]) resource.getExcludes().toArray( EMPTY_STRING_ARRAY ) );
}
}
scanner.scan();
List includedFiles = Arrays.asList( scanner.getIncludedFiles() );
for ( Iterator j = includedFiles.iterator(); j.hasNext(); )
{
String name = (String) j.next();
String entryName = name;
if ( targetPath != null )
{
entryName = targetPath + "/" + name;
}
resourceEntries.put( new File( resource.getDirectory(), name ), entryName );
// if we're only running a single test, then we can break all the way out
// as soon as we find a single matching test file.
if ( singleFileInclude != null )
{
break allScanning;
}
}
}
return resourceEntries;
}
}