<?xml version="1.0" encoding="UTF-8"?>

<meta-data>

  <class-meta>
    <name>org.exolab.jmscts.test.message.properties.PropertyTypeTest</name>
    <description>
      This class tests message property types
    </description>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testObjectPropertyTypes</name>
      <description>
        Verifies valid and invalid object property types.
      </description>
      <attribute name="jmscts.requirement" value="properties.objects"/>
    </method-meta>
    <method-meta>
      <name>testPropertyTypes</name>
      <description>
        Verifies the supported primitive property types.
      </description>
      <attribute name="jmscts.requirement" value="properties.types"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.ReceiverCloseTest</name>
    <description>
      This class tests the behaviour of closing a session while a receiver is active.
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="synchronous"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new connection is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>startConnection</name>
      <description>
        Returns if the connection should be started prior to running the test. This implementation always returns <code>false</code> to avoid conflicts with test cases
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testSessionClose</name>
      <description>
        Verifies that the receive timers for a closed session continue to advance, so receives may time out and return a null message while the session is stopped.
      </description>
      <attribute name="jmscts.requirement" value="session.close.receivers"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.DupsAckTest</name>
    <description>
      This class tests the behaviour of consumers on sessions created with the <code>Session.DUPS_OK_ACKNOWLEDGE</code> message acknowledgment mode.<br/>
    </description>
    <attribute name="jmscts.session" value="DUPS_OK_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="MapMessage"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <attribute name="jmscts.durableonly" value="true"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testDupsOKAcknowledgement</name>
      <description>
        Verifies dups ok acknowledgement functionality. Creates a consumer, send n messages, receives them, and closes the consumer. Creates another consumer and verifies that 0-n messages are be received.
      </description>
      <attribute name="jmscts.requirement" value="session.DUPS_OK_ACKNOWLEDGE"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.clientack.SubscriberRedeliveredTest</name>
    <description>
      This class tests the behaviour of the JMSRedelivered flag when multiple topic subscribers subscribe to the same topic, and one of the CLIENT_ACKNOWLEDGE sessions is recovered.
    </description>
    <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
    <attribute name="jmscts.factory" value="XATopicConnectionFactory"/>
    <attribute name="jmscts.message" value="ObjectMessage"/>
    <method-meta>
      <name>checkJMSRedelivered</name>
      <description>
        Verifies that the JMSRedelivered property matches that expected
      </description>
    </method-meta>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>main</name>
      <description>
        The main line used to execute this test
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testJMSRedelivered</name>
      <description>
        Verifies that messages received after <code>TopicSession.recover()</code> have their JMSRedelivered flag set to <code>true</code>, and that the same messages received via another TopicSession have their JMSRedelivered flag set to <code>false</code>.
      </description>
      <attribute name="jmscts.requirement" value="message.redelivered.receive"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.stress.SendReceive0KTest</name>
    <description>
      Performs a stress test using one producer, one consumer and empty messages.
    </description>
    <attribute name="jmscts.session" value="AUTO_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="DUPS_OK_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="all"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation returns <code>null</code>
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>test</name>
      <description>
        Performs a stress test using: <ul> <li>one producer</li> <li>one consumer</li> <li>one connection</li> <li>one destination</li> </ul> The producer and consumer run concurrently.<br/> For <em>CLIENT_ACKNOWLEDGE</em> sessions, each message is acknowledged.
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.BooleanTest</name>
    <description>
      This class tests selectors containing boolean literals.
    </description>
    <attribute name="jmscts.message" value="ObjectMessage"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testEquals1</name>
      <description>
        Verifies that the selector <code>true = true</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals2</name>
      <description>
        Verifies that the selector <code>true = false</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testFalse</name>
      <description>
        Verifies that the selector <code>false</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.boolean"/>
      <attribute name="jmscts.requirement" value="selector.reservedwords.case"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testFalseCase</name>
      <description>
        Verifies that the selector <code>FALSE</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.boolean"/>
      <attribute name="jmscts.requirement" value="selector.reservedwords.case"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testGreaterEquals</name>
      <description>
        Verifies that the selector <code>false &gt;= true</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testGreaterThan</name>
      <description>
        Verifies that the selector <code>false &gt; true</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessEquals</name>
      <description>
        Verifies that the selector <code>false &lt;= true</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessThan</name>
      <description>
        Verifies that the selector <code>false &lt; true</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testNotEquals1</name>
      <description>
        Verifies that the selector <code>false &lt;&gt; true</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotEquals2</name>
      <description>
        Verifies that the selector <code>false &lt;&gt; false</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.boolean"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testTrue</name>
      <description>
        Verifies that the selector <code>true</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.boolean"/>
      <attribute name="jmscts.requirement" value="selector.reservedwords.case"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testTrueCase</name>
      <description>
        Verifies that the selector <code>TrUe</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.boolean"/>
      <attribute name="jmscts.requirement" value="selector.reservedwords.case"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.clientack.ClientAcknowledgeTest</name>
    <description>
      This class tests the behaviour of sessions created with the <code>Session.CLIENT_ACKNOWLEDGE</code> message acknowledgment mode.
    </description>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testClientAcknowledge</name>
      <description>
        Verifies client acknowledgement functionality. For each destination, send n messages, and then receive them. Acknowledge the last message received, recover the session, and verify that no other messages are received.
      </description>
      <attribute name="jmscts.requirement" value="session.CLIENT_ACKNOWLEDGE"/>
      <attribute name="jmscts.requirement" value="session.recover"/>
    </method-meta>
    <method-meta>
      <name>testPartialClientAcknowledge</name>
      <description>
        Verifies client acknowledgement functionality. For each destination, send n messages, and then receive them. Acknowledge the middle message received for each destination, recover the session, and verify that the messages can be received again. The messages received after recovery should have their JMSRedelivered flag set to true.
      </description>
      <attribute name="jmscts.requirement" value="session.CLIENT_ACKNOWLEDGE"/>
      <attribute name="jmscts.requirement" value="session.recover"/>
      <attribute name="jmscts.requirement" value="message.redelivered.receive"/>
    </method-meta>
    <method-meta>
      <name>testRecover</name>
      <description>
        Verifies session recovery behaviour. For each destination, send n messages, and then receive them. Recover the session, and verify that the messages can be received again. The messages received after recovery should have their JMSRedelivered flag set to true.
      </description>
      <attribute name="jmscts.requirement" value="session.recover"/>
      <attribute name="jmscts.requirement" value="message.redelivered.receive"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.ListenerCloseTest</name>
    <description>
      This class tests the behaviour of stopping and closing a connection while a listener is active. NOTE: Temporary destinations cannot be used as a separate connection is required to verify that the test is successful.
    </description>
    <attribute name="jmscts.session" value="all"/>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="NON_PERSISTENT, administered, asynchronous"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, administered, asynchronous"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new connection is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>startConnection</name>
      <description>
        Returns if the connection should be started prior to running the test. This implementation always returns <code>false</code> to avoid conflicts with test cases
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testSessionClose</name>
      <description>
        Verify that running MessageListeners have full access to session if the session is closed.
      </description>
      <attribute name="jmscts.requirement" value="session.close.listeners"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.clientack.CloseTest</name>
    <description>
      This class tests the behaviour of closing sessions created with the <code>Session.CLIENT_ACKNOWLEDGE</code> message acknowledgment mode.
    </description>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="administered-consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testConnectionClose</name>
      <description>
        Verifies that closing a connection does not force an acknowledgement of client-acknowledged sessions.
      </description>
      <attribute name="jmscts.requirement" value="connection.close.session.CLIENT_ACKNOWLEDGE"/>
    </method-meta>
    <method-meta>
      <name>testSessionClose</name>
      <description>
        Verifies that closing a session does not force an acknowledgement of client-acknowledged sessions.
      </description>
      <attribute name="jmscts.requirement" value="session.close.CLIENT_ACKNOWLEDGE"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.properties.PropertyConversionTest</name>
    <description>
      This class tests message property conversion
    </description>
    <method-meta>
      <name>checkDouble</name>
      <description>
        Checks that a double property equals the expected value
      </description>
    </method-meta>
    <method-meta>
      <name>checkFloat</name>
      <description>
        Checks that a float property equals the expected value
      </description>
    </method-meta>
    <method-meta>
      <name>expectConversionException</name>
      <description>
        For each class 'A' listed in classes, converts the range of values associated with 'A' to a String property, and then verifies that the conversion to an instance of the primitive fails
      </description>
    </method-meta>
    <method-meta>
      <name>expectConversionException</name>
      <description>
        For each value in an array, convert them to a string, and attempt conversion using the supplied primitive's message accessor method. The operation is expected to fail.
      </description>
    </method-meta>
    <method-meta>
      <name>expectException</name>
      <description>
        Expect an exception when converting from one primitive type to another
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testBoolean</name>
      <description>
        Verifies boolean property conversion
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testByte</name>
      <description>
        Verifies byte property conversion
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testDouble</name>
      <description>
        Verifies double property conversion
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testFloat</name>
      <description>
        Verifies float property conversion
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testInt</name>
      <description>
        Verifies int property conversion
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testLong</name>
      <description>
        Verifies long property conversion
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testNullToPrimitive</name>
      <description>
        Verifies that attempting to read a null as a primitive type is equivalent to calling the primitive's corresponding valueOf(String) conversion method with a null value.
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion.null"/>
    </method-meta>
    <method-meta>
      <name>testShort</name>
      <description>
        Verifies short property conversion
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringBoolean</name>
      <description>
        Verifies string &lt;-&gt; boolean property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringByte</name>
      <description>
        Verifies string &lt;-&gt; byte property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringDouble</name>
      <description>
        Verifies string &lt;-&gt; double property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringFloat</name>
      <description>
        Verifies string &lt;-&gt; float property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringInt</name>
      <description>
        Verifies string &lt;-&gt; int property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringLong</name>
      <description>
        Verifies string &lt;-&gt; long property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringObject</name>
      <description>
        Verifies string &lt;-&gt; object property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
    <method-meta>
      <name>testStringShort</name>
      <description>
        Verifies string &lt;-&gt; short property conversions
      </description>
      <attribute name="jmscts.requirement" value="properties.conversion"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.NonTransactedTest</name>
    <description>
      This class verifies that methods used only for transacted sessions throw <code>IllegalStateException</code> if invoked
    </description>
    <attribute name="jmscts.session" value="AUTO_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="DUPS_OK_ACKNOWLEDGE"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCommit</name>
      <description>
        Verifies that an IllegalStateException is thrown if Session.commit() is invoked for a non-transacted sesssion
      </description>
      <attribute name="jmscts.requirement" value="session.commit.IllegalStateException"/>
    </method-meta>
    <method-meta>
      <name>testRollback</name>
      <description>
        Verifies that an IllegalStateException is thrown if Session.rollback() is invoked for a non-transacted sesssion
      </description>
      <attribute name="jmscts.requirement" value="session.rollback.IllegalStateException"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.readwrite.ReadWriteTest</name>
    <description>
      This class tests that message properties and message bodies may be read and written on creation of a new message
    </description>
    <method-meta>
      <name>checkBytesStreamReadableOnCreation</name>
      <description>
        Verifies that attempting to read a BytesMessage or StreamMessage on creation <code>MessageNotReadableException</code>, until <code>reset()</code> is invoked, and that subsequent reads throw <code>MessageEOFException</code>
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testBytesReadableOnCreation</name>
      <description>
        Verifies that attempting to read a BytesMessage on creation throws <code>MessageNotReadableException</code>, until <code>BytesMessage.reset()</code> is invoked, and that subsequent reads throw <code>MessageEOFException</code>
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.creation"/>
      <attribute name="jmscts.requirement" value="message.bytes.eof"/>
      <attribute name="jmscts.requirement" value="message.creation"/>
      <attribute name="jmscts.message" value="BytesMessage"/>
    </method-meta>
    <method-meta>
      <name>testReadableOnCreation</name>
      <description>
        Verifies that a message is readable on creation.
      </description>
      <attribute name="jmscts.requirement" value="message.creation"/>
      <attribute name="jmscts.message" value="MapMessage"/>
      <attribute name="jmscts.message" value="Message"/>
      <attribute name="jmscts.message" value="ObjectMessage"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
    <method-meta>
      <name>testStreamReadableOnCreation</name>
      <description>
        Verifies that attempting to read a StreamMessage on creation throws <code>MessageNotReadableException</code>, until <code>StreamMessage.reset()</code> is invoked, and that subsequent reads throw <code>MessageEOFException</code>
      </description>
      <attribute name="jmscts.requirement" value="message.creation"/>
      <attribute name="jmscts.requirement" value="message.stream.creation"/>
      <attribute name="jmscts.requirement" value="message.stream.eof"/>
      <attribute name="jmscts.message" value="StreamMessage"/>
    </method-meta>
    <method-meta>
      <name>testWriteableOnClear</name>
      <description>
        Verifies that a message is writeable after clearing its body.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
    </method-meta>
    <method-meta>
      <name>testWriteableOnCreation</name>
      <description>
        Verifies that a message is writable on creation.
      </description>
      <attribute name="jmscts.requirement" value="message.creation"/>
      <attribute name="jmscts.message" value="all"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.clear.RecoverClearTest</name>
    <description>
      This class tests the behaviour of <code>Message.clearBody()</code> and <code>Message.clearProperties()</code> for CLIENT_ACKNOWLEDGE sessions where the session is recovered.
    </description>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.delivery" value="all"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testRecover</name>
      <description>
        Verifies that clearing the properties and bodies of received messages doesn't affect the messages received after recovering the session
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearProperties"/>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
    </method-meta>
    <method-meta>
      <name>verify</name>
      <description>
        Receive messages, and verify them
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.ReceiverTest</name>
    <description>
      This class tests the behaviour of stopping and closing a connection while a receiver is active.
    </description>
    <attribute name="jmscts.session" value="all"/>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="synchronous"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new connection is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>startConnection</name>
      <description>
        Returns if the connection should be started prior to running the test. This implementation always returns <code>false</code> to avoid conflicts with test cases
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testConnectionClose</name>
      <description>
        Verifies that the receive timers for a closed connection continue to advance, so receives may time out and return a null message as the connection is closed.
      </description>
      <attribute name="jmscts.requirement" value="connection.close.receivers"/>
    </method-meta>
    <method-meta>
      <name>testConnectionRestart</name>
      <description>
        Verifies that the receive timers for a stopped connection continue to advance, so that when the connection is stopped, a waiting receiver can subsequently receive a message when the connection is started again
      </description>
      <attribute name="jmscts.requirement" value="connection.stop.receivers"/>
    </method-meta>
    <method-meta>
      <name>testConnectionStop</name>
      <description>
        Verifies that the receive timers for a stopped connection continue to advance, so receives may time out and return a null message while the connection is stopped.
      </description>
      <attribute name="jmscts.requirement" value="connection.stop.receivers"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.AuthTest</name>
    <description>
      This class tests connection authorisation
    </description>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testInvalidQueueAuth</name>
      <description>
        Verifies that a QueueConnection cannot be created, when using an invalid username and password
      </description>
      <attribute name="jmscts.requirement" value="connection.authentication"/>
      <attribute name="jmscts.factory" value="QueueConnectionFactory"/>
    </method-meta>
    <method-meta>
      <name>testInvalidTopicAuth</name>
      <description>
        Verifies that a TopicConnection cannot be created, when using an invalid username and password
      </description>
      <attribute name="jmscts.requirement" value="connection.authentication"/>
      <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
    </method-meta>
    <method-meta>
      <name>testQueueAuth</name>
      <description>
        Verifies that a QueueConnection can be created, using a valid username and password
      </description>
      <attribute name="jmscts.requirement" value="connection.authentication"/>
      <attribute name="jmscts.factory" value="QueueConnectionFactory"/>
    </method-meta>
    <method-meta>
      <name>testTopicAuth</name>
      <description>
        Verifies that a TopicConnection can be created, using a valid username and password
      </description>
      <attribute name="jmscts.requirement" value="connection.authentication"/>
      <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.topic.DuplicateDurableSubscriberTest</name>
    <description>
      This class tests the behaviour of durable TopicSubscribers<br/>
    </description>
    <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
    <attribute name="jmscts.factory" value="XATopicConnectionFactory"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testDuplicateSubscriber</name>
      <description>
        Verifies that creating a duplicate subscriber in a different session but same connection throws JMSException
      </description>
      <attribute name="jmscts.requirement" value="subscriber.durable.unique"/>
    </method-meta>
    <method-meta>
      <name>testDuplicateSubscriberPerSession</name>
      <description>
        Verifies that creating a duplicate durable subscriber in the same session throws JMSException
      </description>
      <attribute name="jmscts.requirement" value="subscriber.durable.unique"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.stress.SendReceive2Size0KTest</name>
    <description>
      Performs a stress test using one producer, two consumers and empty messages.
    </description>
    <attribute name="jmscts.session" value="AUTO_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="DUPS_OK_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="all"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation returns <code>null</code>
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>test</name>
      <description>
        Performs a stress test using: <ul> <li>one producer</li> <li>two consumers</li> <li>one connection</li> <li>one destination</li> </ul> The producer and consumers run concurrently.<br/> For <em>CLIENT_ACKNOWLEDGE</em> sessions, each message is acknowledged.
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.readwrite.SendReceiveReadWriteTest</name>
    <description>
      This class tests that message properties and message bodies are writeable on send, and readable on receipt
    </description>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testReadOnlyOnReceipt</name>
      <description>
        Verifies that a message's user properties and body are read-only on receipt, and that they may be subsequently cleared.
      </description>
      <attribute name="jmscts.requirement" value="message.receive"/>
    </method-meta>
    <method-meta>
      <name>testWriteableOnSend</name>
      <description>
        Verifies that the same message may be populated and sent more than once.
      </description>
      <attribute name="jmscts.requirement" value="message.send"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.stress.SendReceive50Size0KTest</name>
    <description>
      Performs a stress test using one producer, fifty consumers and empty messages.
    </description>
    <attribute name="jmscts.session" value="AUTO_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="DUPS_OK_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="all"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation returns <code>null</code>
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>test</name>
      <description>
        Performs a stress test using: <ul> <li>one producer</li> <li>fifty consumers</li> <li>one connection</li> <li>one destination</li> </ul> The producer and consumers run concurrently.<br/> For <em>CLIENT_ACKNOWLEDGE</em> sessions, each message is acknowledged.
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.stream.StreamMessageTest</name>
    <description>
      This class tests the <code>StreamMessage</code> message type
    </description>
    <attribute name="jmscts.message" value="StreamMessage"/>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>populateByteArray</name>
      <description>
        Helper to return a byte array of the specified length, populated with an incrementing sequence of values
      </description>
    </method-meta>
    <method-meta>
      <name>read</name>
      <description>
        Read an object of the specified type
      </description>
    </method-meta>
    <method-meta>
      <name>readNull</name>
      <description>
        Attempt to read a <code>null</code> as a particular type
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testConversion</name>
      <description>
        Verifies valid conversions for all types except String (this is handled by testStringConversion()).
      </description>
      <attribute name="jmscts.requirement" value="message.stream.conversion"/>
    </method-meta>
    <method-meta>
      <name>testFullReadBytes</name>
      <description>
        Verifies that readBytes can read an entire byte array, and returns -1 on the subsequent call.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.readBytes"/>
    </method-meta>
    <method-meta>
      <name>testIncrementalReadBytes</name>
      <description>
        Verifies that readBytes can read be invoked incrementally.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.readBytes"/>
    </method-meta>
    <method-meta>
      <name>testInvalidNumericConversion</name>
      <description>
        Verifies invalid string to numeric conversions.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.conversion"/>
    </method-meta>
    <method-meta>
      <name>testInvalidObject</name>
      <description>
        Verifies that an invalid object being written using the writeObject() method throws <code>MessageFormatException</code>
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.writeObject"/>
    </method-meta>
    <method-meta>
      <name>testNull</name>
      <description>
        Verifies null conversions.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.null"/>
    </method-meta>
    <method-meta>
      <name>testPartialReadBytes</name>
      <description>
        Verifies that invoking any read method when a partial byte array has been read throws <code>MessageFormatException</code>.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.readBytes"/>
    </method-meta>
    <method-meta>
      <name>testReadBytesClearBody1</name>
      <description>
        Verifies that invoking readBytes() followed by clearBody() followed by readBytes() returns the expected result, when the first readBytes() call has not completed reading the array field. This verifies that clearBody() correctly clears the state of the message.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.readBytes"/>
    </method-meta>
    <method-meta>
      <name>testReadBytesClearBody2</name>
      <description>
        Verifies that invoking readBytes() followed by clearBody() followed by readObject() returns the expected result, when the readBytes() call has not completed reading the array field. This ensures that clearBody() correctly clears the state of the message.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.readBytes"/>
    </method-meta>
    <method-meta>
      <name>testReadBytesReset1</name>
      <description>
        Verifies that invoking readBytes() followed by reset() followed by readBytes() returns the expected result, when the first readBytes() call has not completed reading the array field. This verifies that reset() correctly resets the state of the message.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.readBytes"/>
    </method-meta>
    <method-meta>
      <name>testReadBytesReset2</name>
      <description>
        Verifies that invoking readBytes() followed by reset() followed by readObject() returns the expected result, when the readBytes() call has not completed reading the array field. This verifies that reset() correctly resets the state of the message.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.readBytes"/>
    </method-meta>
    <method-meta>
      <name>testReadFailure</name>
      <description>
        Verifies that if a read method throws MessageFormatException the current position of the read pointer is not incremented, and that a subsequent read is capable of recovering from the exception by re-reading the data as a different type.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.read"/>
    </method-meta>
    <method-meta>
      <name>testReadWriteBytes</name>
      <description>
        Verifies that readBytes returns that written by the writeBytes methods.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.writeBytes(1)"/>
      <attribute name="jmscts.requirement" value="message.stream.method.writeBytes(2)"/>
    </method-meta>
    <method-meta>
      <name>testStringConversion</name>
      <description>
        Verifies valid string conversions.
      </description>
      <attribute name="jmscts.requirement" value="message.stream.conversion"/>
    </method-meta>
    <method-meta>
      <name>testWriteBytes</name>
      <description>
        Verifies that invoking writeBytes does not modify the source array
      </description>
      <attribute name="jmscts.requirement" value="message.stream.method.writeBytes(1)"/>
      <attribute name="jmscts.requirement" value="message.stream.method.writeBytes(2)"/>
    </method-meta>
    <method-meta>
      <name>testWriteObject</name>
      <description>
        Verifies that writeObject() can handle all supported types
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.writeObject"/>
    </method-meta>
    <method-meta>
      <name>write</name>
      <description>
        Write an object using the appropriate write&lt;Object&gt;() method
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.ClientIdentifierTest</name>
    <description>
      This class verifies that the client identifier can be set, but only on creation of a connection.
    </description>
    <method-meta>
      <name>expectFailure</name>
      <description>
        Expect the setClientID operation to fail
      </description>
    </method-meta>
    <method-meta>
      <name>startConnection</name>
      <description>
        Returns true if the connection should be started prior to running the test. This implementation returns false, as it would affect the behaviour of {@link #testSetOnCreation}
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testDuplicateClientID</name>
      <description>
        Verifies that two connections may not have the same client identifier
      </description>
      <attribute name="jmscts.requirement" value="connection.clientID.duplicate"/>
    </method-meta>
    <method-meta>
      <name>testSetAfterClose</name>
      <description>
        Verifies that the client identifier cannot be set on a closed connection
      </description>
      <attribute name="jmscts.requirement" value="connection.method.setClientID"/>
    </method-meta>
    <method-meta>
      <name>testSetAfterCreateSession</name>
      <description>
        Verifies that the client identifier cannot be set after a session has been created
      </description>
      <attribute name="jmscts.requirement" value="connection.method.setClientID"/>
    </method-meta>
    <method-meta>
      <name>testSetAfterListenerRegistration</name>
      <description>
        Verifies that the client identifier cannot be set after an exception listener has been registered
      </description>
      <attribute name="jmscts.requirement" value="connection.method.setClientID"/>
    </method-meta>
    <method-meta>
      <name>testSetAfterStart</name>
      <description>
        Verifies that the client identifier cannot be set after the connection has been started
      </description>
      <attribute name="jmscts.requirement" value="connection.method.setClientID"/>
    </method-meta>
    <method-meta>
      <name>testSetAfterStop</name>
      <description>
        Verifies that the client identifier cannot be set after the connection has stopped
      </description>
      <attribute name="jmscts.requirement" value="connection.method.setClientID"/>
    </method-meta>
    <method-meta>
      <name>testSetOnCreation</name>
      <description>
        Verifies that the client identifier can be set on a connection, just after it is created, but not subsequently.
      </description>
      <attribute name="jmscts.requirement" value="connection.method.setClientID"/>
      <attribute name="jmscts.requirement" value="connection.clientID.administered"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.copy.MapMessageTest</name>
    <description>
      This class tests that <code>MapMessage</code> copies byte array content
    </description>
    <attribute name="jmscts.message" value="MapMessage"/>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testByteArrayCopy</name>
      <description>
        Verifies that <code>MapMessage.setObject()</code> copies byte arrays
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
    <method-meta>
      <name>testPartialSetBytesCopy</name>
      <description>
        Verifies that <code>MapMessage.setBytes(byte[], int, int)</code> takes a copy of the byte array.
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
    <method-meta>
      <name>testSetBytesCopy</name>
      <description>
        Verifies that <code>MapMessage.setBytes(byte[])</code> takes a copy of the byte array.
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.asf.ConnectionConsumerTest</name>
    <description>
      This class tests the behaviour of <code>ConnectionConsumer</code>s
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>test</name>
      <description>
        Verifies that a <code>ConnectionConsumer</code> can be created
      </description>
      <attribute name="jmscts.requirement" value="asf.connectionconsumer"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.clear.RollbackClearTest</name>
    <description>
      This class tests the behaviour of <code>Message.clearBody()</code> and <code>Message.clearProperties()</code> for transacted sessions where the session is rolled back.
    </description>
    <attribute name="jmscts.session" value="TRANSACTED"/>
    <attribute name="jmscts.delivery" value="all"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testRollback</name>
      <description>
        Verifies that clearing the properties and bodies of received messages doesn't affect the messages received after rolling back the session
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearProperties"/>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
    </method-meta>
    <method-meta>
      <name>verify</name>
      <description>
        Receive messages, and verify them
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.MessageListenerTest</name>
    <description>
      This class tests that MessageListeners are invoked serially.
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="asynchronous"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testSerialInvocation</name>
      <description>
        Verifies that message listeners are invoked serially.
      </description>
      <attribute name="jmscts.requirement" value="session.listener.serialization"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.header.JMSDestinationTest</name>
    <description>
      This class tests the JMSDestination message property
    </description>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testJMSDestination</name>
      <description>
        Verifies that the JMSDestination is assigned when a message is sent, and that the received message has the same JMSDestination value as that sent
      </description>
      <attribute name="jmscts.requirement" value="message.destination"/>
    </method-meta>
    <method-meta>
      <name>testJMSDestinationOnResend</name>
      <description>
        Verifies that the JMSDestination is assigned when a message is resent to a different destination
      </description>
      <attribute name="jmscts.requirement" value="message.destination"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.StopStartTest</name>
    <description>
      This class tests the behaviour of <code>Connection.stop</code> and <code>Connection.start</code>
    </description>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new connection is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>startConnection</name>
      <description>
        Returns if the connection should be started prior to running the test. This implementation always returns <code>false</code> to avoid conflicts with test cases
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testStartForStartedConnection</name>
      <description>
        Verifies that invoking <code>Connection.start()</code> for a started connection has no effect.
      </description>
      <attribute name="jmscts.requirement" value="connection.start.started"/>
    </method-meta>
    <method-meta>
      <name>testStopForStoppedConnection</name>
      <description>
        Verifies that invoking <code>Connection.stop()</code> for a stopped connection has no effect.
      </description>
      <attribute name="jmscts.requirement" value="connection.stop.stopped"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.transacted.CommitTest</name>
    <description>
      This class tests session commit functionality
    </description>
    <attribute name="jmscts.session" value="TRANSACTED"/>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testCommit</name>
      <description>
        Verifies session commit behaviour
      </description>
      <attribute name="jmscts.requirement" value="session.transactions"/>
    </method-meta>
    <method-meta>
      <name>testCommitForClosedEndpoint</name>
      <description>
        Verifies that messages are sent on commit even if their producer has been closed, and that consumed messages are acknowledged even if the consumer that received them has been closed prior to commit
      </description>
      <attribute name="jmscts.requirement" value="session.ack.closedconsumer"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.ConnectionCloseTest</name>
    <description>
      This class tests the behaviour of <code>Connection.close</code>
    </description>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new connection is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCloseForClosedConnection</name>
      <description>
        Verifies that closing a closed connection does not produce an exception.
      </description>
      <attribute name="jmscts.requirement" value="connection.close.closed"/>
    </method-meta>
    <method-meta>
      <name>testExceptionOnClose</name>
      <description>
        Verifies that a IllegalStateException is thrown for any Connection method (except Connection.close()), if the connection has been closed
      </description>
      <attribute name="jmscts.requirement" value="connection.close"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.object.ObjectMessageTest</name>
    <description>
      This class tests the <code>ObjectMessage</code> message type
    </description>
    <attribute name="jmscts.message" value="ObjectMessage"/>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testNull</name>
      <description>
        Verifies that ObjectMessage supports nulls
      </description>
      <attribute name="jmscts.requirement" value="message.object.method.setObject"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.producer.ttl.TopicPublisherTest</name>
    <description>
      This class tests the behaviour of the time-to-live methods and their affect on the JMSExpiration, for <code>TopicPublisher</code>s
    </description>
    <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
    <attribute name="jmscts.factory" value="XATopicConnectionFactory"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testDefaultTTL</name>
      <description>
        Verifies that the default time-to-live for a publisher equals <code>0</code>, and that the JMSExpiration property is set to <code>0</code> on send and receive when the default time-to-live is used.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="producer.ttl.default"/>
      <attribute name="jmscts.message" value="Message"/>
    </method-meta>
    <method-meta>
      <name>testDefaultTTLForAnonTopic</name>
      <description>
        Verifies that the default time-to-live for a publisher constructed with no destination equals <code>0</code>, and that the JMSExpiration property is set to <code>0</code> on send and receive when the default time-to-live is used.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="producer.ttl.default"/>
      <attribute name="jmscts.message" value="BytesMessage"/>
    </method-meta>
    <method-meta>
      <name>testPublishWithTTL</name>
      <description>
        Verifies that the time-to-live set at publication is used when a message is sent, and that the JMSExpiration property on the received message equals that sent.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.message" value="StreamMessage"/>
    </method-meta>
    <method-meta>
      <name>testPublishWithTTLAndAnonTopic</name>
      <description>
        Verifies that the time-to-live set at publication is used when a message is sent, using a TopicPublisher created with no default topic, and that the JMSExpiration property on the received message equals that sent.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
    <method-meta>
      <name>testSetTTL</name>
      <description>
        Verifies that the time-to-live can be set on a publisher, that the value is used when no time-to-live is provided when a message is sent, and that the JMSExpiration property on the received message equals that sent.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="producer.ttl.set"/>
      <attribute name="jmscts.message" value="MapMessage"/>
    </method-meta>
    <method-meta>
      <name>testSetTTLWithAnonTopic</name>
      <description>
        Verifies that the time-to-live can be set on a publisher created with no default topic, that the value is used when no time-to-live is provided when a message is sent, and that the JMSExpiration property on the received message equals that sent.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="producer.ttl.set"/>
      <attribute name="jmscts.message" value="ObjectMessage"/>
    </method-meta>
    <method-meta>
      <name>verifyPublish</name>
      <description>
        Publishes a message using the TopicPublisher.publish(Message) method and verifies that the JMSExpiration property is set correctly on publish, and is the same on receipt
      </description>
    </method-meta>
    <method-meta>
      <name>verifyPublishWithTopic</name>
      <description>
        Publishes a message using the TopicPublisher.publish(Topic, Message) method and verifies that the JMSExpiration property is set correctly
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.transacted.RollbackTest</name>
    <description>
      This class tests session rollback functionality.
    </description>
    <attribute name="jmscts.session" value="TRANSACTED"/>
    <attribute name="jmscts.message" value="MapMessage"/>
    <method-meta>
      <name>checkRedelivered</name>
      <description>
        Helper to compare the JMSRedelivered property of a list of messages against that expected
      </description>
    </method-meta>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testClose</name>
      <description>
        Verifies that calling <code>Session.rollback()</code> for a closed session throws IllegalStateException
      </description>
      <attribute name="jmscts.requirement" value="session.close"/>
    </method-meta>
    <method-meta>
      <name>testRollback</name>
      <description>
        Verifies session rollback behaviour
      </description>
      <attribute name="jmscts.requirement" value="session.rollback"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.stress.Send0KTest</name>
    <description>
      Performs a stress test using one producer and empty messages.
    </description>
    <attribute name="jmscts.session" value="AUTO_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="DUPS_OK_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="all"/>
    <attribute name="jmscts.delivery" value="NON_PERSISTENT, administered"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, administered"/>
    <attribute name="jmscts.delivery" value="NON_PERSISTENT, temporary"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, temporary"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation returns <code>null</code>
      </description>
    </method-meta>
    <method-meta>
      <name>shouldCreateMessage</name>
      <description>
        Determines if messages should be pre-created and populated for the test.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>test</name>
      <description>
        Performs a stress test using: <ul> <li>a single producer</li> <li>a single destination</li> <li>empty messages</li> </ul>
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.copy.MessageCopyTest</name>
    <description>
      This class tests that message properties and message bodies are copied on send and receive.
    </description>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCopyOnSend</name>
      <description>
        Verifies that messages are copied by the provider on send.
      </description>
      <attribute name="jmscts.requirement" value="message.send"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.producer.ttl.QueueSenderTest</name>
    <description>
      This class tests the behaviour of the time-to-live methods and their affect on the JMSExpiration, for <code>QueueSender</code>s
    </description>
    <attribute name="jmscts.factory" value="QueueConnectionFactory"/>
    <attribute name="jmscts.factory" value="XAQueueConnectionFactory"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testDefaultTTL</name>
      <description>
        Verifies that the default time-to-live for a sender equals <code>0</code>, and that the JMSExpiration property is set to <code>0</code> on send and receive when the default time-to-live is used.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="producer.ttl.default"/>
      <attribute name="jmscts.message" value="Message"/>
    </method-meta>
    <method-meta>
      <name>testDefaultTTLForAnonQueue</name>
      <description>
        Verifies that the default time-to-live for a sender constructed with no destination equals <code>0</code>, and that the JMSExpiration property is set to <code>0</code> on send and receive when the default time-to-live is used.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="producer.ttl.default"/>
      <attribute name="jmscts.message" value="BytesMessage"/>
    </method-meta>
    <method-meta>
      <name>testSendWithTTL</name>
      <description>
        Verifies that the time-to-live set at send is used when a message is sent, and that the JMSExpiration property on the received message equals that sent
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.message" value="StreamMessage"/>
    </method-meta>
    <method-meta>
      <name>testSendWithTTLAndAnonQueue</name>
      <description>
        Verifies that the time-to-live set at send is used when a message is sent, using a QueueSender created with no default queue, and that the JMSExpiration property on the received message equals that sent
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
    <method-meta>
      <name>testSetTTL</name>
      <description>
        Verifies that the time-to-live can be set on a sender, that the value is used when no time-to-live is provided when a message is sent, and that the JMSExpiration message property is set correctly on send and receive
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="producer.ttl.set"/>
      <attribute name="jmscts.message" value="MapMessage"/>
    </method-meta>
    <method-meta>
      <name>testSetTTLWithAnonQueue</name>
      <description>
        Verifies that the time-to-live can be set on a sender created with no default queue, that the value is used when no time-to-live is provided when a message is sent, and that the JMSExpiration property on the received message equals that sent
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.send"/>
      <attribute name="jmscts.requirement" value="message.expiration.receive"/>
      <attribute name="jmscts.requirement" value="producer.ttl.set"/>
      <attribute name="jmscts.message" value="ObjectMessage"/>
    </method-meta>
    <method-meta>
      <name>verifySend</name>
      <description>
        Sendes a message using the QueueSender.send(Message) method and verifies that the JMSExpiration property is set correctly on send, and is the same on receipt
      </description>
    </method-meta>
    <method-meta>
      <name>verifySendWithQueue</name>
      <description>
        Sendes a message using the QueueSender.send(Queue, Message) method and verifies that the JMSExpiration property is set correctly
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.CloseTest</name>
    <description>
      This class tests the behaviour of <code>Session.close</code>
    </description>
    <method-meta>
      <name>invokeSessionMethods</name>
      <description>
        Invoke session methods
      </description>
    </method-meta>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new session is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCloseForClosedSession</name>
      <description>
        Verifies that closing a closed session has no effect.
      </description>
      <attribute name="jmscts.requirement" value="session.close.closed"/>
    </method-meta>
    <method-meta>
      <name>testExceptionOnClose</name>
      <description>
        Verifies that IllegalStateException is thrown for any Session method (except Session.close()) when invoking methods on a closed session.
      </description>
      <attribute name="jmscts.requirement" value="session.close"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.transacted.RecoverTest</name>
    <description>
      This class verifies that methods used only for transacted sessions throw <code>IllegalStateException</code> if invoked
    </description>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testRecover</name>
      <description>
        Verifies that an IllegalStateException is thrown if Session.recover() is invoked for a transacted sesssion
      </description>
      <attribute name="jmscts.requirement" value="session.recover.IllegalStateException"/>
      <attribute name="jmscts.session" value="TRANSACTED"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.map.MapMessageTest</name>
    <description>
      This class tests the <code>MapMessage</code> message type.
    </description>
    <attribute name="jmscts.message" value="MapMessage"/>
    <method-meta>
      <name>checkEmpty</name>
      <description>
        Verifies that a getMapNames() returns an empty Enumeration for an empty message
      </description>
    </method-meta>
    <method-meta>
      <name>compare</name>
      <description>
        Compares two objects, failing if they are not the same
      </description>
    </method-meta>
    <method-meta>
      <name>get</name>
      <description>
        Helper to get a message property, invoking the appropriate get() method based on the type of the property
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>getNull</name>
      <description>
        Helper to attempt to convert a null property
      </description>
    </method-meta>
    <method-meta>
      <name>populate</name>
      <description>
        Populates a message with values
      </description>
    </method-meta>
    <method-meta>
      <name>set</name>
      <description>
        Helper to set a message property, invoking the appropriate set() method based on the type of the property
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCase</name>
      <description>
        Verifies that field names are case sensitive NOTE: this is not explicitly mentioned in the specification, but is in keeping with property name requirements
      </description>
      <attribute name="jmscts.requirement" value="message.map.case"/>
    </method-meta>
    <method-meta>
      <name>testConversion</name>
      <description>
        Verifies valid conversions for all types except String (this is handled by testStringConversion()).
      </description>
      <attribute name="jmscts.requirement" value="message.map.conversion"/>
    </method-meta>
    <method-meta>
      <name>testGetMapNames</name>
      <description>
        Verifies that getMapNames() returns a name for each element in the set
      </description>
      <attribute name="jmscts.requirement" value="message.map.method.getMapNames"/>
    </method-meta>
    <method-meta>
      <name>testInvalidConversion</name>
      <description>
        Verifies that attempting to perform invalid invalid conversions throws MessageFormatException.
      </description>
      <attribute name="jmscts.requirement" value="message.map.conversion"/>
    </method-meta>
    <method-meta>
      <name>testInvalidNumericConversion</name>
      <description>
        Verifies that attempting to perform invalid invalid string to numeric conversions throws NumberFormatException
      </description>
      <attribute name="jmscts.requirement" value="message.map.conversion"/>
    </method-meta>
    <method-meta>
      <name>testInvalidObject</name>
      <description>
        Verifies that attempting to set an invalid object using the setObject() method throws MessageFormatException
      </description>
      <attribute name="jmscts.requirement" value="message.map.method.setObject"/>
    </method-meta>
    <method-meta>
      <name>testItemExists</name>
      <description>
        Verifies the behaviour of the itemExists() method
      </description>
      <attribute name="jmscts.requirement" value="message.map.method.itemExists"/>
    </method-meta>
    <method-meta>
      <name>testMap</name>
      <description>
        Verifies that elements populated in a map are identical to those retrieved
      </description>
      <attribute name="jmscts.requirement" value="message.map"/>
    </method-meta>
    <method-meta>
      <name>testNullConversion</name>
      <description>
        Verifies behaviour of conversions from null
      </description>
      <attribute name="jmscts.requirement" value="message.map.null"/>
    </method-meta>
    <method-meta>
      <name>testSetObject</name>
      <description>
        Verifies that setObject() can handle all supported types
      </description>
      <attribute name="jmscts.requirement" value="message.map.method.setObject"/>
    </method-meta>
    <method-meta>
      <name>testStringConversion</name>
      <description>
        Verifies valid string conversions
      </description>
      <attribute name="jmscts.requirement" value="message.map.conversion"/>
    </method-meta>
    <method-meta>
      <name>testUnset</name>
      <description>
        Verifies that getting a MapMessage field for a field name that has not been set is handled as if the field exists with a null value.
      </description>
      <attribute name="jmscts.requirement" value="message.map.unset"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.properties.IdentifierTest</name>
    <description>
      This class tests message property identifiers.
    </description>
    <method-meta>
      <name>checkIdentifiers</name>
      <description>
        Check that a list of identifiers can/can't be used as property names
      </description>
    </method-meta>
    <method-meta>
      <name>expectFailure</name>
      <description>
        Expect the set property methods to fail for an invalid identifier
      </description>
    </method-meta>
    <method-meta>
      <name>expectSuccess</name>
      <description>
        Expect the set property methods to succeed for a valid identifier
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testIdentifierCase</name>
      <description>
        Verifies that property names are case sensitive
      </description>
      <attribute name="jmscts.requirement" value="properties.identifier.case"/>
    </method-meta>
    <method-meta>
      <name>testInvalidIdentifiers</name>
      <description>
        Verifies that invalid identifiers can't be used as property names
      </description>
      <attribute name="jmscts.requirement" value="properties.identifier"/>
    </method-meta>
    <method-meta>
      <name>testJMSXProviderIdentifiers</name>
      <description>
        Tests that JMSX prefixed identifiers set by the provider cannot be set by clients. This should only apply to those identifiers that the provider supports
      </description>
      <attribute name="jmscts.requirement" value="properties.provider"/>
    </method-meta>
    <method-meta>
      <name>testReservedWords</name>
      <description>
        Verifies that using a reserved word as a property name throws an exception.
      </description>
      <attribute name="jmscts.requirement" value="properties.identifier.reserved"/>
    </method-meta>
    <method-meta>
      <name>testValidIdentifiers</name>
      <description>
        Verifies that valid identifiers may be used as property names
      </description>
      <attribute name="jmscts.requirement" value="properties.identifier"/>
    </method-meta>
    <method-meta>
      <name>toLowerCase</name>
      <description>
        Returns a lowercase version of an array of Strings
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.header.JMSReplyToTest</name>
    <description>
      This class tests the JMSReplyTo message property.
    </description>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testReplyTo</name>
      <description>
        Verifies that the reply-to address on a received message can be used to send and subsequently receive a message.
      </description>
      <attribute name="jmscts.requirement" value="message.replyTo"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.AutoAckTest</name>
    <description>
      This class tests the behaviour of consumers on sessions created with the <code>Session.AUTO_ACKNOWLEDGE</code> message acknowledgment mode.
    </description>
    <attribute name="jmscts.session" value="AUTO_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="ObjectMessage"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testAutoAcknowledgement</name>
      <description>
        Verifies auto acknowledgement functionality. Creates a consumer, send n messages, receives them, and closes the consumer. Creates another consumer and verifies that no messages can be received.
      </description>
      <attribute name="jmscts.requirement" value="session.AUTO_ACKNOWLEDGE"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.clear.ClearTest</name>
    <description>
      This class tests the behaviour of <code>Message.clearBody()</code> and <code>Message.clearProperties()</code>
    </description>
    <method-meta>
      <name>checkClearBody</name>
      <description>
        Verifies that <code>Message.clearBody()</code> leaves the message body empty, and doesn't clear the message properties.
      </description>
    </method-meta>
    <method-meta>
      <name>checkClearBodyOnCreation</name>
      <description>
        Verifies that <code>Message.clearBody()</code> can be invoked for a new message.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testBytesClearBody</name>
      <description>
        Verifies that <code>BytesMessage.clearBody()</code> leaves the message body empty, and doesn't clear the message properties.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.requirement" value="message.bytes.method.clearBody"/>
      <attribute name="jmscts.message" value="BytesMessage"/>
    </method-meta>
    <method-meta>
      <name>testBytesClearBodyOnCreation</name>
      <description>
        Verifies that <code>BytesMessage.clearBody()</code> can be invoked for a new message
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.requirement" value="message.bytes.method.clearBody"/>
      <attribute name="jmscts.message" value="BytesMessage"/>
    </method-meta>
    <method-meta>
      <name>testClearBody</name>
      <description>
        Verifies that <code>Message.clearBody()</code> leaves the message body empty, and doesn't clear the message properties.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.message" value="Message"/>
      <attribute name="jmscts.message" value="MapMessage"/>
      <attribute name="jmscts.message" value="ObjectMessage"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
    <method-meta>
      <name>testClearBodyOnCreation</name>
      <description>
        Verifies that <code>Message.clearBody()</code> can be invoked for a new message.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.message" value="Message"/>
      <attribute name="jmscts.message" value="MapMessage"/>
      <attribute name="jmscts.message" value="ObjectMessage"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
    <method-meta>
      <name>testClearProperties</name>
      <description>
        Verifies that <code>Message.clearProperties()</code> leaves the message properties empty, and doesn't clear the message body.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearProperties"/>
    </method-meta>
    <method-meta>
      <name>testClearPropertiesOnCreation</name>
      <description>
        Verifies that <code>Message.clearProperties()</code> can be invoked for a new message.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearProperties"/>
    </method-meta>
    <method-meta>
      <name>testStreamClearBody</name>
      <description>
        Verifies that <code>StreamMessage.clearBody()</code> leaves the message body empty, and doesn't clear the message properties.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.requirement" value="message.stream.method.clearBody"/>
      <attribute name="jmscts.message" value="StreamMessage"/>
    </method-meta>
    <method-meta>
      <name>testStreamClearBodyOnCreation</name>
      <description>
        Verifies that <code>StreamMessage.clearBody()</code> can be invoked for a new message
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.requirement" value="message.stream.method.clearBody"/>
      <attribute name="jmscts.message" value="StreamMessage"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.header.JMSMessageIDTest</name>
    <description>
      This class tests the JMSMessageID message property
    </description>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testJMSMessageID</name>
      <description>
        Verifies that the JMSMessageID is assigned when a message is sent, that the received message has the same JMSMessageID value, as that sent, and that a new JMSMessageID is assigned when the message is resent
      </description>
      <attribute name="jmscts.requirement" value="message.identifier"/>
      <attribute name="jmscts.delivery" value="consumer"/>
    </method-meta>
    <method-meta>
      <name>testJMSMessageIDAssignment</name>
      <description>
        Verifies that the JMSMessageID is assigned each time a message is sent
      </description>
      <attribute name="jmscts.requirement" value="message.identifier"/>
    </method-meta>
    <method-meta>
      <name>testJMSMessageIDPrefix</name>
      <description>
        Verifies that JMSMessageID is prefixed with 'ID:'
      </description>
      <attribute name="jmscts.requirement" value="message.identifier.prefix"/>
      <attribute name="jmscts.delivery" value="all-send"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.header.JMSCorrelationIDTest</name>
    <description>
      This class tests the JMSCorrelationID message property
    </description>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCorrelationID</name>
      <description>
        Verifies that the JMSCorrelationID header property can be set, and that the received message has the same JMSCorrelationID value as that sent
      </description>
      <attribute name="jmscts.requirement" value="message.correlation"/>
    </method-meta>
    <method-meta>
      <name>testCorrelationIDAsBytes</name>
      <description>
        Verifies the behaviour of the JMSCorrelationIDAsBytes methods.
      </description>
      <attribute name="jmscts.requirement" value="message.correlation.bytes"/>
    </method-meta>
    <method-meta>
      <name>testNullCorrelationID</name>
      <description>
        Verifies that a null can be assigned to JMSCorrelationID when: <ul> <li>a message is intially constructed</li> <li>a message is received with a non-null JMSCorrelationID</li> </ul>
      </description>
      <attribute name="jmscts.requirement" value="message.correlation"/>
      <attribute name="jmscts.delivery" value="consumer"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.copy.BytesMessageTest</name>
    <description>
      This class tests that <code>BytesMessage</code> copies content
    </description>
    <attribute name="jmscts.message" value="BytesMessage"/>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testPartialWriteBytesCopy</name>
      <description>
        Verifies that <code>BytesMessage.writeBytes(byte[], int, int)</code> takes a copy of the byte array.
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
    <method-meta>
      <name>testWriteBytesCopy</name>
      <description>
        Verifies that <code>BytesMessage.writeBytes(byte[])</code> takes a copy of the byte array.
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.SendReceiveStopTest</name>
    <description>
      This class tests the behaviour of <code>Connection.stop</code> and <code>Connection.start</code>
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new connection is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>startConnection</name>
      <description>
        Returns if the connection should be started prior to running the test. This implementation always returns <code>false</code> to avoid conflicts with test cases
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testStop</name>
      <description>
        Verifies that a connection doesn't receive any messages after starting a connection, sending messages, and then stopping it.
      </description>
      <attribute name="jmscts.requirement" value="connection.stopped"/>
    </method-meta>
    <method-meta>
      <name>testStoppedOnCreation</name>
      <description>
        Verifies that a connection does not receive any messages on creation.
      </description>
      <attribute name="jmscts.requirement" value="connection.creation"/>
      <attribute name="jmscts.requirement" value="connection.stopped"/>
      <attribute name="jmscts.requirement" value="connection.stopped.send"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.MetaDataTest</name>
    <description>
      This class tests that connections support JMSXGroupID and JMSXGroupSeq properties.
    </description>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testMetaData</name>
      <description>
        Verifies that the connection supports JMSXGroupID and JMSXGroupSeq properties.
      </description>
      <attribute name="jmscts.requirement" value="connection.metadata.properties"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.close.CloseTest</name>
    <description>
      This class tests the behaviour of messages when the associated connection or session is closed.
    </description>
    <attribute name="jmscts.session" value="all"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new session is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCloseConnection</name>
      <description>
        Verifies that all the methods for a message may be invoked for a closed connection, with the exception of <code>Message.acknowledge()</code>, which should throw <code>IllegalStateException</code>.
      </description>
      <attribute name="jmscts.requirement" value="connection.close.message"/>
    </method-meta>
    <method-meta>
      <name>testCloseSession</name>
      <description>
        Verifies that all the methods for a message may be invoked for a closed session, with the exception of <code>Message.acknowledge()</code>, which should throw <code>IllegalStateException</code>.
      </description>
      <attribute name="jmscts.requirement" value="session.close.message"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.bytes.BytesMessageTest</name>
    <description>
      This class tests the <code>BytesMessage</code> message type.
    </description>
    <attribute name="jmscts.message" value="BytesMessage"/>
    <method-meta>
      <name>checkEndOfStream1</name>
      <description>
        Helper to test that readBytes(byte[]) returns -1 to indicate end-of-stream
      </description>
    </method-meta>
    <method-meta>
      <name>checkEndOfStream2</name>
      <description>
        Helper to test that readBytes(byte[], int) returns -1 to indicate end-of-stream
      </description>
    </method-meta>
    <method-meta>
      <name>checkReadBytes1</name>
      <description>
        Helper to invoke readBytes(byte[]) and verify that the result equals that expected
      </description>
    </method-meta>
    <method-meta>
      <name>checkReadBytes2</name>
      <description>
        Helper to invoke readBytes(byte[], int)
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>populateByteArray</name>
      <description>
        Helper to return a byte array of the specified length, populated with an incrementing sequence of values
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testInvalidObject</name>
      <description>
        Verifies that attempting to write an invalid object using the BytesMessage.writeObject() method throws MessageFormatException
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.writeObject"/>
    </method-meta>
    <method-meta>
      <name>testPartialReadBytes1</name>
      <description>
        Verifies that the BytesMessage.readBytes(byte[], int) method can be called multiple times passing a byte array less than the length of the byte stream, and that the result matches that expected.
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.readBytes(2)"/>
    </method-meta>
    <method-meta>
      <name>testPartialReadBytes2</name>
      <description>
        Verifies that the BytesMessage.readBytes(byte[], int) method can be called multiple times passing a length parameter less than the length of the array, and that the result matches that expected.
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.readBytes(2)"/>
    </method-meta>
    <method-meta>
      <name>testReadBytes</name>
      <description>
        Verifies the behaviour of the BytesMessage.readBytes(byte[]) method.
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.readBytes(1)"/>
    </method-meta>
    <method-meta>
      <name>testReadBytesForEmptyStream1</name>
      <description>
        Verifies that the BytesMessage.readBytes(byte[]) method returns -1 to indicate end-of-stream, for an empty message body.
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.readBytes(1)"/>
    </method-meta>
    <method-meta>
      <name>testReadBytesForEmptyStream2</name>
      <description>
        Verifies that the BytesMessage.readBytes(byte[], int) method returns -1 to indicate end-of-stream, for an empty message body.
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.readBytes(2)"/>
    </method-meta>
    <method-meta>
      <name>testReadBytesIndexException</name>
      <description>
        Verifies that the BytesMessage.readBytes(byte[], int) method throws IndexOutOfBoundsException for invalid length parameters
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.readBytes(2)"/>
    </method-meta>
    <method-meta>
      <name>testReadFailure</name>
      <description>
        Verifies that if a read method throws MessageFormatException or NumberFormatException, the current position of the read pointer is not be incremented, and that a subsequent read is capable of recovering from the exception by re-reading the data as a different type.<br/> NOTE: With the exception of the readUTF() method, it is difficult to conceive test cases for read methods. <ul> <li> A provider that implements BytesMessage using a DataInputStream or equivalent, is likely to only throw MessageFormatException for the readUTF() method.<br/> The other likely exceptions are MessageEOFException for stream overruns, and JMSException for any other error. </li> <li> As BytesMessage does not support conversion, NumberFormatException is unlikely to be thrown. </li> </ul>
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.read"/>
    </method-meta>
    <method-meta>
      <name>testWriteObject</name>
      <description>
        Verfies that all objectified primitives can be written using the BytesMessage.writeObject() method
      </description>
      <attribute name="jmscts.requirement" value="message.bytes.method.writeObject"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.connection.ListenerTest</name>
    <description>
      This class tests the behaviour of stopping and closing a connection while a listener is active. NOTE: Temporary destinations cannot be used as a separate connection is required to verify that the test is successful.
    </description>
    <attribute name="jmscts.session" value="all"/>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="NON_PERSISTENT, administered, asynchronous"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, administered, asynchronous"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>runTest</name>
      <description>
        Run the test
      </description>
    </method-meta>
    <method-meta>
      <name>share</name>
      <description>
        Returns if this test can share resources with other test cases. This implementation always returns <code>false</code>, to ensure that a new connection is created for each test.
      </description>
    </method-meta>
    <method-meta>
      <name>startConnection</name>
      <description>
        Returns if the connection should be started prior to running the test. This implementation always returns <code>false</code> to avoid conflicts with test cases
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testConnectionClose</name>
      <description>
        Verifies that running MessageListeners have full access to connection if the connection is closed - the close invocation must wait until they complete.
      </description>
      <attribute name="jmscts.requirement" value="connection.close.listeners"/>
    </method-meta>
    <method-meta>
      <name>testConnectionStop</name>
      <description>
        Verifies that running MessageListeners have full access to the connection, if the connection is stopped.
      </description>
      <attribute name="jmscts.requirement" value="connection.stop.listeners"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.properties.PropertyTest</name>
    <description>
      This class tests that message properties set before a message is sent are identical to those received.
    </description>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testPropertyIntegrity</name>
      <description>
        Verifies that user properties are not modified when a message is sent and subsequently received.
      </description>
      <attribute name="jmscts.requirement" value="properties.integrity"/>
      <attribute name="jmscts.requirement" value="properties.method.getPropertyNames"/>
    </method-meta>
    <method-meta>
      <name>testPropertyNames</name>
      <description>
        Verifies that JMS standard header fields are not returned by getPropertyNames().
      </description>
      <attribute name="jmscts.requirement" value="properties.method.getPropertyNames"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.JMSTimestampTest</name>
    <description>
      This class tests selectors containing <code>JMSTimestamp</code>
    </description>
    <attribute name="jmscts.message" value="StreamMessage"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testInvalid1</name>
      <description>
        Verifies that the selector <code>JMSTimestamp &gt;= '0'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.datetime"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid2</name>
      <description>
        Verifies that the selector <code>'0' &lt;= JMSTimestamp</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.datetime"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid3</name>
      <description>
        Verifies that the selector <code>JMSTimestamp = '2001/1/1 0:0'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.datetime"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testJMSTimestamp1</name>
      <description>
        Verifies that the selector <code>JMSTimestamp &gt;= 0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.datetime"/>
      <attribute name="jmscts.requirement" value="selector.identifier.header"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testJMSTimestamp2</name>
      <description>
        Verifies that the selector <code>JMSTimestamp &gt;= {time}</code> selects all messages, where {time} is a literal value derived from <code>System.currentTimeMillis()</code>
      </description>
      <attribute name="jmscts.requirement" value="selector.datetime"/>
      <attribute name="jmscts.requirement" value="selector.identifier.header"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testJMSTimestamp3</name>
      <description>
        Verifies that the selector <code>JMSTimestamp &lt; {time}</code> selects no messages, where {time} is a literal value derived from <code>System.currentTimeMillis()</code>
      </description>
      <attribute name="jmscts.requirement" value="selector.datetime"/>
      <attribute name="jmscts.requirement" value="selector.identifier.header"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.JMSDeliveryModeTest</name>
    <description>
      This class tests selectors containing <code>JMSDeliveryMode</code>
    </description>
    <attribute name="jmscts.message" value="Message"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testInvalid1</name>
      <description>
        Verifies that the selector <code>JMSDeliveryMode = {non-persistent} or JMSDeliveryMode = {persistent}</code> throws InvalidSelectorException, where {non-persistent} and {persistent} are the values of <code>DeliveryMode.NON_PERSISTENT</code> and <code>DeliveryMode.PERSISTENT</code> respectively
      </description>
      <attribute name="jmscts.requirement" value="selector.JMSDeliveryMode"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid2</name>
      <description>
        Verifies that the selector <code>JMSDeliveryMode = 'non_persistent'</code> throws InvalidSelectorException.
      </description>
      <attribute name="jmscts.requirement" value="selector.JMSDeliveryMode"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testJMSDeliveryMode</name>
      <description>
        Verifies that messages can be selected on JMSDeliveryMode, using the selector <code>JMSDeliveryMode = 'PERSISTENT' or JMSDeliveryMode = 'NON_PERSISTENT'</code>. This should select all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.JMSDeliveryMode"/>
      <attribute name="jmscts.requirement" value="selector.identifier.header"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.AndOperatorTest</name>
    <description>
      This class tests selectors containing the AND operator.
    </description>
    <attribute name="jmscts.message" value="Message"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testAnd1</name>
      <description>
        Verifies that the selector <code>true and true</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testAnd2</name>
      <description>
        Verifies that the selector <code>true and false</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testAnd3</name>
      <description>
        Verifies that the selector <code>false and true</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testAnd4</name>
      <description>
        Verifies that the selector <code>false and false</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testAndCase</name>
      <description>
        Verifies that the selector <code>true AND true</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.reservedwords.case"/>
    </method-meta>
    <method-meta>
      <name>testInvalidAnd1</name>
      <description>
        Verifies that the selector <code>and</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalidAnd2</name>
      <description>
        Verifies that the selector <code>true and</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalidAnd3</name>
      <description>
        Verifies that the selector <code>false and</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty1</name>
      <description>
        Verifies that the selector <code>true and dummy</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty2</name>
      <description>
        Verifies that the selector <code>false and dummy</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty3</name>
      <description>
        Verifies that the selector <code>dummy and true</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty4</name>
      <description>
        Verifies that the selector <code>dummy and false</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty5</name>
      <description>
        Verifies that the selector <code>dummy and dummy</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.and"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.clientack.RepublishTest</name>
    <description>
      This class tests the behaviour of republishing a received message, and then acknowledging it.
    </description>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="StreamMessage"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, administered, synchronous"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, administered, asynchronous"/>
    <attribute name="jmscts.durableonly" value="true"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testRepublish</name>
      <description>
        Verify the behaviour of republishing a received message, and then acknowledging it.
      </description>
      <attribute name="jmscts.requirement" value="session.CLIENT_ACKNOWLEDGE"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.FloatTest</name>
    <description>
      This class tests selectors containing floating point literals and objects.
    </description>
    <attribute name="jmscts.message" value="MapMessage"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testDivisionByZero</name>
      <description>
        Verifies that the selector <code>10 / zero = 10 / zero</code> selects all messages, when the double property 'zero' is set, with value <code>0.0</code>
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testDoubleNaN1</name>
      <description>
        Verifies that the selector <code>doubleNaN = doubleNaN</code> selects no messages, when the double property 'doubleNaN' is set, with value <code>Double.NaN</code> (as NaN != NaN)
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testDoubleNaN2</name>
      <description>
        Verifies that the selector <code>doubleNaN &lt;&gt; doubleNaN</code> selects all messages, when the double property 'doubleNaN' is set, with value <code>Double.NaN</code>
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals1</name>
      <description>
        Verifies that the selector <code>0.0 = 0.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals2</name>
      <description>
        Verifies that the selector <code>0.0 = 1.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals3</name>
      <description>
        Verifies that the selector <code>0.2 = 0.2</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals4</name>
      <description>
        Verifies that the selector <code>0.2 = 0.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals5</name>
      <description>
        Verifies that the selector <code>92d = 92</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals6</name>
      <description>
        Verifies that the selector <code>93f = 93</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEqualsProperty</name>
      <description>
        Verifies that the selector <code>rate = 0.2</code> selects all messages, when the double property 'rate' is set, with value <code>0.2</code>
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testFloatNaN1</name>
      <description>
        Verifies that the selector <code>floatNaN = floatNaN</code> selects no messages, when the float property 'floatNaN' is set, with value <code>Float.NaN</code> (as NaN != NaN)
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testFloatNaN2</name>
      <description>
        Verifies that the selector <code>floatNaN &lt;&gt; floatNaN</code> selects all messages, when the float property 'floatNaN' is set, with value <code>Float.NaN</code>
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testGreaterEquals1</name>
      <description>
        Verifies that the selector <code>2.0 &gt;= 1.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testGreaterEquals2</name>
      <description>
        Verifies that the selector <code>1.0 &gt;= 2.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testGreaterThan1</name>
      <description>
        Verifies that the selector <code>2.0 &gt; 1.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testGreaterThan2</name>
      <description>
        Verifies that the selector <code>1.0 &gt; 2.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testInvalid1</name>
      <description>
        Verifies that the selector <code>1.0</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid2</name>
      <description>
        Verifies that the selector <code>-1.0</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid3</name>
      <description>
        Verifies that the selector <code>2.0 &lt; '3.0'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid4</name>
      <description>
        Verifies that the selector <code>1.0 &lt;&gt; false</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid5</name>
      <description>
        Verifies that the selector <code>1a.0 = 1a.0</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessEquals1</name>
      <description>
        Verifies that the selector <code>1.0 &lt;= 2.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testLessEquals2</name>
      <description>
        Verifies that the selector <code>2.0 &lt;= 1.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testLessThan1</name>
      <description>
        Verifies that the selector <code>1.0 &lt; 2.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testLessThan2</name>
      <description>
        Verifies that the selector <code>2.0 &lt; 1.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotEquals1</name>
      <description>
        Verifies that the selector <code>1.0 &lt;&gt; 2.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotEquals2</name>
      <description>
        Verifies that the selector <code>1.0 &lt;&gt; 1.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotEquals3</name>
      <description>
        Verifies that the selector <code>1.0 &lt;&gt; 1.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotEqualsProperty</name>
      <description>
        Verifies that the selector <code>rate &lt;&gt; 0.2</code> selects no messages, when the double property 'rate' is set, with value <code>0.2</code>
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNumericRange</name>
      <description>
        Verifies that selectors can have approximate numeric literals in the range <code>Double.MIN_VALUE..Double.MAX_VALUE</code>, using the selector <code>{min-value}={min-value} and {max-value} = {max-value}</code> where {min-value} and {max-value} are the values of Double.MIN_VALUE and Double.MAX_VALUE respectively. This should select all messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testUnaryMinus1</name>
      <description>
        Verifies that the selector <code>-1.0 = -1.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testUnaryMinus2</name>
      <description>
        Verifies that the selector <code>-1.0 = 1.0</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testUnaryMinus3</name>
      <description>
        Verifies that the selector <code>--1.0 = 1.0</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.approxnumeric"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty1</name>
      <description>
        Verifies that the selector <code>dummy + 10.0 = 10.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty2</name>
      <description>
        Verifies that the selector <code>dummy - 10.0 = -10.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty3</name>
      <description>
        Verifies that the selector <code>10.0 + dummy = 10.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty4</name>
      <description>
        Verifies that the selector <code>10.0 - dummy = 0.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty5</name>
      <description>
        Verifies that the selector <code>dummy * 10.0 = 0.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty6</name>
      <description>
        Verifies that the selector <code>10.0 * dummy = 0.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty7</name>
      <description>
        Verifies that the selector <code>dummy / 10.0 = 0.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty8</name>
      <description>
        Verifies that the selector <code>10.0 / dummy = 0.0</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.copy.ObjectMessageTest</name>
    <description>
      This class tests that <code>ObjectMessage</code> copies content
    </description>
    <attribute name="jmscts.message" value="ObjectMessage"/>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testByteArrayCopy</name>
      <description>
        Verifies that <code>ObjectMessage.setObject()</code> copies byte arrays
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
    <method-meta>
      <name>testCopyAtConstruction</name>
      <description>
        Verifies that <code>ObjectMessage.getObject()</code> returns a different reference to that set, when the object is supplied at construction
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
    <method-meta>
      <name>testCustomObjectCopy</name>
      <description>
        Verifies that <code>ObjectMessage.setObject()</code> copies user objects
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.stress.ReceiveSize0KTest</name>
    <description>
      Performs a stress test using one producer, one consumer and empty messages.
    </description>
    <attribute name="jmscts.session" value="AUTO_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="CLIENT_ACKNOWLEDGE"/>
    <attribute name="jmscts.session" value="DUPS_OK_ACKNOWLEDGE"/>
    <attribute name="jmscts.message" value="all"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation returns <code>null</code>
      </description>
    </method-meta>
    <method-meta>
      <name>shouldCreateMessage</name>
      <description>
        Determines if messages should be pre-created and populated for the test.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>test</name>
      <description>
        Performs a stress test using: <ul> <li>a single consumer</li> <li>empty messages</li> </ul> For <em>CLIENT_ACKNOWLEDGE</em> sessions, each message is acknowledged.
      </description>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.IdentifierTest</name>
    <description>
      This class tests selector identifiers.
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testDollars</name>
      <description>
        Verifies that identifiers may contain '$' characters, using the selector <code>$State = 'VIC'</code> and property '$State' with value 'VIC'. This should select all messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.identifier.name"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testInvalid1</name>
      <description>
        Verifies that the selector <code>~ABC = 'foo'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.identifier.name"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid2</name>
      <description>
        Verifies that the selector <code>Country.name = 'Australia'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.identifier.name"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testUnderscores</name>
      <description>
        Verifies that identifiers may contain '_' characters, using the selector <code>_postcode_ = '3001'</code> and property '_postcode_' with value '3001'. This should select all messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.identifier.name"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testUserIdentifierCase</name>
      <description>
        Verifies that user identifier names are case sensitive, using the selector <code>country = 'Australia'</code>, and property 'Country' with value 'Australia'. This shouldn't select any messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.identifier.case"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.EmptySelectorTest</name>
    <description>
      This class tests the behaviour of empty selectors.
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testEmpty</name>
      <description>
        Verifies that consumer creation operations accept an empty string as a valid selector
      </description>
      <attribute name="jmscts.requirement" value="selector.empty"/>
    </method-meta>
    <method-meta>
      <name>testNull</name>
      <description>
        Verifies that consumer creation operations accept null as a valid selector
      </description>
      <attribute name="jmscts.requirement" value="selector.null"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.copy.StreamMessageTest</name>
    <description>
      This class verifies that <code>StreamMessage</code> copies content
    </description>
    <attribute name="jmscts.message" value="StreamMessage"/>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation always returns null
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testByteArrayCopy</name>
      <description>
        Verifies that <code>StreamMessage.setObject()</code> copies byte arrays
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
    <method-meta>
      <name>testPartialWriteBytesCopy</name>
      <description>
        Verifies that <code>StreamMessage.writeBytes(byte[], int, int)</code> takes a copy of the byte array.
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
    <method-meta>
      <name>testWriteBytesCopy</name>
      <description>
        Verifies that <code>StreamMessage.writeBytes(byte[])</code> takes a copy of the byte array.
      </description>
      <attribute name="jmscts.requirement" value="message.copy"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.topic.DurableSubscriberTest</name>
    <description>
      This class tests the behaviour of durable TopicSubscribers
    </description>
    <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
    <attribute name="jmscts.factory" value="XATopicConnectionFactory"/>
    <attribute name="jmscts.message" value="TextMessage"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, administered, synchronous"/>
    <attribute name="jmscts.delivery" value="PERSISTENT, administered, asynchronous"/>
    <attribute name="jmscts.durableonly" value="true"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testChangeSubscription</name>
      <description>
        Verifies that a client can change an existing durable subscription by creating a durable subscriber with the same name and a new topic.
      </description>
      <attribute name="jmscts.requirement" value="subscriber.durable.changing"/>
    </method-meta>
    <method-meta>
      <name>testDurableSubscriber</name>
      <description>
        Verifies that a durable subscriber can be created for a session, closed, and recreated.
      </description>
      <attribute name="jmscts.requirement" value="subscriber.durable"/>
    </method-meta>
    <method-meta>
      <name>testUnsubscribe</name>
      <description>
        Verifies that a durable subscriber can be created for a session, unsubscribed, and recreated
      </description>
      <attribute name="jmscts.requirement" value="subscriber.durable.unsubscribe"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.JMSPriorityTest</name>
    <description>
      This class tests selectors containing <code>JMSPriority</code>
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testInvalid1</name>
      <description>
        Verifies that the selector <code>JMSPriority &gt;= '0'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid2</name>
      <description>
        Verifies that the selector <code>'0' &lt;= JMSPriority</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.datetime"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testJMSPriority</name>
      <description>
        Verifies that messages can be selected on JMSPriority, using the selector <code>JMSPriority &lt;&gt; 0</code>. This should select all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.identifier.header"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testJMSPriorityCase</name>
      <description>
        Verifies that JMS identifier names are case sensitive, using the selector <code>jmspriority between 1 and 9</code>. This shouldn't select any messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.identifier.case"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.StringTest</name>
    <description>
      This class tests selectors containing string literals and objects
    </description>
    <attribute name="jmscts.message" value="TextMessage"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testCaseComparison1</name>
      <description>
        Verifies that string literals are case sensitive, using the selector <code>'abc' = 'ABC'</code>. This shouldn't select any messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.string"/>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testCaseComparison2</name>
      <description>
        Verifies that string literals are case sensitive, using the selector <code>'abc' &lt;&gt; 'ABC'</code>. This should select all messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.string"/>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testCaseComparison3</name>
      <description>
        Verifies that string literals are case sensitive when compared with string properties, using the selector <code>Country = 'france'</code>, and the string property 'Country', with value 'France'. This should select no messages.
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.string"/>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testCheckSingleQuotes1</name>
      <description>
        Verifies that string literals can contain embedded quotes, using the selector <code>'it''s' = 'it''s'</code>. This should select all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.string"/>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testCheckSingleQuotes2</name>
      <description>
        Verifies that the quotes are preserved in string literals with embedded quotes, using the selector <code>'it''s' = 'its'</code>. This should select no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.string"/>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEquals</name>
      <description>
        Verifies that the selector <code>'abc' = 'abc'</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.string"/>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testEqualsProperty</name>
      <description>
        Verifies that the selector <code>Country = 'France'</code> selects all messages, when the string property 'Country' is set, with value 'France'
      </description>
      <attribute name="jmscts.requirement" value="selector.literal.string"/>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testGreaterEquals1</name>
      <description>
        Verifies that the selector <code>'abc' &gt;= 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testGreaterEquals2</name>
      <description>
        Verifies that the selector <code>dummy &gt;= 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testGreaterEquals3</name>
      <description>
        Verifies that the selector <code>'abc' &gt;= dummy</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testGreaterThan1</name>
      <description>
        Verifies that the selector <code>'abc' &gt; 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testGreaterThan2</name>
      <description>
        Verifies that the selector <code>dummy &gt; 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testGreaterThan3</name>
      <description>
        Verifies that the selector <code>'abc' &gt; dummy</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid1</name>
      <description>
        Verifies that the selector <code>'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid2</name>
      <description>
        Verifies that the selector <code>'abc' = 'abc</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid3</name>
      <description>
        Verifies that the selector <code>'abc' = abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid4</name>
      <description>
        Verifies that the selector <code>'abc = 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid5</name>
      <description>
        Verifies that the selector <code>'abc'''' = 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid6</name>
      <description>
        Verifies that the selector <code>"abc" = "abc"</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessEquals1</name>
      <description>
        Verifies that the selector <code>'abc' &lt;= 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessEquals2</name>
      <description>
        Verifies that the selector <code>dummy &lt;= 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessEquals3</name>
      <description>
        Verifies that the selector <code>'abc' &lt;= dummy</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessThan1</name>
      <description>
        Verifies that the selector <code>'abc' &lt; 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessThan2</name>
      <description>
        Verifies that the selector <code>dummy &lt; 'abc'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testLessThan3</name>
      <description>
        Verifies that the selector <code>'abc' &lt; dummy</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.comparison.string"/>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.selector.BetweenOperatorTest</name>
    <description>
      This class tests selector containing the BETWEEN operator.
    </description>
    <attribute name="jmscts.message" value="BytesMessage"/>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testBetween1</name>
      <description>
        Verifies that the selector <code>17 between 16 and 18</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testBetween2</name>
      <description>
        Verifies that the selector <code>17 between 18 and 19</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testBetween3</name>
      <description>
        Verifies that the selector <code>17 Between 17 And 17</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.reservedwords.case"/>
    </method-meta>
    <method-meta>
      <name>testBetween4</name>
      <description>
        Verifies that the selector <code>17 between 4 * 4 and 10 + 8</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testBetween5</name>
      <description>
        Verifies that the selector <code>17 between 4 * 5 and 10 + 12</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testBetween6</name>
      <description>
        Verifies that the selector <code>two between one and three</code> selects all messages, where one, two and three are integer properties with with corresponding values
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testInvalid1</name>
      <description>
        Verifies that the selector <code>two between '1' and '3'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid2</name>
      <description>
        Verifies that the selector <code>one between false and true</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid3</name>
      <description>
        Verifies that the selector <code>b' between 'a' and 'c'</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid4</name>
      <description>
        Verifies that the selector <code>between 1 and 3</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid5</name>
      <description>
        Verifies that the selector <code>not between 1 and 3</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid6</name>
      <description>
        Verifies that the selector <code>2 between 1, 3</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid7</name>
      <description>
        Verifies that the selector <code>2 between 1 and</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid8</name>
      <description>
        Verifies that the selector <code>2 between and 3</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testInvalid9</name>
      <description>
        Verifies that the selector <code>JMSMessageID between 1 and 10</code> throws InvalidSelectorException
      </description>
      <attribute name="jmscts.requirement" value="selector.validation"/>
    </method-meta>
    <method-meta>
      <name>testNotBetween1</name>
      <description>
        Verifies that the selector <code>17 not between 18 and 19</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotBetween2</name>
      <description>
        Verifies that the selector <code>17 not between 16 and 18</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotBetween3</name>
      <description>
        Verifies that the selector <code>17 not between 17 and 17</code> selects no messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testNotBetween4</name>
      <description>
        Verifies that the selector <code>17 Not Between 4 * 5 And 20 / 1</code> selects all messages
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.reservedwords.case"/>
    </method-meta>
    <method-meta>
      <name>testNotBetween5</name>
      <description>
        Verifies that the selector <code>two not between one and three</code> selects all messages, where one, two and three are integer properties with with corresponding values
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty1</name>
      <description>
        Verifies that the selector <code>dummy between 1 and 10</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty2</name>
      <description>
        Verifies that the selector <code>1 between dummy and 10</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
    <method-meta>
      <name>testUnsetProperty3</name>
      <description>
        Verifies that the selector <code>1 between 0 and dummy</code> selects no messages, for the unset property 'dummy'
      </description>
      <attribute name="jmscts.requirement" value="selector.operator.between"/>
      <attribute name="jmscts.requirement" value="selector.expression"/>
      <attribute name="jmscts.requirement" value="selector.values.null"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.properties.JMSXGroupTest</name>
    <description>
      This class tests that connections support JMSXGroupID and JMSXGroupSeq properties <br/> NOTE: the specification is not clear on the behaviour of null values for these properties.
    </description>
    <method-meta>
      <name>checkProperty</name>
      <description>
        Verifies that atttempting to use an invalid property value throws <code>MessageFormatException</code>
      </description>
    </method-meta>
    <method-meta>
      <name>checkSequenceValue</name>
      <description>
        Verifies a value for the JMSXGroupSeq property
      </description>
    </method-meta>
    <method-meta>
      <name>checkSequenceValue</name>
      <description>
        Verifies a value for the JMSXGroupSeq property
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testJMSGroupSeq</name>
      <description>
        Verifies that the only allowed type for JMSXGroupID is an int.
      </description>
      <attribute name="jmscts.requirement" value="properties.group"/>
    </method-meta>
    <method-meta>
      <name>testJMSGroupSeqRange</name>
      <description>
        Verifies that JMSXGroupSeq only handles ints > 0
      </description>
      <attribute name="jmscts.requirement" value="properties.group"/>
    </method-meta>
    <method-meta>
      <name>testJMSXGroupID</name>
      <description>
        Verifies that the only allowed type for JMSXGroupID is a String.
      </description>
      <attribute name="jmscts.requirement" value="properties.group"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.topic.NoLocalTest</name>
    <description>
      This class tests the behaviour of the noLocal argument of <code>TopicSubscriber</code>
    </description>
    <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
    <attribute name="jmscts.factory" value="XATopicConnectionFactory"/>
    <attribute name="jmscts.message" value="ObjectMessage"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testNoLocal</name>
      <description>
        Verifies the behaviour of the subscriber noLocal attribute
      </description>
      <attribute name="jmscts.requirement" value="subscriber.nolocal"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.clear.SendReceiveClearTest</name>
    <description>
      This class tests the behaviour of <code>Message.clearBody()</code> and <code>Message.clearProperties()</code> on send and receipt, against all message, delivery, and transaction types
    </description>
    <attribute name="jmscts.delivery" value="all"/>
    <method-meta>
      <name>checkClearBodyOnReceipt</name>
      <description>
        Verifies that <code>Message.clearProperties()</code> leaves the message properties empty, and doesn't clear the message body, on receipt of a message.
      </description>
    </method-meta>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>getMessagePopulator</name>
      <description>
        Get the message populator. This implementation returns null, as population is handled by the test cases.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testBytesClearBodyOnReceipt</name>
      <description>
        Verifies that <code>BytesMessage.clearBody()</code> leaves the message body empty, and doesn't clear the message properties, on receipt of a message.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.requirement" value="message.bytes.method.clearBody"/>
      <attribute name="jmscts.message" value="BytesMessage"/>
    </method-meta>
    <method-meta>
      <name>testClearBodyOnReceipt</name>
      <description>
        Verifies that <code>Message.clearBody()</code> leaves the message body empty, and doesn't clear the message properties, on receipt of a message.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.message" value="Message"/>
      <attribute name="jmscts.message" value="MapMessage"/>
      <attribute name="jmscts.message" value="ObjectMessage"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
    <method-meta>
      <name>testClearOnSend</name>
      <description>
        Verifies that <code>Message.clearProperties()</code> and <code>Message.clearBody()</code> on send doesn't affect the sent message
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearProperties"/>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
    </method-meta>
    <method-meta>
      <name>testClearPropertiesOnReceipt</name>
      <description>
        Verifies that <code>Message.clearProperties()</code> leaves the message properties empty, and doesn't clear the message body, on receipt of a message.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearProperties"/>
    </method-meta>
    <method-meta>
      <name>testStreamClearBodyOnReceipt</name>
      <description>
        Verifies that <code>StreamMessage.clearBody()</code> leaves the message body empty, and doesn't clear the message properties, on receipt of a message.
      </description>
      <attribute name="jmscts.requirement" value="message.method.clearBody"/>
      <attribute name="jmscts.requirement" value="message.stream.method.clearBody"/>
      <attribute name="jmscts.message" value="StreamMessage"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.message.foreign.ForeignMessageTest</name>
    <description>
      This class tests the behaviour of sending 'foreign' messages. A 'foreign' message is one whose implementation is not one of those of the target provider.
    </description>
    <attribute name="jmscts.session" value="all"/>
    <attribute name="jmscts.delivery" value="consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-create destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>test</name>
      <description>
        Verifies that 'foreign' messages are supported by the JMS provider
      </description>
      <attribute name="jmscts.requirement" value="message.foreign"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.session.transacted.CloseTest</name>
    <description>
      This class tests session rollback functionality.
    </description>
    <attribute name="jmscts.session" value="TRANSACTED"/>
    <attribute name="jmscts.message" value="MapMessage"/>
    <attribute name="jmscts.delivery" value="administered-consumer"/>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite.
      </description>
    </method-meta>
    <method-meta>
      <name>testRollbackForClosedConnection</name>
      <description>
        Verifies that closing a connection rolls back the transactions in progress on its transacted sessions.
      </description>
      <attribute name="jmscts.requirement" value="connection.close.session.transacted"/>
    </method-meta>
    <method-meta>
      <name>testRollbackForClosedSession</name>
      <description>
        Verifies that closing a session rolls back the transaction in progress
      </description>
      <attribute name="jmscts.requirement" value="session.close.transacted"/>
    </method-meta>
  </class-meta>

  <class-meta>
    <name>org.exolab.jmscts.test.producer.ttl.ExpirationTest</name>
    <description>
      This class tests message expiration
    </description>
    <method-meta>
      <name>checkExpiration</name>
      <description>
        Sends <code>messageCount</code> messages with time-to-live <code>timeToLive</code>, and <code>messageCount</code> messages which don't expire, and verifies that after sleeping <code>timeToLive + EXPIRATION_INTERVAL</code> milliseconds, only the non-expiring messages may be received
      </description>
    </method-meta>
    <method-meta>
      <name>checkExpiration</name>
      <description>
        Sends <code>messageCount</code> messages with time-to-live <code>timeToLive</code>, and <code>messageCount</code> messages which don't expire, and verifies that after sleeping <code>timeToLive + EXPIRATION_INTERVAL</code> milliseconds, only the non-expiring messages may be received
      </description>
    </method-meta>
    <method-meta>
      <name>getDestinations</name>
      <description>
        Returns the list of destination names used by this test case. These are used to pre-administer destinations prior to running the test case.
      </description>
    </method-meta>
    <method-meta>
      <name>suite</name>
      <description>
        Sets up the test suite
      </description>
    </method-meta>
    <method-meta>
      <name>testExpiration</name>
      <description>
        Verifies that messages expire. <p/> It sends two groups of messages - one group which expires after 1 second, and another which don't expire, and verifies that after the first group should have expired, only the non-expiring group can be received. <p/> If the JMS provider doesn't support immediate expiration of messages, the <em> org.exolab.jmscts.test.producer.ttl.ExpirationTest.expirationInterval </em> property should be configured in <em>jmscts.properties</em> to delay the test until the expired messages are collected.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="message.expiration.expired"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
    <method-meta>
      <name>testExpiration2DiffSubscribers</name>
      <description>
        Verifies that messages to topics expire, when one subscriber is durable, and the other non-durable. <p/> It sends two groups of messages - one group which expires after 1 second, and another which don't expire, and verifies that after the first group should have expired, only the non-expiring group can be received. <p/> If the JMS provider doesn't support immediate expiration of messages, the <em> org.exolab.jmscts.test.producer.ttl.ExpirationTest.expirationInterval </em> property should be configured in <em>jmscts.properties</em> to delay the test until the expired messages are collected.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="message.expiration.expired"/>
      <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
      <attribute name="jmscts.factory" value="XATopicConnectionFactory"/>
      <attribute name="jmscts.message" value="MapMessage"/>
      <attribute name="jmscts.delivery" value="administered-consumer"/>
      <attribute name="jmscts.durableonly" value="true"/>
    </method-meta>
    <method-meta>
      <name>testExpiration2Subscribers</name>
      <description>
        Verifies that messages to topics expire, when there is more than one subscriber. <p/> It sends two groups of messages - one group which expires after 1 second, and another which don't expire, and verifies that after the first group should have expired, only the non-expiring group can be received. <p/> If the JMS provider doesn't support immediate expiration of messages, the <em> org.exolab.jmscts.test.producer.ttl.ExpirationTest.expirationInterval </em> property should be configured in <em>jmscts.properties</em> to delay the test until the expired messages are collected.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="message.expiration.expired"/>
      <attribute name="jmscts.factory" value="TopicConnectionFactory"/>
      <attribute name="jmscts.factory" value="XATopicConnectionFactory"/>
      <attribute name="jmscts.message" value="ObjectMessage"/>
    </method-meta>
    <method-meta>
      <name>testSingleMessageExpiration</name>
      <description>
        Verifies that a single message expires. <p/> It sends two messages - one which expires after 1 second, and another which doesn't expire, and verifies that after the first should have expired, only the non-expiring message can be received. <p/> If the JMS provider doesn't support immediate expiration of messages, the <em> org.exolab.jmscts.test.producer.ttl.ExpirationTest.expirationInterval </em> property should be configured in <em>jmscts.properties</em> to delay the test until the expired messages are collected.
      </description>
      <attribute name="jmscts.requirement" value="message.expiration.zero"/>
      <attribute name="jmscts.requirement" value="message.expiration.expired"/>
      <attribute name="jmscts.message" value="TextMessage"/>
    </method-meta>
  </class-meta>

</meta-data>
