Added: 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/MessagingTestConfigProperties.csx
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/MessagingTestConfigProperties.csx?rev=612874&view=auto
==============================================================================
--- 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/MessagingTestConfigProperties.csx
 (added)
+++ 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/MessagingTestConfigProperties.csx
 Thu Jan 17 09:13:11 2008
@@ -0,0 +1,652 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+using uk.co.thebadgerset.junit.extensions.util.ParsedProperties;
+
+using javax.jms.Session;
+
+using java.util.Properties;
+
+namespace Apache.Qpid.Integration.Tests.framework
+{
+    /// <summary>
+    /// MessagingTestConfigProperties defines a set of property names and 
default values for specifying a messaging topology,
+    /// and test parameters for running a messaging test over that topology. A 
Properties object holding some of these
+    /// properties, superimposed onto the defaults, is used to establish test 
topologies and control test behaviour.
+    ///
+    /// <p/>A complete list of the parameters, default values and comments on 
their usage is provided here:
+    ///
+    /// <p/><table><caption>Parameters</caption>
+    /// <tr><th> Parameter        <th> Default  <th> Comments
+    /// <tr><td> messageSize      <td> 0        <td> Message size in bytes. 
Not including any headers.
+    /// <tr><td> destinationName  <td> ping     <td> The root name to use to 
generate destination names to ping.
+    /// <tr><td> persistent       <td> false    <td> Determines whether 
peristent delivery is used.
+    /// <tr><td> transacted       <td> false    <td> Determines whether 
messages are sent/received in transactions.
+    /// <tr><td> broker           <td> tcp://localhost:5672 <td> Determines 
the broker to connect to.
+    /// <tr><td> virtualHost      <td> test     <td> Determines the virtual 
host to send all ping over.
+    /// <tr><td> rate             <td> 0        <td> The maximum rate (in 
hertz) to send messages at. 0 means no limit.
+    /// <tr><td> verbose          <td> false    <td> The verbose flag for 
debugging. Prints to console on every message.
+    /// <tr><td> pubsub           <td> false    <td> Whether to ping topics or 
queues. Uses p2p by default.
+    /// <tr><td> username         <td> guest    <td> The username to access 
the broker with.
+    /// <tr><td> password         <td> guest    <td> The password to access 
the broker with.
+    /// <tr><td> selector         <td> null     <td> Not used. Defines a 
message selector to filter pings with.
+    /// <tr><td> destinationCount <td> 1        <td> The number of receivers 
listening to the pings.
+    /// <tr><td> timeout          <td> 30000    <td> In milliseconds. The 
timeout to stop waiting for replies.
+    /// <tr><td> commitBatchSize  <td> 1        <td> The number of messages 
per transaction in transactional mode.
+    /// <tr><td> uniqueDests      <td> true     <td> Whether each receivers 
only listens to one ping destination or all.
+    /// <tr><td> durableDests     <td> false    <td> Whether or not durable 
destinations are used.
+    /// <tr><td> ackMode          <td> AUTO_ACK <td> The message 
acknowledgement mode. Possible values are:
+    ///                                               0 - SESSION_TRANSACTED
+    ///                                               1 - AUTO_ACKNOWLEDGE
+    ///                                               2 - CLIENT_ACKNOWLEDGE
+    ///                                               3 - DUPS_OK_ACKNOWLEDGE
+    ///                                               257 - NO_ACKNOWLEDGE
+    ///                                               258 - PRE_ACKNOWLEDGE
+    /// <tr><td> maxPending       <td> 0        <td> The maximum size in 
bytes, of messages sent but not yet received.
+    ///                                              Limits the volume of 
messages currently buffered on the client
+    ///                                              or broker. Can help scale 
test clients by limiting amount of buffered
+    ///                                              data to avoid out of 
memory errors.
+    /// </table>
+    ///
+    /// <p><table id="crc"><caption>CRC Card</caption>
+    /// <tr><th> Responsibilities <th> Collaborations
+    /// <tr><td> Provide the names and defaults of all test parameters.
+    /// </table>
+    /// </summary>
+    ///
+    /// <remarks> Put a type-safe wrapper around these properties, but 
continue to store the parameters as properties. This is
+    ///       simply to ensure that it is a simple matter to 
serialize/deserialize string/string pairs onto messages.</remarks>
+    public class MessagingTestConfigProperties extends ParsedProperties
+    {
+        // ====================== Connection Properties 
==================================
+
+        /// <summary> Holds the name of the default connection configuration. 
</summary>
+        public static final string CONNECTION_NAME = "broker";
+
+        /// <summary> Holds the name of the property to get the initial 
context factory name from. </summary>
+        public static final string INITIAL_CONTEXT_FACTORY_PROPNAME = 
"java.naming.factory.initial";
+
+        /// <summary> Defines the class to use as the initial context factory 
by default. </summary>
+        public static final string INITIAL_CONTEXT_FACTORY_DEFAULT = 
"org.apache.qpid.jndi.PropertiesFileInitialContextFactory";
+
+        /// <summary> Holds the name of the property to get the test broker 
url from. </summary>
+        public static final string BROKER_PROPNAME = "qpid.test.broker";
+
+        /// <summary> Holds the default broker url for the test. </summary>
+        public static final string BROKER_DEFAULT = "vm://:1";
+
+        /// <summary> Holds the name of the property to get the test broker 
virtual path. </summary>
+        public static final string VIRTUAL_HOST_PROPNAME = "virtualHost";
+
+        /// <summary> Holds the default virtual path for the test. </summary>
+        public static final string VIRTUAL_HOST_DEFAULT = "";
+
+        /// <summary> Holds the name of the property to get the broker access 
username from. </summary>
+        public static final string USERNAME_PROPNAME = "username";
+
+        /// <summary> Holds the default broker log on username. </summary>
+        public static final string USERNAME_DEFAULT = "guest";
+
+        /// <summary> Holds the name of the property to get the broker access 
password from. </summary>
+        public static final string PASSWORD_PROPNAME = "password";
+
+        /// <summary> Holds the default broker log on password. </summary>
+        public static final string PASSWORD_DEFAULT = "guest";
+
+        // ====================== Messaging Topology Properties 
==========================
+
+        /// <summary> Holds the name of the property to get the bind publisher 
procuder flag from. </summary>
+        public static final string PUBLISHER_PRODUCER_BIND_PROPNAME = 
"publisherProducerBind";
+
+        /// <summary> Holds the default value of the publisher producer flag. 
</summary>
+        public static final bool PUBLISHER_PRODUCER_BIND_DEFAULT = true;
+
+        /// <summary> Holds the name of the property to get the bind publisher 
procuder flag from. </summary>
+        public static final string PUBLISHER_CONSUMER_BIND_PROPNAME = 
"publisherConsumerBind";
+
+        /// <summary> Holds the default value of the publisher consumer flag. 
</summary>
+        public static final bool PUBLISHER_CONSUMER_BIND_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to get the bind receivers 
procuder flag from. </summary>
+        public static final string RECEIVER_PRODUCER_BIND_PROPNAME = 
"receiverProducerBind";
+
+        /// <summary> Holds the default value of the receivers producer flag. 
</summary>
+        public static final bool RECEIVER_PRODUCER_BIND_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to get the bind receivers 
procuder flag from. </summary>
+        public static final string RECEIVER_CONSUMER_BIND_PROPNAME = 
"receiverConsumerBind";
+
+        /// <summary> Holds the default value of the receivers consumer flag. 
</summary>
+        public static final bool RECEIVER_CONSUMER_BIND_DEFAULT = true;
+
+        /// <summary> Holds the name of the property to get the publishers 
consumer active flag from. </summary>
+        public static final string PUBLISHER_CONSUMER_ACTIVE_PROPNAME = 
"publisherConsumerActive";
+
+        /// <summary> Holds the default value of the publishers consumer 
active flag. </summary>
+        public static final bool PUBLISHER_CONSUMER_ACTIVE_DEFAULT = true;
+
+        /// <summary> Holds the name of the property to get the receivers 
consumer active flag from. </summary>
+        public static final string RECEIVER_CONSUMER_ACTIVE_PROPNAME = 
"receiverConsumerActive";
+
+        /// <summary> Holds the default value of the receivers consumer active 
flag. </summary>
+        public static final bool RECEIVER_CONSUMER_ACTIVE_DEFAULT = true;
+
+        /// <summary> Holds the name of the property to get the destination 
name root from. </summary>
+        public static final string SEND_DESTINATION_NAME_ROOT_PROPNAME = 
"sendDestinationRoot";
+
+        /// <summary> Holds the root of the name of the default destination to 
send to. </summary>
+        public static final string SEND_DESTINATION_NAME_ROOT_DEFAULT = 
"sendTo";
+
+        /// <summary> Holds the name of the property to get the destination 
name root from. </summary>
+        public static final string RECEIVE_DESTINATION_NAME_ROOT_PROPNAME = 
"receiveDestinationRoot";
+
+        /// <summary> Holds the root of the name of the default destination to 
send to. </summary>
+        public static final string RECEIVE_DESTINATION_NAME_ROOT_DEFAULT = 
"receiveFrom";
+
+        /// <summary> Holds the name of the proeprty to get the destination 
count from. </summary>
+        public static final string DESTINATION_COUNT_PROPNAME = 
"destinationCount";
+
+        /// <summary> Defines the default number of destinations to ping. 
</summary>
+        public static final int DESTINATION_COUNT_DEFAULT = 1;
+
+        /// <summary> Holds the name of the property to get the p2p or pub/sub 
messaging mode from. </summary>
+        public static final string PUBSUB_PROPNAME = "pubsub";
+
+        /// <summary> Holds the pub/sub mode default, true means ping a topic, 
false means ping a queue. </summary>
+        public static final bool PUBSUB_DEFAULT = false;
+
+        // ======================  JMS Options and Flags 
=================================
+
+        /// <summary> Holds the name of the property to get the test delivery 
mode from. </summary>
+        public static final string PERSISTENT_MODE_PROPNAME = "persistent";
+
+        /// <summary> Holds the message delivery mode to use for the test. 
</summary>
+        public static final bool PERSISTENT_MODE_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to get the test 
transactional mode from. </summary>
+        public static final string TRANSACTED_PUBLISHER_PROPNAME = 
"transactedPublisher";
+
+        /// <summary> Holds the transactional mode to use for the test. 
</summary>
+        public static final bool TRANSACTED_PUBLISHER_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to get the test 
transactional mode from. </summary>
+        public static final string TRANSACTED_RECEIVER_PROPNAME = 
"transactedReceiver";
+
+        /// <summary> Holds the transactional mode to use for the test. 
</summary>
+        public static final bool TRANSACTED_RECEIVER_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to set the no local flag 
from. </summary>
+        public static final string NO_LOCAL_PROPNAME = "noLocal";
+
+        /// <summary> Defines the default value of the no local flag to use 
when consuming messages. </summary>
+        public static final bool NO_LOCAL_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to get the message 
acknowledgement mode from. </summary>
+        public static final string ACK_MODE_PROPNAME = "ackMode";
+
+        /// <summary> Defines the default message acknowledgement mode. 
</summary>
+        public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE;
+
+        /// <summary> Holds the name of the property to get the durable 
subscriptions flag from, when doing pub/sub messaging. </summary>
+        public static final string DURABLE_SUBSCRIPTION_PROPNAME = 
"durableSubscription";
+
+        /// <summary> Defines the default value of the durable subscriptions 
flag. </summary>
+        public static final bool DURABLE_SUBSCRIPTION_DEFAULT = false;
+
+        // ======================  Qpid/AMQP Options and Flags 
================================
+
+        /// <summary> Holds the name of the property to set the exclusive flag 
from. </summary>
+        public static final string EXCLUSIVE_PROPNAME = "exclusive";
+
+        /// <summary> Defines the default value of the exclusive flag to use 
when consuming messages. </summary>
+        public static final bool EXCLUSIVE_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to set the immediate flag 
from. </summary>
+        public static final string IMMEDIATE_PROPNAME = "immediate";
+
+        /// <summary> Defines the default value of the immediate flag to use 
when sending messages. </summary>
+        public static final bool IMMEDIATE_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to set the mandatory flag 
from. </summary>
+        public static final string MANDATORY_PROPNAME = "mandatory";
+
+        /// <summary> Defines the default value of the mandatory flag to use 
when sending messages. </summary>
+        public static final bool MANDATORY_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to get the durable 
destinations flag from. </summary>
+        public static final string DURABLE_DESTS_PROPNAME = "durableDests";
+
+        /// <summary> Default value for the durable destinations flag. 
</summary>
+        public static final bool DURABLE_DESTS_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to set the prefetch size 
from. </summary>
+        public static final string PREFETCH_PROPNAME = "prefetch";
+
+        /// <summary> Defines the default prefetch size to use when consuming 
messages. </summary>
+        public static final int PREFETCH_DEFAULT = 100;
+
+        // ======================  Common Test Parameters 
================================
+
+        /// <summary> Holds the name of the property to get the test message 
size from. </summary>
+        public static final string MESSAGE_SIZE_PROPNAME = "messageSize";
+
+        /// <summary> Used to set up a default message size. </summary>
+        public static final int MESSAGE_SIZE_DEAFULT = 0;
+
+        /// <summary> Holds the name of the property to get the message rate 
from. </summary>
+        public static final string RATE_PROPNAME = "rate";
+
+        /// <summary> Defines the default rate (in pings per second) to send 
pings at. 0 means as fast as possible, no restriction. </summary>
+        public static final int RATE_DEFAULT = 0;
+
+        /// <summary> Holds the name of the proeprty to get the. </summary>
+        public static final string SELECTOR_PROPNAME = "selector";
+
+        /// <summary> Holds the default message selector. </summary>
+        public static final string SELECTOR_DEFAULT = "";
+
+        /// <summary> Holds the name of the property to get the waiting 
timeout for response messages. </summary>
+        public static final string TIMEOUT_PROPNAME = "timeout";
+
+        /// <summary> Default time to wait before assuming that a ping has 
timed out. </summary>
+        public static final long TIMEOUT_DEFAULT = 30000;
+
+        /// <summary> Holds the name of the property to get the commit batch 
size from. </summary>
+        public static final string TX_BATCH_SIZE_PROPNAME = "commitBatchSize";
+
+        /// <summary> Defines the default number of pings to send in each 
transaction when running transactionally. </summary>
+        public static final int TX_BATCH_SIZE_DEFAULT = 1;
+
+        /// <summary> Holds the name of the property to set the maximum amount 
of pending message data for a producer to hold. </summary>
+        public static final string MAX_PENDING_PROPNAME = "maxPending";
+
+        /// <summary> Defines the default maximum quantity of pending message 
data to allow producers to hold. </summary>
+        public static final int MAX_PENDING_DEFAULT = 0;
+
+        /// <summary> Holds the name of the property to get the publisher 
rollback flag from. </summary>
+        public static final string ROLLBACK_PUBLISHER_PROPNAME = 
"rollbackPublisher";
+
+        /// <summary> Holds the default publisher roll back setting. </summary>
+        public static final bool ROLLBACK_PUBLISHER_DEFAULT = false;
+
+        /// <summary> Holds the name of the property to get the publisher 
rollback flag from. </summary>
+        public static final string ROLLBACK_RECEIVER_PROPNAME = 
"rollbackReceiver";
+
+        /// <summary> Holds the default publisher roll back setting. </summary>
+        public static final bool ROLLBACK_RECEIVER_DEFAULT = false;
+
+        // ====================== Options that control the bahviour of the 
test framework. =========================
+
+        /// <summary> Holds the name of the property to get the behavioural 
mode of not applicable assertions. </summary>
+        public static final string NOT_APPLICABLE_ASSERTION_PROPNAME = 
"notApplicableAssertion";
+
+        /// <summary> Holds the default behavioral mode of not applicable 
assertions, which is logging them as a warning. </summary>
+        public static final string NOT_APPLICABLE_ASSERTION_DEFAULT = "warn";
+
+        /// <summary> Holds the name of the property to get the verbose mode 
proeprty from. </summary>
+        public static final string VERBOSE_PROPNAME = "verbose";
+
+        /// <summary> Holds the default verbose mode. </summary>
+        public static final bool VERBOSE_DEFAULT = false;
+
+        /// <summary> Holds the default configuration properties. </summary>
+        public static ParsedProperties defaults = new ParsedProperties();
+
+        static
+        {
+            defaults.setPropertyIfNull(INITIAL_CONTEXT_FACTORY_PROPNAME, 
INITIAL_CONTEXT_FACTORY_DEFAULT);
+            defaults.setPropertyIfNull(BROKER_PROPNAME, BROKER_DEFAULT);
+            defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, 
VIRTUAL_HOST_DEFAULT);
+            defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT);
+            defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT);
+
+            defaults.setPropertyIfNull(PUBLISHER_PRODUCER_BIND_PROPNAME, 
PUBLISHER_PRODUCER_BIND_DEFAULT);
+            defaults.setPropertyIfNull(PUBLISHER_CONSUMER_BIND_PROPNAME, 
PUBLISHER_CONSUMER_BIND_DEFAULT);
+            defaults.setPropertyIfNull(RECEIVER_PRODUCER_BIND_PROPNAME, 
RECEIVER_PRODUCER_BIND_DEFAULT);
+            defaults.setPropertyIfNull(RECEIVER_CONSUMER_BIND_PROPNAME, 
RECEIVER_CONSUMER_BIND_DEFAULT);
+            defaults.setPropertyIfNull(PUBLISHER_CONSUMER_ACTIVE_PROPNAME, 
PUBLISHER_CONSUMER_ACTIVE_DEFAULT);
+            defaults.setPropertyIfNull(RECEIVER_CONSUMER_ACTIVE_PROPNAME, 
RECEIVER_CONSUMER_ACTIVE_DEFAULT);
+            defaults.setPropertyIfNull(SEND_DESTINATION_NAME_ROOT_PROPNAME, 
SEND_DESTINATION_NAME_ROOT_DEFAULT);
+            defaults.setPropertyIfNull(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME, 
RECEIVE_DESTINATION_NAME_ROOT_DEFAULT);
+            defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, 
DESTINATION_COUNT_DEFAULT);
+            defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT);
+
+            defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, 
PERSISTENT_MODE_DEFAULT);
+            defaults.setPropertyIfNull(TRANSACTED_PUBLISHER_PROPNAME, 
TRANSACTED_PUBLISHER_DEFAULT);
+            defaults.setPropertyIfNull(TRANSACTED_RECEIVER_PROPNAME, 
TRANSACTED_RECEIVER_DEFAULT);
+            defaults.setPropertyIfNull(NO_LOCAL_PROPNAME, NO_LOCAL_DEFAULT);
+            defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT);
+            defaults.setPropertyIfNull(DURABLE_SUBSCRIPTION_PROPNAME, 
DURABLE_SUBSCRIPTION_DEFAULT);
+
+            defaults.setPropertyIfNull(EXCLUSIVE_PROPNAME, EXCLUSIVE_DEFAULT);
+            defaults.setPropertyIfNull(IMMEDIATE_PROPNAME, IMMEDIATE_DEFAULT);
+            defaults.setPropertyIfNull(MANDATORY_PROPNAME, MANDATORY_DEFAULT);
+            defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, 
DURABLE_DESTS_DEFAULT);
+            defaults.setPropertyIfNull(PREFETCH_PROPNAME, PREFETCH_DEFAULT);
+
+            defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, 
MESSAGE_SIZE_DEAFULT);
+            defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT);
+            defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT);
+            defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT);
+            defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, 
TX_BATCH_SIZE_DEFAULT);
+            defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, 
MAX_PENDING_DEFAULT);
+            defaults.setPropertyIfNull(ROLLBACK_PUBLISHER_PROPNAME, 
ROLLBACK_PUBLISHER_DEFAULT);
+            defaults.setPropertyIfNull(ROLLBACK_RECEIVER_PROPNAME, 
ROLLBACK_RECEIVER_DEFAULT);
+
+            defaults.setPropertyIfNull(NOT_APPLICABLE_ASSERTION_PROPNAME, 
NOT_APPLICABLE_ASSERTION_DEFAULT);
+            defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT);
+        }
+
+        /// <summary> Creates a test configuration based on the defaults. 
</summary>
+        public MessagingTestConfigProperties()
+        {
+            super(defaults);
+        }
+
+        /// <summary>
+        /// Creates a test configuration based on the supplied properties.
+        /// </summary>
+        /// <param name="properties"> The test configuration. </param>
+        public MessagingTestConfigProperties(Properties properties)
+        {
+            super(properties);
+        }
+
+        /// <summary>
+        /// The size of test messages to send.
+        /// </summary>
+        /// <return> The size of test messages to send. </return>
+        public int getMessageSize()
+        {
+            return getPropertyAsInteger(MESSAGE_SIZE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that the publishing producer should be set up to 
publish to a destination.
+        /// </summary>
+        /// <return> Flag to indicate that the publishing producer should be 
set up to publish to a destination. </return>
+        public bool getPublisherProducerBind()
+        {
+            return getPropertyAsBoolean(PUBLISHER_PRODUCER_BIND_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that the publishing consumer should be set up to 
receive from a destination.
+        /// </summary>
+        /// <return> Flag to indicate that the publishing consumer should be 
set up to receive from a destination. </return>
+        public bool getPublisherConsumerBind()
+        {
+            return getPropertyAsBoolean(PUBLISHER_CONSUMER_BIND_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that the receiving producer should be set up to 
publish to a destination.
+        /// </summary>
+        /// <return> Flag to indicate that the receiving producer should be 
set up to publish to a destination. </return>
+        public bool getReceiverProducerBind()
+        {
+            return getPropertyAsBoolean(RECEIVER_PRODUCER_BIND_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that the receiving consumer should be set up to 
receive from a destination.
+        /// </summary>
+        /// <return> Flag to indicate that the receiving consumer should be 
set up to receive from a destination. </return>
+        public bool getReceiverConsumerBind()
+        {
+            return getPropertyAsBoolean(RECEIVER_CONSUMER_BIND_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that the publishing consumer should be created 
and actively listening.
+        /// </summary>
+        /// <return> Flag to indicate that the publishing consumer should be 
created. </return>
+        public bool getPublisherConsumerActive()
+        {
+            return getPropertyAsBoolean(PUBLISHER_CONSUMER_ACTIVE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that the receiving consumers should be created 
and actively listening.
+        /// </summary>
+        /// <return> Flag to indicate that the receiving consumers should be 
created and actively listening. </return>
+        public bool getReceiverConsumerActive()
+        {
+            return getPropertyAsBoolean(RECEIVER_CONSUMER_ACTIVE_PROPNAME);
+        }
+
+        /// <summary>
+        /// A root to create all test destination names from.
+        /// </summary>
+        /// <return> A root to create all test destination names from. 
</return>
+        public string getSendDestinationNameRoot()
+        {
+            return getProperty(SEND_DESTINATION_NAME_ROOT_PROPNAME);
+        }
+
+        /// <summary>
+        /// A root to create all receiving destination names from.
+        /// </summary>
+        /// <return> A root to create all receiving destination names from. 
</return>
+        public string getReceiveDestinationNameRoot()
+        {
+            return getProperty(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that persistent messages should be used.
+        /// </summary>
+        /// <return> Flag to indicate that persistent messages should be used. 
</return>
+        public bool getPersistentMode()
+        {
+            return getPropertyAsBoolean(PERSISTENT_MODE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that transactional messages should be sent by the 
publisher.
+        /// </summary>
+        /// <return> Flag to indicate that transactional messages should be 
sent by the publisher. </return>
+        public bool getPublisherTransacted()
+        {
+            return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that transactional receives should be used by the 
receiver.
+        /// </summary>
+        /// <return> Flag to indicate that transactional receives should be 
used by the receiver. </return>
+        public bool getReceiverTransacted()
+        {
+            return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME);
+        }
+
+        /// <summary>
+        /// The name of the virtual host to run all tests over.
+        /// </summary>
+        /// <return> The name of the virtual host to run all tests over. 
</return>
+        public string getVirtualHost()
+        {
+            return getProperty(VIRTUAL_HOST_PROPNAME);
+        }
+
+        /// <summary>
+        /// Limiting rate for each sender in messages per second, or zero for 
unlimited.
+        /// </summary>
+        /// <return> Limiting rate for each sender in messages per second, or 
zero for unlimited. </return>
+        public string getRate()
+        {
+            return getProperty(RATE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that test messages should be received 
publish/subscribe style by all receivers.
+        /// </summary>
+        /// <return> Flag to indicate that test messages should be received 
publish/subscribe style by all receivers. </return>
+        public bool getPubsub()
+        {
+            return getPropertyAsBoolean(PUBSUB_PROPNAME);
+        }
+
+        /// <summary>
+        /// The username credentials to run tests with.
+        /// </summary>
+        /// <return> The username credentials to run tests with. </return>
+        public string getUsername()
+        {
+            return getProperty(USERNAME_PROPNAME);
+        }
+
+        /// <summary>
+        /// The password credentials to run tests with.
+        /// </summary>
+        /// <return> The password credentials to run tests with. </return>
+        public string getPassword()
+        {
+            return getProperty(PASSWORD_PROPNAME);
+        }
+
+        /// <summary>
+        /// The timeout duration to fail tests on, should they receive no 
messages within it.
+        /// </summary>
+        /// <return> The timeout duration to fail tests on, should they 
receive no messages within it. </return>
+        public long getTimeout()
+        {
+            return getPropertyAsLong(TIMEOUT_PROPNAME);
+        }
+
+        /// <summary>
+        /// The number of messages to batch into each transaction in 
transational tests.
+        /// </summary>
+        /// <return> The number of messages to batch into each transaction in 
transational tests. </return>
+        public int getTxBatchSize()
+        {
+            return getPropertyAsInteger(TX_BATCH_SIZE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that tests should use durable destinations.
+        /// </summary>
+        /// <return> Flag to indicate that tests should use durable 
destinations. </return>
+        public bool getDurableDests()
+        {
+            return getPropertyAsBoolean(DURABLE_DESTS_PROPNAME);
+        }
+
+        /// <summary>
+        /// The ack mode for message receivers to use.
+        /// </summary>
+        /// <return> The ack mode for message receivers to use. </return>
+        public int getAckMode()
+        {
+            return getPropertyAsInteger(ACK_MODE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that tests should use durable subscriptions.
+        /// </summary>
+        /// <return> Flag to indicate that tests should use durable 
subscriptions. </return>
+        public bool getDurableSubscription()
+        {
+            return getPropertyAsBoolean(DURABLE_SUBSCRIPTION_PROPNAME);
+        }
+
+        /// <summary>
+        /// The maximum amount of in-flight data, in bytes, that tests should 
send at any time.
+        /// </summary>
+        /// <return> The maximum amount of in-flight data, in bytes, that 
tests should send at any time. </return>
+        public int getMaxPending()
+        {
+            return getPropertyAsInteger(MAX_PENDING_PROPNAME);
+        }
+
+        /// <summary>
+        /// The size of the prefetch queue to use.
+        /// </summary>
+        /// <return> The size of the prefetch queue to use. </return>
+        public int getPrefetch()
+        {
+            return getPropertyAsInteger(PREFETCH_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that subscriptions should be no-local.
+        /// </summary>
+        /// <return> Flag to indicate that subscriptions should be no-local. 
</return>
+        public bool getNoLocal()
+        {
+            return getPropertyAsBoolean(NO_LOCAL_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that subscriptions should be exclusive.
+        /// </summary>
+        /// <return> Flag to indicate that subscriptions should be exclusive. 
</return>
+        public bool getExclusive()
+        {
+            return getPropertyAsBoolean(EXCLUSIVE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that messages must be delivered immediately.
+        /// </summary>
+        /// <return> Flag to indicate that messages must be delivered 
immediately. </return>
+        public bool getImmediate()
+        {
+            return getPropertyAsBoolean(IMMEDIATE_PROPNAME);
+        }
+
+        /// <summary>
+        /// Flag to indicate that messages must be routable.
+        /// </summary>
+        /// <return> Flag to indicate that messages must be routable. </return>
+        public bool getMandatory()
+        {
+            return getPropertyAsBoolean(MANDATORY_PROPNAME);
+        }
+
+        /// <summary>
+        /// Gets the value of a flag to indicate that the publisher should 
rollback all messages sent.
+        /// </summary>
+        /// <return> A flag to indicate that the publisher should rollback all 
messages sent. </return>
+        public bool getRollbackPublisher()
+        {
+            return getPropertyAsBoolean(ROLLBACK_PUBLISHER_PROPNAME);
+        }
+
+        /// <summary>
+        /// Gets the value of a flag to indicate that the receiver should 
rollback all messages received, then receive them
+        /// again.
+        /// </summary>
+        /// <return> A flag to indicate that the publisher should rollback all 
messages received. </return>
+        public bool getRollbackReceiver()
+        {
+            return getPropertyAsBoolean(ROLLBACK_RECEIVER_PROPNAME);
+        }
+
+        /// <summary>
+        /// Gets the behavioural mode of not applicable assertions. Should be 
one of 'quiet', 'warn' or 'fail'.
+        /// </summary>
+        /// <return> The behavioural mode of not applicable assertions. 
</return>
+        public string getNotApplicableAssertionMode()
+        {
+            return getProperty(NOT_APPLICABLE_ASSERTION_PROPNAME);
+        }
+    }
+}
\ No newline at end of file

Added: 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/NotApplicableAssertion.csx
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/NotApplicableAssertion.csx?rev=612874&view=auto
==============================================================================
--- 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/NotApplicableAssertion.csx
 (added)
+++ 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/NotApplicableAssertion.csx
 Thu Jan 17 09:13:11 2008
@@ -0,0 +1,111 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+using log4net;
+
+using uk.co.thebadgerset.junit.extensions.util.ParsedProperties;
+
+namespace Apache.Qpid.Integration.Tests.framework
+{
+    /// <summary>
+    /// NotApplicableAssertion is a messaging assertion that can be used when 
an assertion requested by a test-case is not
+    /// applicable to the testing scenario. For example an assertion may 
relate to AMQP functionality, but a test case may be
+    /// being run over a non-AMQP JMS implementation, in which case the 
request to create the assertion may return this
+    /// instead of the proper assertion. The test framework is configurable to 
quietly drop these assertions, log them
+    /// as warnings to the console, or raise them as test failures.
+    ///
+    /// <p/><table id="crc"><caption>CRC Card</caption>
+    /// <tr><th> Responsibilities <th> Collaborations
+    /// <tr><td> Quitely pass.
+    /// <tr><td> Log a warning.
+    /// <tr><td> Raise a test failure.
+    /// </table>
+    /// </summary>
+    public class NotApplicableAssertion : Assertion
+    {
+        /// <summary> Used for logging to the console. </summary>
+        private static ILog console = LogManager.GetLogger("CONSOLE." + 
NotApplicableAssertion.class.getName());
+
+        /// <summary> The possible behavioural modes of this assertion. 
</summary>
+        private enum Mode
+        {
+            /// <summary> Quietly ignore the assertion by passing. </summary>
+            Quiet,
+
+            /// <summary> Ignore the assertion by passing but log a warning 
about it. </summary>
+            Warn,
+
+            /// <summary> Fail the assertion. </summary>
+            Fail;
+        }
+
+        /// <summary> The behavioural mode of the assertion. </summary>
+        private Mode mode;
+
+        /// <summary>
+        /// Creates an assertion that is driven by the value of the 
'notApplicableAssertion' property of the test
+        /// configuration. Its value should match one of 'quiet', 'warn' or 
'fail' and if it does not it is automatically
+        /// read as 'fail'.
+        /// </summary>
+        /// <param name="testProperties"> The test configuration properties. 
</param>
+        public NotApplicableAssertion(ParsedProperties testProperties)
+        {
+            // Cast the test properties into a typed interface for convenience.
+            MessagingTestConfigProperties props = new 
MessagingTestConfigProperties(testProperties);
+
+            string modeName = props.getNotApplicableAssertionMode();
+
+            if ("quiet".equals(modeName))
+            {
+                mode = Mode.Quiet;
+            }
+            else if ("warn".equals(modeName))
+            {
+                mode = Mode.Warn;
+            }
+            else
+            {
+                mode = Mode.Fail;
+            }
+        }
+
+        /// <summary>
+        /// Applies the assertion.
+        /// </summary>
+        /// <return> <tt>true</tt> if the assertion passes, <tt>false</tt> if 
it fails. </return>
+        public bool apply()
+        {
+            switch (mode)
+            {
+            case Quiet:
+                return true;
+
+            case Warn:
+                console.warn("Warning: Not applicable assertion being 
ignored.");
+
+                return true;
+
+            case Fail:
+            default:
+                return false;
+            }
+        }
+    }
+}
\ No newline at end of file

Added: 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Publisher.csx
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Publisher.csx?rev=612874&view=auto
==============================================================================
--- 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Publisher.csx
 (added)
+++ 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Publisher.csx
 Thu Jan 17 09:13:11 2008
@@ -0,0 +1,72 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+using uk.co.thebadgerset.junit.extensions.util.ParsedProperties;
+
+namespace Apache.Qpid.Integration.Tests.framework
+{
+    /// <summary>
+    /// A Publisher represents the status of the publishing side of a test 
circuit. Its main purpose is to provide assertions
+    /// that can be applied to test the behaviour of the publishers.
+    ///
+    /// <p/><table id="crc"><caption>CRC Card</caption>
+    /// <tr><th> Responsibilities
+    /// <tr><td> Provide assertion that the publishers received no exceptions.
+    /// </table>
+    /// </summary>
+    ///
+    /// <remarks> There are mixtures of AMQP and JMS assertions in this 
interface. Either keep them here, but quietly (or with a
+    ///       warning or error) drop them from test cases where they are not 
relevant, or push them down into sub-classes.
+    ///       I am tempted to go with the dropping/warning/error approach, 
that would imply that it makes sense to pull
+    ///       the assertions back from AMQPPublisher to here.</remarks>
+    public interface Publisher
+    {
+        // Assertions that are meaningfull to AMQP and to JMS.
+
+        /// <summary>
+        /// Provides an assertion that the publisher encountered no exceptions.
+        /// </summary>
+        /// <param name="testProps"> The test configuration properties. 
</param>
+        ///
+        /// <return> An assertion that the publisher encountered no 
exceptions. </return>
+        public Assertion noExceptionsAssertion(ParsedProperties testProps);
+
+        // Assertions that are meaningfull only to AMQP.
+
+        /// <summary>
+        /// Provides an assertion that the AMQP channel was forcibly closed by 
an error condition.
+        /// </summary>
+        /// <param name="testProps"> The test configuration properties. 
</param>
+        ///
+        /// <return> An assertion that the AMQP channel was forcibly closed by 
an error condition. </return>
+        public Assertion channelClosedAssertion(ParsedProperties testProps);
+
+        // Assertions that are meaningfull only to Java/JMS.
+
+        /// <summary>
+        /// Provides an assertion that the publisher got a given exception 
during the test.
+        /// </summary>
+        /// <param name="testProps">      The test configuration properties. 
</param>
+        /// <param name="exceptionClass"> The exception class to check for. 
</param>
+        ///
+        /// <return> An assertion that the publisher got a given exception 
during the test. </return>
+        public Assertion exceptionAssertion(ParsedProperties testProps, 
Class<? extends Exception> exceptionClass);
+    }
+}
\ No newline at end of file

Added: 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Receiver.csx
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Receiver.csx?rev=612874&view=auto
==============================================================================
--- 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Receiver.csx
 (added)
+++ 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/Receiver.csx
 Thu Jan 17 09:13:11 2008
@@ -0,0 +1,88 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+using uk.co.thebadgerset.junit.extensions.util.ParsedProperties;
+
+namespace Apache.Qpid.Integration.Tests.framework
+{
+    /// <summary>
+    /// A Receiver is a <see cref="CircuitEnd"/> that represents the status of 
the receiving side of a test circuit. Its main
+    /// purpose is to provide assertions that can be applied to check the 
behaviour of the receivers.
+    ///
+    /// <p/><table id="crc"><caption>CRC Card</caption>
+    /// <tr><th> Responsibilities
+    /// <tr><td> Provide assertion that the receivers received no exceptions.
+    /// <tr><td> Provide assertion that the receivers received all test 
messages sent to it.
+    /// </table>
+    /// </summary>
+    ///
+    /// <remarks> There are mixtures of AMQP and JMS assertions in this 
interface. Either keep them here, but quietly (or with a
+    ///       warning or error) drop them from test cases where they are not 
relevant, or push them down into sub-classes.
+    ///       I am tempted to go with the dropping/warning/error 
approach.</remarks>
+    public interface Receiver
+    {
+        // Assertions that are meaningfull to AMQP and to JMS.
+
+        /// <summary>
+        /// Provides an assertion that the receivers encountered no exceptions.
+        /// </summary>
+        /// <param name="testProps"> The test configuration properties. 
</param>
+        ///
+        /// <return> An assertion that the receivers encountered no 
exceptions. </return>
+        public Assertion noExceptionsAssertion(ParsedProperties testProps);
+
+        /// <summary>
+        /// Provides an assertion that the receivers got all messages that 
were sent to it.
+        /// </summary>
+        /// <param name="testProps"> The test configuration properties. 
</param>
+        ///
+        /// <return> An assertion that the receivers got all messages that 
were sent to it. </return>
+        public Assertion allMessagesReceivedAssertion(ParsedProperties 
testProps);
+
+        /// <summary>
+        /// Provides an assertion that the receivers got none of the messages 
that were sent to it.
+        /// </summary>
+        /// <param name="testProps"> The test configuration properties. 
</param>
+        ///
+        /// <return> An assertion that the receivers got none of the messages 
that were sent to it. </return>
+        public Assertion noMessagesReceivedAssertion(ParsedProperties 
testProps);
+
+        // Assertions that are meaningfull only to AMQP.
+
+        /// <summary>
+        /// Provides an assertion that the AMQP channel was forcibly closed by 
an error condition.
+        /// </summary>
+        /// <param name="testProps"> The test configuration properties. 
</param>
+        ///
+        /// <return> An assertion that the AMQP channel was forcibly closed by 
an error condition. </return>
+        public Assertion channelClosedAssertion(ParsedProperties testProps);
+
+        // Assertions that are meaningfull only to Java/JMS.
+
+        /// <summary>
+        /// Provides an assertion that the receiver got a given exception 
during the test.
+        /// </summary>
+        /// <param name="testProps"> The test configuration properties. 
</param>
+        /// <param name="exceptionClass"> The exception class to check for. 
</param>
+        ///
+        /// <return> An assertion that the receiver got a given exception 
during the test. </return>
+        public Assertion exceptionAssertion(ParsedProperties testProps, 
Class<? extends Exception> exceptionClass);
+    }
+}
\ No newline at end of file

Added: 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/TestUtils.csx
URL: 
http://svn.apache.org/viewvc/incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/TestUtils.csx?rev=612874&view=auto
==============================================================================
--- 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/TestUtils.csx
 (added)
+++ 
incubator/qpid/branches/M2.1/dotnet/Qpid.Integration.Tests/framework/TestUtils.csx
 Thu Jan 17 09:13:11 2008
@@ -0,0 +1,188 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+using log4net;
+
+using static 
Apache.Qpid.Integration.Tests.framework.MessagingTestConfigProperties.*;
+
+using uk.co.thebadgerset.junit.extensions.util.ParsedProperties;
+
+using javax.jms.*;
+using javax.naming.Context;
+using javax.naming.InitialContext;
+using javax.naming.NamingException;
+
+using System.Collections.Generic.IDictionary;
+
+namespace Apache.Qpid.Integration.Tests.framework
+{
+    /// <summary>
+    /// TestUtils provides static helper methods that are usefull for writing 
tests against QPid.
+    ///
+    /// <p/><table id="crc"><caption>CRC Card</caption>
+    /// <tr><th> Responsibilities <th> Collaborations
+    /// <tr><td> Create connections from test properties. <td> <see 
cref="MessagingTestConfigProperties"/>
+    /// <tr><td> Create test messages.
+    /// <tr><td> Inject a short pause in a test.
+    /// <tr><td> Serialize properties into a message.
+    /// </table>
+    /// </summary>
+    public class TestUtils
+    {
+        /// <summary> Used for debugging. </summary>
+        private static ILog log = LogManager.GetLogger(typeof(TestUtils));
+
+        /// <summary> Some dummy data to stuff all test messages with. 
</summary>
+        private static final byte[] MESSAGE_DATA_BYTES =
+            "Test Message -- Test Message -- Test Message -- Test Message -- 
Test Message -- Test Message -- Test Message -- "
+            .getBytes();
+
+        /// <summary>
+        /// Establishes a JMS connection using a set of properties and qpids 
built in JNDI implementation. This is a simple
+        /// convenience method for code that does not anticipate handling 
connection failures. All exceptions that indicate
+        /// that the connection has failed, are wrapped as rutime exceptions, 
presumably handled by a top level failure
+        /// handler.
+        ///
+        /// <p/>This utility makes use of the following test parameters from 
<see cref="MessagingTestConfigProperties"/> to control
+        /// the connection creation:
+        ///
+        /// <p/><table>
+        /// <tr><td> <see 
cref="MessagingTestConfigProperties#USERNAME_PROPNAME"/> <td> The username.
+        /// <tr><td> <see 
cref="MessagingTestConfigProperties#PASSWORD_PROPNAME"/> <td> The password.
+        /// <tr><td> <see 
cref="MessagingTestConfigProperties#VIRTUAL_HOST_PROPNAME"/> <td> The virtual 
host name.
+        /// <tr><td> <see 
cref="MessagingTestConfigProperties#BROKER_PROPNAME"/> <td> The broker URL.
+        /// <tr><td> <see 
cref="MessagingTestConfigProperties#CONNECTION_NAME"/> <td> The broker name in 
the initial context.
+        /// </summary>
+        /// <param name="messagingProps"> Connection properties as defined in 
<see cref="MessagingTestConfigProperties"/>. </param>
+        ///
+        /// <return> A JMS conneciton. </return>
+        public static Connection createConnection(ParsedProperties 
messagingProps)
+        {
+            log.debug("public static Connection 
createConnection(ParsedProperties messagingProps = " + messagingProps
+                      + "): called");
+
+            try
+            {
+                // Extract the configured connection properties from the test 
configuration.
+                string conUsername = 
messagingProps.getProperty(USERNAME_PROPNAME);
+                string conPassword = 
messagingProps.getProperty(PASSWORD_PROPNAME);
+                string virtualHost = 
messagingProps.getProperty(VIRTUAL_HOST_PROPNAME);
+                string brokerUrl = messagingProps.getProperty(BROKER_PROPNAME);
+
+                // Create the broker connection url.
+                string connectionstring =
+                    "amqp://" + conUsername + ":" + conPassword + "@clientid/" 
+ ((virtualHost != null) ? virtualHost : "")
+                    + "?brokerlist='" + brokerUrl + "'";
+
+                // Create properties to create the initial context from, and 
inject the connection factory configuration
+                // for the defined connection name into it.
+                messagingProps.setProperty("connectionfactory." + 
CONNECTION_NAME, connectionString);
+
+                Context ctx = new InitialContext(messagingProps);
+
+                ConnectionFactory cf = (ConnectionFactory) 
ctx.lookup(CONNECTION_NAME);
+
+                return cf.createConnection();
+            }
+            catch (NamingException e)
+            {
+                throw new RuntimeException("Got JNDI NamingException whilst 
looking up the connection factory.", e);
+            }
+            catch (JMSException e)
+            {
+                throw new RuntimeException("Could not establish connection due 
to JMSException.", e);
+            }
+        }
+
+        /// <summary>
+        /// Creates a test message of the specified size, on the given JMS 
session.
+        /// </summary>
+        /// <param name="session"> The JMS session. </param>
+        /// <param name="size">    The size of the message in bytes. </param>
+        ///
+        /// <return> A bytes message, of the specified size, filled with dummy 
data. </return>
+        ///
+        /// <exception cref="JMSException"> Any underlying JMSExceptions are 
allowed to fall through. </exception>
+        public static Message createTestMessageOfSize(Session session, int 
size) throws JMSException
+        {
+            BytesMessage message = session.createBytesMessage();
+
+            if (size > 0)
+            {
+                int div = MESSAGE_DATA_BYTES.length / size;
+                int mod = MESSAGE_DATA_BYTES.length % size;
+
+                for (int i = 0; i < div; i++)
+                {
+                    message.writeBytes(MESSAGE_DATA_BYTES);
+                }
+
+                if (mod != 0)
+                {
+                    message.writeBytes(MESSAGE_DATA_BYTES, 0, mod);
+                }
+            }
+
+            return message;
+        }
+
+        /// <summary>
+        /// Pauses for the specified length of time. In the event of failing 
to pause for at least that length of time
+        /// due to interuption of the thread, a RutimeException is raised to 
indicate the failure. The interupted status
+        /// of the thread is restores in that case. This method should only be 
used when it is expected that the pause
+        /// will be succesfull, for example in test code that relies on 
inejecting a pause.
+        /// </summary>
+        /// <param name="t"> The minimum time to pause for in milliseconds. 
</param>
+        public static void pause(long t)
+        {
+            try
+            {
+                Thread.sleep(t);
+            }
+            catch (InterruptedException e)
+            {
+                // Restore the interrupted status
+                Thread.currentThread().interrupt();
+
+                throw new RuntimeException("Failed to generate the requested 
pause length.", e);
+            }
+        }
+
+        /// <summary>
+        /// Sets properties of different types on a JMS Message.
+        /// </summary>
+        /// <param name="message">    The message to set properties on. 
</param>
+        /// <param name="properties"> The property name/value pairs to set. 
</param>
+        ///
+        /// <exception cref="javax.jms.JMSException"> All underlying 
JMSExceptions are allowed to fall through. </exception>
+        ///
+        /// <remarks> Move this helper method somewhere else. For example, 
TestUtils.</remarks>
+        public static void setPropertiesOnMessage(Message message, Map<Object, 
Object> properties) throws JMSException
+        {
+            for (Map.Entry<Object, Object> entry : properties.entrySet())
+            {
+                string name = entry.getKey().ToString();
+                Object value = entry.getValue();
+
+                message.setObjectProperty(name, value);
+            }
+        }
+    }
+}
\ No newline at end of file


Reply via email to