/* * JBoss, Home of Professional Open Source. * Copyright 2010, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.gatein.selenium; import static org.jboss.gatein.selenium.build.BuildHelper.getMavenHome; import static org.jboss.gatein.selenium.common.CommonHelper.copyAndClose; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.Properties; import org.apache.tools.ant.DefaultLogger; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectHelper; /** * @author <a href="mailto:mstrukel@redhat.com">Marko Strukelj</a> */ public class AbstractSingleTestWithAnt extends AbstractSingleTest { private String workDirRoot = "target/"; private String mavenProps = "project.properties"; private String mavenActiveProps = "active-profile.properties"; private boolean fileInited; private File antBuildFile; private Project project; protected String getTestName() { String className = getClass().getName(); return className.substring(className.lastIndexOf('.') + 1); } protected Properties getActiveMavenProperties() throws IOException { Properties props = new Properties(); File propsFile = new File(workDirRoot, mavenProps); if (!propsFile.isFile()) { log.warn("File " + propsFile + " not found. Make sure you're using properties-maven-plugin in your pom.xml. Build may not work properly: " + getAntBuildFileName()); } else { props.load(new FileInputStream(propsFile)); } propsFile = new File(workDirRoot, mavenActiveProps); if (!propsFile.isFile()) { log.warn("File " + propsFile + " not found. Make sure you're using properties-maven-plugin in your pom.xml. Build may not work properly: " + getAntBuildFileName()); } else { props.load(new FileInputStream(propsFile)); } return props; } protected File getTestWorkDir() { return new File(workDirRoot, getTestName()); } protected String getAntBuildFileName() { return getTestName() + "-build.xml"; } protected File findAntBuildFileForTest() throws IOException { if (fileInited) return antBuildFile; fileInited = true; String fileName = getAntBuildFileName(); InputStream is = getClass().getResourceAsStream(fileName); if (is == null) return null; File outDir = getTestWorkDir(); File outFile = new File(outDir, fileName); outDir.mkdirs(); copyAndClose(is, new FileOutputStream(outFile)); antBuildFile = outFile; return outFile; } protected boolean expectAntBuildFile() throws IOException { File buildFile = findAntBuildFileForTest(); if (buildFile == null) { log.warn("Test specific ant build file not found: " + getAntBuildFileName() + "."); return false; } return true; } protected Project prepareAntBuild() throws IOException { /* * Example of how to embed ant: * http://svn.apache.org/viewvc/maven/plugins/tags/maven-antrun-plugin-1.6/src/main/java/org * /apache/maven/plugin/antrun/AntRunMojo.java?revision=1005612&view=markup */ File mavenHome = getMavenHome(); if (mavenHome != null) System.setProperty("maven.home", mavenHome.getAbsolutePath()); Project project = new Project(); File buildFile = findAntBuildFileForTest(); project.setUserProperty("ant.file", buildFile.getAbsolutePath()); Properties props = getActiveMavenProperties(); for (Map.Entry ent : props.entrySet()) { String key = (String) ent.getKey(); // build.xml properties override pom.xml properties if (project.getProperty(key) == null) { project.setInheritedProperty(key, (String) ent.getValue()); } } project.init(); ProjectHelper.configureProject(project, buildFile); DefaultLogger antLogger = new DefaultLogger(); antLogger.setOutputPrintStream(System.out); antLogger.setErrorPrintStream(System.err); String loggingLevel = project.getProperty("ant.logging.level"); antLogger.setMessageOutputLevel(getAntDebugLevel(loggingLevel)); project.addBuildListener(antLogger); this.project = project; return project; } protected int getAntDebugLevel(String loggingLevel) { loggingLevel = loggingLevel.toUpperCase(); if ("VERBOSE".equalsIgnoreCase(loggingLevel)) return Project.MSG_VERBOSE; else if ("DEBUG".equals(loggingLevel)) return Project.MSG_DEBUG; else if ("WARN".equals(loggingLevel)) return Project.MSG_WARN; else if ("ERROR".equals(loggingLevel)) return Project.MSG_ERR; else return Project.MSG_INFO; } protected void executeAntBuild() { if (project == null) throw new RuntimeException("Project not initialized. Call prepareAntBuild() first."); String target = project.getDefaultTarget(); if (target == null) throw new RuntimeException("No default target specified in ant build file: " + antBuildFile); project.executeTarget(target); } protected void prepareAndExecuteAntBuild() throws IOException { prepareAntBuild(); executeAntBuild(); } }