package eu.hats_project.build.maven.plugin; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.maven.plugin.MojoFailureException; import abs.backend.tests.ABSTestRunnerGenerator; /** * * A Maven 2 plugin to execute ABS test code in Java * * @goal javatest * @requiresDependencyResolution * @phase test * */ public class JavaTestMojo extends AbstractTestMojo { /** * The ABS Java Backend target folder. * * @parameter expression="${abs.javaBackend.targetFolder}" * default-value="${project.build.directory}/abs/gen/test/java" * @required */ private File absJavaBackendTestTargetFolder; /** * @parameter expression="${abs.javaBackend.verbose}" default-value=false */ private boolean verbose; /** * @parameter expression="${classpaths}" */ private String[] classPaths; /** * @parameter expression="${dependencies}" */ private String[] dependencies; /** * @parameter expression="${abs.terminateOnException}" default-value=false */ private Boolean terminateOnException; private String[] jvm = new String[0]; /** * Default output appender */ private Appendable appender = new StringBuilder(); @Override protected void makeTest() throws Exception { // generate Java code JavaGenerator generator = new JavaGenerator(); List<String> args = new ArrayList<String>(); if (absTestRunnerFile.exists()) { args.add(absTestRunnerFile.getAbsolutePath()); } args.addAll(getABSArguments()); args = generator.generateJava( absfrontEnd, absTestSrcFolder, args, absJavaBackendTestTargetFolder, checkProductSelection, verbose, false, true, loctype, productName, getLog()); // run java if (terminateOnException) { jvm = Arrays.copyOf(jvm,jvm.length+1); jvm[jvm.length-1] = "-Dabs.terminateOnException=true"; } runJava(jvm); if (appender instanceof StringBuilder) { final String result = appender.toString(); if (result.length() > 0) { getLog().error("Java Test fails."); getLog().error(result); throw new MojoFailureException("One or more Java tests have failed, see log information for details."); } // only in debug getLog().debug(result); } } protected void setJVMOptions(String[] opts) { this.jvm = opts; } protected void setAppendable(Appendable appendable) { this.appender = appendable; } private Appendable runJava(String... jvmargs) throws MojoFailureException { try { String classpath = absfrontEnd.getAbsolutePath() + ":" + absJavaBackendTestTargetFolder.getAbsolutePath(); if (classPaths != null) { for (String cp : classPaths) { classpath += ":" + cp; } } if (dependencies != null) { for (String d : dependencies) { String[] ds = d.split(":"); if (ds.length != 3) { throw new MojoFailureException("Cannot resolve dependency "+d); } try { classpath += ":" + getClasspath(ds[0], ds[1], ds[2]); } catch (Exception e) { throw new MojoFailureException("Cannot resolve dependency "+d,e); } } } List<String> args = new ArrayList<String>(); args.add("java"); args.addAll(Arrays.asList(jvmargs)); String main = ((mainBlock == null) ? ABSTestRunnerGenerator.RUNNER_MAIN : mainBlock) + ".Main"; args.addAll(Arrays.asList("-cp", classpath, main)); String[] argArray = args.toArray(new String[args.size()]); new DebugArgOutput().debug("Executing generated Java code", argArray, getLog()); ProcessBuilder pb = new ProcessBuilder(args.toArray(new String[0])); pb.redirectErrorStream(true); Process p = pb.start(); BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); while (true) { String s; s = r.readLine(); if (s == null) break; appender.append(s + "\n"); } return appender; } catch (IOException e) { e.printStackTrace(); return null; } } }