/*
* Copyright 2007 Werner Guttmann
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.castor.maven.xmlctf;
import java.io.File;
import java.util.Iterator;
import junit.framework.Test;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.model.Resource;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.castor.xmlctf.TestCaseAggregator;
/**
* Abstract Maven Mojo that initialises the Junit test cases from xml Subclasses
* implement the runJUnit method to provide the Runner (eg. text, swing, ..)
*
* @since 1.2
* @requiresProject true
* @requiresDependencyResolution runtime
*/
public abstract class AbstractTestSuiteMojo extends AbstractMojo {
/**
* Property describing the root directory of the tests to be executed.
*/
private static final String TEST_ROOT_PROPERTY = "castor.xmlctf.root";
/**
* Target directory used for the testclasses.
*
* @parameter expression="./target/xmlctf"
*/
private String outputRoot;
/**
* The source directory of the tests.
*
* @parameter
*/
private String testRoot;
/**
* Optional parameter to overwrite the absolute path to the java tools.jar
*
* @parameter
*/
private String pathToTools;
/**
* The project whose project files to create.
*
* @parameter expression="${project}"
* @required
*/
private MavenProject project;
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Starting Castor Mastertestsuite");
// testRoot checks
String testRootToUse = System.getProperty(TEST_ROOT_PROPERTY);
if (testRootToUse == null) {
testRootToUse = testRoot;
}
if (testRootToUse == null) {
throw new MojoExecutionException(
"No testroot found, please specify property -Dcastor.xmlctf.root");
}
if (testRootToUse.equals(".") || testRootToUse.equals("..")) {
// -- convert relative directories "." and ".." to a Canonical path
File tmp = new File(testRootToUse);
try {
testRootToUse = tmp.getCanonicalPath();
} catch (java.io.IOException iox) {
}
} else if (testRootToUse.startsWith("./")
|| testRootToUse.startsWith(".\\")) {
// -- Remove leading ./ or .\ -- URLClassLoader can't handle such
// file URLs
testRoot = testRoot.substring(2);
}
File testRootFile = new File(testRootToUse);
getLog().info("using testRoot: " + testRootFile.getAbsolutePath());
if (!testRootFile.exists()) {
throw new MojoExecutionException("Root not found:" + testRoot);
}
// set classpath for testcompiler
// TODO
String dirSeparator = System.getProperty("file.separator");
String classpath = "";
for (Iterator iter = project.getArtifacts().iterator(); iter.hasNext();) {
classpath += ((Artifact) iter.next()).getFile().getAbsolutePath();
classpath += System.getProperty("path.separator");
}
classpath += project.getBuild().getTestOutputDirectory();
classpath += System.getProperty("path.separator");
if (pathToTools != null) {
classpath += pathToTools + System.getProperty("path.separator");
} else {
classpath += System.getProperty("java.home") + dirSeparator + "lib"
+ dirSeparator + "tools.jar";
classpath += System.getProperty("path.separator");
classpath += System.getProperty("java.home") + dirSeparator + ".."
+ dirSeparator + "lib" + dirSeparator + "tools.jar";
classpath += System.getProperty("path.separator");
}
// set system proerties for
System.setProperty("xmlctf.classpath.override", classpath);
if (getLog().isDebugEnabled()) {
System.setProperty(TestCaseAggregator.VERBOSE_PROPERTY, "true");
System.setProperty(TestCaseAggregator.PRINT_STACK_TRACE, "true");
}
getLog().info("classpath for sourcegenerator is:" + classpath);
// run testCase
TestCaseAggregator aggregator = new TestCaseAggregator(testRootFile, outputRoot);
// aggregator.
runJUnit(aggregator.suite());
}
/**
* For subclasses to implement to provide a test runner.
*
* @param testSuite
* The TestSuite to be executed
* @throws MojoExecutionException
* If test execution fails.
*/
public abstract void runJUnit(Test testSuite) throws MojoExecutionException;
}