You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@beehive.apache.org by Jeremiah Johnson <je...@bea.com> on 2005/06/16 15:00:43 UTC

possible WSM tests

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


Re: possible WSM tests

Posted by Daryoush Mehrtash <dm...@gmail.com>.
Jeremiah--

I am in the middle of a few other things I haven't looked at code in here, I 
am just commenting on assumption in your email here. 

We have been able to get around this:

> 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:
 
You don't need to have the web container for most testing. You can see 

AnnotatedWebServiceDeploymentHandlerTest

Once you set up the soapservice in Axis (which can be done pragmatically) 
you can then ask it to generate WSDL by calling the service's generateWSDL. 
There is a slight song and dance to get things set up but it might be easier 
to do this than requiring container. The other thing you might want to look 
at is the FakeAnnotations. The idea is to pragmatically "fake" a JWS. 

Note: Sometime ago, there was a change in the object model interface but the 
junit tests that tested the object model (that used the fake annotations) 
were not updated to reflect the change. I am in the process of doing it now, 
I hope to get this done by tomorrow, you would be able to use this as model 
too. 


Daryoush

On 6/16/05, Eddie ONeil <ek...@gmail.com> wrote:
> 
> 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 <je...@bea.com> 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 <http://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 <http://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<http://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<http://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 <http://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<http://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<http://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<http://wsm.test.webapp.name>
> }"/>
> > + </target>
> > +
> > + <target name="redeploy" description="Redeploy webapp">
> > + <undeploy-webapp contextPath="${wsm.test.webapp.name<http://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<http://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
> >
> >
> 



-- 
Daryoush

Weblog: http://perlustration.blogspot.com/

Re: possible WSM tests

Posted by Eddie ONeil <ek...@gmail.com>.
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 <je...@bea.com> 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
> 
>