/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2009-2010 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ /** * This is the same class as the one in v2/appserv-tests/util/reportbuilder/src/main/java/com/sun/appserv/test. * * Please see the original svn logs for the contributions. */ package com.sun.appserv.test; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import com.sun.appserv.test.util.process.ProcessManager; import com.sun.appserv.test.util.process.ProcessManagerException; import org.w3c.dom.Document; import org.xml.sax.SAXException; public abstract class BaseDevTest { @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed"}) public BaseDevTest() { } protected abstract String getTestName(); protected abstract String getTestDescription(); public boolean report(String step, boolean success) { return success; } public boolean report(String step, AsadminReturn ret) { return ret.returnValue; } /** * Runs the command with the args given * * @param args * * @return true if successful */ public boolean asadmin(final String... args) { lastAsadminReturn = asadminWithOutput(args); write(lastAsadminReturn.out); write(lastAsadminReturn.err); return lastAsadminReturn.returnValue; } /** * Runs the command with the args given * Returns the precious output strings for further processing. * * @param args * * @return true if successful */ public AsadminReturn asadminWithOutput(final String... args) { AsadminReturn ret = new AsadminReturn(); String cmd = isWindows() ? "/bin/asadmin.bat" : "/bin/asadmin"; List<String> command = new ArrayList<String>(); String gf_home = System.getProperty("glassfish.home"); command.add(gf_home + cmd); command.addAll(Arrays.asList(antProp("as.props").split(" "))); command.addAll(Arrays.asList(args)); ProcessManager pm = new ProcessManager(command); // the tests may be running unattended -- don't wait forever! pm.setTimeoutMsec(DEFAULT_TIMEOUT_MSEC); pm.setEcho(false); int exit; try { exit = pm.execute(); } catch (ProcessManagerException ex) { exit = 1; } ret.out = pm.getStdout(); ret.err = pm.getStderr(); ret.outAndErr = ret.out + ret.err; ret.returnValue = exit == 0 && validResults(ret.out, String.format("Command %s failed.", args[0]), "list-commands"); return ret; } protected boolean validResults(String text, String... invalidResults) { for (String result : invalidResults) { if (text.contains(result)) { return false; } } return true; } public boolean isWindows() { return System.getProperty("os.name").toLowerCase().contains("win"); } public String antProp(final String key) { String value = System.getProperty(key); if (value == null) { try { Properties props = new Properties(); String apsHome = System.getProperty("BASEDIR"); FileReader reader = new FileReader(new File(apsHome, "/build.properties")); try { props.load(reader); } finally { reader.close(); } System.getProperties().putAll(props); System.setProperty("as.props", String.format("--host %s --port %s" + " --echo=true --terse=true", antProp("glassfish.http.host"), antProp("glassfish.admin.port"))); value = System.getProperty(key); int index; while ((index = value.indexOf("${env.")) != -1) { int end = value.indexOf("}", index); String var = value.substring(index, end + 1); final String name = var.substring(6, var.length() - 1); value = value.replace(var, System.getenv(name)); System.setProperty(key, value); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e.getMessage(), e); } } return value; } protected final void write() { if (verbose) { write(lastAsadminReturn.out); write(lastAsadminReturn.err); } } public void write(final String text) { if (verbose) System.out.println(text); } protected final void writeFailure() { System.out.println(FAILURE_START); if (lastAsadminReturn != null) { System.out.println(lastAsadminReturn.out); System.out.println(lastAsadminReturn.err); } } /** * Evaluates the Xpath expression * * @param expr The expression to evaluate * @param f The file to parse * @param ret The return type of the expression can be * * XPathConstants.NODESET XPathConstants.BOOLEAN XPathConstants.NUMBER XPathConstants.STRING XPathConstants.NODE * * @return the object after evaluation can be of type number maps to a java.lang.Double string maps to a * java.lang.String boolean maps to a java.lang.Boolean node-set maps to an org.w3c.dom.NodeList * * @throws XPathExpressionException * @throws IOException * @throws SAXException * @throws ParserConfigurationException */ public Object evalXPath(String expr, File f, QName ret) { try { DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); // never forget this! DocumentBuilder builder = domFactory.newDocumentBuilder(); Document doc = builder.parse(f); write("Parsing" + f.getAbsolutePath()); XPathFactory factory = XPathFactory.newInstance(); XPath xpath = factory.newXPath(); XPathExpression xexpr = xpath.compile(expr); Object result = xexpr.evaluate(doc, ret); write("Evaluating" + f.getAbsolutePath()); return result; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e.getMessage(), e); } } /** * Evaluates the Xpath expression by parsing the DAS's domain.xml * * @param expr The Xpath expression to evaluate * * @return the object after evaluation can be of type number maps to a java.lang.Double string maps to a * java.lang.String boolean maps to a java.lang.Boolean node-set maps to an org.w3c.dom.NodeList * * @throws XPathExpressionException * @throws IOException * @throws SAXException * @throws ParserConfigurationException */ public Object evalXPath(String expr, QName ret) { return evalXPath(expr, getDASDomainXML(), ret); } /** * Gets the domains folder for DAS * * @return GF_HOME/domains/domain1 */ public File getDASDomainDir() { return new File(new File(getGlassFishHome(), "domains"), "domain1"); } /** * Gets the domain.xml for DAS * * @return GF_HOME/domains/domain1/config/domain.xml */ public File getDASDomainXML() { return new File(new File(getDASDomainDir(), "config"), "domain.xml"); } /** * Get the Glassfish home from the environment variable S1AS_HOME * * @return */ public File getGlassFishHome() { String home = System.getProperty("glassfish.home"); System.out.println("GF_HOME : "+home); if (home == null) { throw new IllegalStateException("No S1AS_HOME set!"); } File glassFishHome = new File(home); try { glassFishHome = glassFishHome.getCanonicalFile(); } catch (Exception e) { glassFishHome = glassFishHome.getAbsoluteFile(); } if (!glassFishHome.isDirectory()) { throw new IllegalStateException("S1AS_HOME is not pointing at a real directory!"); } return glassFishHome; } /** * Implementations can override this method to do the cleanup for eg deleting instances, deleting clusters etc */ public void cleanup() { } protected final boolean isVerbose() { return verbose; } protected final void setVerbose(boolean b) { verbose = b; } protected final AsadminReturn getLastAsadminReturn() { return lastAsadminReturn; } // simple C-struct -- DIY public static class AsadminReturn { public boolean returnValue; public String out; public String err; public String outAndErr; } private static final int DEFAULT_TIMEOUT_MSEC = 120000; // 2 minutes private boolean verbose = true; // in case the command fails so that it can be printed (Hack bnevins) private AsadminReturn lastAsadminReturn; private static final String FAILURE_START = "######### FAILURE #########"; }