Jeremiah-- Yeah -- it'd be great to have request / response tests for WSM. Both the framework and WSDL test cases seem like a great way to get started with this. Definitely the right thing to do. :)
To ease the process of making a patch, a couple of comments: - tests should go in the "org.apache.beehive.wsm.tests" package. In the cases above, something like "org.apache.beehive.wsm.tests.axis" would be good. - for the sake of playing nicely with Ant, how about using a .properties file for defining the server / port information rather than a system property? - is the "do.start.appserver" property used anywhere? Would be great if it was, but if not we probably don't need it. If you want to open a JIRA issue and attach a patch, I can get started integrating this in. Thanks! Eddie On 6/16/05, Jeremiah Johnson <[EMAIL PROTECTED]> wrote: > I have some tests that I wrote to check the WSDL produced after a JWS has > been compiled and deployed. I wrote these tests because I was interested in > checking some pieces of the WSDL based on the annotations in the JSR 181 > spec. In some cases (i.e. namespace issues), they can serve as regression > tests, but in others (i.e. @Oneway) they don't have much value. A major > problem with these tests is that they currently require a Web container. > > I can create a Jira issue and attach my full diff - just wanted to bring up > the type of test to see if you see value in it. Please take a look at the > info below and let me know if you have questions or doubts. > > Since the WSM tests don't currently have any tests (that I know of) that > require a Web container, I modified the build scripts in WSM a little. Here > is an overview of what I did: > > Added some main properties: > <property name="wsm.test.webapp.name" value="wsmWeb"/> > <property name="server.root.url" value="http://localhost:8080"/> > <property name="webapp.waitfor.url" > value="${server.root.url}/${wsm.test.webapp.name}"/> > > Increased the work of build.webapp: > <target name="build.webapp"> > <deploy-wsm webappDir="${webapp.dir}"/> > <build-webapp webappDir="${webapp.dir}"/> > <build-webservices srcdir="${webapp.dir}/WEB-INF/src-ws" > destdir="${webapp.dir}/WEB-INF/classes" > tempdir="${webapp.dir}/WEB-INF/temp" > classpathref="drt.classpath"/> > <copy overwrite="true" todir="${build.dir}/${wsm.test.webapp.name}"> > <fileset dir="${webapp.dir}"> > <exclude name="WEB-INF/src/**"/> > <exclude name="WEB-INF/src-ws/**"/> > <exclude name="WEB-INF/temp/**"/> > </fileset> > </copy> > </target> > > Added the in-container section to drt: > <echo message="** in-container tests starting **"/> > <parallel> > <start-server shmem="false" javaOptions=""/> > <sequential> > <antcall target="ensure.deployed"/> > <junit failureproperty="wsmdrtfailed" printsummary="on" > tempdir="${build.dir}" fork="yes"> > <classpath> > <pathelement location="${build.tests}"/> > <pathelement location="${build.gen-tests}"/> > <path refid="drt.classpath"/> > </classpath> > <sysproperty key="base.url" > value="${server.root.url}/${wsm.test.webapp.name}"/> > <formatter type="plain"/> > <test name="org.apache.beehive.wsm.jsr181.wsdl.WebServiceTargetNamespace" > todir="${drt.logs}"/> > </junit> > <antcall target="undeploy"/> > <echo message="stopping Web container"/> > <stop-server /> > </sequential> > </parallel> > > Here is an example case that I think adds value: > /* > * Copyright 2005 The Apache Software Foundation. > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. > * You may obtain a copy of the License at > * > * http://www.apache.org/licenses/LICENSE-2.0 > * > * Unless required by applicable law or agreed to in writing, software > * distributed under the License is distributed on an "AS IS" BASIS, > * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > * See the License for the specific language governing permissions and > * limitations under the License. > */ > package org.apache.beehive.wsm.jsr181.wsdl; > > import javax.wsdl.Definition; > import javax.wsdl.factory.WSDLFactory; > import javax.wsdl.xml.WSDLReader; > import javax.xml.namespace.QName; > > import junit.framework.TestCase; > > /** > * Unit tests around the WebService targetNamespace attribute. > * <p> > * This test currently requires a running instance of a Web container. The > * root URL of the server is determined by the value of BASE_URL. > * </p> > */ > public class WebServiceTargetNamespace extends TestCase { > > /** > * The root URL of the server to hit for the Web service; defaults to > * http://localhsot:8080/wsmTest but can be overridden by setting the > * base.url system property. > */ > private static final String BASE_URL = > System.getProperty( "base.url", "http://localhost:8080/wsmTest" ); > > /** > * Instance of the WSDL Reader used in the test methods; this is (re)set > * in the set up method. > */ > private WSDLReader reader; > > /** > * Prepare for testing by creating a new reader instance. > */ > public void setUp() { > try { > reader = WSDLFactory.newInstance().newWSDLReader(); > } catch( Exception e ) { > e.printStackTrace(); > fail( "failed to prepare WSDL reader for tests: " + e ); > } > } > > /** > * When the targetNamespace attribute is used but empty, the > * targetNamespace in the WSDL should default to http://{package}; > * in this case it should be http://webservice. > */ > public void testEmpty() throws Exception { > Definition wsdl = reader.readWSDL( null, > BASE_URL + "/webservice/TargetNamespaceEmpty.jws?wsdl" ); > assertEquals( "http://webservice", wsdl.getTargetNamespace() ); > } > > /** > * When the targetNamespace attribute is used but empty, the > * targetNamespace in the WSDL should default to the http://{package}. > * <p> > * If there is no package, then it defaults to http://{classname}; in > * this case, it should be http://TargetNamespaceEmpty. > * </p> > */ > public void testEmptyNoPackage() throws Exception { > Definition wsdl = reader.readWSDL( null, > BASE_URL + "/WebServiceTargetNamespaceEmpty.jws?wsdl" ); > assertEquals( "http://WebServiceTargetNamespaceEmpty", > wsdl.getTargetNamespace() ); > } > > /** > * When the targetNamespace attribute is not used, the targetNamespace in > * the WSDL should default to http://{package}; in this case it should be > * http://webservice. > */ > public void testNotUsed() throws Exception { > Definition wsdl = reader.readWSDL( null, > BASE_URL + "/webservice/TargetNamespaceNotUsed.jws?wsdl" ); > assertEquals( "http://webservice", wsdl.getTargetNamespace() ); > } > > /** > * When the targetNamespace attribute is not used, the targetNamespace in > * the WSDL should default to the package name of the Web service. > * <p> > * If there is no package, then the targetNamespace defaults to > * http://{classname}; in this case it would be > * http://WebServiceTargetNamespaceNotUsed. > * </p> > */ > public void testNotUsedNoPackage() throws Exception { > Definition wsdl = reader.readWSDL( null, > BASE_URL + "/WebServiceTargetNamespaceNotUsed.jws?wsdl" ); > assertEquals( "http://WebServiceTargetNamespaceNotUsed", > wsdl.getTargetNamespace() ); > } > > /** > * When the name attribute is used, the portType should be the name set > * in the attribute; in this case, the targetNamespace should be > * urn:jsr181-webservice. > */ > public void testUsed() throws Exception { > Definition wsdl = reader.readWSDL( null, > BASE_URL + "/webservice/TargetNamespaceUsed.jws?wsdl" ); > assertEquals( "urn:jsr181-webservice", wsdl.getTargetNamespace() ); > } > > } > > Here is the example case that I don't think adds much value: > /* > * Copyright 2005 The Apache Software Foundation. > * > * Licensed under the Apache License, Version 2.0 (the "License"); > * you may not use this file except in compliance with the License. > * You may obtain a copy of the License at > * > * http://www.apache.org/licenses/LICENSE-2.0 > * > * Unless required by applicable law or agreed to in writing, software > * distributed under the License is distributed on an "AS IS" BASIS, > * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > * See the License for the specific language governing permissions and > * limitations under the License. > */ > package org.apache.beehive.wsm.jsr181.wsdl; > > import java.util.List; > import java.util.Map; > import javax.wsdl.Definition; > import javax.wsdl.Operation; > import javax.wsdl.Port; > import javax.wsdl.PortType; > import javax.wsdl.Service; > import javax.wsdl.factory.WSDLFactory; > import javax.wsdl.xml.WSDLReader; > import javax.xml.namespace.QName; > > import junit.framework.TestCase; > > /** > * Unit tests around the Oneway annotation. > */ > public class Oneway extends TestCase { > > /** > * The root URL of the server to hit for the Web service; defaults to > * http://localhsot:8080/wsmTest but can be overridden by setting the > * base.url system property. > */ > private static final String BASE_URL = > System.getProperty( "base.url", "http://localhost:8080/wsmTest" ); > > /** > * Instance of the WSDL Reader used in the test methods; this is (re)set > * in the set up method. > */ > private WSDLReader reader; > > /** > * Prepare for testing by creating a new reader instance. > */ > public void setUp() { > try { > reader = WSDLFactory.newInstance().newWSDLReader(); > } catch( Exception e ) { > e.printStackTrace(); > fail( "failed to prepare WSDL reader for tests: " + e ); > } > } > > /** > * When the Oneway annotation is not used, the operation will have an > * output element even if the return on the actual method signature is > * void. > */ > public void testNotUsed() throws Exception { > Definition wsdl = > reader.readWSDL( null, BASE_URL + "OnewayNotUsed.jws?wsdl" ); > assertOperationOutput( wsdl, true ); > } > > /** > * When the Oneway annotation is used, the operation will not have an > * output element. > */ > public void testUsed() throws Exception { > Definition wsdl = > reader.readWSDL( null, BASE_URL + "OnewayUsed.jws?wsdl" ); > assertOperationOutput( wsdl, false ); > } > > /** > * Assuming one service, port, and operation for the given WSDL, this > * verifies that the operation does or doesn't have an output element. > */ > private static void assertOperationOutput( Definition wsdl, > boolean output ) { > Map services = wsdl.getServices(); > assertNotNull( "services", services ); > assertEquals( 1, services.size() ); > Service service = (Service) services.values().toArray()[0]; > > Map ports = service.getPorts(); > assertNotNull( "ports", ports ); > assertEquals( 1, ports.size() ); > PortType portType = > ((Port) ports.values().toArray()[0]).getBinding().getPortType(); > > List<Operation> operations = portType.getOperations(); > assertNotNull( "operations", operations ); > assertEquals( 1, operations.size() ); > > assertNotNull( "input", operations.get(0).getInput() ); > if( output ) { > assertNotNull( "output expected", operations.get(0).getOutput() ); > } else { > assertNull( "output not expected", operations.get(0).getOutput() > ); > } > } > > } > > Here is the full diff of the wsm build.xml, in case you are interested: > Index: wsm/drt/build.xml > =================================================================== > --- wsm/drt/build.xml (revision 190820) > +++ wsm/drt/build.xml (working copy) > @@ -5,6 +5,10 @@ > <import file="../../beehive-imports.xml"/> > <import file="../../ant/beehive-tools.xml"/> > > + <property name="wsm.test.webapp.name" value="wsmWeb"/> > + <property name="server.root.url" value="http://localhost:8080"/> > + <property name="webapp.waitfor.url" > value="${server.root.url}/${wsm.test.we > bapp.name}"/> > + > <property name="drt.root" location="${basedir}"/> > <property name="build.dir" location="${drt.root}/build"/> > <property name="drt.logs" location="${build.dir}/logs"/> > @@ -43,6 +47,12 @@ > <fileset refid="axis.jars"/> > </path> > > + <condition property="do.start.appserver" value="true"> > + <not> > + <isset property="start.appserver"/> > + </not> > + </condition> > + > <target name="usage"> > <echo message=""/> > <echo message=""/> > @@ -111,11 +121,24 @@ > <target name="build.webapp"> > <deploy-wsm webappDir="${webapp.dir}"/> > <build-webapp webappDir="${webapp.dir}"/> > + <build-webservices srcdir="${webapp.dir}/WEB-INF/src-ws" > + destdir="${webapp.dir}/WEB-INF/classes" > + tempdir="${webapp.dir}/WEB-INF/temp" > + classpathref="drt.classpath"/> > + <copy overwrite="true" todir="${build.dir}/${wsm.test.webapp.name}"> > + <fileset dir="${webapp.dir}"> > + <exclude name="WEB-INF/src/**"/> > + <exclude name="WEB-INF/src-ws/**"/> > + <exclude name="WEB-INF/temp/**"/> > + </fileset> > + </copy> > </target> > > <target name="clean.webapp"> > <clean-webapp webappDir="${webapp.dir}"/> > <delete dir="${webapp.dir}/WEB-INF/lib"/> > + <delete dir="${webapp.dir}/WEB-INF/temp"/> > + <delete dir="${webapp.dir}/WEB-INF/classes"/> > </target> > > <target name="xbean"> > @@ -148,7 +171,8 @@ > > <target name="run.drt"> > <echo message="** junit logfiles written to ${drt.logs} **"/> > - <junit failureproperty="wsmdrtfailed" printsummary="on" > tempdir="${buil > d.dir}" fork="yes"> > + <junit failureproperty="wsmdrtfailed" printsummary="on" > + tempdir="${build.dir}" fork="yes"> > <classpath> > <pathelement location="${build.tests}"/> > <pathelement location="${build.gen-tests}"/> > @@ -162,7 +186,110 @@ > </fileset> > </batchtest> > </junit> > - <fail if="wsmdrtfailed" message="One or more tests in the WSM DRT > faile > d."/> > + > + <echo message="** in-container tests starting **"/> > + <parallel> > + <start-server shmem="false" javaOptions=""/> > + <sequential> > + <antcall target="ensure.deployed"/> > + <junit failureproperty="wsmdrtfailed" printsummary="on" > + tempdir="${build.dir}" fork="yes"> > + <classpath> > + <pathelement location="${build.tests}"/> > + <pathelement location="${build.gen-tests}"/> > + <path refid="drt.classpath"/> > + </classpath> > + <sysproperty key="base.url" > + value="${server.root.url}/${wsm.test.webapp.name}"/> > + <formatter type="plain"/> > +<test name="org.apache.beehive.wsm.jsr181.wsdl.WebServiceTargetNamespace" > + todir="${drt.logs}"/> > + </junit> > + <antcall target="undeploy"/> > + <echo message="stopping Web container"/> > + <stop-server /> > + </sequential> > + </parallel> > + > + <fail if="wsmtemp" message="One or more tests in the WSM DRT > failed."/> > > </target> > > + <!-- ================================================================ --> > + <!-- --> > + <!-- Targets for deploying the webapp on a server --> > + <!-- --> > + <!-- ================================================================ --> > + <target name="deploy" description="Deploy webapp"> > + <deploy-webapp webappDir="${webapp.dir}" > contextPath="${wsm.test.webapp > .name}"/> > + </target> > + > + <target name="undeploy" description="Undeploy webapp"> > + <undeploy-webapp contextPath="${wsm.test.webapp.name}"/> > + </target> > + > + <target name="redeploy" description="Redeploy webapp"> > + <undeploy-webapp contextPath="${wsm.test.webapp.name}"/> > + </target> > + > + <!-- ================================================================ --> > + <!-- --> > + <!-- Targets for starting / stopping a server --> > + <!-- --> > + <!-- ================================================================ --> > + <target name="start" description="Start server"> > + <start-server shmem="false" javaOptions=""/> > + </target> > + > + <target name="start.with.shmem" description="Start server"> > + <start-server shmem="true" javaOptions=""/> > + </target> > + > + <target name="start.with.asserts" description="Start server with asserts > en > abled for org.apache.beehive.netui"> > + <start-server shmem="false" > javaOptions="-ea:org.apache.beehive.netui.. > ."/> > + </target> > + > + <target name="start.with.shmem.asserts" description="Start server with > asse > rts enabled for org.apache.beehive.wsm"> > + <start-server shmem="true" > javaOptions="-ea:org.apache.beehive.wsm..."/ > > > + </target> > + > + <target name="stop" description="Stop server"> > + <stop-server/> > + </target> > + > + <target name="ensure.deployed" description="Deploy Web services webapp"> > + <echo>Ensuring that the webapp ${wsm.test.webapp.name} is deployed > on a > running server at the url ${webapp.waitfor.url}</echo> > + > + <waitfor maxwait="5" maxwaitunit="second" > timeoutproperty="unavailable" > > > + <http url="${webapp.waitfor.url}"/> > + </waitfor> > + <antcall target="do.deploy"/> > + <antcall target="do.redeploy"/> > + <fail if="still.unavailable" message="Couldn't find webapp with path > ${ > webapp.waitfor.url}"/> > + </target> > + > + <target name="do.deploy" if="unavailable"> > + <echo>Webapp is not deployed; deploying</echo> > + > + <antcall target="deploy"/> > + <echo>...deploy complete</echo> > + > + <waitfor maxwait="120" maxwaitunit="second" > timeoutproperty="still.unav > ailable"> > + <http url="${webapp.waitfor.url}"/> > + </waitfor> > + </target> > + > + <target name="do.redeploy" unless="unavailable"> > + <echo>Webapp is deployed; undeploy and redeploy</echo> > + > + <antcall target="undeploy"/> > + <echo>...undeploy complete</echo> > + > + <antcall target="deploy"/> > + <echo>...deploy complete</echo> > + > + <waitfor maxwait="120" maxwaitunit="second" > timeoutproperty="still.unav > ailable"> > + <http url="${webapp.waitfor.url}"/> > + </waitfor> > + </target> > + > </project> > > I wanted this email to be a little longer, but that is all I have to say :) > > - jeremiah > >