| /* | |
| * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved. | |
| * | |
| * This program and the accompanying materials are made available under the | |
| * terms of the Eclipse Public License v. 2.0, which is available at | |
| * http://www.eclipse.org/legal/epl-2.0. | |
| * | |
| * This Source Code may also be made available under the following Secondary | |
| * Licenses when the conditions for such availability set forth in the | |
| * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, | |
| * version 2 with the GNU Classpath Exception, which is available at | |
| * https://www.gnu.org/software/classpath/license.html. | |
| * | |
| * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 | |
| */ | |
| package devtests.deployment; | |
| import java.io.File; | |
| import java.io.InputStream; | |
| import java.io.PrintStream; | |
| import org.apache.tools.ant.BuildException; | |
| import org.apache.tools.ant.BuildLogger; | |
| import org.apache.tools.ant.DefaultLogger; | |
| import org.apache.tools.ant.Project; | |
| import org.apache.tools.ant.ProjectHelper; | |
| import org.apache.tools.ant.taskdefs.ExecTask; | |
| import org.apache.tools.ant.types.Commandline; | |
| import org.testng.annotations.Configuration; | |
| import org.testng.annotations.Test; | |
| /** | |
| * Very simple example implementation of a Java-based test driver for | |
| * deployment tests. | |
| * | |
| * This implementation relies on the ant-based tests and common files and | |
| * delegates to targets in those ant scripts. Over time this delegation | |
| * could be replaced by Java implementations of the equivalent logic. | |
| * | |
| * @author: tjquinn | |
| */ | |
| public abstract class DeploymentTest { | |
| /** indicates if the test class has been initialized yet */ | |
| private boolean isInited = false; | |
| /** ant project based on the build.xml in the current directory */ | |
| protected Project project; | |
| /** the build.xml file in the current directory */ | |
| protected File buildFile; | |
| /** Our current message output status. Follows Project.MSG_XXX. */ | |
| private int msgOutputLevel = Project.MSG_INFO; | |
| /**Saved values of the streams */ | |
| private PrintStream out; | |
| private PrintStream err; | |
| private InputStream in; | |
| /** | |
| * The Ant logger class. There may be only one logger. It will have | |
| * the right to use the 'out' PrintStream. The class must implements the | |
| * BuildLogger interface. | |
| */ | |
| private String loggerClassname = null; | |
| /** Creates a new instance of DeploymentTest */ | |
| public DeploymentTest() { | |
| init(); | |
| } | |
| /** | |
| *Reports if the class has been initialized or not. | |
| *@return whether the initialized has occurred or not | |
| */ | |
| protected boolean isInited() { | |
| return isInited; | |
| } | |
| /** | |
| *Prepare the callable ant environment for the test. | |
| */ | |
| private void init() { | |
| if (! isInited()) { | |
| err = System.err; | |
| out = System.out; | |
| in = System.in; | |
| /* | |
| *Use the build.xml in the current directory. | |
| */ | |
| buildFile = new File("build.xml"); | |
| /* | |
| *To call into ant, create a new Project and prepare it for use. | |
| */ | |
| project = new Project(); | |
| // msgOutputLevel = Project.MSG_VERBOSE; | |
| project.addBuildListener(createLogger()); | |
| project.setBasedir("."); | |
| project.init(); | |
| /* | |
| *Set up the project to use the build.xml in the current directory. | |
| */ | |
| ProjectHelper helper = ProjectHelper.getProjectHelper(); | |
| helper.parse(project, buildFile); | |
| isInited = true; | |
| } | |
| } | |
| /** | |
| *Assembles the required jar, war, ear files, etc. | |
| */ | |
| protected void assemble() throws BuildException { | |
| project.executeTarget("assemble"); | |
| } | |
| /** | |
| *Deploys the application using asadmin. | |
| */ | |
| protected void deploy() { | |
| project.executeTarget("deploy.asadmin"); | |
| } | |
| /** | |
| *Redeploys the application using asadmin. | |
| *Removes app refs first, then deploys, then creates app refs. | |
| */ | |
| protected void redeploy() { | |
| project.executeTarget("redeploy.asadmin"); | |
| } | |
| /** | |
| *Undeploys the app using asadmin. | |
| */ | |
| protected void undeploy() { | |
| project.executeTarget("undeploy.asadmin"); | |
| } | |
| /** | |
| *Cleans out the build directory. | |
| */ | |
| protected void clean() { | |
| project.executeTarget("clean"); | |
| } | |
| /** | |
| *Constructs an ExecTask instance, linked to the current project, for | |
| *running the client. | |
| *This implementation prepares the exec task so it will run the appclient | |
| *script. | |
| *@return ExecTask initialized for running the appclient script to execute | |
| *the generated and retrieved app client | |
| */ | |
| protected ExecTask prepareRunExecTask() { | |
| /* | |
| This is the ant excerpt imitated by the exec task built by this method: | |
| <exec executable="${APPCLIENT}" resultproperty="result" failonerror="false" output="${build}/${log.id}.output.log"> | |
| <arg line="-client ${archivedir}/${testName}Client.jar"/> | |
| </exec> | |
| */ | |
| ExecTask exec = new ExecTask(); | |
| exec.setProject(project); | |
| String appclientValue = project.getProperty("APPCLIENT"); | |
| exec.setExecutable(appclientValue); | |
| exec.setFailonerror(false); | |
| exec.setTaskName("runclient"); | |
| return exec; | |
| } | |
| /** | |
| *Prepares a command line argument object for use with the appclient | |
| *exec task that uses the default set of arguments: the default | |
| *location and name for the retreived app client jar file. | |
| *@param exec the ExecTask with which the command line should be associated | |
| *@return the argument, associated with the exec task, and set to invoke the gen'd app client | |
| */ | |
| protected Commandline.Argument prepareRunCommandlineArg(ExecTask exec) { | |
| Commandline.Argument arg = exec.createArg(); | |
| String archiveDir = project.getProperty("archivedir"); | |
| String testName = project.getProperty("testName"); | |
| arg.setLine("-client " + archiveDir + "/" + testName + "Client.jar"); | |
| return arg; | |
| } | |
| /** | |
| *Default implementation for executing the app client | |
| */ | |
| protected void runClient() { | |
| ExecTask exec = prepareRunExecTask(); | |
| prepareRunCommandlineArg(exec); | |
| exec.execute(); | |
| } | |
| /** | |
| *Prepares the test environment by cleaning the build directory | |
| *and assembling the required jar files. | |
| */ | |
| @Configuration(beforeTestClass=true) | |
| public void setup() { | |
| clean(); | |
| assemble(); | |
| } | |
| /** | |
| *Cleans up after all tests have run. In this case, undeploys | |
| *the application. | |
| */ | |
| @Configuration(afterTestClass=true) | |
| public void unsetup() { | |
| undeploy(); | |
| } | |
| // The following is inspired by the code in ant itself. | |
| /** | |
| * Creates the default build logger for sending build events to the ant | |
| * log. | |
| * | |
| * @return the logger instance for this build. | |
| */ | |
| private BuildLogger createLogger() { | |
| BuildLogger logger = null; | |
| if (loggerClassname != null) { | |
| try { | |
| Class loggerClass = Class.forName(loggerClassname); | |
| logger = (BuildLogger) (loggerClass.newInstance()); | |
| } catch (ClassCastException e) { | |
| System.err.println("The specified logger class " | |
| + loggerClassname | |
| + " does not implement the BuildLogger interface"); | |
| throw new RuntimeException(); | |
| } catch (Exception e) { | |
| System.err.println("Unable to instantiate specified logger " | |
| + "class " + loggerClassname + " : " | |
| + e.getClass().getName()); | |
| throw new RuntimeException(); | |
| } | |
| } else { | |
| logger = new DefaultLogger(); | |
| } | |
| logger.setMessageOutputLevel(msgOutputLevel); | |
| logger.setOutputPrintStream(out); | |
| logger.setErrorPrintStream(err); | |
| return logger; | |
| } | |
| } |