<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (version 1.7.0_51) on Sun Jun 28 00:29:00 BST 2015 -->
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<title>org.apache.axis2.transport.testkit (Apache Axis2 - Root 1.6.3 API)</title>
<meta name="date" content="2015-06-28">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body>
<script type="text/javascript"><!--
    if (location.href.indexOf('is-external=true') == -1) {
        parent.document.title="org.apache.axis2.transport.testkit (Apache Axis2 - Root 1.6.3 API)";
    }
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a name="navbar_top">
<!--   -->
</a><a href="#skip-navbar_top" title="Skip navigation links"></a><a name="navbar_top_firstrow">
<!--   -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../overview-summary.html">Overview</a></li>
<li class="navBarCell1Rev">Package</li>
<li>Class</li>
<li><a href="package-use.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../org/apache/axis2/transport/tcp/package-summary.html">Prev Package</a></li>
<li><a href="../../../../../org/apache/axis2/transport/testkit/axis2/package-summary.html">Next Package</a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/axis2/transport/testkit/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.html" target="_top">No Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
  allClassesLink = document.getElementById("allclasses_navbar_top");
  if(window==top) {
    allClassesLink.style.display = "block";
  }
  else {
    allClassesLink.style.display = "none";
  }
  //-->
</script>
</div>
<a name="skip-navbar_top">
<!--   -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
<h1 title="Package" class="title">Package&nbsp;org.apache.axis2.transport.testkit</h1>
<div class="docSummary">
<div class="block">Transport test kit base package.</div>
</div>
<p>See:&nbsp;<a href="#package_description">Description</a></p>
</div>
<div class="contentContainer">
<ul class="blockList">
<li class="blockList">
<table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="Interface Summary table, listing interfaces, and an explanation">
<caption><span>Interface Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Interface</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../../../org/apache/axis2/transport/testkit/Adapter.html" title="interface in org.apache.axis2.transport.testkit">Adapter</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../../org/apache/axis2/transport/testkit/MessageExchangeValidator.html" title="interface in org.apache.axis2.transport.testkit">MessageExchangeValidator</a></td>
<td class="colLast">&nbsp;</td>
</tr>
</tbody>
</table>
</li>
<li class="blockList">
<table class="packageSummary" border="0" cellpadding="3" cellspacing="0" summary="Class Summary table, listing classes, and an explanation">
<caption><span>Class Summary</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tbody>
<tr class="altColor">
<td class="colFirst"><a href="../../../../../org/apache/axis2/transport/testkit/AdapterUtils.html" title="class in org.apache.axis2.transport.testkit">AdapterUtils</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../../org/apache/axis2/transport/testkit/ManagedTestSuite.html" title="class in org.apache.axis2.transport.testkit">ManagedTestSuite</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="altColor">
<td class="colFirst"><a href="../../../../../org/apache/axis2/transport/testkit/MessageTestData.html" title="class in org.apache.axis2.transport.testkit">MessageTestData</a></td>
<td class="colLast">&nbsp;</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><a href="../../../../../org/apache/axis2/transport/testkit/TransportTestSuiteBuilder.html" title="class in org.apache.axis2.transport.testkit">TransportTestSuiteBuilder</a></td>
<td class="colLast">&nbsp;</td>
</tr>
</tbody>
</table>
</li>
</ul>
<a name="package_description">
<!--   -->
</a>
<h2 title="Package org.apache.axis2.transport.testkit Description">Package org.apache.axis2.transport.testkit Description</h2>
<div class="block">Transport test kit base package.
 
 <h2>Introduction and high level overview</h2>
 
 In general a good test suite for an Axis2 transport should contain test cases that
 <ul>
   <li>test the transport sender in isolation, i.e. with non Axis2 endpoints;</li>
   <li>test the transport listener in isolation, i.e. with non Axis2 clients;</li>
   <li>test the interoperability between the transport sender and the transport listener.</li>
 </ul>
 In addition, the test suite should cover
 <ul>
   <li>different message exchange patterns (at least one-way and request-response);</li>
   <li>different content types (SOAP 1.1/1.2, POX, SOAP with attachments, MTOM, plain text, binary, etc.).</li>
 </ul>
 Also for some transports it is necessary to execute the tests with different transport
 configurations or with different protocol providers. For example, HTTP transport implementations
 are tested in HTTP 1.0 and HTTP 1.1 mode, and the JMS transport is tested with different
 JMS providers (currently Qpid and ActiveMQ).
 <p>
 The test kit grew out of the idea that is should be possible to apply a common set of tests
 (with different MEPs and content types) to several transports with a minimum of code duplication.
 By providing non Axis2 test clients and endpoints as well as the code that sets up the
 necessary environment as input, the framework should then be able to build a complete test suite
 for the transport.
 <p>
 It is clear that since each transport protocol has its own specificities, a high level of abstraction
 is required to achieve this goal. The following sections give a high level overview of the
 various abstractions that have been introduced in the test kit.
 
 <h3>Integration with JUnit</h3>
 
 One of the fundamental requirements for the test kit is to integrate well with JUnit.
 This requirement ensures that the tests can be executed easily as part of the Maven
 build and that other available tools such as test report generators and test coverage
 analysis tools can be used.
 <p>
 The usual approach to write JUnit tests is to extend <code>junit.framework.TestCase.TestCase</code>
 and to define a set of methods that implement the different test cases. Since the goal of the framework
 is to build test suites in an automated way and the number of test cases can be fairly high, this
 approach would not be feasible. Fortunately JUnit supports another way to create a test suite
 dynamically. Indeed JUnit scans the test code for methods with the following signature:
   
 <pre>public static TestSuite suite()</pre>
 
 A typical transport test will implement this method and use <a href="../../../../../org/apache/axis2/transport/testkit/TransportTestSuiteBuilder.html" title="class in org.apache.axis2.transport.testkit"><code>TransportTestSuiteBuilder</code></a>
 to let the framework create the test suite.
 
 <h3>Test case naming</h3>
 
 One problem that immediately arises when building a test suite dynamically is that each test
 case must have a name (which should be unique) and that this name should be sufficiently meaningful
 so that when it appears in a report a human should be able to get a basic idea of what the test case does.
 The names generated by the test kit have two parts:
 <ul>
   <li>A numeric ID which is the sequence number of the test case in the test suite.</li>
   <li>A set of key-value pairs describing the components that are used in the test case.</li>
 </ul>
 Example:
 
 <pre>0076:test=REST,client=java.net,endpoint=axis</pre>
 
 The algorithm used by the test kit to collect the key-value pairs is described in the documentation of
 the <a href="../../../../../org/apache/axis2/transport/testkit/name/package-summary.html"><code>org.apache.axis2.transport.testkit.name</code></a> package.
 
 <h3>Resource management</h3>
 
 In general setting up the environment in which a given test case is executed may be quite expensive.
 For example, running a test case for the JMS transport requires starting a message broker. Also
 every test case requires at least an Axis2 client and/or server environment to deploy the transport.
 Setting up and tearing down the entire environment for every single test case would be far too
 expensive. On the other hand the environments required by different test cases in a single test suite
 are in general very different from each other so that it would not possible to set up a common
 environment used by all the test cases.
 <p>
 To overcome this difficulty, the test kit has a mechanism that allows a test case to reuse resources
 from the previous test case. This is managed in an entirely transparent way by a lightweight
 dependency injection container (see [TODO: need to regroup this code in a single package]), so that
 the test case doesn't need to care about it.
 <p>
 The mechanism is based on a set of simple concepts: [TODO: this is too detailed for a high level overview and
 should be moved to the Javadoc of the relevant package]
 <ul>
   <li><p>Every test case is linked to a set of <em>resources</em> which are plain Java objects (that are not
       required to extend any particular class or implement any particular interface).
       These objects define the <em>resource set</em> of the test case (which is represented
       internally by a <a href="../../../../../org/apache/axis2/transport/testkit/tests/TestResourceSet.html" title="class in org.apache.axis2.transport.testkit.tests"><code>TestResourceSet</code></a>
       object).</p></li>
   <li><p>The lifecycle of a resource is managed through methods annotated by
       <a href="../../../../../org/apache/axis2/transport/testkit/tests/Setup.html" title="annotation in org.apache.axis2.transport.testkit.tests"><code>Setup</code></a> and <a href="../../../../../org/apache/axis2/transport/testkit/tests/TearDown.html" title="annotation in org.apache.axis2.transport.testkit.tests"><code>TearDown</code></a>.
       These annotations identify the methods to be called when the framework sets up and tears down the resource.
       The arguments of the methods annotated using <a href="../../../../../org/apache/axis2/transport/testkit/tests/Setup.html" title="annotation in org.apache.axis2.transport.testkit.tests"><code>Setup</code></a> also
       define the <em>dependencies</em> of that resource.</p>
       <p>Example:</p>
 <pre>public class MyTestClient {
    \@Setup
    private void setUp(MyProtocolProvider provider) throws Exception {
        provider.connect();
    }
}</pre>
       <p>As shown in this example, dependencies are specified by class (which may be abstract). The actual
       instance that will be injected is selected during <em>resource resolution</em>.</p></li>
   <li><p>Resources are (in general) resolved from the resource set of the test case. For example an instance
       of the <code>MyTestClient</code> class can only be used as a resource for a given test case
       if the resource set of this test case also contains an instance of <code>MyProtocolProvider</code>
       (more precisely an object that is assignment compatible with <code>MyProtocolProvider</code>).</p></li>
   <li><p>A resource will be reused across two test cases if it is part of the resource sets of both
       test cases and all its dependencies (including transitive dependencies) are part of both resource sets.
       The precise meaning of "reusing" in this context is using the same instance without calling the
       tear down and set up methods.</p>
       <p>For example, consider the following test cases and resource sets:</p>
       <table border="1">
         <tr><th>Test case</th><th>Resource set</th></tr>
         <tr><td>T1</td><td><code>c:MyTestClient</code>, <code>p1:MyProtocolProvider</code></td></tr>
         <tr><td>T2</td><td><code>c:MyTestClient</code>, <code>p1:MyProtocolProvider</code>, <code>r:SomeOtherResourceType</code></td></tr>
         <tr><td>T3</td><td><code>c:MyTestClient</code>, <code>p2:MyProtocolProvider</code>, <code>r:SomeOtherResourceType</code></td></tr>
       </table>
       <p>Assuming that <code>SomeOtherResourceType</code> is independent of <code>MyTestClient</code> and
       <code>MyProtocolProvider</code>, the lifecycle of the different resources will be as follows:</p>
       <table border="1">
         <tr><th>Transition</th><th>Lifecycle actions</th></tr>
         <tr><td>&bull; &rarr; T1</td><td>set up <code>p1</code>, set up <code>c</code></td></tr>
         <tr><td>T1 &rarr; T2</td><td>set up <code>r</code></td></tr>
         <tr><td>T2 &rarr; T3</td><td>tear down <code>c</code>, tear down <code>p1</code>, set up <code>p2</code>, set up <code>c</code></td></tr>
         <tr><td>T3 &rarr; &bull;</td><td>tear down <code>c</code>, tear down <code>p2</code>, tear down <code>r</code></td></tr>
       </table>
       <p>Even if T2 and T3 use the same instance <code>c</code> of <code>MyTestClient</code>, this resource
       is not reused (in the sense defined above) since the <code>MyProtocolProvider</code> dependency
       resolves to different instances.</p></li>
 </ul>
 
 <h3>Resources required by a transport test case</h3>
 
 Every transport test case (extending <a href="../../../../../org/apache/axis2/transport/testkit/tests/MessageTestCase.html" title="class in org.apache.axis2.transport.testkit.tests"><code>MessageTestCase</code></a>)
 at least requires three resources:
 <ul>
   <li>A test client (<a href="../../../../../org/apache/axis2/transport/testkit/client/AsyncTestClient.html" title="interface in org.apache.axis2.transport.testkit.client"><code>AsyncTestClient</code></a>
       or <a href="../../../../../org/apache/axis2/transport/testkit/client/RequestResponseTestClient.html" title="interface in org.apache.axis2.transport.testkit.client"><code>RequestResponseTestClient</code></a>) that
       allows the test case to send messages (and receive responses).</li>
   <li>A test endpoint (<a href="../../../../../org/apache/axis2/transport/testkit/endpoint/AsyncEndpoint.html" title="interface in org.apache.axis2.transport.testkit.endpoint"><code>AsyncEndpoint</code></a>
       or <a href="../../../../../org/apache/axis2/transport/testkit/endpoint/InOutEndpoint.html" title="interface in org.apache.axis2.transport.testkit.endpoint"><code>InOutEndpoint</code></a>). In the one-way case,
       this resource is used to receive requests send by the test client. In the request-response
       case its responsibility is to generate well defined responses (typically a simple echo).</li>
   <li>A channel (<a href="../../../../../org/apache/axis2/transport/testkit/channel/AsyncChannel.html" title="interface in org.apache.axis2.transport.testkit.channel"><code>AsyncChannel</code></a> or
       <a href="../../../../../org/apache/axis2/transport/testkit/channel/RequestResponseChannel.html" title="interface in org.apache.axis2.transport.testkit.channel"><code>RequestResponseChannel</code></a>. This resource
       manages everything that it necessary to transport a message from a client to an endpoint.
       Depending on the transport this task can be fairly complex. For example, in the JMS case,
       the channel creates the required JMS destinations and registers them in JNDI, so that
       they can be used by the client and by the endpoint. On the other hand, for HTTP the
       channel implementation is very simple and basically limited to the computation of the
       endpoint reference.</li>
 </ul>
 <p>The test kit provides the following Axis2 based test client and endpoint implementations:</p>
 <table border="1">
   <tr>
     <th></th>
     <th>One-way</th>
     <th>Request-response</th>
   </tr>
   <tr>
     <th>Client</th>
     <td><a href="../../../../../org/apache/axis2/transport/testkit/axis2/client/AxisAsyncTestClient.html" title="class in org.apache.axis2.transport.testkit.axis2.client"><code>AxisAsyncTestClient</code></a></td>
     <td><a href="../../../../../org/apache/axis2/transport/testkit/axis2/client/AxisRequestResponseTestClient.html" title="class in org.apache.axis2.transport.testkit.axis2.client"><code>AxisRequestResponseTestClient</code></a></td>
   </tr>
   <tr>
     <th>Endpoint</th>
     <td><a href="../../../../../org/apache/axis2/transport/testkit/axis2/endpoint/AxisAsyncEndpoint.html" title="class in org.apache.axis2.transport.testkit.axis2.endpoint"><code>AxisAsyncEndpoint</code></a></td>
     <td><a href="../../../../../org/apache/axis2/transport/testkit/axis2/endpoint/AxisEchoEndpoint.html" title="class in org.apache.axis2.transport.testkit.axis2.endpoint"><code>AxisEchoEndpoint</code></a></td>
   </tr>
 </table>
 
 <h3>Message encoders and decoders</h3>
 
 Different clients, endpoints and test cases may have fairly different ways to "naturally" represent
 a message:
 <ul>
   <li>To test the listener of an HTTP transport, an obvious choice is to build a test client
       that relies on standard Java classes such as <a href="http://download.oracle.com/javase/1.5.0/docs/api/java/net/URLConnection.html?is-external=true" title="class or interface in java.net"><code>URLConnection</code></a>. For that
       purpose the most natural way to represent a message is as a byte sequence.</li>
   <li>All Axis2 based test clients and endpoints already have a canonical message
       representation, which is the SOAP infoset retrieved by
       <a href="../../../../../org/apache/axis2/context/MessageContext.html#getEnvelope()"><code>MessageContext.getEnvelope()</code></a>.</li>
   <li>A test case for plain text messages would naturally represent the test message
       as a string.</li>
 </ul>
 Since defining a message representation that would be suitable for all clients, endpoints and test
 cases (and make their implementation simple) is impossible, a different approach has been chosen
 in the framework. Every client, endpoint or test case implementation chooses the Java type that is
 considers as best suited to represent the message. When invoking the test client, a test case
 uses a <a href="../../../../../org/apache/axis2/transport/testkit/message/MessageEncoder.html" title="interface in org.apache.axis2.transport.testkit.message"><code>MessageEncoder</code></a> to transform the message
 from its own representation to the representation used by the test client. In the same way,
 a <a href="../../../../../org/apache/axis2/transport/testkit/message/MessageDecoder.html" title="interface in org.apache.axis2.transport.testkit.message"><code>MessageDecoder</code></a> is used to transform the message
 intercepted by the endpoint (in the one-way case) or the response message received by the test client
 (in the request-response case).
 <p>
 [TODO: currently message encoders and decoders are chosen at compile time and the transformation is
 is invoked indirectly by adapters; this will change in the future so that encoders and decoders are
 selected dynamically at runtime]
 
 <h3>Exclusion rules</h3>
 
 Sometimes it is necessary to exclude particular test cases (or entire groups of test cases) from the
 test suite generated by the test kit. There are various reasons why one would do that:
 <ul>
   <li>A test case fails because of some known issue in the transport. In that case it should be excluded
       until the issue is fixed. This is necessary to distinguish this type of failure from regressions.
       In general the tests checked in to source control should always succeed unless there is a regression.</li>
   <li>Sometimes a particular test case doesn't make sense for a given transport. For example a test
       case that checks that the transport is able to handle large payloads would not be applicable
       to the UDP transport which has a message size limitation.</li>
   <li>The test suite builder generates test cases by computing all possible combinations of MEPs, content types,
       clients, endpoints and environment setups. For some transports this results in a very high number of test
       cases. Since these test cases generally have a high degree of overlap, one can use exclusion rules
       to reduce the number of test cases to a more reasonable value.</li>
 </ul>
 The test kit allows to specify exclusion rules using LDAP filter expressions. It takes advantage of the
 fact that each test case has a set of key-value pairs used to build the test case name. The LDAP filters
 are evaluated against this set.
 For example, <a href="../../../../../org/apache/axis2/transport/testkit/TransportTestSuiteBuilder.html" title="class in org.apache.axis2.transport.testkit"><code>TransportTestSuiteBuilder</code></a> defines the following
 default exclusion rule:
 
 <pre>(&amp;(client=*)(endpoint=*)(!(|(client=axis)(endpoint=axis))))</pre>
 
 This rule excludes all test cases that would use a non Axis2 client and a non Axis2 endpoint.
 
 <h3>Logging</h3>
 
 Transport test cases generally involve several interacting components and some of these components
 may use multithreading. Also experience has shown that some test cases may randomly fail (often with
 a failure probablity highly dependent on the execution platform) because of subtle problems in the
 transport under test or in the tests themselves. All this can make debugging extremely difficult.
 To simplify this task, the test kit collects (or provides the necessary infrastructure to collect)
 a maximum of information during the execution of each test case.
 <p>
 The collected information is written to a set of log files managed by
 <a href="../../../../../org/apache/axis2/transport/testkit/util/LogManager.html" title="class in org.apache.axis2.transport.testkit.util"><code>LogManager</code></a>. An instance is added automatically to
 the resource set of every test case and other resources can acquire a reference through the dependency
 injection mechanism described above. This is the recommended approach. Alternatively, the log manager
 can be used as a singleton through <a href="../../../../../org/apache/axis2/transport/testkit/util/LogManager.html#INSTANCE"><code>LogManager.INSTANCE</code></a>.
 <p>
 Logs files are written to subdirectories of <tt>target/testkit-logs</tt>. The directory structure has
 a two level hierarchy identifying the test class (by its fully qualified name) and the test case
 (by its ID). It should be noted that the test results themselves (in particular the exception in case
 of failure) are still written to the standard JUnit/Surefire logs and that these logs should be
 consulted first. The test kit specific log files are only meant to provide additional information.
 <p>
 Each test case at least produces a <tt>01-debug.log</tt> file with the messages that were logged
 (using JCL) at level DEBUG during the execution of the test case. In addition, depending on the
 components involved in the test, the test kit will produce the following logs (<tt>XX</tt>
 denotes a sequence number which is generated automatically):
 <dl>
   <dt><tt>XX-formatter.log</tt></dt>
   <dt><tt>XX-builder.log</tt></dt>
   <dd><p>These files are produced when Axis2 test clients and endpoints are used.
       <tt>XX-formatter.log</tt> will contain the payload of an incoming message as seen by the
       <a href="../../../../../org/apache/axis2/transport/MessageFormatter.html" title="interface in org.apache.axis2.transport"><code>MessageFormatter</code></a>. <tt>XX-builder.log</tt> on the other
       hand will contain the payload of an outgoing message as produced by the
       <a href="../../../../../org/apache/axis2/builder/Builder.html" title="interface in org.apache.axis2.builder"><code>Builder</code></a>. Note that the number of log files depends on
       serveral factors, such as the MEP, whether the client or endpoint is Axis2 based or not and
       whether the transport chooses to use message builders and formatters or not.</p>
       <p>These files provides extremely valuable information since it is very difficult to get this
       data using other debugging techniques. Note that the files are created by
       <a href="../../../../../org/apache/axis2/transport/testkit/axis2/LogAspect.html" title="class in org.apache.axis2.transport.testkit.axis2"><code>LogAspect</code></a> which relies on Aspect/J to
       intercept calls to message formatters and builders. This will only work if the tests are
       run with the Aspect/J weaver.</p></dd>
   <dt><tt>XX-service-parameters.log</tt></dt>
   <dd><p>If the test case uses an Axis2 based endpoint, this file will contain the parameters
       of the <a href="../../../../../org/apache/axis2/description/AxisService.html" title="class in org.apache.axis2.description"><code>AxisService</code></a> implementing this endpoint.
       This information is useful since the service configuration is in general determined
       by different components involved in the test.</p></dd>
 </dl></div>
</div>
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a name="navbar_bottom">
<!--   -->
</a><a href="#skip-navbar_bottom" title="Skip navigation links"></a><a name="navbar_bottom_firstrow">
<!--   -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../overview-summary.html">Overview</a></li>
<li class="navBarCell1Rev">Package</li>
<li>Class</li>
<li><a href="package-use.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList">
<li><a href="../../../../../org/apache/axis2/transport/tcp/package-summary.html">Prev Package</a></li>
<li><a href="../../../../../org/apache/axis2/transport/testkit/axis2/package-summary.html">Next Package</a></li>
</ul>
<ul class="navList">
<li><a href="../../../../../index.html?org/apache/axis2/transport/testkit/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.html" target="_top">No Frames</a></li>
</ul>
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses-noframe.html">All Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
  allClassesLink = document.getElementById("allclasses_navbar_bottom");
  if(window==top) {
    allClassesLink.style.display = "block";
  }
  else {
    allClassesLink.style.display = "none";
  }
  //-->
</script>
</div>
<a name="skip-navbar_bottom">
<!--   -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
<p class="legalCopy"><small>Copyright &#169; 2004-2015 <a href="http://www.apache.org/">The Apache Software Foundation</a>. All Rights Reserved.</small></p>
</body>
</html>
