blob: 80cc8d7dc6403fd4be21129a78ed62af78926cc6 [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">
]>
<project name="libclasspath2" default="all" basedir=".">
<!--
This set of tests make sure that the handling of <library-directory> is
done properly, that the server-side and client-side class paths are set
correctly, and that the generated client JAR contains what it should.
**** THE APP CLIENT ****
The app client that drives the tests invokes an EJB method to make sure the
server-side class path is correct, then checks for the very same resources
itself on the client side to make sure that its class path and the generated
app client JAR file are both correct.
The appclient's output servers are property definitions that are written to
the client run's log file. The log file is then used by the ant task to
define run-specific properties for checking the results and displaying any
test failures.
**** THE EARS ****
The tests use a single EAR structure. The <library-directory> setting
in application.xml changes to affect the outcome of the tests.
Here is the EAR structure:
topLevel.jar - always included due to backward compatibility with the legacy feature
that includes all top-level JARs in the class path
topLevel.properties
lib/lib.jar - accessible when <library-directory> element is omitted
because the default is lib (there are no tests in this project that explicitly
specify <library-directory>lib</library-directory>)
lib.properties
lib/sub/lib_sub.jar - should not be accessible because JARs in subdirectories of the
library directory should not be accessible
lib_sub.properties
x/x.jar - accessible when lib dir is "x" - The manifest of x.jar specifies Class-Path: xExtra/xExtra.jar xMore/sub
x.properties - accessible (since x.jar contains it and is in the lib directory)
x/xExtra/xExtra.jar - accessible when lib dir is "x" since the manifest of x.jar includes xExtra/xExtra.jar
x_xExtra.properties
xExtra/xExtra.jar - never accessible. Here to make sure that the Class-Path handling
of xExtra/xExtra.jar in /x/x.jar's manifest correctly resolves relative to the x directory
where x.jar resides and not relative to the top-level of the EAR
xExtra.properties
x/xMore - never accessible because even when the lib-dir is x (and
x.jar's manifest Class-Path specifies xMore/sub), only xMore/sub should be added to the
class path, not its parent directory.
x_xMore.properties
x/xMore/sub - accessible when lib-dir is x
x_xMore_sub.properties
xExtra/xExtra.jar - neve accessible because the manifest Class-Path entries in x/x.jar should be relative to
the URI of the JAR itself, and so should resolve to x/xExtra/xExtra.jar, not xExtra/xExtra.jar
xExtra_xExtra.properties
xMore/sub/ - never accessible (again because x/x.jar's Class-Path entry for xMore/sub
should be resolved relative to x/x.jar's location which is /x and should therefore resovle to x/xMore/sub
within the JAR rather than xMore/sub
xMore_sub.properties
y/y.jar - always accessible to the client (appears in the Class-Path of the app client JAR's manifest)
y.properties
There are three different versions of the EAR created, each of which uses a
different <library-directory> setting:
default.ear - omits <library-directory>, so the default of lib should be used
none.ear - specifies <library-directory/> (empty); no library directory should be used
x.ear - specifies <library-directory> as x
Each EAR should give somewhat different results in trying to locate various
properties files and properties within them.
**** SPECIFYING TESTS ****
The app client driver accepts command-line arguments that specify a path for a resource,
a property name expected to be found in the resource, and the value expected for that
property in that resource. The format of each test expression is
{resource-path}:{property-name}={expected-value}
The client- and server-side tests use the same common logic in ResourceHelper
to parse the test expressions, to search for a
resource, to load a Properties object using the resource, and to get the value
of a requested property and comparing it to the expected value.
-->
&commonBuild;
<property name="testName" value="libClassPath2"/>
<property name="archivedir" value="${build}/archives"/>
<property name="x.ear" value="${archivedir}/${testName}x-App.ear"/>
<property name="default.ear" value="${archivedir}/${testName}default-App.ear"/>
<property name="none.ear" value="${archivedir}/${testName}none-App.ear"/>
<property name="ejb.jar.name" value="libdirtest-EJBModule.jar"/>
<property name="ejb.jar" value="${build}/${ejb.jar.name}"/>
<property name="client.jar.name" value="libdirtest-client.jar"/>
<property name="client.jar" value="${build}/client/${client.jar.name}"/>
<!--
The next properties point to the various JARs and directories in the
build area for constructing the EAR.
-->
<property name="x.jar" value="${build}/x/x.jar"/>
<property name="lib.jar" value="${build}/lib/lib.jar"/>
<property name="lib_sub.jar" value="${build}/lib/sub/lib_sub.jar"/>
<property name="xExtra.jar" value="${build}/xExtra/xExtra.jar"/>
<property name="x_xExtra.jar" value="${build}/x/xExtra/xExtra.jar"/>
<property name="x.xMore.dir" value="${build}/x/xMore"/>
<property name="x.xMore.sub.dir" value="${x.xMore.dir}/sub"/>
<property name="xMore.dir" value="${build}/xMore"/>
<property name="xMore.sub.dir" value="${xMore.dir}/sub"/>
<property name="topLevel.jar" value="${build}/topLevel.jar"/>
<property name="z.jar" value="${build}/client/z/z.jar"/>
<property name="y.dir" value="${build}/client/y"/>
<!--
The next groups of properties define the possible positive and negative results
in trying to find a given resource. Some tests will work in some
EARs but not others; some should work in all EARs; some should work
in no EARs.
-->
<!--
The test for the top-level JAR should always be positive, unless
and until we retire that legacy feature.
-->
<property name="test.tl" value="/topLevel.properties:lib.path="/>
<property name="test.tl.pos" value="${test.tl}topLevel"/>
<!--
x.properties is accessible only using x.ear (lib-dir specified as x)
-->
<property name="test.x" value="/x.properties:lib.path="/>
<property name="test.x.pos" value="${test.x}x"/>
<property name="test.x.neg" value="${test.x}NO_RESOURCE"/>
<!--
xExtra.properties is never accessible
-->
<property name="test.xExtra" value="/xExtra.properties:xExtra="/>
<property name="test.xExtra.neg" value="${test.xExtra}NO_RESOURCE"/>
<!--
x_xExtra.properties is accessible only using x.ear
-->
<property name="test.x.xExtra" value="/x_xExtra.properties:x_xExtra="/>
<property name="test.x.xExtra.pos" value="${test.x.xExtra}x_xExtra"/>
<property name="test.x.xExtra.neg" value="${test.x.xExtra}NO_RESOURCE"/>
<!--
lib.properties is accessible only using default.ear
-->
<property name="test.lib" value="/lib.properties:lib.path="/>
<property name="test.lib.pos" value="${test.lib}lib"/>
<property name="test.lib.neg" value="${test.lib}NO_RESOURCE"/>
<!--
lib_sub.properties is never accessible
-->
<property name="test.lib.sub" value="/lib_sub.properties:lib_sub="/>
<property name="test.lib.sub.neg" value="${test.lib.sub}NO_RESOURCE"/>
<!--
x_xMore.properties is never accessible
-->
<property name="test.x.xMore" value="/x_xMore.properties:x_xMore="/>
<property name="test.x.xMore.pos" value="${test.x.xMore}x_xMore"/>
<property name="test.x.xMore.neg" value="${test.x.xMore}NO_RESOURCE"/>
<!--
xMore_sub.properties is never accessible (because the xMore/sub
Class-Path entry in x.jar's manifest must be resolved within the /x
directory where x.jar is found, not from the top-level of the EAR
-->
<property name="test.xMore.sub" value="/xMore_sub.properties:xMore_sub="/>
<property name="test.xMore.sub.neg" value="${test.xMore.sub}NO_RESOURCE"/>
<!--
x_xMore_sub.properties is accessible only using x.ear
-->
<property name="test.x.xMore.sub" value="/x_xMore_sub.properties:x_xMore_sub="/>
<property name="test.x.xMore.sub.pos" value="${test.x.xMore.sub}x_xMore_sub"/>
<property name="test.x.xMore.sub.neg" value="${test.x.xMore.sub}NO_RESOURCE"/>
<!--
z.properties is always accessible to the client (it appears in the Class-Path
in the app client JAR's manifest) but never to the server
-->
<property name="test.z" value="/z.properties:value="/>
<property name="test.z.pos" value="${test.z}z"/>
<property name="test.z.neg" value="${test.z}NO_RESOURCE"/>
<!--
y.properties should always be accessible because the
app client JAR manifest used for the app client JAR shared by all
EARs specifies y/y.properties in its Class-Path.
-->
<property name="test.y" value="/y.properties:value="/>
<property name="test.y.pos" value="${test.y}y"/>
<property name="test.y.neg" value="${test.y}NO_RESOURCE"/>
<!--
The following properties define the expected results for each test run.
-->
<!-- library-directory specified as empty, meaning no lib dir should be used -->
<property name="noLib.expected.results"
value="${test.tl.pos} ${test.x.neg} ${test.xExtra.neg} ${test.lib.neg} ${test.lib.sub.neg} ${test.x.xExtra.neg} ${test.xMore.sub.neg} ${test.x.xMore.neg} ${test.x.xMore.sub.neg} -clientonly ${test.z.pos} -serveronly ${test.z.neg} ${test.y.neg}"/>
<!-- library-directory not specified; default of lib used -->
<property name="defaultLib.expected.results"
value="${test.tl.pos} ${test.x.neg} ${test.xExtra.neg} ${test.lib.pos} ${test.lib.sub.neg} ${test.x.xExtra.neg} ${test.xMore.sub.neg} ${test.x.xMore.neg} ${test.x.xMore.sub.neg} -clientonly ${test.z.pos} -serveronly ${test.z.neg} ${test.y.neg}"/>
<!-- library-directory specified as x; x.jar and its Class-Path entries xExtra/xExtra.jar and xMore/sub used -->
<property name="explicitLibWithDir.expected.results"
value="${test.tl.pos} ${test.x.pos} ${test.xExtra.neg} ${test.lib.neg} ${test.lib.sub.neg} ${test.x.xExtra.pos} ${test.xMore.sub.neg} ${test.x.xMore.neg} -clientonly ${test.z.pos} -serveronly ${test.z.neg} ${test.y.neg}"/>
<target name="prepare" depends="init">
<mkdir dir="${build}"/>
<mkdir dir="${build}/ejb"/>
<mkdir dir="${build}/client"/>
<mkdir dir="${build}/client/y"/>
<mkdir dir="${build}/client/z"/>
<mkdir dir="${archivedir}"/>
<!-- The following directories will hold different files so they will
appear in the EAR in the right places.
-->
<mkdir dir="${build}/x"/> <!-- holds x.jar -->
<mkdir dir="${build}/x/xExtra"/> <!-- holds xExtra.jar -->
<mkdir dir="${build}/x/xMore"/> <!-- holds x_xMore.properties (should not be accessible) -->
<mkdir dir="${build}/x/xMore/sub"/> <!-- holds x_xMore_sub.properties -->
<mkdir dir="${build}/xMore/"/>
<mkdir dir="${build}/xMore/sub"/> <!-- holds xMore_sub.properties (should not be accessible) -->
<mkdir dir="${build}/lib"/> <!-- holds lib.jar -->
<mkdir dir="${build}/lib/sub"/> <!-- holds lib_sub.jar (should not be accessible) -->
<mkdir dir="${build}/xExtra"/> <!-- holds xExtra.jar (should not be accessible) -->
</target>
<target name="compile" depends="prepare">
<javac srcdir="." destdir="${build}" debug="on" failonerror="true">
<classpath refid="gfv3.classpath"/>
</javac>
</target>
<target name="assemble" depends="makeEars"/>
<target name="makeJars" depends="compile">
<!--
Build the various jars used in the different tests.
-->
<!--
The x/x.jar will have the Class-Path setting in its manifest, so
specify the manifest rather than letting ant create it.
-->
<jar destfile="${x.jar}" manifest="x/MANIFEST.MF">
<fileset dir="x" includes="*.properties"/>
</jar>
<jar destfile="${x_xExtra.jar}">
<fileset dir="x/xExtra" includes="*.properties"/>
</jar>
<jar destfile="${xExtra.jar}">
<fileset dir="xExtra" includes="*.properties"/>
</jar>
<jar destfile="${lib.jar}">
<fileset dir="lib" includes="*.properties"/>
</jar>
<jar destfile="${lib_sub.jar}">
<fileset dir="lib/sub" includes="*.properties"/>
</jar>
<jar destfile="${topLevel.jar}">
<fileset dir="topLevel" includes="**/*.properties"/>
</jar>
<jar destfile="${z.jar}">
<fileset dir="client/z" includes="*.properties"/>
</jar>
<!--
Copy the properties files that should occupy directories (as opposed
to JARs) to the build area so they will be included in the EARs.
-->
<copy file="x/xMore/x_xMore.properties" todir="${x.xMore.dir}"/>
<copy file="x/xMore/sub/x_xMore_sub.properties" todir="${x.xMore.sub.dir}"/>
<copy file="xMore/sub/xMore_sub.properties" todir="${xMore.sub.dir}"/>
<copy file="client/y/y.properties" todir="${y.dir}"/>
<!--
Build the EJB and client jars. The ResourceHelper class is used from
the EJB and also from the client, so include it in both submodules.
-->
<fileset id="resourceHelperClass" dir="${build}" includes="**/ResourceHelper*.class"/> <!-- the shared utility class -->
<jar destfile="${ejb.jar}">
<fileset dir="${build}" includes="**/ejb/**/*.class"/>
<fileset refid="resourceHelperClass"/>
</jar>
<jar destfile="${client.jar}" manifest="client/MANIFEST.MF">
<fileset dir="${build}" includes="**/client/**/*.class"/>
<fileset dir="${build}" includes="**/ejb/LookupSBRemote.class"/>
<fileset refid="resourceHelperClass"/>
</jar>
</target>
<target name="makeEars" depends="makeJars">
<!--
All the EARs are populated with exactly the same content EXCEPT for
the application.xml, which differs for each. The earIncludes property
defined next spells out all the JARs and directories included in all
the EARs.
-->
<property name="earIncludes" value="libdirtest-EJBModule.jar,client/libdirtest-client.jar,client/z/z.jar,client/y/y.properties,topLevel.jar,lib/lib.jar,lib/sub/lib_sub.jar,x/x.jar,xExtra/xExtra.jar,x/xExtra/xExtra.jar,x/xMore/**,xMore/**"/>
<ear destfile="${none.ear}" basedir="${build}"
appxml="application-noLibDir.xml" includes="${earIncludes}"/>
<ear destfile="${default.ear}" basedir="${build}"
appxml="application-defaultLibDir.xml" includes="${earIncludes}"/>
<ear destfile="${x.ear}" basedir="${build}"
appxml="application-xLibDir.xml" includes="${earIncludes}"/>
</target>
<target name="deploy.asadmin" depends="prepare">
<antcall target="common.deploy.asadmin">
<param name="arg.list" value="--property compatibility=v2 --retrieve ${archivedir} --name ${module.name} ${ear.file}"/>
<param name="testName" value="${testName}"/>
</antcall>
</target>
<target name="undeploy.asadmin" depends="prepare">
<antcall target="common.undeploy.asadmin">
<param name="arg.list" value="${module.name}"/>
<param name="testName" value="${testName}"/>
</antcall>
</target>
<target name="runclient" depends="init">
<echo message="appclient -client ${archivedir}/${clientName} ${tests}"/>
<exec command="appclient" resultproperty="result" output="${build}/${log.id}.output.log">
<arg value="-client"/>
<arg value="${archivedir}/${clientName}"/>
<arg value="${tests}"/>
</exec>
<antcall target="processResult">
<param name="result" value="${result}"/>
<param name="log" value="${build}/${log.id}.output.log"/>
</antcall>
</target>
<target name="run" depends="run.positive"/>
<target name="run.positive" depends="setHttpPort">
<antcall target="common.run.positive">
<param name="link" value="${contextRoot}/${testName}"/>
<param name="log.id" value="${log.id}"/>
</antcall>
</target>
<target name="private-all" depends="prepare" if="PE">
<antcall target="assemble"/>
<deploy moduleName="libtest-none" earFile="${none.ear}"/>
<run-test tests="${noLib.expected.results}" moduleName="libtest-none" logID="0" testLogTitle="noLibUsed"/>
<undeploy moduleName="libtest-none"/>
<deploy moduleName="libtest-default" earFile="${default.ear}"/>
<run-test tests="${defaultLib.expected.results}" moduleName="libtest-default" logID="1" testLogTitle="defaultLibUsed"/>
<undeploy moduleName="libtest-default"/>
<deploy moduleName="libtest-explicitWithDir" earFile="${x.ear}"/>
<run-test tests="${explicitLibWithDir.expected.results}" moduleName="libtest-explicitWithDir" logID="2" testLogTitle="explicitLibWithDir"/>
<undeploy moduleName="libtest-explicitWithDir"/>
</target>
<macrodef name="deploy">
<attribute name="moduleName"/>
<attribute name="earFile" default="${archivedir}/@{moduleName}.ear"/>
<sequential>
<antcall target="deploy.asadmin">
<param name="module.name" value="@{moduleName}"/>
<param name="ear.file" value="@{earFile}"/>
</antcall>
</sequential>
</macrodef>
<macrodef name="undeploy">
<attribute name="moduleName"/>
<sequential>
<antcall target="undeploy.asadmin">
<param name="module.name" value="@{moduleName}"/>
</antcall>
</sequential>
</macrodef>
<macrodef name="run-test">
<attribute name="tests"/>
<attribute name="logID"/>
<attribute name="moduleName"/>
<attribute name="clientFile" default="${archivedir}/@{moduleName}Client.jar"/>
<attribute name="testLogTitle" default="@{expectedResult}"/>
<sequential>
<antcall target="declare-test">
<param name="description" value="ear/libclasspath2 Testing for @{testLogTitle}"/>
</antcall>
<echo message="${APPCLIENT} -client @{clientFile} @{tests}"/>
<exec executable="${APPCLIENT}" resultproperty="result" output="${build}/@{logID}.output.log" failonerror="false">
<arg value="-client"/>
<arg value="@{clientFile}"/>
<arg line="@{tests}"/>
</exec>
<checkResult logID="@{logID}"/>
</sequential>
</macrodef>
<!--
<macrodef name="run-test-only">
<attribute name="expectedResult"/>
<attribute name="logID"/>
<attribute name="appEarPrefix" default="${archivedir}/${testName}@{expectedResult}-App"/>
<attribute name="moduleName" default="libtest-@{expectedResult}"/>
<attribute name="clientFile" default="${archivedir}/@{moduleName}Client.jar"/>
<sequential>
<echo message="${APPCLIENT} -client @{clientFile} @{expectedResult}"/>
<exec executable="${APPCLIENT}" resultproperty="result" output="${build}/@{logID}.output.log" failonerror="false">
<arg value="-client"/>
<arg value="@{clientFile}"/>
<arg value="@{expectedResult}"/>
</exec>
</sequential>
</macrodef>
<target name="run-only" depends="init">
<run-test-only expectedResult="${expectedResult}" logID="${logID}"/>
</target>
-->
<!--
Convenience target for deploying and running a single test. Hand-edit the
expectedResult property (and the logID if you feel like it) so it is
one of the test apps build by the assemble task.
-->
<!--
<target name="deploy-run" depends="init">
<property name="expectedResult" value="topLevel5"/>
<property name="logID" value="0"/>
-->
<macrodef name="checkResult">
<attribute name="logID"/>
<attribute name="logFile" default="${build}/@{logID}.output.log"/>
<sequential>
<property file="@{logFile}" prefix="x@{logID}"/>
<concat>
<fileset file="@{logFile}"/>
</concat>
<antcall target="processResult">
<param name="result" value="${x@{logID}.result}"/>
</antcall>
</sequential>
</macrodef>
</project>