blob: 89d42361255c6139bd3642ee1ec36e2964f3f388 [file] [log] [blame]
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE project [
<!--
Copyright (c) 2017, 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
-->
<!ENTITY commonBuild SYSTEM "./../../config/common.xml">
]>
<!--
Note that this currently assumes that the ear/earwithejb and ejb/statelesshello projects have run to build
the ear used for this test.
Also note that this test expects the 'grep' command to be present in the operating environment.
This is fine on Solaris and Linux systems, and should be fine on Windows systems prepared
according to the requirements for building the app server.
-->
<project name="autodeployWithEJB" default="all" basedir=".">
&commonBuild;
<property name="testName" value="withEJB"/>
<property name="dateFormat" value="yyyy-MM-dd-HH:mm:ss.SSS"/>
<property name="archivedir" value="${build}/archives"/>
<!--
The following property defines the exception text that appears in the server.log file if
the bug is present.
-->
<property name="exceptionText" value="EJBClassLoader instance that has already been shutdown"/>
<target name="prepare" depends="init">
<property name="archiveName" value="earwithejb.ear"/>
<property name="all.ear" value="${archivedir}/${archiveName}"/>
<property name="server.log.file" value="${env.S1AS_HOME}/domains/domain1/logs/server.log"/>
<property name="autodeploy.dir" value="${env.S1AS_HOME}/domains/domain1/autodeploy"/>
<property name="result.property.file" value="${build}/result.properties"/>
<mkdir dir="${build}" />
<path id="test.compile.classpath">
<pathelement location="${inst}/lib/j2ee.jar"/>
<pathelement location="${java.home}/lib/tools.jar"/>
<pathelement location="${env.S1AS_HOME}/lib/appserv-rt.jar"/>
<pathelement location="${build}"/>
</path>
</target>
<target name="build" depends="prepare">
<echo>Building ear</echo>
<!--
The earlier tests should have run already, so the app we use for autodeploy testing
should already be in place.
-->
<!--
<ant dir="${testsRoot}/ejb/statelesshello" target="assemble">
<property name="build" value="${testsRoot}/build/ejb/statelesshello"/>
</ant>
<ant dir="${testsRoot}/ear/earwithejb" target="assemble">
<property name="build" value="${testsRoot}/build/ear/earwithejb"/>
</ant>
-->
</target>
<target name="compile" depends="prepare">
<javac srcdir="."
destdir="${build}"
debug="on"
failonerror="true">
<classpath refid="test.compile.classpath"/>
</javac>
</target>
<!--
This target runs a Java class that watches the app server's autodeploy directory and detects
when the app server has deployed or undeployed the app (or has reported a failure to do so) by observing
when the marker files appear in the directory.
The target records its results in a temporary properties file in the ${build} directory.
This provides a simple way (relatively simple, at least) to use the same target more than once
and store different result values in a way that can be retrieved and used from the main
target. (This basically works around the behavior of ant in which a called target's property
settings are NOT propagated out to the calling target. It also avoids the practice of creating
a set of marker files that, by their presence or absence, convey success or failure of a substep.)
-->
<target name="runAutoDeployMonitor">
<javaWithResult
fork="true"
failonerror="false"
jvm="${JAVA}"
classname="autodeploy.test.AutoDeployMonitor"
resultproperty="autodeployResult"
output="${build}/${log.id}.output.log"
>
<jvmarg value="-Dmonitor.debug=true"/>
<classpath>
<path location="${inst}/lib/j2ee.jar"/>
<path location="${build}"/>
</classpath>
<arg line="${arg.list}"/>
</javaWithResult>
<!--
The result property name used in the next task is an argument to the called target.
Note that the echo is a little oddly formatted. The </echo> is on a line by itself and left-justified so
that the output to the file being written will reside on a line by itself. The
left-justification is not really needed but the properties file looks a bit nicer
if you open it in an editor. This is because the next line in the properties file being
written is indented as far as the </echo> is indented here in the build.xml file.
-->
<echo file="${result.property.file}" append="true">${resultPropertyName}=${autodeployResult}
</echo>
</target>
<target name="deploy.autodeploy">
<!--
To monitor auto-deployment or auto-undeployment, we start by getting the current time.
Then we copy the archive file into the autodeploy directory (for auto-deploy) or delete
it (for auto-undeploy). All marker files created by the server during auto-deployment of
the newly-copied archive file will have later timestamps than the timestamp just created.
There could be earlier marker files for the same archive in the directory and the monitor
wants to ignore those, which is why we get the current time and pass it to the monitor.
The monitor will check for marker files for the copied archive file
and whose last modification time are after the current timestamp, returning 0 if the
auto-deployer creates a _deployed or _undeployed file, 1 if it creates a _deploy_failed
or _undeploy_failed file, and -1 if it recognized no marker file.
-->
<tstamp prefix="deploy">
<format property="NOW" pattern="${dateFormat}"/>
</tstamp>
<!--
Trigger the auto-deploy.
-->
<copy file="${archive.file}" todir="${autodeploy.dir}" overwrite="true"/>
<!--
Use the monitor to detect when the auto-deploy has completed.
-->
<echo>Waiting for autodeployment to complete...</echo>
<antcall target="runAutoDeployMonitor">
<param name="arg.list" value="${archiveName} ${autodeploy.dir} ${dateFormat} ${deploy.NOW}"/>
<param name="resultPropertyName" value="${deployResultPropertyName}"/>
<param name="log.id" value="1"/>
</antcall>
</target>
<target name="deploy.autoundeploy">
<!--
This target works very much like the deploy.autodeploy target except that instead of
copying the archive into the autodeploy directory it deletes the previously copied
archive from that directory.
-->
<tstamp prefix="undeploy">
<format property="NOW" pattern="${dateFormat}"/>
</tstamp>
<!--
Trigger auto-undeploy by deleting the file.
-->
<delete quiet="true">
<fileset dir="${autodeploy.dir}" includes="${archiveName}"/>
</delete>
<echo>Waiting for autoundeployment to complete...</echo>
<antcall target="runAutoDeployMonitor">
<param name="arg.list" value="${archiveName} ${autodeploy.dir} ${dateFormat} ${undeploy.NOW}"/>
<param name="resultPropertyName" value="${undeployResultPropertyName}"/>
<param name="log.id" value="2"/>
</antcall>
</target>
<target name="searchForException">
<!--
See if the exception text appears in the server.log file. This step assumes the operating
environment supports the grep command. This should be fine for Solaris and Linux systems
and for Windows systems that support building the product.
The output from the grep is saved into a property (grepOutput),then the property is written
into a file. The file to be written (output.file) is also provided as an argument so this
target can be called from different places and the results stored in different files for
later comparison.
-->
<exec
executable="grep"
resultproperty="grepResult"
outputproperty="grepOutput"
>
<arg value="${exceptionText}"/>
<arg value="${server.log.file}"/>
</exec>
<!--
If grep does not find the error string it displays Result: 1 which looks like a failure. The
next couple of steps prepare and display a message that reassures someone looking at the log
that Result: 1 is not a problem in this context.
-->
<condition property="statusMessage" value="The preceding Result: 1 message is expected; it means grep did not find the error string.">
<equals arg1="${grepResult}" arg2="1"/>
</condition>
<property name="statusMessage" value=""/>
<echo>${statusMessage}</echo>
<echo file="${output.file}">${grepOutput}</echo>
<echo file="${result.property.file}" append="true">${resultPropertyName}=${grepResult}
</echo>
</target>
<target name="checkForRegression" if="fileMatchError">
<echo>${fileMatchError}
The string "${exceptionText}" was found, implying that the bug is present.
</echo>
</target>
<target name="private-all" depends="compile">
<antcall target="build"/>
<antcall target="declare-test">
<param name="description" value="autodeploy/loadertest Test autodeploy and context class loader"/>
</antcall>
<!--
The next task discards any previous temporary file used to gather property settings that
record the results of the autodeploy directory monitoring Java class.
-->
<delete file="${result.property.file}" quiet="true"/>
<!--
Do the auto-deployment.
-->
<antcall target="deploy.autodeploy">
<param name="archive.file" value="${all.ear}"/>
<param name="autodeploy.dir" value="${autodeploy.dir}"/>
<param name="deployResultPropertyName" value="deployResult"/>
</antcall>
<!--
Search the server's log file for occurrences of the exception we're interested in.
We do this now, before undeploying, and capture the output in a file. Then we'll
do the same thing after undeploying, capturing that output to s separate file. We
hope the two output files will be the same, meaning that no new exceptions were
thrown as a result of the undeploy. If the bug has resurfaced, then the second
output file will contain an additional exception as compared to the first output file.
-->
<antcall target="searchForException">
<param name="resultPropertyName" value="firstSearchResult"/>
<param name="output.file" value="${build}/before2nddeploy.log"/>
</antcall>
<!--
Now undeploy the app.
-->
<antcall target="deploy.autoundeploy">
<param name="archive.file" value="${all.ear}"/>
<param name="autodeploy.dir" value="${autodeploy.dir}"/>
<param name="undeployResultPropertyName" value="undeployResult"/>
</antcall>
<!--
Trigger another autodeployment. If the bug is present, this will trigger
an exception message in the server's log file although the autodeployment
will succeed.
-->
<antcall target="deploy.autodeploy">
<param name="archive.file" value="${all.ear}"/>
<param name="autodeploy.dir" value="${autodeploy.dir}"/>
<param name="deployResultPropertyName" value="secondDeployResult"/>
</antcall>
<!--
Search the file again looking for the error message that the bug would trigger.
-->
<antcall target="searchForException">
<param name="resultPropertyName" value="secondSearchResult"/>
<param name="output.file" value="${build}/after2nddeploy.log"/>
</antcall>
<!--
Autoundeploy the app once more just to clean up.
-->
<antcall target="deploy.autoundeploy">
<param name="archive.file" value="${all.ear}"/>
<param name="autodeploy.dir" value="${autodeploy.dir}"/>
<param name="undeployResultPropertyName" value="secondUndeployResult"/>
</antcall>
<!--
Make the result properties of the several substeps accessible now because we need them in
the next several steps. The prefix attribute helps avoid possible collisions with other
property names that might already be present.
-->
<property file="${result.property.file}" prefix="autodeploy"/>
<!--
Compare the two grep output files. They will be the same if the test was successful, and
the fileMatchError property will be set if the grep outputs do NOT match.
-->
<condition property="fileMatchError" value="An exception was recorded in the server.log file that indicates a regression of bug 5003242.">
<not>
<filesmatch file1="${build}/before2nddeploy.log" file2="${build}/after2nddeploy.log"/>
</not>
</condition>
<!--
Decide whether the test was successful or not. Make sure that the deploy and
undeploy results are good and that the grep for the error string of the server.log
file was the same before and after the second autodeployment. We don't really care
if the second undeploy worked or not so we don't check its result property here.
-->
<condition property="result" value="0">
<and>
<equals arg1="${autodeploy.deployResult}" arg2="0"/>
<equals arg1="${autodeploy.undeployResult}" arg2="0"/>
<equals arg1="${autodeploy.secondDeployResult}" arg2="0"/>
<not>
<isset property="fileMatchError"/>
</not>
</and>
</condition>
<antcall target="checkForRegression"/>
<!--
If the property "result" was not set by the "condition" task just above then something
went wrong and we set result to 1 now. Normally checkForRegression will set the value to 0 or 1.
-->
<condition property="result" value="1">
<not>
<isset property="result"/>
</not>
</condition>
<antcall target="processResult">
<param name="result" value="${result}"/>
<param name="log" value="${build}/output.log"/>
</antcall>
</target>
</project>