diff options
| author | Robert Gemmell <robbie@apache.org> | 2012-04-04 16:15:04 +0000 |
|---|---|---|
| committer | Robert Gemmell <robbie@apache.org> | 2012-04-04 16:15:04 +0000 |
| commit | cd490267f429405a14e033089d244c9c52c48fe4 (patch) | |
| tree | 90329a1f2967a8bb0e9692f1af0e57ff11c6d0ef /qpid/java/systests/src | |
| parent | 8ea49185740bea4d7260c883aed20f2b5be89a0b (diff) | |
| download | qpid-python-cd490267f429405a14e033089d244c9c52c48fe4.tar.gz | |
QPID-3929: remove old perftests + integrationtests + junit-toolkit modules and associated files
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1309476 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java/systests/src')
53 files changed, 0 insertions, 9447 deletions
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java deleted file mode 100644 index 4a92f04b30..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/server/exchange/MessagingTestConfigProperties.java +++ /dev/null @@ -1,300 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.server.exchange; - -import org.apache.qpid.jms.Session; -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -/** - * 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 receiver 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> - */ -public class MessagingTestConfigProperties -{ - // ====================== Connection Properties ================================== - - /** Holds the name of the default connection configuration. */ - public static final String CONNECTION_NAME = "broker"; - - /** Holds the name of the property to get the initial context factory name from. */ - public static final String INITIAL_CONTEXT_FACTORY_PROPNAME = "java.naming.factory.initial"; - - /** Defines the class to use as the initial context factory by default. */ - public static final String INITIAL_CONTEXT_FACTORY_DEFAULT = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory"; - - /** Holds the name of the default connection factory configuration property. */ - public static final String CONNECTION_PROPNAME = "connectionfactory.broker"; - - /** Holds the name of the property to get the test broker url from. */ - public static final String BROKER_PROPNAME = "qpid.test.broker"; - - /** Holds the name of the property to get the test broker virtual path. */ - public static final String VIRTUAL_HOST_PROPNAME = "virtualHost"; - - /** Holds the default virtual path for the test. */ - public static final String VIRTUAL_HOST_DEFAULT = ""; - - /** Holds the name of the property to get the broker access username from. */ - public static final String USERNAME_PROPNAME = "username"; - - /** Holds the default broker log on username. */ - public static final String USERNAME_DEFAULT = "guest"; - - /** Holds the name of the property to get the broker access password from. */ - public static final String PASSWORD_PROPNAME = "password"; - - /** Holds the default broker log on password. */ - public static final String PASSWORD_DEFAULT = "guest"; - - // ====================== Messaging Topology Properties ========================== - - /** Holds the name of the property to get the bind publisher procuder flag from. */ - public static final String PUBLISHER_PRODUCER_BIND_PROPNAME = "publisherProducerBind"; - - /** Holds the default value of the publisher producer flag. */ - public static final boolean PUBLISHER_PRODUCER_BIND_DEFAULT = true; - - /** Holds the name of the property to get the bind publisher procuder flag from. */ - public static final String PUBLISHER_CONSUMER_BIND_PROPNAME = "publisherConsumerBind"; - - /** Holds the default value of the publisher consumer flag. */ - public static final boolean PUBLISHER_CONSUMER_BIND_DEFAULT = false; - - /** Holds the name of the property to get the bind receiver procuder flag from. */ - public static final String RECEIVER_PRODUCER_BIND_PROPNAME = "receiverProducerBind"; - - /** Holds the default value of the receiver producer flag. */ - public static final boolean RECEIVER_PRODUCER_BIND_DEFAULT = false; - - /** Holds the name of the property to get the bind receiver procuder flag from. */ - public static final String RECEIVER_CONSUMER_BIND_PROPNAME = "receiverConsumerBind"; - - /** Holds the default value of the receiver consumer flag. */ - public static final boolean RECEIVER_CONSUMER_BIND_DEFAULT = true; - - /** Holds the name of the property to get the destination name root from. */ - public static final String SEND_DESTINATION_NAME_ROOT_PROPNAME = "sendDestinationRoot"; - - /** Holds the root of the name of the default destination to send to. */ - public static final String SEND_DESTINATION_NAME_ROOT_DEFAULT = "sendTo"; - - /** Holds the name of the property to get the destination name root from. */ - public static final String RECEIVE_DESTINATION_NAME_ROOT_PROPNAME = "receiveDestinationRoot"; - - /** Holds the root of the name of the default destination to send to. */ - public static final String RECEIVE_DESTINATION_NAME_ROOT_DEFAULT = "receiveFrom"; - - /** Holds the name of the proeprty to get the destination count from. */ - public static final String DESTINATION_COUNT_PROPNAME = "destinationCount"; - - /** Defines the default number of destinations to ping. */ - public static final int DESTINATION_COUNT_DEFAULT = 1; - - /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */ - public static final String PUBSUB_PROPNAME = "pubsub"; - - /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */ - public static final boolean PUBSUB_DEFAULT = false; - - // ====================== JMS Options and Flags ================================= - - /** Holds the name of the property to get the test delivery mode from. */ - public static final String PERSISTENT_MODE_PROPNAME = "persistent"; - - /** Holds the message delivery mode to use for the test. */ - public static final boolean PERSISTENT_MODE_DEFAULT = false; - - /** Holds the name of the property to get the test transactional mode from. */ - public static final String TRANSACTED_PROPNAME = "transacted"; - - /** Holds the transactional mode to use for the test. */ - public static final boolean TRANSACTED_DEFAULT = false; - - /** Holds the name of the property to set the no local flag from. */ - public static final String NO_LOCAL_PROPNAME = "noLocal"; - - /** Defines the default value of the no local flag to use when consuming messages. */ - public static final boolean NO_LOCAL_DEFAULT = false; - - /** Holds the name of the property to get the message acknowledgement mode from. */ - public static final String ACK_MODE_PROPNAME = "ackMode"; - - /** Defines the default message acknowledgement mode. */ - public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE; - - /** Holds the name of the property to get the durable subscriptions flag from, when doing pub/sub messaging. */ - public static final String DURABLE_SUBSCRIPTION_PROPNAME = "durableSubscription"; - - /** Defines the default value of the durable subscriptions flag. */ - public static final boolean DURABLE_SUBSCRIPTION_DEFAULT = false; - - // ====================== Qpid Options and Flags ================================ - - /** Holds the name of the property to set the exclusive flag from. */ - public static final String EXCLUSIVE_PROPNAME = "exclusive"; - - /** Defines the default value of the exclusive flag to use when consuming messages. */ - public static final boolean EXCLUSIVE_DEFAULT = false; - - /** Holds the name of the property to set the immediate flag from. */ - public static final String IMMEDIATE_PROPNAME = "immediate"; - - /** Defines the default value of the immediate flag to use when sending messages. */ - public static final boolean IMMEDIATE_DEFAULT = false; - - /** Holds the name of the property to set the mandatory flag from. */ - public static final String MANDATORY_PROPNAME = "mandatory"; - - /** Defines the default value of the mandatory flag to use when sending messages. */ - public static final boolean MANDATORY_DEFAULT = false; - - /** Holds the name of the property to get the durable destinations flag from. */ - public static final String DURABLE_DESTS_PROPNAME = "durableDests"; - - /** Default value for the durable destinations flag. */ - public static final boolean DURABLE_DESTS_DEFAULT = false; - - /** Holds the name of the proeprty to set the prefetch size from. */ - public static final String PREFECTH_PROPNAME = "prefetch"; - - /** Defines the default prefetch size to use when consuming messages. */ - public static final int PREFETCH_DEFAULT = 100; - - // ====================== Common Test Parameters ================================ - - /** Holds the name of the property to get the test message size from. */ - public static final String MESSAGE_SIZE_PROPNAME = "messageSize"; - - /** Used to set up a default message size. */ - public static final int MESSAGE_SIZE_DEAFULT = 0; - - /** Holds the name of the property to get the message rate from. */ - public static final String RATE_PROPNAME = "rate"; - - /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */ - public static final int RATE_DEFAULT = 0; - - /** Holds the name of the proeprty to get the. */ - public static final String SELECTOR_PROPNAME = "selector"; - - /** Holds the default message selector. */ - public static final String SELECTOR_DEFAULT = ""; - - /** Holds the name of the property to get the waiting timeout for response messages. */ - public static final String TIMEOUT_PROPNAME = "timeout"; - - /** Default time to wait before assuming that a ping has timed out. */ - public static final long TIMEOUT_DEFAULT = 30000; - - /** Holds the name of the property to get the commit batch size from. */ - public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize"; - - /** Defines the default number of pings to send in each transaction when running transactionally. */ - public static final int TX_BATCH_SIZE_DEFAULT = 1; - - /** Holds the name of the property to set the maximum amount of pending message data for a producer to hold. */ - public static final String MAX_PENDING_PROPNAME = "maxPending"; - - /** Defines the default maximum quantity of pending message data to allow producers to hold. */ - public static final int MAX_PENDING_DEFAULT = 0; - - /** Holds the name of the property to get the verbose mode proeprty from. */ - public static final String VERBOSE_PROPNAME = "verbose"; - - /** Holds the default verbose mode. */ - public static final boolean VERBOSE_DEFAULT = false; - - /** Holds the default configuration properties. */ - public static ParsedProperties defaults = new ParsedProperties(); - - static - { - defaults.setPropertyIfNull(INITIAL_CONTEXT_FACTORY_PROPNAME, INITIAL_CONTEXT_FACTORY_DEFAULT); - defaults.setPropertyIfNull(MESSAGE_SIZE_PROPNAME, MESSAGE_SIZE_DEAFULT); - 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(SEND_DESTINATION_NAME_ROOT_PROPNAME, SEND_DESTINATION_NAME_ROOT_DEFAULT); - defaults.setPropertyIfNull(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME, RECEIVE_DESTINATION_NAME_ROOT_DEFAULT); - defaults.setPropertyIfNull(PERSISTENT_MODE_PROPNAME, PERSISTENT_MODE_DEFAULT); - defaults.setPropertyIfNull(TRANSACTED_PROPNAME, TRANSACTED_DEFAULT); - defaults.setPropertyIfNull(VIRTUAL_HOST_PROPNAME, VIRTUAL_HOST_DEFAULT); - defaults.setPropertyIfNull(RATE_PROPNAME, RATE_DEFAULT); - defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT); - defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT); - defaults.setPropertyIfNull(USERNAME_PROPNAME, USERNAME_DEFAULT); - defaults.setPropertyIfNull(PASSWORD_PROPNAME, PASSWORD_DEFAULT); - defaults.setPropertyIfNull(SELECTOR_PROPNAME, SELECTOR_DEFAULT); - defaults.setPropertyIfNull(DESTINATION_COUNT_PROPNAME, DESTINATION_COUNT_DEFAULT); - defaults.setPropertyIfNull(TIMEOUT_PROPNAME, TIMEOUT_DEFAULT); - defaults.setPropertyIfNull(TX_BATCH_SIZE_PROPNAME, TX_BATCH_SIZE_DEFAULT); - defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT); - defaults.setPropertyIfNull(ACK_MODE_PROPNAME, ACK_MODE_DEFAULT); - defaults.setPropertyIfNull(DURABLE_SUBSCRIPTION_PROPNAME, DURABLE_SUBSCRIPTION_DEFAULT); - defaults.setPropertyIfNull(MAX_PENDING_PROPNAME, MAX_PENDING_DEFAULT); - defaults.setPropertyIfNull(PREFECTH_PROPNAME, PREFETCH_DEFAULT); - defaults.setPropertyIfNull(NO_LOCAL_PROPNAME, NO_LOCAL_DEFAULT); - defaults.setPropertyIfNull(EXCLUSIVE_PROPNAME, EXCLUSIVE_DEFAULT); - defaults.setPropertyIfNull(IMMEDIATE_PROPNAME, IMMEDIATE_DEFAULT); - defaults.setPropertyIfNull(MANDATORY_PROPNAME, MANDATORY_DEFAULT); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java deleted file mode 100644 index 13465741bd..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AMQPPublisher.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -/** - * An AMQPPublisher represents the status of the publishing side of a test circuit that exposes AMQP specific features. - * Its provides additional assertions not available through the plain JMS {@link Publisher} interface. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Provide assertion that the publishers received a no consumers error code on every message. - * <tr><td> Provide assertion that the publishers received a no route error code on every message. - * </table> - */ -public interface AMQPPublisher extends Publisher -{ - /** - * Provides an assertion that the publisher got a no consumers exception on every message. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the publisher got a no consumers exception on every message. - */ - Assertion noConsumersAssertion(ParsedProperties testProps); - - /** - * Provides an assertion that the publisher got a no rout exception on every message. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the publisher got a no rout exception on every message. - */ - Assertion noRouteAssertion(ParsedProperties testProps); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java deleted file mode 100644 index 60d54f1f6f..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Assertion.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -/** - * Assertion models an assertion on a test {@link Circuit}. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Indicate whether or not the assertion passes when applied. - * </table> - */ -public interface Assertion -{ - /** - * Applies the assertion. - * - * @return <tt>true</tt> if the assertion passes, <tt>false</tt> if it fails. - */ - public boolean apply(); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java deleted file mode 100644 index 0bb4911d4c..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/AssertionBase.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import java.util.LinkedList; -import java.util.List; - -/** - * AssertionBase is a base class for implenmenting assertions. It provides a mechanism to store error messages, and - * report all error messages when its {@link #toString()} method is called. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Collect error messages. - * </table> - */ -public abstract class AssertionBase implements Assertion -{ - /** Holds the error messages. */ - List<String> errors = new LinkedList<String>(); - - /** - * Adds an error message to the assertion. - * - * @param error An error message to add to the assertion. - */ - public void addError(String error) - { - errors.add(error); - } - - /** - * Prints all of the error messages in the assertion into a string. - * - * @return All of the error messages in the assertion as a string. - */ - public String toString() - { - String result = ""; - - for (String error : errors) - { - result += error; - } - - return result; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java deleted file mode 100644 index 41614f92fc..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/BrokerLifecycleAware.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -/** - * BrokerLifecycleAware is an awareness interface implemented by test cases that can run control the life-cycle of - * the brokers on which they run. Its purpose is to expose additional instrumentation of brokers during testing, that - * enables tests to use an automated failure mechanism to simulate broker failures, and to re-start failed brokers. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Indicate whether or not a test case is using an in-vm broker. - * <tr><td> Track which in-vm broker is currently in use. - * <tr><td> Accept setting of a failure mechanism. <td> {@link CauseFailure}. - * </table> - * - * @todo Need to think about how to present the brokers through this interface. Thinking numbering the available - * brokers from 1 will do. Then can kill 1 and assume failing onto 2. Restart 1 and kill 2 and fail back onto - * 1 again? - */ -public interface BrokerLifecycleAware -{ - public void setInVmBrokers(); - - /** - * Indicates whether or not a test case is using in-vm brokers. - * - * @return <tt>true</tt> if the test is using in-vm brokers, <tt>false</tt> otherwise. - */ - public boolean usingInVmBroker(); - - /** - * Sets the currently live in-vm broker. - * - * @param i The currently live in-vm broker. - */ - public void setLiveBroker(int i); - - /** - * Reports the currently live in-vm broker. - * - * @return The currently live in-vm broker. - */ - public int getLiveBroker(); - - /** - * Accepts a failure mechanism. - * - * @param failureMechanism The failure mechanism. - */ - public void setFailureMechanism(CauseFailure failureMechanism); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java deleted file mode 100644 index 9bdd5a72c5..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailure.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -/** - * CauseFailure provides a method to cause a failure in a messaging broker, usually used in conjunction with fail-over - * or other failure mode testing. In some cases failures may be automated, for example by shutting down an in-vm broker, - * or by sending a special control signal to a broker over a network connection. In other cases, it may be preferable - * to ask a user interactively to cause a failure scenario, in which case an implementation may display a prompt or - * dialog box asking for notification once the failure has been caused. The purpose of this interface is to abstract - * the exact cause and nature of a failure out of failure test cases. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Cause messaging broker failure. - * </table> - */ -public interface CauseFailure -{ - /** - * Causes the active message broker to fail. - */ - void causeFailure(); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java deleted file mode 100644 index 118ddff48b..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CauseFailureUserPrompt.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import java.io.IOException; - -/** - * Causes a message broker failure by interactively prompting the user to cause it. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Cause messaging broker failure. - * </table> - */ -public class CauseFailureUserPrompt implements CauseFailure -{ - /** - * Causes the active message broker to fail. - */ - public void causeFailure() - { - waitForUser("Cause a broker failure now, then press Return."); - } - - /** - * Outputs a prompt to the console and waits for the user to press return. - * - * @param prompt The prompt to display on the console. - */ - private void waitForUser(String prompt) - { - System.out.println(prompt); - - try - { - System.in.read(); - } - catch (IOException e) - { - // Ignored. - } - - System.out.println("Continuing."); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java deleted file mode 100644 index 4f9ab1a273..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Circuit.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import java.util.List; - -/** - * A Circuit is the basic test unit against which test cases are to be written. A circuit consists of two 'ends', an - * instigating 'publisher' end and a more passive 'receivers' end. - * - * <p/>Once created, the life-cycle of a circuit may be controlled by {@link #start()}ing it, or {@link #close()}ing it. - * Once started, the circuit is ready to send messages over. Once closed the circuit can no longer be used. - * - * <p/>The state of the circuit may be taken with the {@link #check()} method, and asserted against by the - * {@link #applyAssertions(java.util.List)} method. - * - * <p/>There is a default test procedure which may be performed against the circuit. The outline of this procedure is: - * - * <p/><pre> - * Start the circuit. - * Send test messages. - * Request a status report. - * Assert conditions on the publishing end of the circuit. - * Assert conditions on the receiving end of the circuit. - * Close the circuit. - * Pass with no failed assertions or fail with a list of failed assertions. - * </pre> - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Supply the publishing and receiving ends of a test messaging circuit. - * <tr><td> Start the circuit running. - * <tr><td> Close the circuit down. - * <tr><td> Take a reading of the circuits state. - * <tr><td> Apply assertions against the circuits state. - * <tr><td> Send test messages over the circuit. - * <tr><td> Perform the default test procedue on the circuit. - * </table> - */ -public interface Circuit -{ - /** - * Gets the interface on the publishing end of the circuit. - * - * @return The publishing end of the circuit. - */ - public Publisher getPublisher(); - - /** - * Gets the interface on the receiving end of the circuit. - * - * @return The receiving end of the circuit. - */ - public Receiver getReceiver(); - - /** - * Connects and starts the circuit. After this method is called the circuit is ready to send messages. - */ - public void start(); - - /** - * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit, - * into a report, against which assertions may be checked. - */ - public void check(); - - /** - * Closes the circuit. All associated resources are closed. - */ - public void close(); - - /** - * Applied a list of assertions against the test circuit. The {@link #check()} method should be called before doing - * this, to ensure that the circuit has gathered its state into a report to assert against. - * - * @param assertions The list of assertions to apply to the circuit. - * - * @return Any assertions that failed. - */ - public List<Assertion> applyAssertions(List<Assertion> assertions); - - /** - * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold. - * - * @param numMessages The number of messages to send using the default test procedure. - * @param assertions The list of assertions to apply. - * - * @return Any assertions that failed. - */ - public List<Assertion> test(int numMessages, List<Assertion> assertions); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java deleted file mode 100644 index ffde385cfc..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEnd.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; - -/** - * A CircuitEnd is a pair consisting of one message producer and one message consumer, that represents one end of a - * test circuit. It is a standard unit of connectivity allowing a full-duplex conversation to be held, provided both - * the consumer and producer are instantiated and configured. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Provide a message producer for sending messages. - * <tr><td> Provide a message consumer for receiving messages. - * </table> - * - * @todo Update the {@link org.apache.qpid.test.utils.ConversationFactory} so that it accepts these as the basic conversation - * connection units. - */ -public interface CircuitEnd -{ - /** - * Gets the message producer at this circuit end point. - * - * @return The message producer at with this circuit end point. - */ - public MessageProducer getProducer(); - - /** - * Gets the message consumer at this circuit end point. - * - * @return The message consumer at this circuit end point. - */ - public MessageConsumer getConsumer(); - - /** - * Send the specified message over the producer at this end point. - * - * @param message The message to send. - * - * @throws JMSException Any JMS exception occuring during the send is allowed to fall through. - */ - public void send(Message message) throws JMSException; - - /** - * Gets the JMS Session associated with this circuit end point. - * - * @return The JMS Session associated with this circuit end point. - */ - public Session getSession(); - - /** - * Closes the message producers and consumers and the sessions, associated with this circuit end point. - * - * @throws JMSException Any JMSExceptions occurring during the close are allowed to fall through. - */ - public void close() throws JMSException; - - /** - * Returns the message monitor for reporting on received messages on this circuit end. - * - * @return The message monitor for this circuit end. - */ - public MessageMonitor getMessageMonitor(); - - /** - * Returns the exception monitor for reporting on exceptions received on this circuit end. - * - * @return The exception monitor for this circuit end. - */ - public ExceptionMonitor getExceptionMonitor(); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java deleted file mode 100644 index 5730752eae..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/CircuitEndBase.java +++ /dev/null @@ -1,156 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; - -/** - * A CircuitEndBase is a pair consisting of one message producer and one message consumer, that represents one end of a - * test circuit. It is a standard unit of connectivity allowing a full-duplex conversation to be held, provided both - * the consumer and producer are instantiated and configured. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Provide a message producer for sending messages. - * <tr><td> Provide a message consumer for receiving messages. - * </table> - */ -public class CircuitEndBase implements CircuitEnd -{ - /** Holds the single message producer. */ - MessageProducer producer; - - /** Holds the single message consumer. */ - MessageConsumer consumer; - - /** Holds the controlSession for the circuit end. */ - Session session; - - /** Holds the message monitor for the circuit end. */ - MessageMonitor messageMonitor; - - /** Holds the exception monitor for the circuit end. */ - ExceptionMonitor exceptionMonitor; - - /** - * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured - * for messages and exceptions received by the circuit end. - * - * @param producer The message producer for the circuit end point. - * @param consumer The message consumer for the circuit end point. - * @param session The controlSession for the circuit end point. - * @param messageMonitor The monitor to notify of all messages received by the circuit end. - * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end. - */ - public CircuitEndBase(MessageProducer producer, MessageConsumer consumer, Session session, MessageMonitor messageMonitor, - ExceptionMonitor exceptionMonitor) - { - this.producer = producer; - this.consumer = consumer; - this.session = session; - - this.messageMonitor = messageMonitor; - this.exceptionMonitor = exceptionMonitor; - } - - /** - * Gets the message producer at this circuit end point. - * - * @return The message producer at with this circuit end point. - */ - public MessageProducer getProducer() - { - return producer; - } - - /** - * Gets the message consumer at this circuit end point. - * - * @return The message consumer at this circuit end point. - */ - public MessageConsumer getConsumer() - { - return consumer; - } - - /** - * Send the specified message over the producer at this end point. - * - * @param message The message to send. - * @throws javax.jms.JMSException Any JMS exception occuring during the send is allowed to fall through. - */ - public void send(Message message) throws JMSException - { - producer.send(message); - } - - /** - * Gets the JMS Session associated with this circuit end point. - * - * @return The JMS Session associated with this circuit end point. - */ - public Session getSession() - { - return session; - } - - /** - * Closes the message producers and consumers and the sessions, associated with this circuit end point. - * - * @throws javax.jms.JMSException Any JMSExceptions occurring during the close are allowed to fall through. - */ - public void close() throws JMSException - { - if (producer != null) - { - producer.close(); - } - - if (consumer != null) - { - consumer.close(); - } - } - - /** - * Returns the message monitor for reporting on received messages on this circuit end. - * - * @return The message monitor for this circuit end. - */ - public MessageMonitor getMessageMonitor() - { - return messageMonitor; - } - - /** - * Returns the exception monitor for reporting on exceptions received on this circuit end. - * - * @return The exception monitor for this circuit end. - */ - public ExceptionMonitor getExceptionMonitor() - { - return exceptionMonitor; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java deleted file mode 100644 index 78b5a72c1f..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/DropInTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import javax.jms.JMSException; -import javax.jms.Message; - -/** - * A DropIn test is a test case that can accept late joining test clients into a running test. This can be usefull, - * for interactive experimentation. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Accept late joining test clients. - * </table> - */ -public interface DropInTest -{ - /** - * Should accept a late joining client into a running test case. The client will be enlisted with a control message - * with the 'CONTROL_TYPE' field set to the value 'LATEJOIN'. It should also provide values for the fields: - * - * <p/><table> - * <tr><td> CLIENT_NAME <td> A unique name for the new client. - * <tr><td> CLIENT_PRIVATE_CONTROL_KEY <td> The key for the route on which the client receives its control messages. - * </table> - * - * @param message The late joiners join message. - * - * @throws JMSException Any JMS Exception are allowed to fall through, indicating that the join failed. - */ - public void lateJoin(Message message) throws JMSException; -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java deleted file mode 100644 index afb7b5bc5b..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/ExceptionMonitor.java +++ /dev/null @@ -1,204 +0,0 @@ -/* - * - * 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 -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.log4j.Logger; - -import javax.jms.ExceptionListener; -import javax.jms.JMSException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.List; - -/** - * An exception monitor, listens for JMS exception on a connection or consumer. It record all exceptions that it receives - * and provides methods to test the number and type of exceptions received. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Record all exceptions received. - * </table> - */ -public class ExceptionMonitor implements ExceptionListener -{ - /** Used for debugging. */ - private final Logger log = Logger.getLogger(ExceptionMonitor.class); - - /** Holds the received exceptions. */ - private List<Exception> exceptions = new ArrayList<Exception>(); - - /** - * Receives incoming exceptions. - * - * @param e The exception to record. - */ - public synchronized void onException(JMSException e) - { - log.debug("public void onException(JMSException e): called", e); - - exceptions.add(e); - } - - /** - * Checks that no exceptions have been received. - * - * @return <tt>true</tt> if no exceptions have been received, <tt>false</tt> otherwise. - */ - public synchronized boolean assertNoExceptions() - { - return exceptions.isEmpty(); - } - - /** - * Checks that exactly one exception has been received. - * - * @return <tt>true</tt> if exactly one exception been received, <tt>false</tt> otherwise. - */ - public synchronized boolean assertOneJMSException() - { - return exceptions.size() == 1; - } - - /** - * Checks that exactly one exception, with a linked cause of the specified type, has been received. - * - * @param aClass The type of the linked cause. - * - * @return <tt>true</tt> if exactly one exception, with a linked cause of the specified type, been received, - * <tt>false</tt> otherwise. - */ - public synchronized boolean assertOneJMSExceptionWithLinkedCause(Class aClass) - { - if (exceptions.size() == 1) - { - Exception e = exceptions.get(0); - - if (e instanceof JMSException) - { - JMSException jmse = (JMSException) e; - - Exception linkedCause = jmse.getLinkedException(); - - if ((linkedCause != null) && aClass.isInstance(linkedCause)) - { - return true; - } - } - } - - return false; - } - - /** - * Checks that at least one exception of the the specified type, has been received. - * - * @param exceptionClass The type of the exception. - * - * @return <tt>true</tt> if at least one exception of the specified type has been received, <tt>false</tt> otherwise. - */ - public synchronized boolean assertExceptionOfType(Class exceptionClass) - { - // Start by assuming that the exception has no been received. - boolean passed = false; - - // Scan all the exceptions for a match. - for (Exception e : exceptions) - { - if (exceptionClass.isInstance(e)) - { - passed = true; - - break; - } - } - - return passed; - } - - /** - * Reports the number of exceptions held by this monitor. - * - * @return The number of exceptions held by this monitor. - */ - public synchronized int size() - { - return exceptions.size(); - } - - /** - * Clears the record of received exceptions. - */ - public synchronized void reset() - { - exceptions = new ArrayList<Exception>(); - } - - /** - * Provides a dump of the stack traces of all exceptions that this exception monitor was notified of. Mainly - * use for debugging/test failure reporting purposes. - * - * @return A string containing a dump of the stack traces of all exceptions. - */ - public synchronized String toString() - { - String result = "ExceptionMonitor: holds " + exceptions.size() + " exceptions.\n\n"; - - for (Exception ex : exceptions) - { - result += getStackTrace(ex) + "\n"; - } - - return result; - } - - /** - * Prints an exception stack trace into a string. - * - * @param t The throwable to get the stack trace from. - * - * @return A string containing the throwables stack trace. - */ - public static String getStackTrace(Throwable t) - { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw, true); - t.printStackTrace(pw); - pw.flush(); - sw.flush(); - - return sw.toString(); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java deleted file mode 100644 index ecbb710a6b..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkBaseCase.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.log4j.Logger; -import org.apache.log4j.NDC; - -import org.apache.qpid.junit.extensions.SetupTaskAware; -import org.apache.qpid.junit.extensions.SetupTaskHandler; -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.junit.extensions.util.TestContextProperties; -import org.apache.qpid.test.framework.sequencers.CircuitFactory; -import org.apache.qpid.test.utils.QpidBrokerTestCase; - -import java.util.ArrayList; -import java.util.List; - -/** - * FrameworkBaseCase provides a starting point for writing test cases against the test framework. Its main purpose is - * to provide some convenience methods for testing. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Create and clean up in-vm brokers on every test case. - * <tr><td> Produce lists of assertions from assertion creation calls. - * <tr><td> Produce JUnit failures from assertion failures. - * <tr><td> Convert failed assertions to error messages. - * </table> - */ -public class FrameworkBaseCase extends QpidBrokerTestCase implements FrameworkTestContext, SetupTaskAware, - BrokerLifecycleAware -{ - /** Used for debugging purposes. */ - private static final Logger log = Logger.getLogger(FrameworkBaseCase.class); - - private CircuitFactory circuitFactory = new LocalAMQPCircuitFactory(); - - private ParsedProperties testProps; - - private SetupTaskHandler taskHandler = new SetupTaskHandler(); - - private boolean isUsingInVM; - - private CauseFailure failureMechanism = new CauseFailureUserPrompt(); - - /** - * Creates a new test case with the specified name. - * - * @param name The test case name. - */ - public FrameworkBaseCase(String name) - { - super(name); - } - - /** Holds the test sequencer to create and run test circuits with. */ /** - * Returns the test case sequencer that provides test circuit, and test sequence implementations. The sequencer - * that this base case returns by default is suitable for running a test circuit with both circuit ends colocated - * on the same JVM. - * - * @return The test case sequencer. - */ - protected CircuitFactory getCircuitFactory() - { - return circuitFactory; - } - - /** - * Overrides the default test circuit factory. Test decorators can use this to supply distributed test sequencers or - * other test circuit factory specializations. - * - * @param circuitFactory The new test circuit factory. - */ - public void setCircuitFactory(CircuitFactory circuitFactory) - { - this.circuitFactory = circuitFactory; - } - - /** - * Reports the current test case name. - * - * @return The current test case name. - */ - public TestCaseVector getTestCaseVector() - { - return new TestCaseVector(this.getName(), 0); - } - - /** - * Reports the current test case parameters. - * - * @return The current test case parameters. - */ - public MessagingTestConfigProperties getTestParameters() - { - return new MessagingTestConfigProperties(testProps); - } - - /** - * Creates a list of assertions. - * - * @param asserts The assertions to compile in a list. - * - * @return A list of assertions. - */ - protected List<Assertion> assertionList(Assertion... asserts) - { - List<Assertion> result = new ArrayList<Assertion>(); - - for (Assertion assertion : asserts) - { - result.add(assertion); - } - - return result; - } - - /** - * Generates a JUnit assertion exception (failure) if any assertions are passed into this method, also concatenating - * all of the error messages in the assertions together to form an error message to diagnose the test failure with. - * - * @param asserts The list of failed assertions. - */ - protected static void assertNoFailures(List<Assertion> asserts) - { - log.debug("protected void assertNoFailures(List<Assertion> asserts = " + asserts + "): called"); - - // Check if there are no assertion failures, and return without doing anything if so. - if ((asserts == null) || asserts.isEmpty()) - { - return; - } - - // Compile all of the assertion failure messages together. - String errorMessage = assertionsToString(asserts); - - // Fail with the error message from all of the assertions. - fail(errorMessage); - } - - /** - * Converts a list of failed assertions into an error message. - * - * @param asserts The failed assertions. - * - * @return The error message. - */ - protected static String assertionsToString(List<Assertion> asserts) - { - String errorMessage = ""; - - for (Assertion assertion : asserts) - { - errorMessage += assertion.toString() + "\n"; - } - - return errorMessage; - } - - /** - * Ensures that the in-vm broker is created and initialized. - * - * @throws Exception Any exceptions allowed to fall through and fail the test. - */ - protected void setUp() throws Exception - { - super.setUp(); - NDC.push(getName()); - - testProps = TestContextProperties.getInstance(MessagingTestConfigProperties.defaults); - } - - /** - * Ensures that the in-vm broker is cleaned up after each test run. - */ - protected void tearDown() - { - NDC.pop(); - - // Process all optional tear down tasks. This may include in-vm broker clean up, if a decorator has added it. - taskHandler.runTearDownTasks(); - } - - /** - * Adds the specified task to the tests setup. - * - * @param task The task to add to the tests setup. - */ - public void chainSetupTask(Runnable task) - { - taskHandler.chainSetupTask(task); - } - - /** - * Adds the specified task to the tests tear down. - * - * @param task The task to add to the tests tear down. - */ - public void chainTearDownTask(Runnable task) - { - taskHandler.chainTearDownTask(task); - } - - /** - * Should provide a translation from the junit method name of a test to its test case name as known to the test - * clients that will run the test. The purpose of this is to convert the JUnit method name into the correct test - * case name to place into the test invite. For example the method "testP2P" might map onto the interop test case - * name "TC2_BasicP2P". - * - * @param methodName The name of the JUnit test method. - * - * @return The name of the corresponding interop test case. - */ - public String getTestCaseNameForTestMethod(String methodName) - { - return methodName; - } - - public void setInVmBrokers() - { - isUsingInVM = true; - } - - /** - * Indicates whether or not a test case is using in-vm brokers. - * - * @return <tt>true</tt> if the test is using in-vm brokers, <tt>false</tt> otherwise. - */ - public boolean usingInVmBroker() - { - return isUsingInVM; - } - - /** - * Sets the currently live in-vm broker. - * - * @param i The currently live in-vm broker. - */ - public void setLiveBroker(int i) - { } - - /** - * Reports the currently live in-vm broker. - * - * @return The currently live in-vm broker. - */ - public int getLiveBroker() - { - return 0; - } - - /** - * Accepts a failure mechanism. - * - * @param failureMechanism The failure mechanism. - */ - public void setFailureMechanism(CauseFailure failureMechanism) - { - this.failureMechanism = failureMechanism; - } - - protected ParsedProperties getTestProps() - { - return testProps; - } - - protected void setTestProps(ParsedProperties testProps) - { - this.testProps = testProps; - } - - protected SetupTaskHandler getTaskHandler() - { - return taskHandler; - } - - protected CauseFailure getFailureMechanism() - { - return failureMechanism; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java deleted file mode 100644 index 9a4668e86f..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/FrameworkTestContext.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -/** - * A FrameworkTestContext provides context information to test code about the current test case being run; its name, its - * parameters. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide the name of the current test case. - * <tr><td> Provide the test parameters. - * </table> - */ -public interface FrameworkTestContext -{ - /** - * Reports the current test case name. - * - * @return The current test case name. - */ - TestCaseVector getTestCaseVector(); - - /** - * Reports the current test case parameters. - * - * @return The current test case parameters. - */ - MessagingTestConfigProperties getTestParameters(); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java deleted file mode 100644 index 899a808bdd..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalAMQPCircuitFactory.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.log4j.Logger; - -import org.apache.qpid.client.AMQSession; -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.localcircuit.LocalAMQPPublisherImpl; -import org.apache.qpid.test.framework.localcircuit.LocalPublisherImpl; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; -import javax.jms.Topic; - -/** - * LocalAMQPCircuitFactory is a test sequencer that creates test circuits with publishing and receiving ends rooted - * on the same JVM, allowing AMQP/Qpid specific options to be applied to the circuit. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide a standard test procedure over a test circuit. - * <tr><td> Construct test circuits appropriate to a tests context. - * <tr><td> Construct test circuits the support AMQP specific options. - * </table> - */ -public class LocalAMQPCircuitFactory extends LocalCircuitFactory -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(LocalAMQPCircuitFactory.class); - - /** - * Builds a circuit end suitable for the publishing side of a test circuit, from standard test parameters. - * - * @param connection The connection to build the circuit end on. - * @param testProps The test parameters to configure the circuit end construction. - * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique. - * - * @return A circuit end suitable for the publishing side of a test circuit. - * - * @throws javax.jms.JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation. - */ - public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId) - throws JMSException - { - log.debug( - "public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = " - + uniqueId + "): called"); - - // Cast the test properties into a typed interface for convenience. - MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps); - - Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode()); - - Destination destination = - props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId) - : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId); - - MessageProducer producer = - props.getPublisherProducerBind() - ? ((props.getImmediate() || props.getMandatory()) - ? ((AMQSession) session).createProducer(destination, props.getMandatory(), props.getImmediate()) - : session.createProducer(destination)) : null; - - MessageConsumer consumer = - props.getPublisherConsumerBind() - ? session.createConsumer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null; - - MessageMonitor messageMonitor = new MessageMonitor(); - - if (consumer != null) - { - consumer.setMessageListener(messageMonitor); - } - - ExceptionMonitor exceptionMonitor = new ExceptionMonitor(); - connection.setExceptionListener(exceptionMonitor); - - if (!props.getPublisherConsumerActive() && (consumer != null)) - { - consumer.close(); - } - - return new CircuitEndBase(producer, consumer, session, messageMonitor, exceptionMonitor); - } - - /** - * Builds a circuit end suitable for the receiving side of a test circuit, from standard test parameters. - * - * @param connection The connection to build the circuit end on. - * @param testProps The test parameters to configure the circuit end construction. - * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique. - * - * @return A circuit end suitable for the receiving side of a test circuit. - * - * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation. - */ - public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId) - throws JMSException - { - log.debug( - "public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = " - + uniqueId + "): called"); - - // Cast the test properties into a typed interface for convenience. - MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps); - - Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode()); - - MessageProducer producer = - props.getReceiverProducerBind() - ? session.createProducer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null; - - Destination destination = - props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId) - : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId); - - MessageConsumer consumer = - props.getReceiverConsumerBind() - ? ((props.getDurableSubscription() && props.getPubsub()) - ? session.createDurableSubscriber((Topic) destination, "testsub") : session.createConsumer(destination)) - : null; - - MessageMonitor messageMonitor = new MessageMonitor(); - - if (consumer != null) - { - consumer.setMessageListener(messageMonitor); - } - - if (!props.getReceiverConsumerActive() && (consumer != null)) - { - consumer.close(); - } - - return new CircuitEndBase(producer, consumer, session, messageMonitor, null); - } - - /** - * Creates a local {@link Publisher} from a {@link CircuitEnd}. The publisher implementation provides AMQP - * specific assertion methods, for testing beyond JMS. - * - * @param publisherEnd The publishing circuit end. - * - * @return A {@link Receiver}. - */ - protected LocalPublisherImpl createPublisherFromCircuitEnd(CircuitEndBase publisherEnd) - { - return new LocalAMQPPublisherImpl(publisherEnd); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java deleted file mode 100644 index b8fd4cc7e7..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/LocalCircuitFactory.java +++ /dev/null @@ -1,320 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.localcircuit.LocalCircuitImpl; -import org.apache.qpid.test.framework.localcircuit.LocalPublisherImpl; -import org.apache.qpid.test.framework.localcircuit.LocalReceiverImpl; -import org.apache.qpid.test.framework.sequencers.CircuitFactory; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; -import javax.jms.Topic; -import java.util.List; -import java.util.Properties; -import java.util.concurrent.atomic.AtomicLong; - -/** - * LocalCircuitFactory is a circuit factory that creates test circuits with publishing and receiving ends rooted - * on the same JVM. The ends of the circuit are presented as {@link Publisher} and {@link Receiver} interfaces, which - * in turn provide methods to apply assertions to the circuit. The creation of the circuit ends, and the presentation - * of the ends as publisher/receiver interfaces, are designed to be overriden, so that circuits and assertions that - * use messaging features not available in JMS can be written. This provides an extension point for writing tests - * against proprietary features of JMS implementations. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide a standard test procedure over a test circuit. - * <tr><td> Construct test circuits appropriate to a tests context. - * </table> - */ -public class LocalCircuitFactory implements CircuitFactory -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(LocalCircuitFactory.class); - - /** Used to create unique destination names for each test. */ - protected static AtomicLong uniqueDestsId = new AtomicLong(); - - /** - * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles, - * begining the test and gathering the test reports from the participants. - * - * @param testCircuit The test circuit. - * @param assertions The list of assertions to apply to the test circuit. - * @param testProperties The test case definition. - */ - public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties) - { - if (testCircuit != null) - { - FrameworkBaseCase.assertNoFailures(testCircuit.test(1, assertions)); - } - } - - /** - * Creates a test circuit for the test, configered by the test parameters specified. - * - * @param testProperties The test parameters. - * - * @return A test circuit. - */ - public Circuit createCircuit(Connection connection, ParsedProperties testProperties) - { - Circuit result; - - // Cast the test properties into a typed interface for convenience. - MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProperties); - - // Create a standard publisher/receivers test client pair on a shared connection, individual sessions. - try - { - // Get a unique offset to append to destination names to make them unique to the connection. - long uniqueId = uniqueDestsId.incrementAndGet(); - - // Add the connection exception listener to assert on exception conditions with. - // ExceptionMonitor exceptionMonitor = new ExceptionMonitor(); - // connection.setExceptionListener(exceptionMonitor); - - // Set up the publisher. - CircuitEndBase publisherEnd = createPublisherCircuitEnd(connection, props, uniqueId); - - // Set up the receiver. - CircuitEndBase receiverEnd = createReceiverCircuitEnd(connection, props, uniqueId); - - // Start listening for incoming messages. - connection.start(); - - // Package everything up. - LocalPublisherImpl publisher = createPublisherFromCircuitEnd(publisherEnd); - LocalReceiverImpl receiver = createReceiverFromCircuitEnd(receiverEnd); - - result = new LocalCircuitImpl(testProperties, publisher, receiver, connection, publisher.getExceptionMonitor()); - } - catch (JMSException e) - { - throw new RuntimeException("Could not create publisher/receivers pair due to a JMSException.", e); - } - - return result; - } - - /** - * Creates a local {@link Receiver} from a {@link CircuitEnd}. Sub-classes may override this to provide more - * specialized receivers if necessary. - * - * @param receiverEnd The receiving circuit end. - * - * @return A {@link Receiver}. - */ - protected LocalReceiverImpl createReceiverFromCircuitEnd(CircuitEndBase receiverEnd) - { - return new LocalReceiverImpl(receiverEnd); - } - - /** - * Creates a local {@link Publisher} from a {@link CircuitEnd}. Sub-classes may override this to provide more - * specialized receivers if necessary. - * - * @param publisherEnd The publishing circuit end. - * - * @return A {@link Receiver}. - */ - protected LocalPublisherImpl createPublisherFromCircuitEnd(CircuitEndBase publisherEnd) - { - return new LocalPublisherImpl(publisherEnd); - } - - /** - * Builds a circuit end suitable for the publishing side of a test circuit, from standard test parameters. - * - * @param connection The connection to build the circuit end on. - * @param testProps The test parameters to configure the circuit end construction. - * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique. - * - * @return A circuit end suitable for the publishing side of a test circuit. - * - * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation. - */ - public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId) - throws JMSException - { - log.debug( - "public CircuitEndBase createPublisherCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = " - + uniqueId + "): called"); - - // Cast the test properties into a typed interface for convenience. - MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps); - - // Check that the test properties do not contain AMQP/Qpid specific settings, and fail if they do. - if (props.getImmediate() || props.getMandatory()) - { - throw new RuntimeException( - "Cannot create a pure JMS circuit as the test properties require AMQP specific options."); - } - - Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode()); - - Destination destination = - props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId) - : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId); - - MessageProducer producer = props.getPublisherProducerBind() ? session.createProducer(destination) : null; - - MessageConsumer consumer = - props.getPublisherConsumerBind() - ? session.createConsumer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null; - - MessageMonitor messageMonitor = new MessageMonitor(); - - if (consumer != null) - { - consumer.setMessageListener(messageMonitor); - } - - ExceptionMonitor exceptionMonitor = new ExceptionMonitor(); - connection.setExceptionListener(exceptionMonitor); - - if (!props.getPublisherConsumerActive() && (consumer != null)) - { - consumer.close(); - } - - return new CircuitEndBase(producer, consumer, session, messageMonitor, exceptionMonitor); - } - - /** - * Builds a circuit end suitable for the receiving side of a test circuit, from standard test parameters. - * - * @param connection The connection to build the circuit end on. - * @param testProps The test parameters to configure the circuit end construction. - * @param uniqueId A unique number to being numbering destinations from, to make this circuit unique. - * - * @return A circuit end suitable for the receiving side of a test circuit. - * - * @throws JMSException Any underlying JMSExceptions are allowed to fall through and fail the creation. - */ - public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId) - throws JMSException - { - log.debug( - "public CircuitEndBase createReceiverCircuitEnd(Connection connection, ParsedProperties testProps, long uniqueId = " - + uniqueId + "): called"); - - // Cast the test properties into a typed interface for convenience. - MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps); - - // Check that the test properties do not contain AMQP/Qpid specific settings, and fail if they do. - if (props.getImmediate() || props.getMandatory()) - { - throw new RuntimeException( - "Cannot create a pure JMS circuit as the test properties require AMQP specific options."); - } - - Session session = connection.createSession(props.getPublisherTransacted(), props.getAckMode()); - - MessageProducer producer = - props.getReceiverProducerBind() - ? session.createProducer(session.createQueue(props.getReceiveDestinationNameRoot() + "_" + uniqueId)) : null; - - Destination destination = - props.getPubsub() ? session.createTopic(props.getSendDestinationNameRoot() + "_" + uniqueId) - : session.createQueue(props.getSendDestinationNameRoot() + "_" + uniqueId); - - MessageConsumer consumer = - props.getReceiverConsumerBind() - ? ((props.getDurableSubscription() && props.getPubsub()) - ? session.createDurableSubscriber((Topic) destination, "testsub") : session.createConsumer(destination)) - : null; - - MessageMonitor messageMonitor = new MessageMonitor(); - - if (consumer != null) - { - consumer.setMessageListener(messageMonitor); - } - - if (!props.getReceiverConsumerActive() && (consumer != null)) - { - consumer.close(); - } - - return new CircuitEndBase(producer, consumer, session, messageMonitor, null); - } - - /** - * Sets the sender test client to coordinate the test with. - * - * @param sender The contact details of the sending client in the test. - */ - public void setSender(TestClientDetails sender) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Sets the receiving test client to coordinate the test with. - * - * @param receiver The contact details of the sending client in the test. - */ - public void setReceiver(TestClientDetails receiver) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Supplies the sending test client. - * - * @return The sending test client. - */ - public TestClientDetails getSender() - { - throw new RuntimeException("Not implemented."); - } - - /** - * Supplies the receiving test client. - * - * @return The receiving test client. - */ - public List<TestClientDetails> getReceivers() - { - throw new RuntimeException("Not implemented."); - } - - /** - * Accepts the conversation factory over which to hold the test coordinating conversation. - * - * @param conversationFactory The conversation factory to coordinate the test over. - */ - public void setConversationFactory(ConversationFactory conversationFactory) - { - throw new RuntimeException("Not implemented."); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java deleted file mode 100644 index 397c4e9fbd..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageIdentityVector.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -/** - * MessageIdentityVector provides a message identification scheme, that matches individual messages with test cases. - * Test messages are being sent by a number of test clients, sending messages over a set of routes, and being received - * by another set of test clients. Each test is itself, being run within a test cycle, of which there could be many. It - * is the job of the test coordinator to request and receive reports from the available test clients, on what has been - * sent, what has been received, and what errors may have occurred, and to reconcile this information against the - * assertions being applied by the test case. In order to be able to figure out which messages belong to which test, - * there needs to be an identification scheme, that the coordinator can use to correlate messages in senders and - * receiver reports. Every message sent in a test can be associated with this information. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Identify a test case, a handling client id, a circuit end within the client, and a test cycle number. - * </table> - */ -public class MessageIdentityVector -{ - /** Holds the test case vector component of the message identity vector. */ - private TestCaseVector testCaseVector; - - /** The unique client id. */ - private String clientId; - - /** The unique circuit end number within the client id. */ - private int circuitEndId; - - /** - * Creates a new identity vector for test messages. - * - * @param testCase The name of the test case generating the messages. - * @param clientId The unique id of the client implementing a circuit end that is handling the messages. - * @param circuitEndId The unique id number of the circuit end within the client. - * @param testCycleNumber The cycle iteration number of the test case. - */ - public MessageIdentityVector(String testCase, String clientId, int circuitEndId, int testCycleNumber) - { - this.testCaseVector = new TestCaseVector(testCase, testCycleNumber); - this.clientId = clientId; - this.circuitEndId = circuitEndId; - } - - /** - * Reports the test case vector component of the message identity vector. - * - * @return The test case vector component of the message identity vector. - */ - public TestCaseVector getTestCaseVector() - { - return testCaseVector; - } - - /** - * Reports the name of the test case. - * - * @return The name of the test case. - */ - public String getTestCase() - { - return testCaseVector.getTestCase(); - } - - /** - * Reports the test iteration cycle number within the test case. - * - * @return The test iteration cycle number within the test case. - */ - public int getTestCycleNumber() - { - return testCaseVector.getTestCycleNumber(); - } - - /** - * Resports the client id. - * - * @return The client id. - */ - public String getClientId() - { - return clientId; - } - - /** - * Reports the circuit end number within the test client. - * - * @return The circuit end number within the test client. - */ - public int getCircuitEndId() - { - return circuitEndId; - } - - /** - * Compares this identity vector with another for equality. All fields must match. - * - * @param o The identity vector to compare with. - * - * @return <tt>true</tt> if the identity vector is identical to this one by all fields, <tt>false</tt> otherwise. - */ - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - - if ((o == null) || (getClass() != o.getClass())) - { - return false; - } - - MessageIdentityVector that = (MessageIdentityVector) o; - - if (circuitEndId != that.circuitEndId) - { - return false; - } - - if ((clientId != null) ? (!clientId.equals(that.clientId)) : (that.clientId != null)) - { - return false; - } - - if ((testCaseVector != null) ? (!testCaseVector.equals(that.testCaseVector)) : (that.testCaseVector != null)) - { - return false; - } - - return true; - } - - /** - * Computes a hash code for this identity vector based on all fields. - * - * @return A hash code for this identity vector based on all fields. - */ - public int hashCode() - { - int result; - result = ((testCaseVector != null) ? testCaseVector.hashCode() : 0); - result = (31 * result) + ((clientId != null) ? clientId.hashCode() : 0); - result = (31 * result) + circuitEndId; - - return result; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java deleted file mode 100644 index 5265c0416f..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessageMonitor.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.log4j.Logger; - -import javax.jms.Message; -import javax.jms.MessageListener; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * MessageMonitor is used to record information about messages received. This will provide methods to check various - * properties, such as the type, number and content of messages received in order to verify the correct behaviour of - * tests. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Count incoming messages. - * <tr><td> Record time ellapsed since the arrival of the first message. - * <tr><td> Reset all counts and timings. - * </table> - */ -public class MessageMonitor implements MessageListener -{ - /** Used for debugging. */ - private final Logger log = Logger.getLogger(MessageMonitor.class); - - /** Holds the count of messages received since the last query. */ - protected AtomicInteger numMessages = new AtomicInteger(); - - /** Holds the time of arrival of the first message. */ - protected Long firstMessageTime = null; - - /** - * Handles received messages. Does Nothing. - * - * @param message The message. Ignored. - */ - public void onMessage(Message message) - { - // log.debug("public void onMessage(Message message): called"); - - numMessages.getAndIncrement(); - } - - /** - * Gets the count of messages. - * - * @return The count of messages. - */ - public int getNumMessage() - { - if (firstMessageTime == null) - { - firstMessageTime = System.nanoTime(); - } - - return numMessages.get(); - } - - /** - * Gets the time elapsed since the first message arrived, in nanos, or zero if no messages have arrived yet. - * - * @return The time elapsed since the first message arrived, in nanos, or zero if no messages have arrived yet. - */ - public long getTime() - { - if (firstMessageTime != null) - { - return System.nanoTime() - firstMessageTime; - } - else - { - return 0L; - } - } - - /** - * Resets the message count and timer to zero. - */ - public void reset() - { - numMessages.set(0); - firstMessageTime = null; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java deleted file mode 100644 index ceece2dae2..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/MessagingTestConfigProperties.java +++ /dev/null @@ -1,684 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -import javax.jms.Session; -import java.util.Properties; - -/** - * 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> - * - * @todo 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. - */ -public class MessagingTestConfigProperties extends ParsedProperties -{ - // ====================== Connection Properties ================================== - - /** Holds the name of the default connection configuration. */ - public static final String CONNECTION_NAME = "broker"; - - /** Holds the name of the property to get the initial context factory name from. */ - public static final String INITIAL_CONTEXT_FACTORY_PROPNAME = "java.naming.factory.initial"; - - /** Defines the class to use as the initial context factory by default. */ - public static final String INITIAL_CONTEXT_FACTORY_DEFAULT = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory"; - - /** Holds the name of the property to get the test broker url from. */ - public static final String BROKER_PROPNAME = "qpid.test.broker"; - - /** Holds the default broker url for the test. */ - public static final String BROKER_DEFAULT = "vm://:1"; - - /** Holds the name of the property to get the test broker virtual path. */ - public static final String VIRTUAL_HOST_PROPNAME = "virtualHost"; - - /** Holds the default virtual path for the test. */ - public static final String VIRTUAL_HOST_DEFAULT = "test"; - - /** Holds the name of the property to get the broker access username from. */ - public static final String USERNAME_PROPNAME = "username"; - - /** Holds the default broker log on username. */ - public static final String USERNAME_DEFAULT = "guest"; - - /** Holds the name of the property to get the broker access password from. */ - public static final String PASSWORD_PROPNAME = "password"; - - /** Holds the default broker log on password. */ - public static final String PASSWORD_DEFAULT = "guest"; - - // ====================== Messaging Topology Properties ========================== - - /** Holds the name of the property to get the bind publisher procuder flag from. */ - public static final String PUBLISHER_PRODUCER_BIND_PROPNAME = "publisherProducerBind"; - - /** Holds the default value of the publisher producer flag. */ - public static final boolean PUBLISHER_PRODUCER_BIND_DEFAULT = true; - - /** Holds the name of the property to get the bind publisher procuder flag from. */ - public static final String PUBLISHER_CONSUMER_BIND_PROPNAME = "publisherConsumerBind"; - - /** Holds the default value of the publisher consumer flag. */ - public static final boolean PUBLISHER_CONSUMER_BIND_DEFAULT = false; - - /** Holds the name of the property to get the bind receivers procuder flag from. */ - public static final String RECEIVER_PRODUCER_BIND_PROPNAME = "receiverProducerBind"; - - /** Holds the default value of the receivers producer flag. */ - public static final boolean RECEIVER_PRODUCER_BIND_DEFAULT = false; - - /** Holds the name of the property to get the bind receivers procuder flag from. */ - public static final String RECEIVER_CONSUMER_BIND_PROPNAME = "receiverConsumerBind"; - - /** Holds the default value of the receivers consumer flag. */ - public static final boolean RECEIVER_CONSUMER_BIND_DEFAULT = true; - - /** Holds the name of the property to get the publishers consumer active flag from. */ - public static final String PUBLISHER_CONSUMER_ACTIVE_PROPNAME = "publisherConsumerActive"; - - /** Holds the default value of the publishers consumer active flag. */ - public static final boolean PUBLISHER_CONSUMER_ACTIVE_DEFAULT = true; - - /** Holds the name of the property to get the receivers consumer active flag from. */ - public static final String RECEIVER_CONSUMER_ACTIVE_PROPNAME = "receiverConsumerActive"; - - /** Holds the default value of the receivers consumer active flag. */ - public static final boolean RECEIVER_CONSUMER_ACTIVE_DEFAULT = true; - - /** Holds the name of the property to get the destination name root from. */ - public static final String SEND_DESTINATION_NAME_ROOT_PROPNAME = "sendDestinationRoot"; - - /** Holds the root of the name of the default destination to send to. */ - public static final String SEND_DESTINATION_NAME_ROOT_DEFAULT = "sendTo"; - - /** Holds the name of the property to get the destination name root from. */ - public static final String RECEIVE_DESTINATION_NAME_ROOT_PROPNAME = "receiveDestinationRoot"; - - /** Holds the root of the name of the default destination to send to. */ - public static final String RECEIVE_DESTINATION_NAME_ROOT_DEFAULT = "receiveFrom"; - - /** Holds the name of the proeprty to get the destination count from. */ - public static final String DESTINATION_COUNT_PROPNAME = "destinationCount"; - - /** Defines the default number of destinations to ping. */ - public static final int DESTINATION_COUNT_DEFAULT = 1; - - /** Holds the name of the property to get the p2p or pub/sub messaging mode from. */ - public static final String PUBSUB_PROPNAME = "pubsub"; - - /** Holds the pub/sub mode default, true means ping a topic, false means ping a queue. */ - public static final boolean PUBSUB_DEFAULT = false; - - // ====================== JMS Options and Flags ================================= - - /** Holds the name of the property to get the test delivery mode from. */ - public static final String PERSISTENT_MODE_PROPNAME = "persistent"; - - /** Holds the message delivery mode to use for the test. */ - public static final boolean PERSISTENT_MODE_DEFAULT = false; - - /** Holds the name of the property to get the test transactional mode from. */ - public static final String TRANSACTED_PUBLISHER_PROPNAME = "transactedPublisher"; - - /** Holds the transactional mode to use for the test. */ - public static final boolean TRANSACTED_PUBLISHER_DEFAULT = false; - - /** Holds the name of the property to get the test transactional mode from. */ - public static final String TRANSACTED_RECEIVER_PROPNAME = "transactedReceiver"; - - /** Holds the transactional mode to use for the test. */ - public static final boolean TRANSACTED_RECEIVER_DEFAULT = false; - - /** Holds the name of the property to set the no local flag from. */ - public static final String NO_LOCAL_PROPNAME = "noLocal"; - - /** Defines the default value of the no local flag to use when consuming messages. */ - public static final boolean NO_LOCAL_DEFAULT = false; - - /** Holds the name of the property to get the message acknowledgement mode from. */ - public static final String ACK_MODE_PROPNAME = "ackMode"; - - /** Defines the default message acknowledgement mode. */ - public static final int ACK_MODE_DEFAULT = Session.AUTO_ACKNOWLEDGE; - - /** Holds the name of the property to get the durable subscriptions flag from, when doing pub/sub messaging. */ - public static final String DURABLE_SUBSCRIPTION_PROPNAME = "durableSubscription"; - - /** Defines the default value of the durable subscriptions flag. */ - public static final boolean DURABLE_SUBSCRIPTION_DEFAULT = false; - - // ====================== Qpid/AMQP Options and Flags ================================ - - /** Holds the name of the property to set the exclusive flag from. */ - public static final String EXCLUSIVE_PROPNAME = "exclusive"; - - /** Defines the default value of the exclusive flag to use when consuming messages. */ - public static final boolean EXCLUSIVE_DEFAULT = false; - - /** Holds the name of the property to set the immediate flag from. */ - public static final String IMMEDIATE_PROPNAME = "immediate"; - - /** Defines the default value of the immediate flag to use when sending messages. */ - public static final boolean IMMEDIATE_DEFAULT = false; - - /** Holds the name of the property to set the mandatory flag from. */ - public static final String MANDATORY_PROPNAME = "mandatory"; - - /** Defines the default value of the mandatory flag to use when sending messages. */ - public static final boolean MANDATORY_DEFAULT = false; - - /** Holds the name of the property to get the durable destinations flag from. */ - public static final String DURABLE_DESTS_PROPNAME = "durableDests"; - - /** Default value for the durable destinations flag. */ - public static final boolean DURABLE_DESTS_DEFAULT = false; - - /** Holds the name of the property to set the prefetch size from. */ - public static final String PREFETCH_PROPNAME = "prefetch"; - - /** Defines the default prefetch size to use when consuming messages. */ - public static final int PREFETCH_DEFAULT = 100; - - // ====================== Common Test Parameters ================================ - - /** Holds the name of the property to get the test message size from. */ - public static final String MESSAGE_SIZE_PROPNAME = "messageSize"; - - /** Used to set up a default message size. */ - public static final int MESSAGE_SIZE_DEAFULT = 0; - - /** Holds the name of the property to get the message rate from. */ - public static final String RATE_PROPNAME = "rate"; - - /** Defines the default rate (in pings per second) to send pings at. 0 means as fast as possible, no restriction. */ - public static final int RATE_DEFAULT = 0; - - /** Holds the name of the proeprty to get the. */ - public static final String SELECTOR_PROPNAME = "selector"; - - /** Holds the default message selector. */ - public static final String SELECTOR_DEFAULT = ""; - - /** Holds the name of the property to get the waiting timeout for response messages. */ - public static final String TIMEOUT_PROPNAME = "timeout"; - - /** Default time to wait before assuming that a ping has timed out. */ - public static final long TIMEOUT_DEFAULT = 30000; - - /** Holds the name of the property to get the commit batch size from. */ - public static final String TX_BATCH_SIZE_PROPNAME = "commitBatchSize"; - - /** Defines the default number of pings to send in each transaction when running transactionally. */ - public static final int TX_BATCH_SIZE_DEFAULT = 1; - - /** Holds the name of the property to set the maximum amount of pending message data for a producer to hold. */ - public static final String MAX_PENDING_PROPNAME = "maxPending"; - - /** Defines the default maximum quantity of pending message data to allow producers to hold. */ - public static final int MAX_PENDING_DEFAULT = 0; - - /** Holds the name of the property to get the publisher rollback flag from. */ - public static final String ROLLBACK_PUBLISHER_PROPNAME = "rollbackPublisher"; - - /** Holds the default publisher roll back setting. */ - public static final boolean ROLLBACK_PUBLISHER_DEFAULT = false; - - /** Holds the name of the property to get the publisher rollback flag from. */ - public static final String ROLLBACK_RECEIVER_PROPNAME = "rollbackReceiver"; - - /** Holds the default publisher roll back setting. */ - public static final boolean ROLLBACK_RECEIVER_DEFAULT = false; - - // ====================== Options that control the bahviour of the test framework. ========================= - - /** Holds the name of the property to get the behavioural mode of not applicable assertions. */ - public static final String NOT_APPLICABLE_ASSERTION_PROPNAME = "notApplicableAssertion"; - - /** Holds the default behavioral mode of not applicable assertions, which is logging them as a warning. */ - public static final String NOT_APPLICABLE_ASSERTION_DEFAULT = "warn"; - - /** Holds the name of the property to get the verbose mode proeprty from. */ - public static final String VERBOSE_PROPNAME = "verbose"; - - /** Holds the default verbose mode. */ - public static final boolean VERBOSE_DEFAULT = false; - - /** Holds the default configuration properties. */ - 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); - } - - /** - * Creates a test configuration based on the defaults. - */ - public MessagingTestConfigProperties() - { - super(defaults); - } - - /** - * Creates a test configuration based on the supplied properties. - * - * @param properties The test configuration. - */ - public MessagingTestConfigProperties(Properties properties) - { - super(properties); - } - - /** - * The size of test messages to send. - * - * @return The size of test messages to send. - */ - public int getMessageSize() - { - return getPropertyAsInteger(MESSAGE_SIZE_PROPNAME); - } - - /** - * Flag to indicate that the publishing producer should be set up to publish to a destination. - * - * @return Flag to indicate that the publishing producer should be set up to publish to a destination. - */ - public boolean getPublisherProducerBind() - { - return getPropertyAsBoolean(PUBLISHER_PRODUCER_BIND_PROPNAME); - } - - /** - * Flag to indicate that the publishing consumer should be set up to receive from a destination. - * - * @return Flag to indicate that the publishing consumer should be set up to receive from a destination. - */ - public boolean getPublisherConsumerBind() - { - return getPropertyAsBoolean(PUBLISHER_CONSUMER_BIND_PROPNAME); - } - - /** - * Flag to indicate that the receiving producer should be set up to publish to a destination. - * - * @return Flag to indicate that the receiving producer should be set up to publish to a destination. - */ - public boolean getReceiverProducerBind() - { - return getPropertyAsBoolean(RECEIVER_PRODUCER_BIND_PROPNAME); - } - - /** - * Flag to indicate that the receiving consumer should be set up to receive from a destination. - * - * @return Flag to indicate that the receiving consumer should be set up to receive from a destination. - */ - public boolean getReceiverConsumerBind() - { - return getPropertyAsBoolean(RECEIVER_CONSUMER_BIND_PROPNAME); - } - - /** - * Flag to indicate that the publishing consumer should be created and actively listening. - * - * @return Flag to indicate that the publishing consumer should be created. - */ - public boolean getPublisherConsumerActive() - { - return getPropertyAsBoolean(PUBLISHER_CONSUMER_ACTIVE_PROPNAME); - } - - /** - * Flag to indicate that the receiving consumers should be created and actively listening. - * - * @return Flag to indicate that the receiving consumers should be created and actively listening. - */ - public boolean getReceiverConsumerActive() - { - return getPropertyAsBoolean(RECEIVER_CONSUMER_ACTIVE_PROPNAME); - } - - /** - * A root to create all test destination names from. - * - * @return A root to create all test destination names from. - */ - public String getSendDestinationNameRoot() - { - return getProperty(SEND_DESTINATION_NAME_ROOT_PROPNAME); - } - - /** - * A root to create all receiving destination names from. - * - * @return A root to create all receiving destination names from. - */ - public String getReceiveDestinationNameRoot() - { - return getProperty(RECEIVE_DESTINATION_NAME_ROOT_PROPNAME); - } - - /** - * Flag to indicate that persistent messages should be used. - * - * @return Flag to indicate that persistent messages should be used. - */ - public boolean getPersistentMode() - { - return getPropertyAsBoolean(PERSISTENT_MODE_PROPNAME); - } - - /** - * Flag to indicate that transactional messages should be sent by the publisher. - * - * @return Flag to indicate that transactional messages should be sent by the publisher. - */ - public boolean getPublisherTransacted() - { - return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME); - } - - /** - * Flag to indicate that transactional receives should be used by the receiver. - * - * @return Flag to indicate that transactional receives should be used by the receiver. - */ - public boolean getReceiverTransacted() - { - return getPropertyAsBoolean(TRANSACTED_PUBLISHER_PROPNAME); - } - - /** - * The name of the virtual host to run all tests over. - * - * @return The name of the virtual host to run all tests over. - */ - public String getVirtualHost() - { - return getProperty(VIRTUAL_HOST_PROPNAME); - } - - /** - * Limiting rate for each sender in messages per second, or zero for unlimited. - * - * @return Limiting rate for each sender in messages per second, or zero for unlimited. - */ - public String getRate() - { - return getProperty(RATE_PROPNAME); - } - - /** - * Flag to indicate that test messages should be received publish/subscribe style by all receivers. - * - * @return Flag to indicate that test messages should be received publish/subscribe style by all receivers. - */ - public boolean getPubsub() - { - return getPropertyAsBoolean(PUBSUB_PROPNAME); - } - - /** - * The username credentials to run tests with. - * - * @return The username credentials to run tests with. - */ - public String getUsername() - { - return getProperty(USERNAME_PROPNAME); - } - - /** - * The password credentials to run tests with. - * - * @return The password credentials to run tests with. - */ - public String getPassword() - { - return getProperty(PASSWORD_PROPNAME); - } - - /** - * The timeout duration to fail tests on, should they receive no messages within it. - * - * @return The timeout duration to fail tests on, should they receive no messages within it. - */ - public long getTimeout() - { - return getPropertyAsLong(TIMEOUT_PROPNAME); - } - - /** - * The number of messages to batch into each transaction in transational tests. - * - * @return The number of messages to batch into each transaction in transational tests. - */ - public int getTxBatchSize() - { - return getPropertyAsInteger(TX_BATCH_SIZE_PROPNAME); - } - - /** - * Flag to indicate that tests should use durable destinations. - * - * @return Flag to indicate that tests should use durable destinations. - */ - public boolean getDurableDests() - { - return getPropertyAsBoolean(DURABLE_DESTS_PROPNAME); - } - - /** - * The ack mode for message receivers to use. - * - * @return The ack mode for message receivers to use. - */ - public int getAckMode() - { - return getPropertyAsInteger(ACK_MODE_PROPNAME); - } - - /** - * Flag to indicate that tests should use durable subscriptions. - * - * @return Flag to indicate that tests should use durable subscriptions. - */ - public boolean getDurableSubscription() - { - return getPropertyAsBoolean(DURABLE_SUBSCRIPTION_PROPNAME); - } - - /** - * The maximum amount of in-flight data, in bytes, that tests should send at any time. - * - * @return The maximum amount of in-flight data, in bytes, that tests should send at any time. - */ - public int getMaxPending() - { - return getPropertyAsInteger(MAX_PENDING_PROPNAME); - } - - /** - * The size of the prefetch queue to use. - * - * @return The size of the prefetch queue to use. - */ - public int getPrefetch() - { - return getPropertyAsInteger(PREFETCH_PROPNAME); - } - - /** - * Flag to indicate that subscriptions should be no-local. - * - * @return Flag to indicate that subscriptions should be no-local. - */ - public boolean getNoLocal() - { - return getPropertyAsBoolean(NO_LOCAL_PROPNAME); - } - - /** - * Flag to indicate that subscriptions should be exclusive. - * - * @return Flag to indicate that subscriptions should be exclusive. - */ - public boolean getExclusive() - { - return getPropertyAsBoolean(EXCLUSIVE_PROPNAME); - } - - /** - * Flag to indicate that messages must be delivered immediately. - * - * @return Flag to indicate that messages must be delivered immediately. - */ - public boolean getImmediate() - { - return getPropertyAsBoolean(IMMEDIATE_PROPNAME); - } - - /** - * Flag to indicate that messages must be routable. - * - * @return Flag to indicate that messages must be routable. - */ - public boolean getMandatory() - { - return getPropertyAsBoolean(MANDATORY_PROPNAME); - } - - /** - * Gets the value of a flag to indicate that the publisher should rollback all messages sent. - * - * @return A flag to indicate that the publisher should rollback all messages sent. - */ - public boolean getRollbackPublisher() - { - return getPropertyAsBoolean(ROLLBACK_PUBLISHER_PROPNAME); - } - - /** - * Gets the value of a flag to indicate that the receiver should rollback all messages received, then receive them - * again. - * - * @return A flag to indicate that the publisher should rollback all messages received. - */ - public boolean getRollbackReceiver() - { - return getPropertyAsBoolean(ROLLBACK_RECEIVER_PROPNAME); - } - - /** - * Gets the behavioural mode of not applicable assertions. Should be one of 'quiet', 'warn' or 'fail'. - * - * @return The behavioural mode of not applicable assertions. - */ - public String getNotApplicableAssertionMode() - { - return getProperty(NOT_APPLICABLE_ASSERTION_PROPNAME); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java deleted file mode 100644 index 2a20be12d6..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/NotApplicableAssertion.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -/** - * 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> - */ -public class NotApplicableAssertion implements Assertion -{ - /** Used for logging to the console. */ - private static final Logger console = Logger.getLogger("CONSOLE." + NotApplicableAssertion.class.getName()); - - /** The possible behavioural modes of this assertion. */ - private enum Mode - { - /** Quietly ignore the assertion by passing. */ - Quiet, - - /** Ignore the assertion by passing but log a warning about it. */ - Warn, - - /** Fail the assertion. */ - Fail; - } - - /** The behavioural mode of the assertion. */ - private Mode mode; - - /** - * 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'. - * - * @param testProperties The test configuration properties. - */ - 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; - } - } - - /** - * Applies the assertion. - * - * @return <tt>true</tt> if the assertion passes, <tt>false</tt> if it fails. - */ - public boolean apply() - { - switch (mode) - { - case Quiet: - return true; - - case Warn: - console.warn("Warning: Not applicable assertion being ignored."); - - return true; - - case Fail: - default: - return false; - } - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java deleted file mode 100644 index 2c8be4f787..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Publisher.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -/** - * 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> - * - * @todo 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. - */ -public interface Publisher -{ - // Assertions that are meaningfull to AMQP and to JMS. - - /** - * Provides an assertion that the publisher encountered no exceptions. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the publisher encountered no exceptions. - */ - public Assertion noExceptionsAssertion(ParsedProperties testProps); - - // Assertions that are meaningfull only to AMQP. - - /** - * Provides an assertion that the AMQP channel was forcibly closed by an error condition. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the AMQP channel was forcibly closed by an error condition. - */ - public Assertion channelClosedAssertion(ParsedProperties testProps); - - // Assertions that are meaningfull only to Java/JMS. - - /** - * Provides an assertion that the publisher got a given exception during the test. - * - * @param testProps The test configuration properties. - * @param exceptionClass The exception class to check for. - * - * @return An assertion that the publisher got a given exception during the test. - */ - public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java deleted file mode 100644 index 19dc4d90e7..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/Receiver.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -/** - * A Receiver is a {@link 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> - * - * @todo 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. - */ -public interface Receiver -{ - // Assertions that are meaningfull to AMQP and to JMS. - - /** - * Provides an assertion that the receivers encountered no exceptions. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the receivers encountered no exceptions. - */ - public Assertion noExceptionsAssertion(ParsedProperties testProps); - - /** - * Provides an assertion that the receivers got all messages that were sent to it. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the receivers got all messages that were sent to it. - */ - public Assertion allMessagesReceivedAssertion(ParsedProperties testProps); - - /** - * Provides an assertion that the receivers got none of the messages that were sent to it. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the receivers got none of the messages that were sent to it. - */ - public Assertion noMessagesReceivedAssertion(ParsedProperties testProps); - - // Assertions that are meaningfull only to AMQP. - - /** - * Provides an assertion that the AMQP channel was forcibly closed by an error condition. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the AMQP channel was forcibly closed by an error condition. - */ - public Assertion channelClosedAssertion(ParsedProperties testProps); - - // Assertions that are meaningfull only to Java/JMS. - - /** - * Provides an assertion that the receiver got a given exception during the test. - * - * @param testProps The test configuration properties. - * @param exceptionClass The exception class to check for. - * - * @return An assertion that the receiver got a given exception during the test. - */ - public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java deleted file mode 100644 index ad1e70f6f7..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestCaseVector.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -/** - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> - * </table> - */ -public class TestCaseVector -{ - /** The test case name. */ - private String testCase; - - /** The test cycle number within the test case. */ - private int testCycleNumber; - - public TestCaseVector(String testCase, int testCycleNumber) - { - this.testCase = testCase; - this.testCycleNumber = testCycleNumber; - } - - public String getTestCase() - { - return testCase; - } - - public int getTestCycleNumber() - { - return testCycleNumber; - } - - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - - if ((o == null) || (getClass() != o.getClass())) - { - return false; - } - - TestCaseVector that = (TestCaseVector) o; - - if (testCycleNumber != that.testCycleNumber) - { - return false; - } - - if ((testCase != null) ? (!testCase.equals(that.testCase)) : (that.testCase != null)) - { - return false; - } - - return true; - } - - public int hashCode() - { - int result; - result = ((testCase != null) ? testCase.hashCode() : 0); - result = (31 * result) + testCycleNumber; - - return result; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java deleted file mode 100644 index 7498f2b6b5..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestClientDetails.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -/** - * TestClientDetails is used to encapsulate information about an interop test client. It pairs together the unique - * name of the client, and the route on which it listens to its control messages. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Record test clients control addresses together with their names. - * </table> - */ -public class TestClientDetails -{ - /** The test clients name. */ - public String clientName; - - /* The test clients unique sequence number. Not currently used. */ - - /** The routing key of the test clients control topic. */ - public String privateControlKey; - - /** - * Two TestClientDetails are considered to be equal, iff they have the same client name. - * - * @param o The object to compare to. - * - * @return <tt>If the object to compare to is a TestClientDetails equal to this one, <tt>false</tt> otherwise. - */ - public boolean equals(Object o) - { - if (this == o) - { - return true; - } - - if (!(o instanceof TestClientDetails)) - { - return false; - } - - final TestClientDetails testClientDetails = (TestClientDetails) o; - - return !((clientName != null) ? (!clientName.equals(testClientDetails.clientName)) - : (testClientDetails.clientName != null)); - } - - /** - * Computes a hash code compatible with the equals method; based on the client name alone. - * - * @return A hash code for this. - */ - public int hashCode() - { - return ((clientName != null) ? clientName.hashCode() : 0); - } - - /** - * Outputs the client name and address details. Mostly used for debugging purposes. - * - * @return The client name and address. - */ - public String toString() - { - return "TestClientDetails: [ clientName = " + clientName + ", privateControlKey = " + privateControlKey + " ]"; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java deleted file mode 100644 index 919faa4754..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/TestUtils.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -import static org.apache.qpid.test.framework.MessagingTestConfigProperties.BROKER_PROPNAME; -import static org.apache.qpid.test.framework.MessagingTestConfigProperties.CONNECTION_NAME; -import static org.apache.qpid.test.framework.MessagingTestConfigProperties.PASSWORD_PROPNAME; -import static org.apache.qpid.test.framework.MessagingTestConfigProperties.USERNAME_PROPNAME; -import static org.apache.qpid.test.framework.MessagingTestConfigProperties.VIRTUAL_HOST_PROPNAME; - -import javax.jms.BytesMessage; -import javax.jms.Connection; -import javax.jms.ConnectionFactory; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Session; -import javax.naming.Context; -import javax.naming.InitialContext; -import javax.naming.NamingException; -import java.util.Map; - -/** - * 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> {@link MessagingTestConfigProperties} - * <tr><td> Create test messages. - * <tr><td> Inject a short pause in a test. - * <tr><td> Serialize properties into a message. - * </table> - */ -public class TestUtils -{ - /** Used for debugging. */ - private static Logger log = Logger.getLogger(TestUtils.class); - - /** Some dummy data to stuff all test messages with. */ - private static final byte[] MESSAGE_DATA_BYTES = - "Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- Test Message -- " - .getBytes(); - - /** - * 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 {@link MessagingTestConfigProperties} to control - * the connection creation: - * - * <p/><table> - * <tr><td> {@link MessagingTestConfigProperties#USERNAME_PROPNAME} <td> The username. - * <tr><td> {@link MessagingTestConfigProperties#PASSWORD_PROPNAME} <td> The password. - * <tr><td> {@link MessagingTestConfigProperties#VIRTUAL_HOST_PROPNAME} <td> The virtual host name. - * <tr><td> {@link MessagingTestConfigProperties#BROKER_PROPNAME} <td> The broker URL. - * <tr><td> {@link MessagingTestConfigProperties#CONNECTION_NAME} <td> The broker name in the initial context. - * - * @param messagingProps Connection properties as defined in {@link MessagingTestConfigProperties}. - * - * @return A JMS conneciton. - */ - 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); - } - } - - /** - * Creates a test message of the specified size, on the given JMS session. - * - * @param session The JMS session. - * @param size The size of the message in bytes. - * - * @return A bytes message, of the specified size, filled with dummy data. - * - * @throws JMSException Any underlying JMSExceptions are allowed to fall through. - */ - public static Message createTestMessageOfSize(Session session, int size) throws JMSException - { - BytesMessage message = session.createBytesMessage(); - - if (size > 0) - { - int div = size / MESSAGE_DATA_BYTES.length; - int mod = size % MESSAGE_DATA_BYTES.length; - - for (int i = 0; i < div; i++) - { - message.writeBytes(MESSAGE_DATA_BYTES); - } - - if (mod != 0) - { - message.writeBytes(MESSAGE_DATA_BYTES, 0, mod); - } - } - - return message; - } - - /** - * 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. - * - * @param t The minimum time to pause for in milliseconds. - */ - 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); - } - } - - /** - * Sets properties of different types on a JMS Message. - * - * @param message The message to set properties on. - * @param properties The property name/value pairs to set. - * - * @throws javax.jms.JMSException All underlying JMSExceptions are allowed to fall through. - * - * @todo Move this helper method somewhere else. For example, TestUtils. - */ - 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); - } - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java deleted file mode 100644 index 00cc2d8966..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchFailureException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.clocksynch; - -/** - * ClockSynchFailureException represents failure of a {@link ClockSynchronizer} to achieve synchronization. For example, - * this could be because a reference signal is not available, or because a desired accurracy cannot be attained. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Represent failure to achieve synchronization. - * </table> - */ -public class ClockSynchFailureException extends Exception -{ - /** - * Creates a clock synch failure exception. - * - * @param message The detail message (which is saved for later retrieval by the {@link #getMessage()} method). - * @param cause The cause (which is saved for later retrieval by the {@link #getCause()} method). (A <tt>null</tt> - * value is permitted, and indicates that the cause is nonexistent or unknown.) - */ - public ClockSynchFailureException(String message, Throwable cause) - { - super(message, cause); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java deleted file mode 100644 index 3d4c4f7d12..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchThread.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.clocksynch; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.ShutdownHookable; -import org.apache.qpid.junit.extensions.Throttle; - -/** - * ClockSynchThread is a convenient utility for running a thread that periodically synchronizes the clock against - * a reference. Supply it with a {@link ClockSynchronizer} and a {@link Throttle} and it will continually keep the - * clock up-to-date at a rate determined by the throttle. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Continually sychronize the clock at a throttled rate. - * </table> - */ -public class ClockSynchThread extends Thread implements ShutdownHookable -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(ClockSynchThread.class); - - /** Holds the clock syncher for the synch thread. */ - private ClockSynchronizer clockSyncher; - - /** Holds the throttle to limit the synch rate. */ - private Throttle throttle; - - /** Flag to indicate that the periodic clock syncher should keep running. */ - boolean doSynch = true; - - /** - * Creates a clock synchronizer thread from a clock synchronizer and a throttle. - * - * @param syncher The clock synchronizer. - * @param throttle The throttle. - */ - public ClockSynchThread(ClockSynchronizer syncher, Throttle throttle) - { - this.clockSyncher = syncher; - this.throttle = throttle; - } - - /** - * Terminates the synchronization thread. - */ - public void terminate() - { - doSynch = false; - } - - /** - * Continually updates the clock, until {@link #terminate()} is called. - */ - public void run() - { - while (doSynch) - { - // Perform a clock clockSynch. - try - { - // Wait controlled by the throttle before doing the next synch. - throttle.throttle(); - - clockSyncher.synch(); - log.debug("Clock synched, delta = " + clockSyncher.getDelta() + ", epsilon = " + clockSyncher.getEpsilon() - + "."); - } - // Terminate the synch thread if the synchronization cannot be achieved. - catch (ClockSynchFailureException e) - { - log.debug("Cannot synchronize the clock (reference service may be down). Terminating the synch thread."); - doSynch = false; - } - } - } - - /** - * Gets the clock synchronizer that is kept continually up to date. - * - * @return The clock synchronizer that is kept continually up to date. - */ - public ClockSynchronizer getClockSyncher() - { - return clockSyncher; - } - - /** - * Supplies a shutdown hook, that terminates the synching thread. - * - * @return The shut down hook. - */ - public Thread getShutdownHook() - { - return new Thread(new Runnable() - { - public void run() - { - doSynch = false; - } - }); - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java deleted file mode 100644 index a92c551bc2..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/ClockSynchronizer.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.clocksynch; - -/** - * ClockSynchronizer provides an interface through which two nodes may synchronize their clocks. It is expected that one - * node will act as the reference clock, to which no delta need be applied, and the other node will act as the slave, - * and which must apply a delta to its local clock to get a clock synchronized with the reference. - * - * <p/>The slave side will initiate the computation of a clock delta by calling the {@link #synch} method. This method - * will not return until the delta has been computed, at which point there is a method to return its value, as well as - * an estimate of the likely error (usually one standard deviation), in the synchronization. For convenience there is a - * {@link #nanoTime} method to return the value of System.nanoTime() with the delta added in. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Trigger a clock synchronization. - * <tr><td> Compute a clock delta to apply to the local clock. - * <tr><td> Estimate the error in the synchronzation. - * </table> - */ -public interface ClockSynchronizer -{ - /** - * The slave side should call this to copute a clock delta with the reference. - * - * @throws ClockSynchFailureException If synchronization cannot be achieved. - */ - public void synch() throws ClockSynchFailureException; - - /** - * Gets the clock delta in nano seconds. - * - * @return The clock delta in nano seconds. - */ - public long getDelta(); - - /** - * Gets an estimate of the clock error in nan seconds. - * - * @return An estimate of the clock error in nan seconds. - */ - public long getEpsilon(); - - /** - * Gets the local clock time with any computed delta added in. - * - * @return The local clock time with any computed delta added in. - */ - public long nanoTime(); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java deleted file mode 100644 index f448d5f23c..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/LocalClockSynchronizer.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.clocksynch; - -/** - * LocalClockSynchronizer is a fake {@link ClockSynchronizer} that simply calls System.nanoTime(). It exists so that - * the same tests can be run distributed or locally, taking timings against the ClockSynchronizer interface without - * being aware of how they are being run. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Supply the local clock with no delta. - * </table> - */ -public class LocalClockSynchronizer implements ClockSynchronizer -{ - /** - * The slave side should call this to copute a clock delta with the reference. - * - * @throws org.apache.qpid.test.framework.clocksynch.ClockSynchFailureException - * If synchronization cannot be achieved. - */ - public void synch() throws ClockSynchFailureException - { } - - /** - * Gets the clock delta in nano seconds. - * - * @return The clock delta in nano seconds. - */ - public long getDelta() - { - return 0L; - } - - /** - * Gets an estimate of the clock error in nan seconds. - * - * @return An estimate of the clock error in nan seconds. - */ - public long getEpsilon() - { - return 0L; - } - - /** - * Gets the local clock time with any computed delta added in. - * - * @return The local clock time with any computed delta added in. - */ - public long nanoTime() - { - return System.nanoTime(); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java deleted file mode 100644 index 8ee8d82636..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockReference.java +++ /dev/null @@ -1,169 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.clocksynch; - -import org.apache.qpid.junit.extensions.ShutdownHookable; - -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.nio.ByteBuffer; - -/** - * UDPClockReference supplies a refernce clock signal (generated from System.nanoTime()). - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Supply a reference clock signal. - * </table> - * - * @todo Port hard coded. Make configurable. - * - * @todo Errors rethrown as runtimes, or silently terminate the service. Could add better error handling if needed. - */ -public class UDPClockReference implements Runnable, ShutdownHookable -{ - /** Used for debugging. */ - // private static final Logger log = Logger.getLogger(UDPClockReference.class); - - /** Defines the timeout to use when polling the socket for time requests. */ - private static final int TIMEOUT = 200; - - /** Defines the port to run the clock reference on. */ - public static final int REFERENCE_PORT = 4444; - - /** Holds the socket to receive clock reference requests on. */ - protected DatagramSocket socket = null; - - /** Flag used to indicate that the time server should keep running. Set to false to terminate. */ - protected boolean publish = true; - - /** - * Creates a clock reference service on the standard port. - */ - public UDPClockReference() - { - try - { - socket = new DatagramSocket(REFERENCE_PORT); - socket.setSoTimeout(TIMEOUT); - } - catch (SocketException e) - { - throw new RuntimeException(e); - } - } - - /** - * Implements the run loop for this reference time server. This waits for incoming time requests, and replies to - * any, with a message with the local time stamp in it. Periodically (controlled by {@link #TIMEOUT}), the run - * loop will check if the {@link #publish} flag has been cleared, and terminate the reference time service if so. - */ - public void run() - { - byte[] buf = new byte[256]; - ByteBuffer bbuf = ByteBuffer.wrap(buf); - - while (publish) - { - try - { - // Wait for a reference time request. - DatagramPacket packet = new DatagramPacket(buf, buf.length); - boolean timedOut = false; - - try - { - socket.receive(packet); - } - catch (SocketTimeoutException e) - { - timedOut = true; - } - - if (!timedOut) - { - // Work out from the received packet, where to reply to. - InetAddress address = packet.getAddress(); - int port = packet.getPort(); - - // Respond to the time request by sending back the local clock as the reference time. - bbuf.putLong(System.nanoTime()); - bbuf.flip(); - packet = new DatagramPacket(bbuf.array(), bbuf.capacity(), address, port); - - socket.send(packet); - } - } - catch (IOException e) - { - publish = false; - } - } - - socket.close(); - } - - /** - * Supplies a shutdown hook. - * - * @return The shut down hook. - */ - public Thread getShutdownHook() - { - return new Thread(new Runnable() - { - public void run() - { - publish = false; - } - }); - } - - /** - * For testing purposes. Runs a reference clock on the default port. - * - * @param args None. - */ - public static void main(String[] args) - { - try - { - // Create the clock reference service. - UDPClockReference clock = new UDPClockReference(); - - // Set up a shutdown hook for it. - Runtime.getRuntime().addShutdownHook(clock.getShutdownHook()); - - // Start the service. - clock.run(); - } - catch (Exception e) - { - e.printStackTrace(); - System.exit(1); - } - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java deleted file mode 100644 index 226c84611d..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/clocksynch/UDPClockSynchronizer.java +++ /dev/null @@ -1,468 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.clocksynch; - -import org.apache.qpid.junit.extensions.util.CommandLineParser; -import org.apache.qpid.junit.extensions.util.ParsedProperties; - -import java.io.IOException; -import java.net.DatagramPacket; -import java.net.DatagramSocket; -import java.net.InetAddress; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.net.UnknownHostException; -import java.nio.ByteBuffer; -import java.util.Arrays; - -/** - * UDPClockSynchronizer is a {@link ClockSynchronizer} that sends pings as UDP datagrams, and uses the following simple - * algorithm to perform clock synchronization: - * - * <ol> - * <li>Slave initiates synchronization with a Reference clock.</li> - * <li>Slave stamps current local time on a "time request" message and sends to the Reference.</li> - * <li>Upon receipt by Reference, Reference stamps Reference-time and returns.</li> - * <li>Upon receipt by Slave, Slave subtracts current time from sent time and divides by two to compute latency. It - * subtracts current time from Reference time to determine Slave-Reference time delta and adds in the - * half-latency to get the correct clock delta.</li> - * <li>The first result is immediately used to update the clock since it will get the local clock into at least - * the right ballpark.</li> - * <li>The Slave repeats steps 2 through 4, 15 more times.</li> - * <li>The results of the packet receipts are accumulated and sorted in lowest-latency to highest-latency order. The - * median latency is determined by picking the mid-point sample from this ordered list.</li> - * <li>All samples outside 1 standard-deviation from the median are discarded and the remaining samples - * are averaged using an arithmetic mean.</li> - * </ol> - * - * <p/>The use of UDP datagrams, instead of TCP based communication eliminates the hidden delays that TCP can introduce, - * as it can transparently re-order or re-send packets, or introduce delays as packets are naggled. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Trigger a clock synchronziation. - * <tr><td> Compute a clock delta to apply to the local clock. - * <tr><td> Estimate the error in the synchronzation. - * </table> - */ -public class UDPClockSynchronizer implements ClockSynchronizer -{ - /** Used for debugging. */ - // private static final Logger log = Logger.getLogger(UDPClockSynchronizer.class); - - /** Defines the timeout to use when waiting for responses to time requests. */ - private static final int TIMEOUT = 50; - - /** The clock delta. */ - private long delta = 0L; - - /** Holds an estimate of the clock error relative to the reference clock. */ - private long epsilon = 0L; - - /** Holds the address of the reference clock. */ - private InetAddress referenceAddress; - - /** Holds the socket to communicate with the reference service over. */ - private DatagramSocket socket; - - /** Used to control the shutdown in the main test loop. */ - private static boolean doSynch = true; - - /** - * Creates a clock synchronizer against the specified address for the reference. - * - * @param address The address of the reference service. - */ - public UDPClockSynchronizer(String address) - { - try - { - referenceAddress = InetAddress.getByName(address); - } - catch (UnknownHostException e) - { - throw new RuntimeException(e); - } - } - - /** - * The slave side should call this to compute a clock delta with the reference. - * - * @throws ClockSynchFailureException If synchronization cannot be achieved, due to unavailability of the reference - * time service. - */ - public void synch() throws ClockSynchFailureException - { - try - { - socket = new DatagramSocket(); - socket.setSoTimeout(TIMEOUT); - - // Synchronize on a single ping, to get the clock into the right ball-park. - synch(1); - - // Synchronize on 15 pings. - synch(15); - - // And again, for greater accuracy, on 31. - synch(31); - - socket.close(); - } - catch (SocketException e) - { - throw new RuntimeException(e); - } - } - - /** - * Updates the synchronization delta by performing the specified number of reference clock requests. - * - * @param n The number of reference clock request cycles to perform. - * - * @throws ClockSynchFailureException If synchronization cannot be achieved, due to unavailability of the reference - * time service. - */ - protected void synch(int n) throws ClockSynchFailureException - { - // log.debug("protected void synch(int n = " + n + "): called"); - - // Create an array of deltas by performing n reference pings. - long[] delta = new long[n]; - - for (int i = 0; i < n; i++) - { - delta[i] = ping(); - } - - // Reject any deltas that are larger than 1 s.d. above the median. - long median = median(delta); - long sd = standardDeviation(delta); - - // log.debug("median = " + median); - // log.debug("sd = " + sd); - - long[] tempDeltas = new long[n]; - int count = 0; - - for (int i = 0; i < n; i++) - { - if ((delta[i] <= (median + sd)) && (delta[i] >= (median - sd))) - { - tempDeltas[count] = delta[i]; - count++; - } - else - { - // log.debug("Rejected: " + delta[i]); - } - } - - System.arraycopy(tempDeltas, 0, delta, 0, count); - - // Estimate the delta as the mean of the remaining deltas. - this.delta += mean(delta); - - // Estimate the error as the standard deviation of the remaining deltas. - this.epsilon = standardDeviation(delta); - - // log.debug("this.delta = " + this.delta); - // log.debug("this.epsilon = " + this.epsilon); - } - - /** - * Performs a single reference clock request cycle and returns the estimated delta relative to the local clock. - * This is computed as the half-latency of the requst cycle, plus the reference clock, minus the local clock. - * - * @return The estimated clock delta. - * - * @throws ClockSynchFailureException If the reference service is not responding. - */ - protected long ping() throws ClockSynchFailureException - { - // log.debug("protected long ping(): called"); - - try - { - byte[] buf = new byte[256]; - - boolean timedOut = false; - long start = 0L; - long refTime = 0L; - long localTime = 0L; - long latency = 0L; - int failCount = 0; - - // Keep trying the ping until it gets a response, or 10 tries in a row all time out. - do - { - // Start timing the request latency. - start = nanoTime(); - - // Get the reference time. - DatagramPacket packet = - new DatagramPacket(buf, buf.length, referenceAddress, UDPClockReference.REFERENCE_PORT); - socket.send(packet); - packet = new DatagramPacket(buf, buf.length); - - timedOut = false; - - try - { - socket.receive(packet); - } - catch (SocketTimeoutException e) - { - timedOut = true; - failCount++; - - continue; - } - - ByteBuffer bbuf = ByteBuffer.wrap(packet.getData()); - refTime = bbuf.getLong(); - - // Stop timing the request latency. - localTime = nanoTime(); - latency = localTime - start; - - // log.debug("refTime = " + refTime); - // log.debug("localTime = " + localTime); - // log.debug("start = " + start); - // log.debug("latency = " + latency); - // log.debug("delta = " + ((latency / 2) + (refTime - localTime))); - - } - while (timedOut && (failCount < 10)); - - // Fail completely if the fail count is too high. - if (failCount >= 10) - { - throw new ClockSynchFailureException("Clock reference not responding.", null); - } - - // Estimate delta as (ref clock + half-latency) - local clock. - return (latency / 2) + (refTime - localTime); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - - /** - * Gets the clock delta in nano seconds. - * - * @return The clock delta in nano seconds. - */ - public long getDelta() - { - return delta; - } - - /** - * Gets an estimate of the clock error in nan seconds. - * - * @return An estimate of the clock error in nan seconds. - */ - public long getEpsilon() - { - return epsilon; - } - - /** - * Gets the local clock time with any computed delta added in. - * - * @return The local clock time with any computed delta added in. - */ - public long nanoTime() - { - return System.nanoTime() + delta; - } - - /** - * Computes the median of a series of values. - * - * @param values The values. - * - * @return The median. - */ - public static long median(long[] values) - { - // log.debug("public static long median(long[] values = " + Arrays.toString(values) + "): called"); - - long median; - - // Order the list of values. - long[] orderedValues = new long[values.length]; - System.arraycopy(values, 0, orderedValues, 0, values.length); - Arrays.sort(orderedValues); - - // Check if the median is computed from a pair of middle value. - if ((orderedValues.length % 2) == 0) - { - int middle = orderedValues.length / 2; - - median = (orderedValues[middle] + orderedValues[middle - 1]) / 2; - } - // The median is computed from a single middle value. - else - { - median = orderedValues[orderedValues.length / 2]; - } - - // log.debug("median = " + median); - - return median; - } - - /** - * Computes the mean of a series of values. - * - * @param values The values. - * - * @return The mean. - */ - public static long mean(long[] values) - { - // log.debug("public static long mean(long[] values = " + Arrays.toString(values) + "): called"); - - long total = 0L; - - for (long value : values) - { - total += value; - } - - long mean = total / values.length; - - // log.debug("mean = " + mean); - - return mean; - } - - /** - * Computes the variance of series of values. - * - * @param values The values. - * - * @return The variance of the values. - */ - public static long variance(long[] values) - { - // log.debug("public static long variance(long[] values = " + Arrays.toString(values) + "): called"); - - long mean = mean(values); - - long totalVariance = 0; - - for (long value : values) - { - long diff = (value - mean); - totalVariance += diff * diff; - } - - long variance = totalVariance / values.length; - - // log.debug("variance = " + variance); - - return variance; - } - - /** - * Computes the standard deviation of a series of values. - * - * @param values The values. - * - * @return The standard deviation. - */ - public static long standardDeviation(long[] values) - { - // log.debug("public static long standardDeviation(long[] values = " + Arrays.toString(values) + "): called"); - - long sd = Double.valueOf(Math.sqrt(variance(values))).longValue(); - - // log.debug("sd = " + sd); - - return sd; - } - - /** - * For testing purposes. Supply address of reference clock as arg 1. - * - * @param args Address of reference clock as arg 1. - */ - public static void main(String[] args) - { - ParsedProperties options = - new ParsedProperties(CommandLineParser.processCommandLine(args, - new CommandLineParser( - new String[][] - { - { "1", "Address of clock reference service.", "address", "true" } - }), System.getProperties())); - - String address = options.getProperty("1"); - - // Create a clock synchronizer. - UDPClockSynchronizer clockSyncher = new UDPClockSynchronizer(address); - - // Set up a shutdown hook for it. - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() - { - public void run() - { - doSynch = false; - } - })); - - // Repeat the clock synching until the user kills the progam. - while (doSynch) - { - // Perform a clock clockSynch. - try - { - clockSyncher.synch(); - - // Print out the clock delta and estimate of the error. - System.out.println("Delta = " + clockSyncher.getDelta()); - System.out.println("Epsilon = " + clockSyncher.getEpsilon()); - - try - { - Thread.sleep(250); - } - catch (InterruptedException e) - { - // Restore the interrupted status and terminate the loop. - Thread.currentThread().interrupt(); - doSynch = false; - } - } - // Terminate if the reference time service is unavailable. - catch (ClockSynchFailureException e) - { - doSynch = false; - } - } - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java deleted file mode 100644 index 6c950fc307..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedCircuitImpl.java +++ /dev/null @@ -1,472 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedcircuit; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.TimingController; -import org.apache.qpid.junit.extensions.TimingControllerAware; -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.Circuit; -import org.apache.qpid.test.framework.Publisher; -import org.apache.qpid.test.framework.Receiver; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.framework.TestUtils; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Session; -import java.util.LinkedList; -import java.util.List; - -/** - * DistributedCircuitImpl is a distributed implementation of the test {@link Circuit}. Many publishers and receivers - * accross multiple machines may be combined to form a single test circuit. The test circuit extracts reports from - * all of its publishers and receivers, and applies its assertions to these reports. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Supply the publishing and receiving ends of a test messaging circuit. - * <tr><td> Start the circuit running. - * <tr><td> Close the circuit down. - * <tr><td> Take a reading of the circuits state. - * <tr><td> Apply assertions against the circuits state. - * <tr><td> Send test messages over the circuit. - * <tr><td> Perform the default test procedue on the circuit. - * </table> - * - * @todo There is a short pause after receiving sender reports before asking for receiver reports, because receivers may - * not have finished receiving all their test messages before the report request arrives. This is going to be a - * problem for taking test timings and needs to be eliminiated. Suggested solution: have receiver send back reports - * asynchronously, on test batch size boundaries, and do so automatically rather than having to have the report - * request sent to them. Number each test run, or otherwise uniquely identify it, when a receiver does not get - * any more messages on a test run for more than a timeout, it can assume the test is complete and send a final - * report. On the coordinator end a future will need to be created to wait for all final reports to come in, and - * to register results and timings for the test. This must work in such a way that a new test cycle can be started - * without waiting for the results of the old one to come in. - * - * @todo Add in setting of timing controller, from timing aware test cases. - */ -public class DistributedCircuitImpl implements Circuit, TimingControllerAware -{ - /** Used for debugging purposes. */ - private static final Logger log = Logger.getLogger(DistributedCircuitImpl.class); - - /** Holds the conversation factory over which to coordinate the test. */ - protected ConversationFactory conversationFactory; - - /** Holds the controlSession over which to hold the control conversation. */ - protected Session controlSession; - - /** Holds the sender nodes in the test circuit. */ - protected List<TestClientDetails> senders; - - /** Holds the receiver nodes in the test circuit. */ - protected List<TestClientDetails> receivers; - - /** Holds the sender control conversations. */ - protected ConversationFactory.Conversation[] senderConversation; - - /** Holds the receiver control conversations. */ - protected ConversationFactory.Conversation[] receiverConversation; - - /** Holds the control topics for the senders in the test circuit. */ - protected Destination[] senderControlTopic; - - /** Holds the control topics for the receivers in the test circuit. */ - protected Destination[] receiverControlTopic; - - /** Holds the number of messages to send per test run. */ - protected int numMessages; - - /** - * Holds the timing controller for the circuit. This is used to log test times asynchronously, when reciever nodes - * return their reports after senders have completed a test case. - */ - TimingController timingController; - - /** - * Creates a distributed test circuit on the specified senders and receivers. - * - * @param session The controlSession for all control conversations. - * @param senders The senders. - * @param receivers The receivers. - * @param senderConversation A control conversation with the senders. - * @param receiverConversation A control conversation with the receivers. - * @param senderControlTopic The senders control topic. - * @param receiverControlTopic The receivers control topic. - */ - protected DistributedCircuitImpl(Session session, List<TestClientDetails> senders, List<TestClientDetails> receivers, - ConversationFactory.Conversation[] senderConversation, ConversationFactory.Conversation[] receiverConversation, - Destination[] senderControlTopic, Destination[] receiverControlTopic) - { - this.controlSession = session; - this.senders = senders; - this.receivers = receivers; - this.senderConversation = senderConversation; - this.receiverConversation = receiverConversation; - this.senderControlTopic = senderControlTopic; - this.receiverControlTopic = receiverControlTopic; - } - - /** - * Creates a distributed test circuit from the specified test parameters, on the senders and receivers - * given. - * - * @param testProps The test parameters. - * @param senders The sender ends in the test circuit. - * @param receivers The receiver ends in the test circuit. - * @param conversationFactory A conversation factory for creating the control conversations with senders and receivers. - * - * @return A connected and ready to start, test circuit. - */ - public static Circuit createCircuit(ParsedProperties testProps, List<TestClientDetails> senders, - List<TestClientDetails> receivers, ConversationFactory conversationFactory) - { - log.debug("public static Circuit createCircuit(ParsedProperties testProps, List<TestClientDetails> senders, " - + " List<TestClientDetails> receivers, ConversationFactory conversationFactory)"); - - try - { - Session session = conversationFactory.getSession(); - - // Create control conversations with each of the senders. - ConversationFactory.Conversation[] senderConversation = new ConversationFactory.Conversation[senders.size()]; - Destination[] senderControlTopic = new Destination[senders.size()]; - - for (int i = 0; i < senders.size(); i++) - { - TestClientDetails sender = senders.get(i); - - senderControlTopic[i] = session.createTopic(sender.privateControlKey); - senderConversation[i] = conversationFactory.startConversation(); - } - - log.debug("Sender conversations created."); - - // Create control conversations with each of the receivers. - ConversationFactory.Conversation[] receiverConversation = new ConversationFactory.Conversation[receivers.size()]; - Destination[] receiverControlTopic = new Destination[receivers.size()]; - - for (int i = 0; i < receivers.size(); i++) - { - TestClientDetails receiver = receivers.get(i); - - receiverControlTopic[i] = session.createTopic(receiver.privateControlKey); - receiverConversation[i] = conversationFactory.startConversation(); - } - - log.debug("Receiver conversations created."); - - // Assign the sender role to each of the sending test clients. - for (int i = 0; i < senders.size(); i++) - { - TestClientDetails sender = senders.get(i); - - Message assignSender = conversationFactory.getSession().createMessage(); - TestUtils.setPropertiesOnMessage(assignSender, testProps); - assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE"); - assignSender.setStringProperty("ROLE", "SENDER"); - - senderConversation[i].send(senderControlTopic[i], assignSender); - } - - log.debug("Sender role assignments sent."); - - // Assign the receivers role to each of the receiving test clients. - for (int i = 0; i < receivers.size(); i++) - { - TestClientDetails receiver = receivers.get(i); - - Message assignReceiver = session.createMessage(); - TestUtils.setPropertiesOnMessage(assignReceiver, testProps); - assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE"); - assignReceiver.setStringProperty("ROLE", "RECEIVER"); - - receiverConversation[i].send(receiverControlTopic[i], assignReceiver); - } - - log.debug("Receiver role assignments sent."); - - // Wait for the senders and receivers to confirm their roles. - for (int i = 0; i < senders.size(); i++) - { - senderConversation[i].receive(); - } - - log.debug("Got all sender role confirmations"); - - for (int i = 0; i < receivers.size(); i++) - { - receiverConversation[i].receive(); - } - - log.debug("Got all receiver role confirmations"); - - // Package everything up as a circuit. - return new DistributedCircuitImpl(session, senders, receivers, senderConversation, receiverConversation, - senderControlTopic, receiverControlTopic); - } - catch (JMSException e) - { - throw new RuntimeException("JMSException not handled."); - } - } - - /** - * Used by tests cases that can supply a {@link org.apache.qpid.junit.extensions.TimingController} to set the - * controller on an aware test. - * - * @param controller The timing controller. - */ - public void setTimingController(TimingController controller) - { - this.timingController = controller; - } - - /** - * Gets the interface on the publishing end of the circuit. - * - * @return The publishing end of the circuit. - */ - public Publisher getPublisher() - { - throw new RuntimeException("Not Implemented."); - } - - /** - * Gets the interface on the receiving end of the circuit. - * - * @return The receiving end of the circuit. - */ - public Receiver getReceiver() - { - throw new RuntimeException("Not Implemented."); - } - - /** - * Connects and starts the circuit. After this method is called the circuit is ready to send messages. - */ - public void start() - { - log.debug("public void start(): called"); - - try - { - // Start the test on each of the senders. - Message start = controlSession.createMessage(); - start.setStringProperty("CONTROL_TYPE", "START"); - start.setIntProperty("MESSAGE_COUNT", numMessages); - - for (int i = 0; i < senders.size(); i++) - { - senderConversation[i].send(senderControlTopic[i], start); - } - - log.debug("All senders told to start their tests."); - } - catch (JMSException e) - { - throw new RuntimeException("Unhandled JMSException.", e); - } - } - - /** - * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit, - * into a report, against which assertions may be checked. - * - * @todo Replace the asynch receiver report thread with a choice of direct or asynch executor, so that asynch - * or synch logging of test timings is optional. Also need to provide an onMessage method that is capable - * of receiving timing reports that receivers will generate during an ongoing test, on the test sample - * size boundaries. The message timing logging code should be factored out as a common method that can - * be called in response to the final report responses, or the onMessage method. Another alternative is - * to abandon the final report request altogether and just use the onMessage method? I think the two - * differ though, as the final report is used to apply assertions, and the ongoing report is just for - * periodic timing results... In which case, maybe there needs to be a way for the onMessage method - * to process just some of the incoming messages, and forward the rest on to the conversion helper, as - * a sort of pre-conversation helper filter? Make conversation expose its onMessage method (it should - * already) and allow another delivery thread to filter the incoming messages to the conversation. - */ - public void check() - { - log.debug("public void check(): called"); - - try - { - // Wait for all the test senders to return their reports. - for (int i = 0; i < senders.size(); i++) - { - Message senderReport = senderConversation[i].receive(); - log.debug("Sender " + senderReport.getStringProperty("CLIENT_NAME") + " reports message count: " - + senderReport.getIntProperty("MESSAGE_COUNT")); - log.debug("Sender " + senderReport.getStringProperty("CLIENT_NAME") + " reports message time: " - + senderReport.getLongProperty("TEST_TIME")); - } - - log.debug("Got all sender test reports."); - - // Apply sender assertions to pass/fail the tests. - - // Inject a short pause to give the receivers time to finish receiving their test messages. - TestUtils.pause(500); - - // Ask the receivers for their reports. - Message statusRequest = controlSession.createMessage(); - statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST"); - - for (int i = 0; i < receivers.size(); i++) - { - receiverConversation[i].send(receiverControlTopic[i], statusRequest); - } - - log.debug("All receiver test reports requested."); - - // Wait for all receiver reports to come in, but do so asynchronously. - Runnable gatherAllReceiverReports = - new Runnable() - { - public void run() - { - try - { - // Wait for all the receivers to send their reports. - for (int i = 0; i < receivers.size(); i++) - { - Message receiverReport = receiverConversation[i].receive(); - - String clientName = receiverReport.getStringProperty("CLIENT_NAME"); - int messageCount = receiverReport.getIntProperty("MESSAGE_COUNT"); - long testTime = receiverReport.getLongProperty("TEST_TIME"); - - log.debug("Receiver " + clientName + " reports message count: " + messageCount); - log.debug("Receiver " + receiverReport.getStringProperty("CLIENT_NAME") - + " reports message time: " + testTime); - - // Apply receiver assertions to pass/fail the tests. - - // Log the test timings on the asynchronous test timing controller. - /*try - { - timingController.completeTest(true, messageCount, testTime); - } - // The timing controll can throw InterruptedException is the current test is to be - // interrupted. - catch (InterruptedException e) - { - e.printStackTrace(); - }*/ - } - - log.debug("All receiver test reports received."); - } - catch (JMSException e) - { - throw new RuntimeException(e); - } - } - }; - - Thread receiverReportsThread = new Thread(gatherAllReceiverReports); - receiverReportsThread.start(); - - // return new Message[] { senderReport, receiverReport }; - - } - catch (JMSException e) - { - throw new RuntimeException("Unhandled JMSException.", e); - } - } - - /** - * Closes the circuit. All associated resources are closed. - */ - public void close() - { - log.debug("public void close(): called"); - - // End the current test on all senders and receivers. - } - - /** - * Applies a list of assertions against the test circuit. The {@link #check()} method should be called before doing - * this, to ensure that the circuit has gathered its state into a report to assert against. - * - * @param assertions The list of assertions to apply. - * - * @return Any assertions that failed. - */ - public List<Assertion> applyAssertions(List<Assertion> assertions) - { - log.debug("public List<Assertion> applyAssertions(List<Assertion> assertions = " + assertions + "): called"); - - List<Assertion> failures = new LinkedList<Assertion>(); - - for (Assertion assertion : assertions) - { - if (!assertion.apply()) - { - failures.add(assertion); - } - } - - return failures; - } - - /** - * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold. - * - * @param numMessages The number of messages to send using the default test procedure. - * @param assertions The list of assertions to apply. - * - * @return Any assertions that failed. - * - * @todo From check onwards needs to be handled as a future. The future must call back onto the test case to - * report results asynchronously. - */ - public List<Assertion> test(int numMessages, List<Assertion> assertions) - { - log.debug("public List<Assertion> test(int numMessages = " + numMessages + ", List<Assertion> assertions = " - + assertions + "): called"); - - // Keep the number of messages to send per test run, where the send method can reference it. - this.numMessages = numMessages; - - // Start the test running on all sender circuit ends. - start(); - - // Request status reports to be handed in. - check(); - - // Assert conditions on the publishing end of the circuit. - // Assert conditions on the receiving end of the circuit. - List<Assertion> failures = applyAssertions(assertions); - - // Close the circuit ending the current test case. - close(); - - // Pass with no failed assertions or fail with a list of failed assertions. - return failures; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java deleted file mode 100644 index 130e908b0e..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedPublisherImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedcircuit; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.Publisher; - -/** - * DistributedPublisherImpl represents the status of the publishing side of a test circuit. Its main purpose is to - * provide assertions that can be applied to verify the behaviour of a non-local publisher. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide assertion that the publishers received no exceptions. - * <tr><td> Provide assertion that the publishers received a no consumers error code on every message. - * <tr><td> Provide assertion that the publishers received a no route error code on every message. - * </table> - */ -public class DistributedPublisherImpl implements Publisher -{ - /** - * Provides an assertion that the publisher encountered no exceptions. - * - * @return An assertion that the publisher encountered no exceptions. - * @param testProps - */ - public Assertion noExceptionsAssertion(ParsedProperties testProps) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the publisher got a no consumers exception on every message. - * - * @return An assertion that the publisher got a no consumers exception on every message. - */ - public Assertion noConsumersAssertion() - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the publisher got a no rout exception on every message. - * - * @return An assertion that the publisher got a no rout exception on every message. - */ - public Assertion noRouteAssertion() - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the AMQP channel was forcibly closed by an error condition. - * - * @param testProps The test configuration properties. - * @return An assertion that the AMQP channel was forcibly closed by an error condition. - */ - public Assertion channelClosedAssertion(ParsedProperties testProps) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the publisher got a given exception during the test. - * - * @param testProps The test configuration properties. - * @param exceptionClass The exception class to check for. - * @return An assertion that the publisher got a given exception during the test. - */ - public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass) - { - throw new RuntimeException("Not implemented."); - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java deleted file mode 100644 index 4b801e7b66..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/DistributedReceiverImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedcircuit; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.Receiver; - -/** - * DistributedReceiverImpl represents the status of the receiving side of a test circuit. Its main purpose is to - * provide assertions that can be applied to verify the behaviour of a non-local receiver. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <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> - */ -public class DistributedReceiverImpl implements Receiver -{ - /** - * Provides an assertion that the receivers encountered no exceptions. - * - * @return An assertion that the receivers encountered no exceptions. - * @param testProps - */ - public Assertion noExceptionsAssertion(ParsedProperties testProps) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the receivers got all messages that were sent to it. - * - * @return An assertion that the receivers got all messages that were sent to it. - * @param testProps - */ - public Assertion allMessagesReceivedAssertion(ParsedProperties testProps) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the receivers got none of the messages that were sent to it. - * - * @return An assertion that the receivers got none of the messages that were sent to it. - * @param testProps - */ - public Assertion noMessagesReceivedAssertion(ParsedProperties testProps) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the AMQP channel was forcibly closed by an error condition. - * - * @param testProps The test configuration properties. - * @return An assertion that the AMQP channel was forcibly closed by an error condition. - */ - public Assertion channelClosedAssertion(ParsedProperties testProps) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Provides an assertion that the receiver got a given exception during the test. - * - * @param testProps - *@param exceptionClass The exception class to check for. @return An assertion that the receiver got a given exception during the test. - */ - public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass) - { - throw new RuntimeException("Not implemented."); - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java deleted file mode 100644 index 09bcf24da5..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedcircuit/TestClientCircuitEnd.java +++ /dev/null @@ -1,333 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedcircuit; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.junit.extensions.util.TestContextProperties; -import org.apache.qpid.test.framework.CircuitEnd; -import org.apache.qpid.test.framework.ExceptionMonitor; -import org.apache.qpid.test.framework.LocalCircuitFactory; -import org.apache.qpid.test.framework.MessageMonitor; -import org.apache.qpid.test.framework.MessagingTestConfigProperties; -import org.apache.qpid.test.framework.TestUtils; -import org.apache.qpid.test.framework.distributedtesting.TestClientControlledTest; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; - -/** - * A TestClientCircuitEnd is a {@link CircuitEnd} that may be controlled from a - * {@link org.apache.qpid.test.framework.distributedtesting.TestClient}, and that forms a single publishing or - * receiving end point in a distributed test {@link org.apache.qpid.test.framework.Circuit}. - * - * <p/>When operating in the SENDER role, this circuit end is capable of acting as part of the default circuit test - * procedure (described in the class comment for {@link org.apache.qpid.test.framework.Circuit}). That is, it will - * send the number of test messages required, using the test configuration parameters given in the test invite, and - * return a report on its activities to the circuit controller. - * - * <p/>When operation in the RECEIVER role, this circuit end acts as part of the default circuit test procedure. It will - * receive test messages, on the setup specified in the test configuration parameters, and keep count of the messages - * received, and time taken to receive them. When requested by the circuit controller to provide a report, it will - * return this report of its activities. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide a message producer for sending messages. - * <td> {@link CircuitEnd}, {@link LocalCircuitFactory}, {@link TestUtils} - * <tr><td> Provide a message consumer for receiving messages. - * <td> {@link CircuitEnd}, {@link LocalCircuitFactory}, {@link TestUtils} - * <tr><td> Supply the name of the test case that this implements. - * <tr><td> Accept/Reject invites based on test parameters. <td> {@link MessagingTestConfigProperties} - * <tr><td> Adapt to assigned roles. <td> {@link TestClientControlledTest.Roles} - * <tr><td> Perform test case actions. <td> {@link MessageMonitor} - * <tr><td> Generate test reports. <td> {@link MessageMonitor} - * </table> - */ -public class TestClientCircuitEnd implements CircuitEnd, TestClientControlledTest -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(TestClientCircuitEnd.class); - - /** Holds the test parameters. */ - ParsedProperties testProps; - - /** The number of test messages to send. */ - private int numMessages; - - /** The role to be played by the test. */ - private Roles role; - - /** The connection to send the test messages on. */ - private Connection connection; - - /** Holds the circuit end for this test. */ - CircuitEnd circuitEnd; - - /** - * Holds a message monitor for this circuit end, either the monitor on the consumer when in RECEIVER more, or - * a monitor updated on every message sent, when acting as a SENDER. - */ - MessageMonitor messageMonitor; - - /** - * Should provide the name of the test case that this class implements. The exact names are defined in the - * interop testing spec. - * - * @return The name of the test case that this implements. - */ - public String getName() - { - return "DEFAULT_CIRCUIT_TEST"; - } - - /** - * Determines whether the test invite that matched this test case is acceptable. - * - * @param inviteMessage The invitation to accept or reject. - * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it. - * - * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through. - */ - public boolean acceptInvite(Message inviteMessage) throws JMSException - { - log.debug("public boolean acceptInvite(Message inviteMessage): called"); - - // Populate the test parameters from the invitation. - testProps = TestContextProperties.getInstance(MessagingTestConfigProperties.defaults); - - for (Object key : testProps.keySet()) - { - String propName = (String) key; - - // If the test parameters is overridden by the invitation, use it instead. - String inviteValue = inviteMessage.getStringProperty(propName); - - if (inviteValue != null) - { - testProps.setProperty(propName, inviteValue); - log.debug("Test invite supplied override to " + propName + " of " + inviteValue); - } - - } - - // Accept the invitation. - return true; - } - - /** - * Assigns the role to be played by this test case. The test parameters are fully specified in the - * assignment message. When this method return the test case will be ready to execute. - * - * @param role The role to be played; sender or receivers. - * @param assignRoleMessage The role assingment message, contains the full test parameters. - * - * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through. - */ - public void assignRole(Roles role, Message assignRoleMessage) throws JMSException - { - log.debug("public void assignRole(Roles role, Message assignRoleMessage): called"); - - // Take note of the role to be played. - this.role = role; - - // Extract and retain the test parameters. - numMessages = 1; // assignRoleMessage.getIntProperty("NUM_MESSAGES"); - - // Connect using the test parameters. - connection = TestUtils.createConnection(testProps); - - // Create a circuit end that matches the assigned role and test parameters. - LocalCircuitFactory circuitFactory = new LocalCircuitFactory(); - - switch (role) - { - // Check if the sender role is being assigned, and set up a message producer if so. - case SENDER: - - // Set up the publisher. - circuitEnd = circuitFactory.createPublisherCircuitEnd(connection, testProps, 0L); - - // Create a custom message monitor that will be updated on every message sent. - messageMonitor = new MessageMonitor(); - - break; - - // Otherwise the receivers role is being assigned, so set this up to listen for messages. - case RECEIVER: - - // Set up the receiver. - circuitEnd = circuitFactory.createReceiverCircuitEnd(connection, testProps, 0L); - - // Use the message monitor from the consumer for stats. - messageMonitor = getMessageMonitor(); - - break; - } - - // Reset all messaging stats for the report. - messageMonitor.reset(); - - connection.start(); - } - - /** - * Performs the test case actions. Returning from here, indicates that the sending role has completed its test. - * - * @param numMessages The number of test messages to send. - * - * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through. - * - * @todo Add round robin on destinations where multiple destinations being used. - * - * @todo Add rate limiting when rate limit specified on publishers. - * - * @todo Add Max pending message size protection. The receiver will have to send back some acks once in a while, - * to notify the publisher that its messages are being consumed. This makes the safety valve harder to - * implement than in the single VM case. For example, if the limit is 1000 messages, might want to get back - * an ack every 500, to notify the publisher that it can keep sending. What about pub/sub tests? Will it be - * necessary to wait for an ack from every receiver? This will have the effect of rate limiting to slow - * consumers too. - * - * @todo Add commits on every commit batch size boundary. - */ - public void start(int numMessages) throws JMSException - { - log.debug("public void start(): called"); - - // If in the SENDER role, send the specified number of test messages to the circuit destinations. - if (role.equals(Roles.SENDER)) - { - Message testMessage = getSession().createMessage(); - - for (int i = 0; i < numMessages; i++) - { - getProducer().send(testMessage); - - // Increment the message count and timings. - messageMonitor.onMessage(testMessage); - } - } - } - - /** - * Gets a report on the actions performed by the test case in its assigned role. - * - * @param session The controlSession to create the report message in. - * @return The report message. - * - * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through. - */ - public Message getReport(Session session) throws JMSException - { - Message report = session.createMessage(); - report.setStringProperty("CONTROL_TYPE", "REPORT"); - - // Add the count of messages sent/received to the report. - report.setIntProperty("MESSAGE_COUNT", messageMonitor.getNumMessage()); - - // Add the time to send/receive messages to the report. - report.setLongProperty("TEST_TIME", messageMonitor.getTime()); - - // Add any exceptions detected to the report. - - return report; - } - - /** - * Gets the message producer at this circuit end point. - * - * @return The message producer at with this circuit end point. - */ - public MessageProducer getProducer() - { - return circuitEnd.getProducer(); - } - - /** - * Gets the message consumer at this circuit end point. - * - * @return The message consumer at this circuit end point. - */ - public MessageConsumer getConsumer() - { - return circuitEnd.getConsumer(); - } - - /** - * Send the specified message over the producer at this end point. - * - * @param message The message to send. - * - * @throws JMSException Any JMS exception occuring during the send is allowed to fall through. - */ - public void send(Message message) throws JMSException - { - // Send the message on the circuit ends producer. - circuitEnd.send(message); - } - - /** - * Gets the JMS Session associated with this circuit end point. - * - * @return The JMS Session associated with this circuit end point. - */ - public Session getSession() - { - return circuitEnd.getSession(); - } - - /** - * Closes the message producers and consumers and the sessions, associated with this circuit end point. - * - * @throws JMSException Any JMSExceptions occurring during the close are allowed to fall through. - */ - public void close() throws JMSException - { - // Close the producer and consumer. - circuitEnd.close(); - } - - /** - * Returns the message monitor for reporting on received messages on this circuit end. - * - * @return The message monitor for this circuit end. - */ - public MessageMonitor getMessageMonitor() - { - return circuitEnd.getMessageMonitor(); - } - - /** - * Returns the exception monitor for reporting on exceptions received on this circuit end. - * - * @return The exception monitor for this circuit end. - */ - public ExceptionMonitor getExceptionMonitor() - { - return circuitEnd.getExceptionMonitor(); - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java deleted file mode 100644 index e07b141cb5..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/Coordinator.java +++ /dev/null @@ -1,546 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedtesting; - -import junit.framework.Test; -import junit.framework.TestResult; -import junit.framework.TestSuite; -import org.apache.log4j.Logger; -import org.apache.log4j.NDC; - -import org.apache.qpid.junit.extensions.TKTestRunner; -import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator; -import org.apache.qpid.junit.extensions.util.CommandLineParser; -import org.apache.qpid.junit.extensions.util.MathUtils; -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.junit.extensions.util.TestContextProperties; -import org.apache.qpid.test.framework.FrameworkBaseCase; -import org.apache.qpid.test.framework.MessagingTestConfigProperties; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.framework.TestUtils; -import org.apache.qpid.test.framework.clocksynch.UDPClockReference; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Session; -import java.net.InetAddress; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.LinkedBlockingQueue; - -/** - * <p/>Implements the coordinator client described in the interop testing specification - * (http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification). This coordinator is built on - * top of the JUnit testing framework. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Find out what test clients are available. <td> {@link ConversationFactory} - * <tr><td> Decorate available tests to run on all available clients. <td> {@link DistributedTestDecorator} - * <tr><td> Attach XML test result logger. - * <tr><td> Terminate the interop testing framework. - * </table> - * - * @todo Should accumulate failures over all tests, and return with success or fail code based on all results. May need - * to write a special TestResult to do this properly. At the moment only the last one used will be tested for - * errors, as the start method creates a fresh one for each test case run. - */ -public class Coordinator extends TKTestRunner -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(Coordinator.class); - - /** Used for reporting to the console. */ - private static final Logger console = Logger.getLogger("CONSOLE"); - - /** Defines the possible distributed test engines available to run coordinated test cases with. */ - public enum TestEngine - { - /** Specifies the interop test engine. This tests all available clients in pairs. */ - INTEROP, - - /** Specifies the fanout test engine. This sets up one publisher role, and many reciever roles. */ - FANOUT - } - - /** - * Holds the test context properties that provides the default test parameters, plus command line overrides. - * This is initialized with the default test parameters, to which command line overrides may be applied. - */ - protected static ParsedProperties testContextProperties = - TestContextProperties.getInstance(MessagingTestConfigProperties.defaults); - - /** Holds the URL of the broker to coordinate the tests on. */ - protected String brokerUrl; - - /** Holds the virtual host to coordinate the tests on. If <tt>null</tt>, then the default virtual host is used. */ - protected String virtualHost; - - /** Holds the list of all clients that enlisted, when the compulsory invite was issued. */ - protected Set<TestClientDetails> enlistedClients = new HashSet<TestClientDetails>(); - - /** Holds the conversation helper for the control conversation. */ - protected ConversationFactory conversationFactory; - - /** Holds the connection that the coordinating messages are sent over. */ - protected Connection connection; - - /** Holds the path of the directory to output test results too, if one is defined. */ - protected String reportDir; - - /** Holds the coordinating test engine type to run the tests through. */ - protected TestEngine engine; - - /** Flag that indicates that all test clients should be terminated upon completion of the test cases. */ - protected boolean terminate; - - /** - * Creates an interop test coordinator on the specified broker and virtual host. - * - * @param repetitions The number of times to repeat the test, or test batch size. - * @param duration The length of time to run the tests for. -1 means no duration has been set. - * @param threads The concurrency levels to ramp up to. - * @param delay A delay in milliseconds between test runs. - * @param params The sets of 'size' parameters to pass to test. - * @param testCaseName The name of the test case to run. - * @param reportDir The directory to output the test results to. - * @param runName The name of the test run; used to name the output file. - * @param verbose Whether to print comments during test run. - * @param brokerUrl The URL of the broker to connect to. - * @param virtualHost The virtual host to run all tests on. Optional, may be <tt>null</tt>. - * @param engine The distributed test engine type to run the tests with. - * @param terminate <tt>true</tt> if test client nodes should be terminated at the end of the tests. - * @param csv <tt>true</tt> if the CSV results listener should be attached. - * @param xml <tt>true</tt> if the XML results listener should be attached. - * @param decoratorFactories List of factories for user specified decorators. - */ - public Coordinator(Integer repetitions, Long duration, int[] threads, int delay, int[] params, String testCaseName, - String reportDir, String runName, boolean verbose, String brokerUrl, String virtualHost, TestEngine engine, - boolean terminate, boolean csv, boolean xml, List<TestDecoratorFactory> decoratorFactories) - { - super(repetitions, duration, threads, delay, params, testCaseName, reportDir, runName, csv, xml, decoratorFactories); - - log.debug("public Coordinator(Integer repetitions = " + repetitions + " , Long duration = " + duration - + ", int[] threads = " + Arrays.toString(threads) + ", int delay = " + delay + ", int[] params = " - + Arrays.toString(params) + ", String testCaseName = " + testCaseName + ", String reportDir = " + reportDir - + ", String runName = " + runName + ", boolean verbose = " + verbose + ", String brokerUrl = " + brokerUrl - + ", String virtualHost =" + virtualHost + ", TestEngine engine = " + engine + ", boolean terminate = " - + terminate + ", boolean csv = " + csv + ", boolean xml = " + xml + "): called"); - - // Retain the connection parameters. - this.brokerUrl = brokerUrl; - this.virtualHost = virtualHost; - this.reportDir = reportDir; - this.engine = engine; - this.terminate = terminate; - } - - /** - * The entry point for the interop test coordinator. This client accepts the following command line arguments: - * - * <p/><table> - * <tr><td> -b <td> The broker URL. <td> Mandatory. - * <tr><td> -h <td> The virtual host. <td> Optional. - * <tr><td> -o <td> The directory to output test results to. <td> Optional. - * <tr><td> -e <td> The type of test distribution engine to use. <td> Optional. One of: interop, fanout. - * <tr><td> ... <td> Free arguments. The distributed test cases to run. - * <td> Mandatory. At least one must be defined. - * <tr><td> name=value <td> Trailing argument define name/value pairs. Added to the test contenxt properties. - * <td> Optional. - * </table> - * - * @param args The command line arguments. - */ - public static void main(String[] args) - { - NDC.push("coordinator"); - log.debug("public static void main(String[] args = " + Arrays.toString(args) + "): called"); - console.info("Qpid Distributed Test Coordinator."); - - // Override the default broker url to be localhost:5672. - testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, "tcp://localhost:5672"); - - try - { - // Use the command line parser to evaluate the command line with standard handling behaviour (print errors - // and usage then exist if there are errors). - // Any options and trailing name=value pairs are also injected into the test context properties object, - // to override any defaults that may have been set up. - ParsedProperties options = - new ParsedProperties(CommandLineParser.processCommandLine(args, - new CommandLineParser( - new String[][] - { - { "b", "The broker URL.", "broker", "false" }, - { "h", "The virtual host to use.", "virtual host", "false" }, - { "o", "The name of the directory to output test timings to.", "dir", "false" }, - { - "e", "The test execution engine to use. Default is interop.", "engine", "interop", - "^interop$|^fanout$", "true" - }, - { "t", "Terminate test clients on completion of tests.", null, "false" }, - { "-csv", "Output test results in CSV format.", null, "false" }, - { "-xml", "Output test results in XML format.", null, "false" }, - { - "-trefaddr", "To specify an alternative to hostname for time singal reference.", - "address", "false" - }, - { - "c", "The number of tests to run concurrently.", "num", "false", - MathUtils.SEQUENCE_REGEXP - }, - { "r", "The number of times to repeat each test.", "num", "false" }, - { - "d", "The length of time to run the tests for.", "duration", "false", - MathUtils.DURATION_REGEXP - }, - { - "f", "The maximum rate to call the tests at.", "frequency", "false", - "^([1-9][0-9]*)/([1-9][0-9]*)$" - }, - { "s", "The size parameter to run tests with.", "size", "false", MathUtils.SEQUENCE_REGEXP }, - { "v", "Verbose mode.", null, "false" }, - { "n", "A name for this test run, used to name the output file.", "name", "true" }, - { - "X:decorators", "A list of additional test decorators to wrap the tests in.", - "\"class.name[:class.name]*\"", "false" - } - }), testContextProperties)); - - // Extract the command line options. - String brokerUrl = options.getProperty("b"); - String virtualHost = options.getProperty("h"); - String reportDir = options.getProperty("o"); - reportDir = (reportDir == null) ? "." : reportDir; - String testEngine = options.getProperty("e"); - TestEngine engine = "fanout".equals(testEngine) ? TestEngine.FANOUT : TestEngine.INTEROP; - boolean terminate = options.getPropertyAsBoolean("t"); - boolean csvResults = options.getPropertyAsBoolean("-csv"); - boolean xmlResults = options.getPropertyAsBoolean("-xml"); - String threadsString = options.getProperty("c"); - Integer repetitions = options.getPropertyAsInteger("r"); - String durationString = options.getProperty("d"); - String paramsString = options.getProperty("s"); - boolean verbose = options.getPropertyAsBoolean("v"); - String testRunName = options.getProperty("n"); - String decorators = options.getProperty("X:decorators"); - - int[] threads = (threadsString == null) ? null : MathUtils.parseSequence(threadsString); - int[] params = (paramsString == null) ? null : MathUtils.parseSequence(paramsString); - Long duration = (durationString == null) ? null : MathUtils.parseDuration(durationString); - - // If broker or virtual host settings were specified as command line options, override the defaults in the - // test context properties with them. - - // Collection all of the test cases to be run. - Collection<Class<? extends FrameworkBaseCase>> testCaseClasses = - new ArrayList<Class<? extends FrameworkBaseCase>>(); - - // Create a list of test decorator factories for use specified decorators to be applied. - List<TestDecoratorFactory> decoratorFactories = parseDecorators(decorators); - - // Scan for available test cases using a classpath scanner. - // ClasspathScanner.getMatches(DistributedTestCase.class, "^Test.*", true); - - // Hard code the test classes till the classpath scanner is fixed. - // Collections.addAll(testCaseClasses, InteropTestCase1DummyRun.class, InteropTestCase2BasicP2P.class, - // InteropTestCase3BasicPubSub.class); - - // Parse all of the free arguments as test cases to run. - for (int i = 1; true; i++) - { - String nextFreeArg = options.getProperty(Integer.toString(i)); - - // Terminate the loop once all free arguments have been consumed. - if (nextFreeArg == null) - { - break; - } - - try - { - Class nextClass = Class.forName(nextFreeArg); - - if (FrameworkBaseCase.class.isAssignableFrom(nextClass)) - { - testCaseClasses.add(nextClass); - console.info("Found distributed test case: " + nextFreeArg); - } - } - catch (ClassNotFoundException e) - { - console.info("Unable to instantiate the test case: " + nextFreeArg + "."); - } - } - - // Check that some test classes were actually found. - if (testCaseClasses.isEmpty()) - { - throw new RuntimeException( - "No test cases implementing FrameworkBaseCase were specified on the command line."); - } - - // Extract the names of all the test classes, to pass to the start method. - int i = 0; - String[] testClassNames = new String[testCaseClasses.size()]; - - for (Class testClass : testCaseClasses) - { - testClassNames[i++] = testClass.getName(); - } - - // Create a coordinator and begin its test procedure. - Coordinator coordinator = - new Coordinator(repetitions, duration, threads, 0, params, null, reportDir, testRunName, verbose, brokerUrl, - virtualHost, engine, terminate, csvResults, xmlResults, decoratorFactories); - - TestResult testResult = coordinator.start(testClassNames); - - // Return different error codes, depending on whether or not there were test failures. - if (testResult.failureCount() > 0) - { - System.exit(FAILURE_EXIT); - } - else - { - System.exit(SUCCESS_EXIT); - } - } - catch (Exception e) - { - log.debug("Top level handler caught execption.", e); - console.info(e.getMessage()); - e.printStackTrace(); - System.exit(EXCEPTION_EXIT); - } - } - - /** - * Starts all of the test classes to be run by this coordinator. - * - * @param testClassNames An array of all the coordinating test case implementations. - * - * @return A JUnit TestResult to run the tests with. - * - * @throws Exception Any underlying exceptions are allowed to fall through, and fail the test process. - */ - public TestResult start(String[] testClassNames) throws Exception - { - log.debug("public TestResult start(String[] testClassNames = " + Arrays.toString(testClassNames) + ": called"); - - // Connect to the broker. - connection = TestUtils.createConnection(TestContextProperties.getInstance()); - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - - Destination controlTopic = session.createTopic("iop.control"); - Destination responseQueue = session.createQueue("coordinator"); - - conversationFactory = new ConversationFactory(connection, responseQueue, LinkedBlockingQueue.class); - ConversationFactory.Conversation conversation = conversationFactory.startConversation(); - - connection.start(); - - // Broadcast the compulsory invitation to find out what clients are available to test. - Message invite = session.createMessage(); - invite.setStringProperty("CONTROL_TYPE", "INVITE"); - invite.setJMSReplyTo(responseQueue); - - conversation.send(controlTopic, invite); - - // Wait for a short time, to give test clients an opportunity to reply to the invitation. - Collection<Message> enlists = conversation.receiveAll(0, 500); - enlistedClients = extractEnlists(enlists); - - for (TestClientDetails client : enlistedClients) - { - log.debug("Got enlisted test client: " + client); - console.info("Test node " + client.clientName + " available."); - } - - // Start the clock reference service running. - UDPClockReference clockReference = new UDPClockReference(); - Thread clockRefThread = new Thread(clockReference); - registerShutdownHook(clockReference); - clockRefThread.start(); - - // Broadcast to all clients to synchronize their clocks against the coordinators clock reference. - Message clockSynchRequest = session.createMessage(); - clockSynchRequest.setStringProperty("CONTROL_TYPE", "CLOCK_SYNCH"); - - String localAddress = InetAddress.getByName(InetAddress.getLocalHost().getHostName()).getHostAddress(); - clockSynchRequest.setStringProperty("ADDRESS", localAddress); - - conversation.send(controlTopic, clockSynchRequest); - - // Run the test in the suite using JUnit. - TestResult result = null; - - for (String testClassName : testClassNames) - { - // Record the current test class, so that the test results can be output to a file incorporating this name. - this.currentTestClassName = testClassName; - - result = super.start(new String[] { testClassName }); - } - - // At this point in time, all tests have completed. Broadcast the shutdown message, if the termination option - // was set on the command line. - if (terminate) - { - Message terminate = session.createMessage(); - terminate.setStringProperty("CONTROL_TYPE", "TERMINATE"); - - conversation.send(controlTopic, terminate); - } - - return result; - } - - /** - * For a collection of enlist messages, this method pulls out of the client details for the enlisting clients. - * - * @param enlists The enlist messages. - * - * @return A set of enlisting clients, extracted from the enlist messages. - * - * @throws JMSException Any underlying JMSException is allowed to fall through. - */ - public static Set<TestClientDetails> extractEnlists(Collection<Message> enlists) throws JMSException - { - log.debug("public static Set<TestClientDetails> extractEnlists(Collection<Message> enlists = " + enlists - + "): called"); - - Set<TestClientDetails> enlistedClients = new HashSet<TestClientDetails>(); - - // Retain the list of all available clients. - for (Message enlist : enlists) - { - TestClientDetails clientDetails = new TestClientDetails(); - clientDetails.clientName = enlist.getStringProperty("CLIENT_NAME"); - clientDetails.privateControlKey = enlist.getStringProperty("CLIENT_PRIVATE_CONTROL_KEY"); - - String replyType = enlist.getStringProperty("CONTROL_TYPE"); - - if ("ENLIST".equals(replyType)) - { - enlistedClients.add(clientDetails); - } - else if ("DECLINE".equals(replyType)) - { - log.debug("Test client " + clientDetails.clientName + " declined the invite."); - } - else - { - log.warn("Got an unknown reply type, " + replyType + ", to the invite."); - } - } - - return enlistedClients; - } - - /** - * Runs a test or suite of tests, using the super class implemenation. This method wraps the test to be run - * in any test decorators needed to add in the coordinators ability to invite test clients to participate in - * tests. - * - * @param test The test to run. - * @param wait Undocumented. Nothing in the JUnit javadocs to say what this is for. - * - * @return The results of the test run. - */ - public TestResult doRun(Test test, boolean wait) - { - log.debug("public TestResult doRun(Test \"" + test + "\", boolean " + wait + "): called"); - - // Wrap all tests in the test suite with WrappedSuiteTestDecorators. This is quite ugly and a bit baffling, - // but the reason it is done is because the JUnit implementation of TestDecorator has some bugs in it. - WrappedSuiteTestDecorator targetTest = null; - - if (test instanceof TestSuite) - { - log.debug("targetTest is a TestSuite"); - - TestSuite suite = (TestSuite)test; - - int numTests = suite.countTestCases(); - log.debug("There are " + numTests + " in the suite."); - - for (int i = 0; i < numTests; i++) - { - Test nextTest = suite.testAt(i); - log.debug("suite.testAt(" + i + ") = " + nextTest); - - if (nextTest instanceof FrameworkBaseCase) - { - log.debug("nextTest is a FrameworkBaseCase"); - } - } - - targetTest = new WrappedSuiteTestDecorator(suite); - log.debug("Wrapped with a WrappedSuiteTestDecorator."); - } - - // Apply any optional user specified decorators. - targetTest = applyOptionalUserDecorators(targetTest); - - // Wrap the tests in a suitable distributed test decorator, to perform the invite/test cycle. - targetTest = newTestDecorator(targetTest, enlistedClients, conversationFactory, connection); - - // TestSuite suite = new TestSuite(); - // suite.addTest(targetTest); - - // Wrap the tests in a scaled test decorator to them them as a 'batch' in one thread. - // targetTest = new ScaledTestDecorator(targetTest, new int[] { 1 }); - - return super.doRun(targetTest, wait); - } - - /** - * Creates a wrapped test decorator, that is capable of inviting enlisted clients to participate in a specified - * test. This is the test engine that sets up the roles and sequences a distributed test case. - * - * @param targetTest The test decorator to wrap. - * @param enlistedClients The enlisted clients available to run the test. - * @param conversationFactory The conversation factory used to build conversation helper over the specified connection. - * @param connection The connection to talk to the enlisted clients over. - * - * @return An invititing test decorator, that invites all the enlisted clients to participate in tests, in pairs. - */ - protected DistributedTestDecorator newTestDecorator(WrappedSuiteTestDecorator targetTest, - Set<TestClientDetails> enlistedClients, ConversationFactory conversationFactory, Connection connection) - { - switch (engine) - { - case FANOUT: - return new FanOutTestDecorator(targetTest, enlistedClients, conversationFactory, connection); - case INTEROP: - default: - return new InteropTestDecorator(targetTest, enlistedClients, conversationFactory, connection); - } - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java deleted file mode 100644 index 49a01d3127..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/DistributedTestDecorator.java +++ /dev/null @@ -1,164 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedtesting; - -import junit.framework.TestResult; -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator; -import org.apache.qpid.test.framework.FrameworkBaseCase; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.framework.sequencers.CircuitFactory; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import java.util.Collection; -import java.util.Set; - -/** - * DistributedTestDecorator is a base class for writing test decorators that invite test clients to participate in - * distributed test cases. It provides a helper method, {@link #signupClients}, that broadcasts an invitation and - * returns the set of test clients that are available to particiapte in the test. - * - * <p/>When used to wrap a {@link FrameworkBaseCase} test, it replaces the default {@link CircuitFactory} implementations - * with a suitable circuit factory for distributed tests. Concrete implementations can use this to configure the sending - * and receiving roles on the test. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Broadcast test invitations and collect enlists. <td> {@link ConversationFactory}. - * </table> - */ -public abstract class DistributedTestDecorator extends WrappedSuiteTestDecorator -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(DistributedTestDecorator.class); - - /** Holds the contact information for all test clients that are available and that may take part in the test. */ - Set<TestClientDetails> allClients; - - /** Holds the conversation helper for the control level conversation for coordinating the test through. */ - ConversationFactory conversationFactory; - - /** Holds the connection that the control conversation is held over. */ - Connection connection; - - /** Holds the underlying test suite that this decorator wraps. */ - WrappedSuiteTestDecorator testSuite; - - /** Holds the control topic, on which test invitations are broadcast. */ - protected Destination controlTopic; - - /** - * Creates a wrapped suite test decorator from another one. - * - * @param suite The test suite. - * @param availableClients The list of all clients that responded to the compulsory invite. - * @param controlConversation The conversation helper for the control level, test coordination conversation. - * @param controlConnection The connection that the coordination messages are sent over. - */ - public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients, - ConversationFactory controlConversation, Connection controlConnection) - { - super(suite); - - log.debug("public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> allClients = " - + availableClients + ", ConversationHelper controlConversation = " + controlConversation + "): called"); - - testSuite = suite; - allClients = availableClients; - conversationFactory = controlConversation; - connection = controlConnection; - - // Set up the test control topic. - try - { - controlTopic = conversationFactory.getSession().createTopic("iop.control"); - } - catch (JMSException e) - { - throw new RuntimeException("Unable to create the coordinating control topic to broadcast test invites on.", e); - } - } - - /** - * Should run all of the tests in the wrapped test suite. - * - * @param testResult The the results object to monitor the test results with. - */ - public abstract void run(TestResult testResult); - - /** - * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase} - * tests. - * - * @return A distributed test sequencer. - */ - public abstract CircuitFactory getTestSequencer(); - - /** - * Broadcasts an invitation to participate in a coordinating test case to find out what clients are available to - * run the test case. - * - * @param coordTest The coordinating test case to broadcast an inviate for. - * - * @return A set of test clients that accepted the invitation. - */ - protected Set<TestClientDetails> signupClients(FrameworkBaseCase coordTest) - { - // Broadcast the invitation to find out what clients are available to test. - Set<TestClientDetails> enlists; - try - { - Message invite = conversationFactory.getSession().createMessage(); - - ConversationFactory.Conversation conversation = conversationFactory.startConversation(); - - invite.setStringProperty("CONTROL_TYPE", "INVITE"); - invite.setStringProperty("TEST_NAME", coordTest.getTestCaseNameForTestMethod(coordTest.getName())); - - conversation.send(controlTopic, invite); - - // Wait for a short time, to give test clients an opportunity to reply to the invitation. - Collection<Message> replies = conversation.receiveAll(allClients.size(), 500); - enlists = Coordinator.extractEnlists(replies); - } - catch (JMSException e) - { - throw new RuntimeException("There was a JMSException during the invite/enlist conversation.", e); - } - - return enlists; - } - - /** - * Prints a string summarizing this test decorator, mainly for debugging purposes. - * - * @return String representation for debugging purposes. - */ - public String toString() - { - return "DistributedTestDecorator: [ testSuite = " + testSuite + " ]"; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java deleted file mode 100644 index 809bb1dd2f..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/FanOutTestDecorator.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedtesting; - -import junit.framework.Test; -import junit.framework.TestResult; -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator; -import org.apache.qpid.test.framework.DropInTest; -import org.apache.qpid.test.framework.FrameworkBaseCase; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.framework.sequencers.CircuitFactory; -import org.apache.qpid.test.framework.sequencers.FanOutCircuitFactory; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageListener; -import java.util.Iterator; -import java.util.Set; - -/** - * FanOutTestDecorator is an {@link DistributedTestDecorator} that runs one test client in the sender role, and the remainder - * in the receivers role. It also has the capability to listen for new test cases joining the test beyond the initial start - * point. This feature can be usefull when experimenting with adding more load, in the form of more test clients, to assess - * its impact on a running test. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Execute coordinated test cases. <td> {@link FrameworkBaseCase} - * <tr><td> Accept test clients joining a running test. - * </table> - */ -public class FanOutTestDecorator extends DistributedTestDecorator implements MessageListener -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(FanOutTestDecorator.class); - - /** Holds the currently running test case. */ - private FrameworkBaseCase currentTest = null; - - /** - * Creates a wrapped suite test decorator from another one. - * - * @param suite The test suite. - * @param availableClients The list of all clients that responded to the compulsory invite. - * @param controlConversation The conversation helper for the control level, test coordination conversation. - * @param controlConnection The connection that the coordination messages are sent over. - */ - public FanOutTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients, - ConversationFactory controlConversation, Connection controlConnection) - { - super(suite, availableClients, controlConversation, controlConnection); - - log.debug("public DistributedTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> allClients = " - + availableClients + ", ConversationHelper controlConversation = " + controlConversation + "): called"); - - testSuite = suite; - allClients = availableClients; - conversationFactory = controlConversation; - connection = controlConnection; - - // Sign available clients up to the test. - for (Test test : getAllUnderlyingTests()) - { - FrameworkBaseCase coordTest = (FrameworkBaseCase) test; - - // Get all of the clients able to participate in the test. - Set<TestClientDetails> enlists = signupClients(coordTest); - - // Check that there were some clients available. - if (enlists.size() == 0) - { - throw new RuntimeException("No clients to test with"); - } - - // Create a distributed test circuit factory for the test. - CircuitFactory circuitFactory = getTestSequencer(); - - // Set up the first client in the sender role, and the remainder in the receivers role. - Iterator<TestClientDetails> clients = enlists.iterator(); - circuitFactory.setSender(clients.next()); - - while (clients.hasNext()) - { - // Set the sending and receiving client details on the test case. - circuitFactory.setReceiver(clients.next()); - } - - // Pass down the connection to hold the coordinating conversation over. - circuitFactory.setConversationFactory(conversationFactory); - - // If the current test case is a drop-in test, set it up as the currently running test for late joiners to - // add in to. Otherwise the current test field is set to null, to indicate that late joiners are not allowed. - currentTest = (coordTest instanceof DropInTest) ? coordTest : null; - - // Execute the test case. - coordTest.setCircuitFactory(circuitFactory); - } - } - - /** - * Broadcasts a test invitation and accepts enlists from participating clients. The wrapped test cases are run - * with one test client in the sender role, and the remaining test clients in the receiving role. - * - * <p/>Any JMSExceptions during the invite/enlist conversation will be allowed to fall through as runtime - * exceptions, resulting in the non-completion of the test run. - * - * @param testResult The the results object to monitor the test results with. - * - * @todo Better error recovery for failure of the invite/enlist conversation could be added. - */ - public void run(TestResult testResult) - { - log.debug("public void run(TestResult testResult): called"); - - // Listen for late joiners on the control topic. - try - { - conversationFactory.getSession().createConsumer(controlTopic).setMessageListener(this); - } - catch (JMSException e) - { - throw new RuntimeException("Unable to set up the message listener on the control topic.", e); - } - - // Run all of the test cases in the test suite. - /*for (Test test : getAllUnderlyingTests()) - { - FrameworkBaseCase coordTest = (FrameworkBaseCase) test; - - // Get all of the clients able to participate in the test. - Set<TestClientDetails> enlists = signupClients(coordTest); - - // Check that there were some clients available. - if (enlists.size() == 0) - { - throw new RuntimeException("No clients to test with"); - } - - // Create a distributed test circuit factory for the test. - CircuitFactory circuitFactory = getTestSequencer(); - - // Set up the first client in the sender role, and the remainder in the receivers role. - Iterator<TestClientDetails> clients = enlists.iterator(); - circuitFactory.setSender(clients.next()); - - while (clients.hasNext()) - { - // Set the sending and receiving client details on the test case. - circuitFactory.setReceiver(clients.next()); - } - - // Pass down the connection to hold the coordinating conversation over. - circuitFactory.setConversationFactory(conversationFactory); - - // If the current test case is a drop-in test, set it up as the currently running test for late joiners to - // add in to. Otherwise the current test field is set to null, to indicate that late joiners are not allowed. - currentTest = (coordTest instanceof DropInTest) ? coordTest : null; - - // Execute the test case. - coordTest.setCircuitFactory(circuitFactory); - }*/ - - // Run all of the test cases in the test suite. - for (Test test : getAllUnderlyingTests()) - { - FrameworkBaseCase coordTest = (FrameworkBaseCase) test; - - coordTest.run(testResult); - - currentTest = null; - } - } - - /** - * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase} - * tests. - * - * @return A distributed test sequencer. - */ - public CircuitFactory getTestSequencer() - { - return new FanOutCircuitFactory(); - } - - /** - * Listens to incoming messages on the control topic. If the messages are 'join' messages, signalling a new - * test client wishing to join the current test, then the new client will be added to the current test in the - * receivers role. - * - * @param message The incoming control message. - */ - public void onMessage(Message message) - { - try - { - // Check if the message is from a test client attempting to join a running test, and join it to the current - // test case if so. - if (message.getStringProperty("CONTROL_TYPE").equals("JOIN") && (currentTest != null)) - { - ((DropInTest) currentTest).lateJoin(message); - } - } - // There is not a lot can be done with this error, so it is deliberately ignored. - catch (JMSException e) - { - log.debug("Unable to process message:" + message); - } - } - - /** - * Prints a string summarizing this test decorator, mainly for debugging purposes. - * - * @return String representation for debugging purposes. - */ - public String toString() - { - return "FanOutTestDecorator: [ testSuite = " + testSuite + " ]"; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java deleted file mode 100644 index dd5007090b..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/InteropTestDecorator.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedtesting; - -import junit.framework.Test; -import junit.framework.TestResult; -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.WrappedSuiteTestDecorator; -import org.apache.qpid.test.framework.FrameworkBaseCase; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.framework.sequencers.CircuitFactory; -import org.apache.qpid.test.framework.sequencers.InteropCircuitFactory; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -/** - * DistributedTestDecorator is a test decorator, written to implement the interop test specification. Given a list - * of enlisted test clients, that are available to run interop tests, this decorator invites them to participate - * in each test in the wrapped test suite. Amongst all the clients that respond to the invite, all pairs are formed, - * and each pairing (in both directions, but excluding the reflexive pairings) is split into a sender and receivers - * role and a test case run between them. Any enlisted combinations that do not accept a test invite are automatically - * failed. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Broadcast test invitations and collect enlists. <td> {@link org.apache.qpid.test.utils.ConversationFactory}. - * <tr><td> Output test failures for clients unwilling to run the test case. <td> {@link Coordinator} - * <tr><td> Execute distributed test cases. <td> {@link FrameworkBaseCase} - * <tr><td> Fail non-participating pairings. <td> {@link OptOutTestCase} - * </table> - */ -public class InteropTestDecorator extends DistributedTestDecorator -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(InteropTestDecorator.class); - - /** - * Creates a wrapped suite test decorator from another one. - * - * @param suite The test suite. - * @param availableClients The list of all clients that responded to the compulsory invite. - * @param controlConversation The conversation helper for the control level, test coordination conversation. - * @param controlConnection The connection that the coordination messages are sent over. - */ - public InteropTestDecorator(WrappedSuiteTestDecorator suite, Set<TestClientDetails> availableClients, - ConversationFactory controlConversation, Connection controlConnection) - { - super(suite, availableClients, controlConversation, controlConnection); - } - - /** - * Broadcasts a test invitation and accetps enlisting from participating clients. The wrapped test case is - * then repeated for every combination of test clients (provided the wrapped test case extends - * {@link FrameworkBaseCase}. - * - * <p/>Any JMSExceptions during the invite/enlist conversation will be allowed to fall through as runtime exceptions, - * resulting in the non-completion of the test run. - * - * @todo Better error recovery for failure of the invite/enlist conversation could be added. - * - * @param testResult The the results object to monitor the test results with. - */ - public void run(TestResult testResult) - { - log.debug("public void run(TestResult testResult): called"); - - Collection<Test> tests = testSuite.getAllUnderlyingTests(); - - for (Test test : getAllUnderlyingTests()) - { - FrameworkBaseCase coordTest = (FrameworkBaseCase) test; - - // Broadcast the invitation to find out what clients are available to test. - Set<TestClientDetails> enlists = signupClients(coordTest); - - // Compare the list of willing clients to the list of all available. - Set<TestClientDetails> optOuts = new HashSet<TestClientDetails>(allClients); - optOuts.removeAll(enlists); - - // Output test failures for clients that will not particpate in the test. - Set<List<TestClientDetails>> failPairs = allPairs(optOuts, allClients); - - for (List<TestClientDetails> failPair : failPairs) - { - // Create a distributed test circuit factory for the test. - CircuitFactory circuitFactory = getTestSequencer(); - - // Create an automatic failure test for the opted out test pair. - FrameworkBaseCase failTest = new OptOutTestCase("testOptOut"); - circuitFactory.setSender(failPair.get(0)); - circuitFactory.setReceiver(failPair.get(1)); - failTest.setCircuitFactory(circuitFactory); - - failTest.run(testResult); - } - - // Loop over all combinations of clients, willing to run the test. - Set<List<TestClientDetails>> enlistedPairs = allPairs(enlists, enlists); - - for (List<TestClientDetails> enlistedPair : enlistedPairs) - { - // Create a distributed test circuit factory for the test. - CircuitFactory circuitFactory = getTestSequencer(); - - // Set the sending and receiving client details on the test circuitFactory. - circuitFactory.setSender(enlistedPair.get(0)); - circuitFactory.setReceiver(enlistedPair.get(1)); - - // Pass down the connection to hold the coordination conversation over. - circuitFactory.setConversationFactory(conversationFactory); - - // Execute the test case. - coordTest.setCircuitFactory(circuitFactory); - coordTest.run(testResult); - } - } - } - - /** - * Should provide the distributed test sequencer to pass to {@link org.apache.qpid.test.framework.FrameworkBaseCase} - * tests. - * - * @return A distributed test sequencer. - */ - public CircuitFactory getTestSequencer() - { - return new InteropCircuitFactory(); - } - - /** - * Produces all pairs of combinations of elements from two sets. The ordering of the elements in the pair is - * important, that is the pair <l, r> is distinct from <r, l>; both pairs are generated. For any element, i, in - * both the left and right sets, the reflexive pair <i, i> is not generated. - * - * @param left The left set. - * @param right The right set. - * @param <E> The type of the content of the pairs. - * - * @return All pairs formed from the permutations of all elements of the left and right sets. - */ - private <E> Set<List<E>> allPairs(Set<E> left, Set<E> right) - { - log.debug("private <E> Set<List<E>> allPairs(Set<E> left = " + left + ", Set<E> right = " + right + "): called"); - - Set<List<E>> results = new HashSet<List<E>>(); - - // Form all pairs from left to right. - // Form all pairs from right to left. - for (E le : left) - { - for (E re : right) - { - if (!le.equals(re)) - { - results.add(new Pair<E>(le, re)); - results.add(new Pair<E>(re, le)); - } - } - } - - log.debug("results = " + results); - - return results; - } - - /** - * A simple implementation of a pair, using a list. - */ - private class Pair<T> extends ArrayList<T> - { - /** - * Creates a new pair of elements. - * - * @param first The first element. - * @param second The second element. - */ - public Pair(T first, T second) - { - super(); - super.add(first); - super.add(second); - } - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java deleted file mode 100644 index 229c6a34da..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/OptOutTestCase.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedtesting; - -import org.apache.qpid.test.framework.FrameworkBaseCase; -import org.apache.qpid.test.framework.sequencers.CircuitFactory; - -/** - * An OptOutTestCase is a test case that automatically fails. It is used when a list of test clients has been generated - * from a compulsory invite, but only some of those clients have responded to a specific test case invite. The clients - * that did not respond, may automatically be given a fail for some tests. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Fail the test with a suitable reason. - * </table> - */ -public class OptOutTestCase extends FrameworkBaseCase -{ - /** - * Creates a new coordinating test case with the specified name. - * - * @param name The test case name. - */ - public OptOutTestCase(String name) - { - super(name); - } - - /** Generates an appropriate test failure assertion. */ - public void testOptOut() - { - CircuitFactory circuitFactory = getCircuitFactory(); - - fail("One of " + circuitFactory.getSender() + " and " + getCircuitFactory().getReceivers() - + " opted out of the test."); - } - - /** - * Should provide a translation from the junit method name of a test to its test case name as defined in the - * interop testing specification. For example the method "testP2P" might map onto the interop test case name - * "TC2_BasicP2P". - * - * @param methodName The name of the JUnit test method. - * @return The name of the corresponding interop test case. - */ - public String getTestCaseNameForTestMethod(String methodName) - { - return "OptOutTest"; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java deleted file mode 100644 index f9b8cbb898..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClient.java +++ /dev/null @@ -1,510 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedtesting; - -import org.apache.log4j.Logger; -import org.apache.log4j.NDC; - -import org.apache.qpid.junit.extensions.SleepThrottle; -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.junit.extensions.util.TestContextProperties; -import org.apache.qpid.test.framework.MessagingTestConfigProperties; -import org.apache.qpid.test.framework.TestUtils; -import org.apache.qpid.test.framework.clocksynch.ClockSynchThread; -import org.apache.qpid.test.framework.clocksynch.UDPClockSynchronizer; -import org.apache.qpid.test.utils.ReflectionUtils; -import org.apache.qpid.test.utils.ReflectionUtilsException; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.MessageConsumer; -import javax.jms.MessageListener; -import javax.jms.MessageProducer; -import javax.jms.Session; -import javax.jms.Topic; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * Implements a test client as described in the interop testing spec - * (http://cwiki.apache.org/confluence/display/qpid/Interop+Testing+Specification). A test client is an agent that - * reacts to control message sequences send by the test {@link Coordinator}. - * - * <p/><table><caption>Messages Handled by TestClient</caption> - * <tr><th> Message <th> Action - * <tr><td> Invite(compulsory) <td> Reply with Enlist. - * <tr><td> Invite(test case) <td> Reply with Enlist if test case available. - * <tr><td> AssignRole(test case) <td> Reply with Accept Role if matches an enlisted test. Keep test parameters. - * <tr><td> Start <td> Send test messages defined by test parameters. Send report on messages sent. - * <tr><td> Status Request <td> Send report on messages received. - * <tr><td> Terminate <td> Terminate the test client. - * <tr><td> ClockSynch <td> Synch clock against the supplied UDP address. - * </table> - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Handle all incoming control messages. <td> {@link TestClientControlledTest} - * <tr><td> Configure and look up test cases by name. <td> {@link TestClientControlledTest} - * </table> - */ -public class TestClient implements MessageListener -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(TestClient.class); - - /** Used for reporting to the console. */ - private static final Logger console = Logger.getLogger("CONSOLE"); - - /** Holds the default identifying name of the test client. */ - public static final String CLIENT_NAME = "java"; - - /** - * Holds the test context properties that provides the default test parameters, plus command line overrides. - * This is initialized with the default test parameters, to which command line overrides may be applied. - */ - public static ParsedProperties testContextProperties = - TestContextProperties.getInstance(MessagingTestConfigProperties.defaults); - - /** Holds all the test cases loaded from the classpath. */ - Map<String, TestClientControlledTest> testCases = new HashMap<String, TestClientControlledTest>(); - - /** Holds the test case currently being run by this client. */ - protected TestClientControlledTest currentTestCase; - - /** Holds the connection to the broker that the test is being coordinated on. */ - protected Connection connection; - - /** Holds the message producer to hold the test coordination over. */ - protected MessageProducer producer; - - /** Holds the JMS controlSession for the test coordination. */ - protected Session session; - - /** Holds the name of this client, with a default value. */ - protected String clientName = CLIENT_NAME; - - /** This flag indicates that the test client should attempt to join the currently running test case on start up. */ - protected boolean join; - - /** Holds the clock synchronizer for the test node. */ - ClockSynchThread clockSynchThread; - - /** - * Creates a new interop test client, listenting to the specified broker and virtual host, with the specified client - * identifying name. - * - * @param pBrokerUrl The url of the broker to connect to. - * @param pVirtualHost The virtual host to conect to. - * @param clientName The client name to use. - * @param join Flag to indicate that this client should attempt to join running tests. - */ - public TestClient(String pBrokerUrl, String pVirtualHost, String clientName, boolean join) - { - log.debug("public TestClient(String pBrokerUrl = " + pBrokerUrl + ", String pVirtualHost = " + pVirtualHost - + ", String clientName = " + clientName + ", boolean join = " + join + "): called"); - - // Retain the connection parameters. - this.clientName = clientName; - this.join = join; - - // Save properies from command line to defaults - if (pBrokerUrl != null) - { - testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, pBrokerUrl); - } - if (pVirtualHost != null) - { - testContextProperties.setProperty(MessagingTestConfigProperties.VIRTUAL_HOST_PROPNAME, pVirtualHost); - } - } - - /** - * The entry point for the interop test coordinator. This client accepts the following command line arguments: - * - * <p/><table> - * <tr><td> -b <td> The broker URL. <td> Optional. - * <tr><td> -h <td> The virtual host. <td> Optional. - * <tr><td> -n <td> The test client name. <td> Optional. - * <tr><td> name=value <td> Trailing argument define name/value pairs. Added to system properties. <td> Optional. - * </table> - * - * @param args The command line arguments. - */ - public static void main(String[] args) - { - log.debug("public static void main(String[] args = " + Arrays.toString(args) + "): called"); - console.info("Qpid Distributed Test Client."); - - // Override the default broker url to be localhost:5672. - testContextProperties.setProperty(MessagingTestConfigProperties.BROKER_PROPNAME, "tcp://localhost:5672"); - - // Use the command line parser to evaluate the command line with standard handling behaviour (print errors - // and usage then exist if there are errors). - // Any options and trailing name=value pairs are also injected into the test context properties object, - // to override any defaults that may have been set up. - ParsedProperties options = - new ParsedProperties(org.apache.qpid.junit.extensions.util.CommandLineParser.processCommandLine(args, - new org.apache.qpid.junit.extensions.util.CommandLineParser( - new String[][] - { - { "b", "The broker URL.", "broker", "false" }, - { "h", "The virtual host to use.", "virtual host", "false" }, - { "o", "The name of the directory to output test timings to.", "dir", "false" }, - { "n", "The name of the test client.", "name", "false" }, - { "j", "Join this test client to running test.", "false" } - }), testContextProperties)); - - // Extract the command line options. - String brokerUrl = options.getProperty("b"); - String virtualHost = options.getProperty("h"); - String clientName = options.getProperty("n"); - clientName = (clientName == null) ? CLIENT_NAME : clientName; - boolean join = options.getPropertyAsBoolean("j"); - - // To distinguish logging output set up an NDC on the client name. - NDC.push(clientName); - - // Create a test client and start it running. - TestClient client = new TestClient(brokerUrl, virtualHost, clientName, join); - - // Use a class path scanner to find all the interop test case implementations. - // Hard code the test classes till the classpath scanner is fixed. - Collection<Class<? extends TestClientControlledTest>> testCaseClasses = - new ArrayList<Class<? extends TestClientControlledTest>>(); - // ClasspathScanner.getMatches(TestClientControlledTest.class, "^TestCase.*", true); - testCaseClasses.addAll(loadTestCases("org.apache.qpid.interop.clienttestcases.TestCase1DummyRun", - "org.apache.qpid.interop.clienttestcases.TestCase2BasicP2P", - "org.apache.qpid.interop.clienttestcases.TestCase3BasicPubSub", - "org.apache.qpid.interop.clienttestcases.TestCase4P2PMessageSize", - "org.apache.qpid.interop.clienttestcases.TestCase5PubSubMessageSize", - "org.apache.qpid.test.framework.distributedcircuit.TestClientCircuitEnd")); - - try - { - client.start(testCaseClasses); - } - catch (Exception e) - { - log.error("The test client was unable to start.", e); - console.info(e.getMessage()); - System.exit(1); - } - } - - /** - * Parses a list of class names, and loads them if they are available on the class path. - * - * @param classNames The names of the classes to load. - * - * @return A list of the loaded test case classes. - */ - public static List<Class<? extends TestClientControlledTest>> loadTestCases(String... classNames) - { - List<Class<? extends TestClientControlledTest>> testCases = - new LinkedList<Class<? extends TestClientControlledTest>>(); - - for (String className : classNames) - { - try - { - Class<?> cls = ReflectionUtils.forName(className); - testCases.add((Class<? extends TestClientControlledTest>) cls); - } - catch (ReflectionUtilsException e) - { - // Ignore, class could not be found, so test not available. - console.warn("Requested class " + className + " cannot be found, ignoring it."); - } - catch (ClassCastException e) - { - // Ignore, class was not of correct type to be a test case. - console.warn("Requested class " + className + " is not an instance of TestClientControlledTest."); - } - } - - return testCases; - } - - /** - * Starts the interop test client running. This causes it to start listening for incoming test invites. - * - * @param testCaseClasses The classes of the available test cases. The test case names from these are used to - * matchin incoming test invites against. - * - * @throws JMSException Any underlying JMSExceptions are allowed to fall through. - */ - protected void start(Collection<Class<? extends TestClientControlledTest>> testCaseClasses) throws JMSException - { - log.debug("protected void start(Collection<Class<? extends TestClientControlledTest>> testCaseClasses = " - + testCaseClasses + "): called"); - - // Create all the test case implementations and index them by the test names. - for (Class<? extends TestClientControlledTest> nextClass : testCaseClasses) - { - try - { - TestClientControlledTest testCase = nextClass.newInstance(); - testCases.put(testCase.getName(), testCase); - } - catch (InstantiationException e) - { - log.warn("Could not instantiate test case class: " + nextClass.getName(), e); - // Ignored. - } - catch (IllegalAccessException e) - { - log.warn("Could not instantiate test case class due to illegal access: " + nextClass.getName(), e); - // Ignored. - } - } - - // Open a connection to communicate with the coordinator on. - connection = TestUtils.createConnection(testContextProperties); - session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - - // Set this up to listen for control messages. - Topic privateControlTopic = session.createTopic("iop.control." + clientName); - MessageConsumer consumer = session.createConsumer(privateControlTopic); - consumer.setMessageListener(this); - - Topic controlTopic = session.createTopic("iop.control"); - MessageConsumer consumer2 = session.createConsumer(controlTopic); - consumer2.setMessageListener(this); - - // Create a producer to send replies with. - producer = session.createProducer(null); - - // If the join flag was set, then broadcast a join message to notify the coordinator that a new test client - // is available to join the current test case, if it supports it. This message may be ignored, or it may result - // in this test client receiving a test invite. - if (join) - { - Message joinMessage = session.createMessage(); - - joinMessage.setStringProperty("CONTROL_TYPE", "JOIN"); - joinMessage.setStringProperty("CLIENT_NAME", clientName); - joinMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName); - producer.send(controlTopic, joinMessage); - } - - // Start listening for incoming control messages. - connection.start(); - } - - /** - * Handles all incoming control messages. - * - * @param message The incoming message. - */ - public void onMessage(Message message) - { - NDC.push(clientName); - log.debug("public void onMessage(Message message = " + message + "): called"); - - try - { - String controlType = message.getStringProperty("CONTROL_TYPE"); - String testName = message.getStringProperty("TEST_NAME"); - - log.debug("Received control of type '" + controlType + "' for the test '" + testName + "'"); - - // Check if the message is a test invite. - if ("INVITE".equals(controlType)) - { - // Flag used to indicate that an enlist should be sent. Only enlist to compulsory invites or invites - // for which test cases exist. - boolean enlist = false; - - if (testName != null) - { - log.debug("Got an invite to test: " + testName); - - // Check if the requested test case is available. - TestClientControlledTest testCase = testCases.get(testName); - - if (testCase != null) - { - log.debug("Found implementing class for test '" + testName + "', enlisting for it."); - - // Check if the test case will accept the invitation. - enlist = testCase.acceptInvite(message); - - log.debug("The test case " - + (enlist ? " accepted the invite, enlisting for it." - : " did not accept the invite, not enlisting.")); - - // Make the requested test case the current test case. - currentTestCase = testCase; - } - else - { - log.debug("Received an invite to the test '" + testName + "' but this test is not known."); - } - } - else - { - log.debug("Got a compulsory invite, enlisting for it."); - - enlist = true; - } - - if (enlist) - { - // Reply with the client name in an Enlist message. - Message enlistMessage = session.createMessage(); - enlistMessage.setStringProperty("CONTROL_TYPE", "ENLIST"); - enlistMessage.setStringProperty("CLIENT_NAME", clientName); - enlistMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName); - enlistMessage.setJMSCorrelationID(message.getJMSCorrelationID()); - - log.debug("Sending enlist message '" + enlistMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo()); - - producer.send(message.getJMSReplyTo(), enlistMessage); - } - else - { - // Reply with the client name in an Decline message. - Message enlistMessage = session.createMessage(); - enlistMessage.setStringProperty("CONTROL_TYPE", "DECLINE"); - enlistMessage.setStringProperty("CLIENT_NAME", clientName); - enlistMessage.setStringProperty("CLIENT_PRIVATE_CONTROL_KEY", "iop.control." + clientName); - enlistMessage.setJMSCorrelationID(message.getJMSCorrelationID()); - - log.debug("Sending decline message '" + enlistMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo()); - - producer.send(message.getJMSReplyTo(), enlistMessage); - } - } - else if ("ASSIGN_ROLE".equals(controlType)) - { - // Assign the role to the current test case. - String roleName = message.getStringProperty("ROLE"); - - log.debug("Got a role assignment to role: " + roleName); - - TestClientControlledTest.Roles role = Enum.valueOf(TestClientControlledTest.Roles.class, roleName); - - currentTestCase.assignRole(role, message); - - // Reply by accepting the role in an Accept Role message. - Message acceptRoleMessage = session.createMessage(); - acceptRoleMessage.setStringProperty("CLIENT_NAME", clientName); - acceptRoleMessage.setStringProperty("CONTROL_TYPE", "ACCEPT_ROLE"); - acceptRoleMessage.setJMSCorrelationID(message.getJMSCorrelationID()); - - log.debug("Sending accept role message '" + acceptRoleMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo()); - - producer.send(message.getJMSReplyTo(), acceptRoleMessage); - } - else if ("START".equals(controlType) || "STATUS_REQUEST".equals(controlType)) - { - if ("START".equals(controlType)) - { - log.debug("Got a start notification."); - - // Extract the number of test messages to send from the start notification. - int numMessages; - - try - { - numMessages = message.getIntProperty("MESSAGE_COUNT"); - } - catch (NumberFormatException e) - { - // If the number of messages is not specified, use the default of one. - numMessages = 1; - } - - // Start the current test case. - currentTestCase.start(numMessages); - } - else - { - log.debug("Got a status request."); - } - - // Generate the report from the test case and reply with it as a Report message. - Message reportMessage = currentTestCase.getReport(session); - reportMessage.setStringProperty("CLIENT_NAME", clientName); - reportMessage.setStringProperty("CONTROL_TYPE", "REPORT"); - reportMessage.setJMSCorrelationID(message.getJMSCorrelationID()); - - log.debug("Sending report message '" + reportMessage.getJMSMessageID() + "' to " + message.getJMSReplyTo()); - - producer.send(message.getJMSReplyTo(), reportMessage); - } - else if ("TERMINATE".equals(controlType)) - { - console.info("Received termination instruction from coordinator."); - - // Is a cleaner shutdown needed? - connection.close(); - System.exit(0); - } - else if ("CLOCK_SYNCH".equals(controlType)) - { - log.debug("Received clock synch command."); - String address = message.getStringProperty("ADDRESS"); - - log.debug("address = " + address); - - // Re-create (if necessary) and start the clock synch thread to synch the clock every ten seconds. - if (clockSynchThread != null) - { - clockSynchThread.terminate(); - } - - SleepThrottle throttle = new SleepThrottle(); - throttle.setRate(0.1f); - - clockSynchThread = new ClockSynchThread(new UDPClockSynchronizer(address), throttle); - clockSynchThread.start(); - } - else - { - // Log a warning about this but otherwise ignore it. - log.warn("Got an unknown control message, controlType = " + controlType + ", message = " + message); - } - } - catch (JMSException e) - { - // Log a warning about this, but otherwise ignore it. - log.warn("Got JMSException whilst handling message: " + message, e); - } - // Log any runtimes that fall through this message handler. These are fatal errors for the test client. - catch (RuntimeException e) - { - log.error("The test client message handler got an unhandled exception: ", e); - console.info("The message handler got an unhandled exception, terminating the test client."); - System.exit(1); - } - finally - { - NDC.pop(); - } - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java deleted file mode 100644 index 2e64c9ca2d..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/distributedtesting/TestClientControlledTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.distributedtesting; - -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Session; - -/** - * TestClientControlledTest provides an interface that classes implementing test cases to run on a {@link TestClient} - * node can use. Implementations must be Java beans, that is, to provide a default constructor and to implement the - * {@link #getName} method. - * - * <p/>The methods specified in this interface are called when the {@link TestClient} receives control instructions to - * apply to the test. There are control instructions to present the test case with the test invite, so that it may - * choose whether or not to participate in the test, assign the test to play the sender or receiver role, start the - * test and obtain the test status report. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Supply the name of the test case that this implements. - * <tr><td> Accept/Reject invites based on test parameters. - * <tr><td> Adapt to assigned roles. - * <tr><td> Perform test case actions. - * <tr><td> Generate test reports. - * </table> - */ -public interface TestClientControlledTest -{ - /** Defines the possible test case roles that an interop test case can take on. */ - public enum Roles - { - /** Specifies the sender role. */ - SENDER, - - /** Specifies the receivers role. */ - RECEIVER - } - - /** - * Should provide the name of the test case that this class implements. The exact names are defined in the - * interop testing spec. - * - * @return The name of the test case that this implements. - */ - public String getName(); - - /** - * Determines whether the test invite that matched this test case is acceptable. - * - * @param inviteMessage The invitation to accept or reject. - * - * @return <tt>true</tt> to accept the invitation, <tt>false</tt> to reject it. - * - * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through. - */ - public boolean acceptInvite(Message inviteMessage) throws JMSException; - - /** - * Assigns the role to be played by this test case. The test parameters are fully specified in the - * assignment message. When this method return the test case will be ready to execute. - * - * @param role The role to be played; sender or receivers. - * @param assignRoleMessage The role assingment message, contains the full test parameters. - * - * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through. - */ - public void assignRole(Roles role, Message assignRoleMessage) throws JMSException; - - /** - * Performs the test case actions. Returning from here, indicates that the sending role has completed its test. - * - * @param numMessages The number of test messages to send. - * - * @throws JMSException Any JMSException resulting from reading the message are allowed to fall through. - */ - public void start(int numMessages) throws JMSException; - - /** - * Gets a report on the actions performed by the test case in its assigned role. - * - * @param session The controlSession to create the report message in. - * - * @return The report message. - * - * @throws JMSException Any JMSExceptions resulting from creating the report are allowed to fall through. - */ - public Message getReport(Session session) throws JMSException; -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java deleted file mode 100644 index ad2c196adb..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/listeners/XMLTestListener.java +++ /dev/null @@ -1,414 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.listeners; - -import junit.framework.AssertionFailedError; -import junit.framework.Test; -import junit.framework.TestCase; -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.ShutdownHookable; -import org.apache.qpid.junit.extensions.listeners.TKTestListener; - -import java.io.IOException; -import java.io.PrintWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -/** - * Listens for test results for a named test and outputs these in the standard JUnit XML format to the specified - * writer. - * - * <p/>The API for this listener accepts notifications about different aspects of a tests results through different - * methods, so some assumption needs to be made as to which test result a notification refers to. For example - * {@link #startTest} will be called, then possibly {@link #timing} will be called, even though the test instance is - * passed in both cases, it is not enough to distinguish a particular run of the test, as the test case instance may - * be being shared between multiple threads, or being run a repeated number of times, and can therfore be re-used - * between calls. The listeners make the assumption that, for every test, a unique thread will call {@link #startTest} - * and {@link #endTest} to delimit each test. All calls to set test parameters, timings, state and so on, will occur - * between the start and end and will be given with the same thread id as the start and end, so the thread id provides - * a unqiue value to identify a particular test run against. - * - * <p><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Listen to test lifecycle notifications. - * <tr><td> Listen to test errors and failures. - * <tr><td> Listen to test timings. - * <tr><td> Listen to test memory usages. - * <tr><td> Listen to parameterized test parameters. - * <tr><th> Responsibilities - * </table> - * - * @todo Merge this class with CSV test listener, making the collection of results common to both, and only factoring - * out the results printing code into sub-classes. Provide a simple XML results formatter with the same format as - * the ant XML formatter, and a more structured one for outputing results with timings and summaries from - * performance tests. - */ -public class XMLTestListener implements TKTestListener, ShutdownHookable -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(XMLTestListener.class); - - /** The results file writer. */ - protected Writer writer; - - /** Holds the results for individual tests. */ - // protected Map<Result, Result> results = new LinkedHashMap<Result, Result>(); - // protected List<Result> results = new ArrayList<Result>(); - - /** - * Map for holding results on a per thread basis as they come in. A ThreadLocal is not used as sometimes an - * explicit thread id must be used, where notifications come from different threads than the ones that called - * the test method. - */ - Map<Long, Result> threadLocalResults = Collections.synchronizedMap(new LinkedHashMap<Long, Result>()); - - /** - * Holds results for tests that have ended. Transferring these results here from the per-thread results map, means - * that the thread id is freed for the thread to generate more results. - */ - List<Result> results = new ArrayList<Result>(); - - /** Holds the overall error count. */ - protected int errors = 0; - - /** Holds the overall failure count. */ - protected int failures = 0; - - /** Holds the overall tests run count. */ - protected int runs = 0; - - /** Holds the name of the class that tests are being run for. */ - String testClassName; - - /** - * Creates a new XML results output listener that writes to the specified location. - * - * @param writer The location to write results to. - * @param testClassName The name of the test class to include in the test results. - */ - public XMLTestListener(Writer writer, String testClassName) - { - log.debug("public XMLTestListener(Writer writer, String testClassName = " + testClassName + "): called"); - - this.writer = writer; - this.testClassName = testClassName; - } - - /** - * Resets the test results to the default state of time zero, memory usage zero, parameter zero, test passed. - * - * @param test The test to resest any results for. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void reset(Test test, Long threadId) - { - log.debug("public void reset(Test test = " + test + ", Long threadId = " + threadId + "): called"); - - XMLTestListener.Result r = - (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId); - - r.error = null; - r.failure = null; - - } - - /** - * Notification that a test started. - * - * @param test The test that started. - */ - public void startTest(Test test) - { - log.debug("public void startTest(Test test = " + test + "): called"); - - Result newResult = new Result(test.getClass().getName(), ((TestCase) test).getName()); - - // Initialize the thread local test results. - threadLocalResults.put(Thread.currentThread().getId(), newResult); - runs++; - } - - /** - * Should be called every time a test completes with the run time of that test. - * - * @param test The name of the test. - * @param nanos The run time of the test in nanoseconds. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void timing(Test test, long nanos, Long threadId) - { } - - /** - * Optionally called every time a test completes with the second timing test. - * - * @param test The name of the test. - * @param nanos The second timing information of the test in nanoseconds. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void timing2(Test test, Long nanos, Long threadId) - { } - - /** - * Should be called every time a test completed with the amount of memory used before and after the test was run. - * - * @param test The test which memory was measured for. - * @param memStart The total JVM memory used before the test was run. - * @param memEnd The total JVM memory used after the test was run. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void memoryUsed(Test test, long memStart, long memEnd, Long threadId) - { } - - /** - * Should be called every time a parameterized test completed with the int value of its test parameter. - * - * @param test The test which memory was measured for. - * @param parameter The int parameter value. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void parameterValue(Test test, int parameter, Long threadId) - { } - - /** - * Should be called every time a test completes with the current number of test threads running. - * - * @param test The test for which the measurement is being generated. - * @param threads The number of tests being run concurrently. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void concurrencyLevel(Test test, int threads, Long threadId) - { } - - /** - * Notifies listeners of the tests read/set properties. - * - * @param properties The tests read/set properties. - */ - public void properties(Properties properties) - { } - - /** - * Notification that a test ended. - * - * @param test The test that ended. - */ - public void endTest(Test test) - { - log.debug("public void endTest(Test test = " + test + "): called"); - - // Move complete test results into the completed tests list. - Result r = threadLocalResults.get(Thread.currentThread().getId()); - results.add(r); - - // Clear all the test results for the thread. - threadLocalResults.remove(Thread.currentThread().getId()); - } - - /** - * Called when a test completes. Success, failure and errors. This method should be used when registering an - * end test from a different thread than the one that started the test. - * - * @param test The test which completed. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void endTest(Test test, Long threadId) - { - log.debug("public void endTest(Test test = " + test + ", Long threadId = " + threadId + "): called"); - - // Move complete test results into the completed tests list. - Result r = - (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId); - results.add(r); - - // Clear all the test results for the thread. - threadLocalResults.remove(Thread.currentThread().getId()); - } - - /** - * An error occurred. - * - * @param test The test in which the error occurred. - * @param t The throwable that resulted from the error. - */ - public void addError(Test test, Throwable t) - { - log.debug("public void addError(Test test = " + test + ", Throwable t = " + t + "): called"); - - Result r = threadLocalResults.get(Thread.currentThread().getId()); - r.error = t; - errors++; - } - - /** - * A failure occurred. - * - * @param test The test in which the failure occurred. - * @param t The JUnit assertions that led to the failure. - */ - public void addFailure(Test test, AssertionFailedError t) - { - log.debug("public void addFailure(Test test = " + test + ", AssertionFailedError t = " + t + "): called"); - - Result r = threadLocalResults.get(Thread.currentThread().getId()); - r.failure = t; - failures++; - } - - /** - * Called when a test completes to mark it as a test fail. This method should be used when registering a - * failure from a different thread than the one that started the test. - * - * @param test The test which failed. - * @param e The assertion that failed the test. - * @param threadId Optional thread id if not calling from thread that started the test method. May be null. - */ - public void addFailure(Test test, AssertionFailedError e, Long threadId) - { - log.debug("public void addFailure(Test test, AssertionFailedError e, Long threadId): called"); - - Result r = - (threadId == null) ? threadLocalResults.get(Thread.currentThread().getId()) : threadLocalResults.get(threadId); - r.failure = e; - failures++; - } - - /** - * Notifies listeners of the start of a complete run of tests. - */ - public void startBatch() - { - log.debug("public void startBatch(): called"); - - // Reset all results counts. - threadLocalResults = Collections.synchronizedMap(new HashMap<Long, Result>()); - errors = 0; - failures = 0; - runs = 0; - - // Write out the file header. - try - { - writer.write("<?xml version=\"1.0\" ?>\n"); - } - catch (IOException e) - { - throw new RuntimeException("Unable to write the test results.", e); - } - } - - /** - * Notifies listeners of the end of a complete run of tests. - * - * @param parameters The optional test parameters to log out with the batch results. - */ - public void endBatch(Properties parameters) - { - log.debug("public void endBatch(Properties parameters = " + parameters + "): called"); - - // Write out the results. - try - { - // writer.write("<?xml version=\"1.0\" ?>\n"); - writer.write("<testsuite errors=\"" + errors + "\" failures=\"" + failures + "\" tests=\"" + runs + "\" name=\"" - + testClassName + "\">\n"); - - for (Result result : results) - { - writer.write(" <testcase classname=\"" + result.testClass + "\" name=\"" + result.testName + "\">\n"); - - if (result.error != null) - { - writer.write(" <error type=\"" + result.error.getClass() + "\">"); - result.error.printStackTrace(new PrintWriter(writer)); - writer.write(" </error>"); - } - else if (result.failure != null) - { - writer.write(" <failure type=\"" + result.failure.getClass() + "\">"); - result.failure.printStackTrace(new PrintWriter(writer)); - writer.write(" </failure>"); - } - - writer.write(" </testcase>\n"); - } - - writer.write("</testsuite>\n"); - writer.flush(); - } - catch (IOException e) - { - throw new RuntimeException("Unable to write the test results.", e); - } - } - - /** - * Supplies the shutdown hook. - * - * @return The shut down hook. - */ - public Thread getShutdownHook() - { - return new Thread(new Runnable() - { - public void run() - { - log.debug("XMLTestListener::ShutdownHook: called"); - } - }); - } - - /** - * Used to capture the results of a particular test run. - */ - protected static class Result - { - /** Holds the name of the test class. */ - public String testClass; - - /** Holds the name of the test method. */ - public String testName; - - /** Holds the exception that caused error in this test. */ - public Throwable error; - - /** Holds the assertion exception that caused failure in this test. */ - public AssertionFailedError failure; - - /** - * Creates a placeholder for the results of a test. - * - * @param testClass The test class. - * @param testName The name of the test that was run. - */ - public Result(String testClass, String testName) - { - this.testClass = testClass; - this.testName = testName; - } - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java deleted file mode 100644 index 6a0e8cba4b..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalAMQPPublisherImpl.java +++ /dev/null @@ -1,137 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.localcircuit; - -import org.apache.qpid.client.AMQNoConsumersException; -import org.apache.qpid.client.AMQNoRouteException; -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.AMQPPublisher; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.AssertionBase; -import org.apache.qpid.test.framework.CircuitEndBase; -import org.apache.qpid.test.framework.ExceptionMonitor; -import org.apache.qpid.test.framework.MessageMonitor; - -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; - -/** - * LocalAMQPPublisherImpl is an extension of {@link LocalPublisherImpl} that adds AMQP specific features. Specifically - * extra assertions for AMQP features not available through generic JMS. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> - * </table> - */ -public class LocalAMQPPublisherImpl extends LocalPublisherImpl implements AMQPPublisher -{ - /** - * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured - * for messages and exceptions received by the circuit end. - * - * @param producer The message producer for the circuit end point. - * @param consumer The message consumer for the circuit end point. - * @param session The controlSession for the circuit end point. - * @param messageMonitor The monitor to notify of all messages received by the circuit end. - * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end. - */ - public LocalAMQPPublisherImpl(MessageProducer producer, MessageConsumer consumer, Session session, - MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor) - { - super(producer, consumer, session, messageMonitor, exceptionMonitor); - } - - /** - * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation. - * - * @param end The circuit end base implementation to take producers and consumers from. - */ - public LocalAMQPPublisherImpl(CircuitEndBase end) - { - super(end); - } - - /** - * Provides an assertion that the publisher got a no consumers exception on every message. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the publisher got a no consumers exception on every message. - */ - public Assertion noConsumersAssertion(ParsedProperties testProps) - { - return new AssertionBase() - { - public boolean apply() - { - boolean passed = true; - ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor(); - - if (!connectionExceptionMonitor.assertOneJMSExceptionWithLinkedCause(AMQNoConsumersException.class)) - { - passed = false; - - addError("Was expecting linked exception type " + AMQNoConsumersException.class.getName() - + " on the connection.\n"); - addError((connectionExceptionMonitor.size() > 0) - ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor) - : "Got no exceptions on the connection."); - } - - return passed; - } - }; - } - - /** - * Provides an assertion that the publisher got a no rout exception on every message. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the publisher got a no rout exception on every message. - */ - public Assertion noRouteAssertion(ParsedProperties testProps) - { - return new AssertionBase() - { - public boolean apply() - { - boolean passed = true; - ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor(); - - if (!connectionExceptionMonitor.assertOneJMSExceptionWithLinkedCause(AMQNoRouteException.class)) - { - passed = false; - - addError("Was expecting linked exception type " + AMQNoRouteException.class.getName() - + " on the connection.\n"); - addError((connectionExceptionMonitor.size() > 0) - ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor) - : "Got no exceptions on the connection."); - } - - return passed; - } - }; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java deleted file mode 100644 index dc9ee0ac28..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalCircuitImpl.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.localcircuit; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.Circuit; -import org.apache.qpid.test.framework.CircuitEnd; -import org.apache.qpid.test.framework.ExceptionMonitor; -import org.apache.qpid.test.framework.MessagingTestConfigProperties; -import org.apache.qpid.test.framework.Publisher; -import org.apache.qpid.test.framework.Receiver; -import org.apache.qpid.test.framework.TestUtils; - -import javax.jms.Connection; -import javax.jms.JMSException; -import javax.jms.Message; -import java.util.LinkedList; -import java.util.List; - -/** - * LocalCircuitImpl provides an implementation of the test circuit. This is a local only circuit implementation that - * supports a single producer/consumer on each end of the circuit, with both ends of the circuit on the same JVM. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Supply the publishing and receiving ends of a test messaging circuit. - * <td> {@link LocalPublisherImpl}, {@link LocalReceiverImpl} - * <tr><td> Start the circuit running. - * <tr><td> Close the circuit down. - * <tr><td> Take a reading of the circuits state. - * <tr><td> Apply assertions against the circuits state. <td> {@link Assertion} - * <tr><td> Send test messages over the circuit. - * <tr><td> Perform the default test procedure on the circuit. - * <tr><td> Provide access to connection and controlSession exception monitors. <td> {@link ExceptionMonitor} - * </table> - */ -public class LocalCircuitImpl implements Circuit -{ - /** Used for debugging. */ - private static final Logger log = Logger.getLogger(LocalCircuitImpl.class); - - /** Holds the test configuration for the circuit. */ - private ParsedProperties testProps; - - /** Holds the publishing end of the circuit. */ - private LocalPublisherImpl publisher; - - /** Holds the receiving end of the circuit. */ - private LocalReceiverImpl receiver; - - /** Holds the connection for the publishing end of the circuit. */ - private Connection connection; - - /** Holds the exception listener for the connection on the publishing end of the circuit. */ - private ExceptionMonitor connectionExceptionMonitor; - - /** Holds the exception listener for the controlSession on the publishing end of the circuit. */ - private ExceptionMonitor exceptionMonitor; - - /** - * Creates a test circuit using the specified test parameters. The publisher, receivers, connection and - * connection monitor must already have been created, to assemble the circuit. - * - * @param testProps The test parameters. - * @param publisher The test publisher. - * @param receiver The test receivers. - * @param connection The connection. - * @param connectionExceptionMonitor The connection exception monitor. - */ - public LocalCircuitImpl(ParsedProperties testProps, LocalPublisherImpl publisher, LocalReceiverImpl receiver, - Connection connection, ExceptionMonitor connectionExceptionMonitor) - { - this.testProps = testProps; - this.publisher = publisher; - this.receiver = receiver; - this.connection = connection; - this.connectionExceptionMonitor = connectionExceptionMonitor; - this.exceptionMonitor = new ExceptionMonitor(); - - // Set this as the parent circuit on the publisher and receivers. - publisher.setCircuit(this); - receiver.setCircuit(this); - } - - /** - * Gets the interface on the publishing end of the circuit. - * - * @return The publishing end of the circuit. - */ - public Publisher getPublisher() - { - return publisher; - } - - /** - * Gets the local publishing circuit end, for direct manipulation. - * - * @return The local publishing circuit end. - */ - public CircuitEnd getLocalPublisherCircuitEnd() - { - return publisher; - } - - /** - * Gets the interface on the receiving end of the circuit. - * - * @return The receiving end of the circuit. - */ - public Receiver getReceiver() - { - return receiver; - } - - /** - * Gets the local receiving circuit end, for direct manipulation. - * - * @return The local receiving circuit end. - */ - public CircuitEnd getLocalReceiverCircuitEnd() - { - return receiver; - } - - /** - * Checks the test circuit. The effect of this is to gather the circuits state, for both ends of the circuit, - * into a report, against which assertions may be checked. - */ - public void check() - { } - - /** - * Applied a list of assertions against the test circuit. The {@link #check()} method should be called before doing - * this, to ensure that the circuit has gathered its state into a report to assert against. - * - * @param assertions The list of assertions to apply. - * @return Any assertions that failed. - */ - public List<Assertion> applyAssertions(List<Assertion> assertions) - { - List<Assertion> failures = new LinkedList<Assertion>(); - - for (Assertion assertion : assertions) - { - if (!assertion.apply()) - { - failures.add(assertion); - } - } - - return failures; - } - - /** - * Connects and starts the circuit. After this method is called the circuit is ready to send messages. - */ - public void start() - { } - - /** - * Closes the circuit. All associated resources are closed. - */ - public void close() - { - try - { - publisher.close(); - receiver.close(); - connection.close(); - } - catch (JMSException e) - { - throw new RuntimeException("Got JMSException during close:" + e.getMessage(), e); - } - } - - /** - * Sends a message on the test circuit. The exact nature of the message sent is controlled by the test parameters. - */ - protected void send() - { - // Cast the test properties into a typed interface for convenience. - MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps); - - boolean transactional = props.getPublisherTransacted(); - boolean rollback = props.getRollbackPublisher(); - - // Send a message through the publisher and log any exceptions raised. - try - { - CircuitEnd end = getLocalPublisherCircuitEnd(); - - end.send(createTestMessage(end)); - - if (rollback) - { - end.getSession().rollback(); - } - else if (transactional) - { - end.getSession().commit(); - } - } - catch (JMSException e) - { - exceptionMonitor.onException(e); - } - } - - /** - * Runs the default test procedure against the circuit, and checks that all of the specified assertions hold. The - * outline of the default test procedure is: - * - * <p/><pre> - * Start the circuit. - * Send test messages. - * Request a status report. - * Assert conditions on the publishing end of the circuit. - * Assert conditions on the receiving end of the circuit. - * Close the circuit. - * Pass with no failed assertions or fail with a list of failed assertions. - * </pre> - * - * @param numMessages The number of messages to send using the default test procedure. - * @param assertions The list of assertions to apply. - * @return Any assertions that failed. - */ - public List<Assertion> test(int numMessages, List<Assertion> assertions) - { - // Start the test circuit. - start(); - - // Send the requested number of test messages. - for (int i = 0; i < numMessages; i++) - { - send(); - } - - // Inject a short pause to allow time for exceptions to come back asynchronously. - TestUtils.pause(500L); - - // Request a status report. - check(); - - // Clean up the publisher/receivers/controlSession/connections. - close(); - - // Apply all of the requested assertions, keeping record of any that fail. - List<Assertion> failures = applyAssertions(assertions); - - // Return any failed assertions to the caller. - return failures; - } - - /** - * Creates a message with the properties defined as per the test parameters. - * - * @param client The circuit end to create the message on. - * - * @return The test message. - * - * @throws JMSException Any JMSException occurring during creation of the message is allowed to fall through. - */ - private Message createTestMessage(CircuitEnd client) throws JMSException - { - // Cast the test properties into a typed interface for convenience. - MessagingTestConfigProperties props = new MessagingTestConfigProperties(testProps); - - return TestUtils.createTestMessageOfSize(client.getSession(), props.getMessageSize()); - } - - /** - * Gets the exception monitor for the publishing ends connection. - * - * @return The exception monitor for the publishing ends connection. - */ - public ExceptionMonitor getConnectionExceptionMonitor() - { - return connectionExceptionMonitor; - } - - /** - * Gets the exception monitor for the publishing ends controlSession. - * - * @return The exception monitor for the publishing ends controlSession. - */ - public ExceptionMonitor getExceptionMonitor() - { - return exceptionMonitor; - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java deleted file mode 100644 index 9920be003a..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalPublisherImpl.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.localcircuit; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.AssertionBase; -import org.apache.qpid.test.framework.CircuitEnd; -import org.apache.qpid.test.framework.CircuitEndBase; -import org.apache.qpid.test.framework.ExceptionMonitor; -import org.apache.qpid.test.framework.MessageMonitor; -import org.apache.qpid.test.framework.NotApplicableAssertion; -import org.apache.qpid.test.framework.Publisher; - -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; - -/** - * Provides an implementation of the {@link Publisher} interface and wraps a single message producer and consumer on - * a single controlSession, as a {@link CircuitEnd}. A local publisher also acts as a circuit end, because for a locally - * located circuit the assertions may be applied directly, there does not need to be any inter-process messaging - * between the publisher and its single circuit end, in order to ascertain its status. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide a message producer for sending messages. - * <tr><td> Provide a message consumer for receiving messages. - * <tr><td> Provide assertion that the publisher received no exceptions. - * <tr><td> Provide assertion that the publisher received a no consumers error code. - * <tr><td> Provide assertion that the publisher received a no route error code. - * </table> - */ -public class LocalPublisherImpl extends CircuitEndBase implements Publisher -{ - /** Holds a reference to the containing circuit. */ - protected LocalCircuitImpl circuit; - - /** - * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured - * for messages and exceptions received by the circuit end. - * - * @param producer The message producer for the circuit end point. - * @param consumer The message consumer for the circuit end point. - * @param session The controlSession for the circuit end point. - * @param messageMonitor The monitor to notify of all messages received by the circuit end. - * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end. - */ - public LocalPublisherImpl(MessageProducer producer, MessageConsumer consumer, Session session, - MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor) - { - super(producer, consumer, session, messageMonitor, exceptionMonitor); - } - - /** - * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation. - * - * @param end The circuit end base implementation to take producers and consumers from. - */ - public LocalPublisherImpl(CircuitEndBase end) - { - super(end.getProducer(), end.getConsumer(), end.getSession(), end.getMessageMonitor(), end.getExceptionMonitor()); - } - - /** - * Provides an assertion that the publisher encountered no exceptions. - * - * @param testProps - * - * @return An assertion that the publisher encountered no exceptions. - */ - public Assertion noExceptionsAssertion(ParsedProperties testProps) - { - return new AssertionBase() - { - public boolean apply() - { - boolean passed = true; - ExceptionMonitor sessionExceptionMonitor = circuit.getExceptionMonitor(); - ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor(); - - if (!connectionExceptionMonitor.assertNoExceptions()) - { - passed = false; - - addError("Was expecting no exceptions.\n"); - addError("Got the following exceptions on the connection, " - + circuit.getConnectionExceptionMonitor()); - } - - if (!sessionExceptionMonitor.assertNoExceptions()) - { - passed = false; - - addError("Was expecting no exceptions.\n"); - addError("Got the following exceptions on the producer, " + circuit.getExceptionMonitor()); - } - - return passed; - } - }; - } - - /** - * Provides an assertion that the AMQP channel was forcibly closed by an error condition. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the AMQP channel was forcibly closed by an error condition. - */ - public Assertion channelClosedAssertion(ParsedProperties testProps) - { - return new NotApplicableAssertion(testProps); - } - - /** - * Provides an assertion that the publisher got a given exception during the test. - * - * @param testProps The test configuration properties. - * @param exceptionClass The exception class to check for. - * - * @return An assertion that the publisher got a given exception during the test. - */ - public Assertion exceptionAssertion(ParsedProperties testProps, final Class<? extends Exception> exceptionClass) - { - return new AssertionBase() - { - public boolean apply() - { - boolean passed = true; - ExceptionMonitor connectionExceptionMonitor = circuit.getConnectionExceptionMonitor(); - - if (!connectionExceptionMonitor.assertExceptionOfType(exceptionClass)) - { - passed = false; - - addError("Was expecting linked exception type " + exceptionClass.getName() - + " on the connection.\n"); - addError((connectionExceptionMonitor.size() > 0) - ? ("Actually got the following exceptions on the connection, " + connectionExceptionMonitor) - : "Got no exceptions on the connection."); - } - - return passed; - } - }; - } - - /** - * Sets the contianing circuit. - * - * @param circuit The containing circuit. - */ - public void setCircuit(LocalCircuitImpl circuit) - { - this.circuit = circuit; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java deleted file mode 100644 index bb242faf90..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/localcircuit/LocalReceiverImpl.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.localcircuit; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.CircuitEnd; -import org.apache.qpid.test.framework.CircuitEndBase; -import org.apache.qpid.test.framework.ExceptionMonitor; -import org.apache.qpid.test.framework.MessageMonitor; -import org.apache.qpid.test.framework.NotApplicableAssertion; -import org.apache.qpid.test.framework.Receiver; - -import javax.jms.MessageConsumer; -import javax.jms.MessageProducer; -import javax.jms.Session; - -/** - * Provides an implementation of the {@link Receiver} interface that wraps a single message producer and consumer on - * a single controlSession, as a {@link CircuitEnd}. A local receiver also acts as a circuit end, because for a locally - * located circuit the assertions may be applied directly, there does not need to be any inter process messaging - * between the publisher and its single circuit end, in order to ascertain its status. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Provide a message producer for sending messages. - * <tr><td> Provide a message consumer for receiving messages. - * <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> - */ -public class LocalReceiverImpl extends CircuitEndBase implements Receiver -{ - /** Holds a reference to the containing circuit. */ - private LocalCircuitImpl circuit; - - /** - * Creates a circuit end point on the specified producer, consumer and controlSession. Monitors are also configured - * for messages and exceptions received by the circuit end. - * - * @param producer The message producer for the circuit end point. - * @param consumer The message consumer for the circuit end point. - * @param session The controlSession for the circuit end point. - * @param messageMonitor The monitor to notify of all messages received by the circuit end. - * @param exceptionMonitor The monitor to notify of all exceptions received by the circuit end. - */ - public LocalReceiverImpl(MessageProducer producer, MessageConsumer consumer, Session session, - MessageMonitor messageMonitor, ExceptionMonitor exceptionMonitor) - { - super(producer, consumer, session, messageMonitor, exceptionMonitor); - } - - /** - * Creates a circuit end point from the producer, consumer and controlSession in a circuit end base implementation. - * - * @param end The circuit end base implementation to take producers and consumers from. - */ - public LocalReceiverImpl(CircuitEndBase end) - { - super(end.getProducer(), end.getConsumer(), end.getSession(), end.getMessageMonitor(), end.getExceptionMonitor()); - } - - /** - * Provides an assertion that the receivers encountered no exceptions. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the receivers encountered no exceptions. - */ - public Assertion noExceptionsAssertion(ParsedProperties testProps) - { - return new NotApplicableAssertion(testProps); - } - - /** - * Provides an assertion that the AMQP channel was forcibly closed by an error condition. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the AMQP channel was forcibly closed by an error condition. - */ - public Assertion channelClosedAssertion(ParsedProperties testProps) - { - return new NotApplicableAssertion(testProps); - } - - /** - * Provides an assertion that the receivers got all messages that were sent to it. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the receivers got all messages that were sent to it. - */ - public Assertion allMessagesReceivedAssertion(ParsedProperties testProps) - { - return new NotApplicableAssertion(testProps); - } - - /** - * Provides an assertion that the receivers got none of the messages that were sent to it. - * - * @param testProps The test configuration properties. - * - * @return An assertion that the receivers got none of the messages that were sent to it. - */ - public Assertion noMessagesReceivedAssertion(ParsedProperties testProps) - { - return new NotApplicableAssertion(testProps); - } - - /** - * Provides an assertion that the receiver got a given exception during the test. - * - * @param testProps The test configuration properties. - * @param exceptionClass The exception class to check for. @return An assertion that the receiver got a given exception during the test. - */ - public Assertion exceptionAssertion(ParsedProperties testProps, Class<? extends Exception> exceptionClass) - { - return new NotApplicableAssertion(testProps); - } - - /** - * Sets the contianing circuit. - * - * @param circuit The containing circuit. - */ - public void setCircuit(LocalCircuitImpl circuit) - { - this.circuit = circuit; - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/package.html b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/package.html deleted file mode 100644 index ac4e30d312..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/package.html +++ /dev/null @@ -1,43 +0,0 @@ -<!-- - - 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. - ---> - -<html> -<body> -<p/>A framework for testing Qpid, built around a standard 'test circuit' design. The idea behind this framework is the -use of a test circuit which is configured by a set of test parameters, that may be projected onto a topology of -test nodes, with tests scripted to run over test circuits, making as few assumptions as possible about the underlying -topology. The standardization of the design, whilst limiting in some respectes, allows a large variety of test -scenarios to be written with minimal amounts of coding. - -<p/>The standard consruction block for a test, is a test circuit. This consists of a publisher, and a receiver. The -publisher and receiver may reside on the same machine, or may be distributed. Will use a standard set of properties to -define the desired circuit topology. - -<p/>Tests are always to be controlled from the publishing side only. The receiving end of the circuit is to be exposed -to the test code through an interface, that abstracts as much as possible the receiving end of the test. The interface -exposes a set of 'assertions' that may be applied to the receiving end of the test circuit. - -<p/>In the case where the receiving end of the circuit resides on the same JVM, the assertions will call the receivers -code locally. Where the receiving end is distributed accross one or more machines, the assertions will be applied to a -test report gethered from all of the receivers. Test code will be written to the assertions making as few assumptions -as possible about the exact test topology. -</body> -</html> diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java deleted file mode 100644 index bd27fc3d90..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/BaseCircuitFactory.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.sequencers; - -import org.apache.log4j.Logger; - -import org.apache.qpid.test.framework.Circuit; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.utils.ConversationFactory; - -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; - -/** - * BaseCircuitFactory provides some functionality common to all {@link CircuitFactory}s, such as the details of - * all {@link org.apache.qpid.test.framework.distributedtesting.TestClient}s that make up the end-points of - * the circuits that the factory creates, and an active {@link ConversationFactory} that can be used to generate - * control conversations with those circuit end-points. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Hold the details of the sending and receiving end-points to create circuits from. - * <tr><td> Provide a conversation factory to create control conversations with the end-points. - * </table> - */ -public abstract class BaseCircuitFactory implements CircuitFactory -{ - - /** Used for debugging. */ - private final Logger log = Logger.getLogger(BaseCircuitFactory.class); - - /** Holds the contact details for the sending test client. */ - protected TestClientDetails sender; - - /** Holds the contact details for the receving test client. */ - protected List<TestClientDetails> receivers = new LinkedList<TestClientDetails>(); - - /** Holds the conversation factory over which to coordinate the test. */ - protected ConversationFactory conversationFactory; - - /** - * Creates a test circuit for the test, configered by the test parameters specified. - * - * @param testProperties The test parameters. - * @return A test circuit. - */ - public Circuit createCircuit(Properties testProperties) - { - throw new RuntimeException("Not implemented."); - } - - /** - * Sets the sender test client to coordinate the test with. - * - * @param sender The contact details of the sending client in the test. - */ - public void setSender(TestClientDetails sender) - { - log.debug("public void setSender(TestClientDetails sender = " + sender + "): called"); - - this.sender = sender; - } - - /** - * Sets the receiving test client to coordinate the test with. - * - * @param receiver The contact details of the sending client in the test. - */ - public void setReceiver(TestClientDetails receiver) - { - log.debug("public void setReceiver(TestClientDetails receivers = " + receiver + "): called"); - - this.receivers.add(receiver); - } - - /** - * Supplies the sending test client. - * - * @return The sending test client. - */ - public TestClientDetails getSender() - { - return sender; - } - - /** - * Supplies the receiving test client. - * - * @return The receiving test client. - */ - public List<TestClientDetails> getReceivers() - { - return receivers; - } - - /** - * Accepts the conversation factory over which to hold the test coordinating conversation. - * - * @param conversationFactory The conversation factory to coordinate the test over. - */ - public void setConversationFactory(ConversationFactory conversationFactory) - { - this.conversationFactory = conversationFactory; - } - - /** - * Provides the conversation factory for providing the distributed test sequencing conversations over the test - * connection. - * - * @return The conversation factory to create test sequencing conversations with. - */ - public ConversationFactory getConversationFactory() - { - return conversationFactory; - } -} - diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java deleted file mode 100644 index 9b5d40fd48..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/CircuitFactory.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.sequencers; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.Circuit; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import java.util.List; -import java.util.Properties; - -/** - * A CircuitFactory is responsibile for creating test circuits appropriate to the context that a test case is - * running in, and providing an implementation of a standard test procedure over a test circuit. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities - * <tr><td> Provide a standard test procedure over a test circuit. - * <tr><td> Construct test circuits appropriate to a tests context. - * </table> - */ -public interface CircuitFactory -{ - /** - * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles, - * begining the test, gathering the test reports from the participants, and checking for assertion failures against - * the test reports. - * - * @param testCircuit The test circuit. - * @param assertions The list of assertions to apply to the test circuit. - * @param testProperties The test case definition. - * - * @deprecated Use test circuits and Circuit.test instead. - */ - public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties); - - /** - * Creates a test circuit for the test, configered by the test parameters specified. - * - * @param testProperties The test parameters. - * - * @return A test circuit. - */ - public Circuit createCircuit(Connection connection, ParsedProperties testProperties); - - /** - * Sets the sender test client to coordinate the test with. - * - * @param sender The contact details of the sending client in the test. - */ - public void setSender(TestClientDetails sender); - - /** - * Sets the receiving test client to coordinate the test with. - * - * @param receiver The contact details of the sending client in the test. - */ - public void setReceiver(TestClientDetails receiver); - - /** - * Supplies the sending test client. - * - * @return The sending test client. - */ - public TestClientDetails getSender(); - - /** - * Supplies the receiving test client. - * - * @return The receiving test client. - */ - public List<TestClientDetails> getReceivers(); - - /** - * Accepts the conversation factory over which to hold the test coordinating conversation. - * - * @param conversationFactory The conversation factory to coordinate the test over. - */ - public void setConversationFactory(ConversationFactory conversationFactory); -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java deleted file mode 100644 index 833f5fb674..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/FanOutCircuitFactory.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.sequencers; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.Circuit; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.framework.TestUtils; -import org.apache.qpid.test.framework.distributedcircuit.DistributedCircuitImpl; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Session; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; - -/** - * FanOutCircuitFactory is a circuit factory that creates distributed test circuits. Given a set of participating - * test client nodes, it assigns one node to the SENDER role and the remainder to the RECEIVER role. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Create distributed circuits from one to many test nodes, for fanout style testing. - * </table> - * - * @todo Adapt this to be an n*m topology circuit factory. Need to add circuit topology definitions to the test - * parameters. Place n senders onto the available test clients, and m receivers. Where n or m is larger than - * the available nodes, start stacking multiple test clients on each node. There will also be an option that - * indicates whether nodes can play both roles, and how many nodes out of all available may be assigned to - * each role. - * - * @todo The createCircuit methods on this and InteropCircuitFactory are going to be identical. This is because the - * partitioning into senders and receivers is already done by the test decorators. Either eliminate these factories - * as unnesesary, or move the partitioning functionality into the factories, in which case the test decorators - * can probably be merged or eliminated. There is confusion over the placement of responsibilities between the - * factories and the test decorators... although the test decorators may well do more than just circuit creation - * in the future. For example, there may have to be a special decorator for test repetition that does one circuit - * creation, but the runs many tests over it, in which case the handling of responsibilities becomes clearer. - */ -public class FanOutCircuitFactory extends BaseCircuitFactory -{ - /** Used for debugging. */ - private Logger log = Logger.getLogger(FanOutCircuitFactory.class); - - /** - * Creates a test circuit for the test, configered by the test parameters specified. - * - * @param testProperties The test parameters. - * @return A test circuit. - */ - public Circuit createCircuit(Connection connection, ParsedProperties testProperties) - { - log.debug("public Circuit createCircuit(ParsedProperties testProperties): called"); - - List<TestClientDetails> senders = new LinkedList<TestClientDetails>(); - senders.add(getSender()); - List<TestClientDetails> receivers = getReceivers(); - ConversationFactory conversationFactory = getConversationFactory(); - - return DistributedCircuitImpl.createCircuit(testProperties, senders, receivers, conversationFactory); - } - - /** - * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles, - * begining the test, gathering the test reports from the participants, and checking for assertion failures against - * the test reports. - * - * @param testCircuit The test circuit. - * @param assertions The list of assertions to apply to the test circuit. - * @param testProperties The test case definition. - * - * @deprecated Scheduled for removal once existing tests converted over to use test circuits. - */ - public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties) - { - log.debug("protected Message[] sequenceTest(Object... testProperties = " + testProperties + "): called"); - - TestClientDetails sender = getSender(); - List<TestClientDetails> receivers = getReceivers(); - ConversationFactory conversationFactory = getConversationFactory(); - - try - { - // Create a conversation on the sender clients private control route. - Session session = conversationFactory.getSession(); - Destination senderControlTopic = session.createTopic(sender.privateControlKey); - ConversationFactory.Conversation senderConversation = conversationFactory.startConversation(); - - // Assign the sender role to the sending test client. - Message assignSender = conversationFactory.getSession().createMessage(); - TestUtils.setPropertiesOnMessage(assignSender, testProperties); - assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE"); - assignSender.setStringProperty("ROLE", "SENDER"); - assignSender.setStringProperty("CLIENT_NAME", "Sustained_SENDER"); - - senderConversation.send(senderControlTopic, assignSender); - - // Wait for the sender to confirm its role. - senderConversation.receive(); - - // Assign the receivers roles. - for (TestClientDetails receiver : receivers) - { - assignReceiverRole(receiver, testProperties, true); - } - - // Start the test on the sender. - Message start = session.createMessage(); - start.setStringProperty("CONTROL_TYPE", "START"); - - senderConversation.send(senderControlTopic, start); - - // Wait for the test sender to return its report. - Message senderReport = senderConversation.receive(); - TestUtils.pause(500); - - // Ask the receivers for their reports. - Message statusRequest = session.createMessage(); - statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST"); - - // Gather the reports from all of the receiving clients. - - // Return all of the test reports, the senders report first. - // return new Message[] { senderReport }; - } - catch (JMSException e) - { - throw new RuntimeException("Unhandled JMSException."); - } - } - - /** - * Assigns the receivers role to the specified test client that is to act as a receivers during the test. This method - * does not always wait for the receiving clients to confirm their role assignments. This is because this method - * may be called from an 'onMessage' method, when a client is joining the test at a later point in time, and it - * is not possible to do a synchronous receive during an 'onMessage' method. There is a flag to indicate whether - * or not to wait for role confirmations. - * - * @param receiver The test client to assign the receivers role to. - * @param testProperties The test parameters. - * @param confirm Indicates whether role confirmation should be waited for. - * - * @throws JMSException Any JMSExceptions occurring during the conversation are allowed to fall through. - * - * @deprecated Scheduled for removal once existing tests converted over to use test circuits. - */ - protected void assignReceiverRole(TestClientDetails receiver, Properties testProperties, boolean confirm) - throws JMSException - { - log.info("assignReceiverRole(TestClientDetails receivers = " + receiver + ", Map<String, Object> testProperties = " - + testProperties + "): called"); - - ConversationFactory conversationFactory = getConversationFactory(); - - // Create a conversation with the receiving test client. - Session session = conversationFactory.getSession(); - Destination receiverControlTopic = session.createTopic(receiver.privateControlKey); - ConversationFactory.Conversation receiverConversation = conversationFactory.startConversation(); - - // Assign the receivers role to the receiving client. - Message assignReceiver = session.createMessage(); - TestUtils.setPropertiesOnMessage(assignReceiver, testProperties); - assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE"); - assignReceiver.setStringProperty("ROLE", "RECEIVER"); - assignReceiver.setStringProperty("CLIENT_NAME", receiver.clientName); - - receiverConversation.send(receiverControlTopic, assignReceiver); - - // Wait for the role confirmation to come back. - if (confirm) - { - receiverConversation.receive(); - } - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java deleted file mode 100644 index a4c6888d68..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/framework/sequencers/InteropCircuitFactory.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.framework.sequencers; - -import org.apache.log4j.Logger; - -import org.apache.qpid.junit.extensions.util.ParsedProperties; -import org.apache.qpid.test.framework.Assertion; -import org.apache.qpid.test.framework.Circuit; -import org.apache.qpid.test.framework.TestClientDetails; -import org.apache.qpid.test.framework.TestUtils; -import org.apache.qpid.test.framework.distributedcircuit.DistributedCircuitImpl; -import org.apache.qpid.test.utils.ConversationFactory; - -import javax.jms.Connection; -import javax.jms.Destination; -import javax.jms.JMSException; -import javax.jms.Message; -import javax.jms.Session; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; - -/** - * InteropCircuitFactory is a circuit factory that creates distributed test circuits. Given a set of participating - * test client nodes, it assigns one node to the SENDER role and one the RECEIVER role. - * - * <p/><table id="crc"><caption>CRC Card</caption> - * <tr><th> Responsibilities <th> Collaborations - * <tr><td> Create distributed circuits from pairs of test nodes, for interop style testing. - * </table> - * - * @todo The partitioning of a set of nodes into sender and receiver roles is actually done by the interop test - * decorator. See the todo comment in FanOutCircuitFactory about merging the factories with the decorators, or - * more carefully dividing up responsibilities between them. - * - * @todo The squenceTest code is deprecated, but currently still used by the interop tests. It will be removed once it - * have been fully replaced by the default test procedure. - */ -public class InteropCircuitFactory extends BaseCircuitFactory -{ - /** Used for debugging. */ - private Logger log = Logger.getLogger(InteropCircuitFactory.class); - - /** - * Creates a test circuit for the test, configered by the test parameters specified. - * - * @param testProperties The test parameters. - * @return A test circuit. - */ - public Circuit createCircuit(Connection connection, ParsedProperties testProperties) - { - log.debug("public Circuit createCircuit(ParsedProperties testProperties): called"); - - List<TestClientDetails> senders = new LinkedList<TestClientDetails>(); - senders.add(getSender()); - List<TestClientDetails> receivers = getReceivers(); - ConversationFactory conversationFactory = getConversationFactory(); - - return DistributedCircuitImpl.createCircuit(testProperties, senders, receivers, conversationFactory); - } - - /** - * Holds a test coordinating conversation with the test clients. This should consist of assigning the test roles, - * begining the test, gathering the test reports from the participants, and checking for assertion failures against - * the test reports. - * - * @param testCircuit The test circuit. - * @param assertions The list of assertions to apply to the test circuit. - * @param testProperties The test case definition. - */ - public void sequenceTest(Circuit testCircuit, List<Assertion> assertions, Properties testProperties) - { - log.debug("protected Message[] sequenceTest(Object... testProperties = " + testProperties + "): called"); - - TestClientDetails sender = getSender(); - List<TestClientDetails> receivers = getReceivers(); - ConversationFactory conversationFactory = getConversationFactory(); - - try - { - Session session = conversationFactory.getSession(); - Destination senderControlTopic = session.createTopic(sender.privateControlKey); - Destination receiverControlTopic = session.createTopic(receivers.get(0).privateControlKey); - - ConversationFactory.Conversation senderConversation = conversationFactory.startConversation(); - ConversationFactory.Conversation receiverConversation = conversationFactory.startConversation(); - - Message assignSender = conversationFactory.getSession().createMessage(); - TestUtils.setPropertiesOnMessage(assignSender, testProperties); - assignSender.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE"); - assignSender.setStringProperty("ROLE", "SENDER"); - - senderConversation.send(senderControlTopic, assignSender); - - // Assign the receivers role the receiving client. - Message assignReceiver = session.createMessage(); - TestUtils.setPropertiesOnMessage(assignReceiver, testProperties); - assignReceiver.setStringProperty("CONTROL_TYPE", "ASSIGN_ROLE"); - assignReceiver.setStringProperty("ROLE", "RECEIVER"); - - receiverConversation.send(receiverControlTopic, assignReceiver); - - // Wait for the senders and receivers to confirm their roles. - senderConversation.receive(); - receiverConversation.receive(); - - // Start the test. - Message start = session.createMessage(); - start.setStringProperty("CONTROL_TYPE", "START"); - - senderConversation.send(senderControlTopic, start); - - // Wait for the test sender to return its report. - Message senderReport = senderConversation.receive(); - TestUtils.pause(500); - - // Ask the receivers for its report. - Message statusRequest = session.createMessage(); - statusRequest.setStringProperty("CONTROL_TYPE", "STATUS_REQUEST"); - - receiverConversation.send(receiverControlTopic, statusRequest); - - // Wait for the receivers to send its report. - Message receiverReport = receiverConversation.receive(); - - // return new Message[] { senderReport, receiverReport }; - - // Apply assertions. - } - catch (JMSException e) - { - throw new RuntimeException("JMSException not handled."); - } - } -} diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java deleted file mode 100644 index 4da9a1db29..0000000000 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/unit/close/CloseBeforeAckTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.test.unit.close; - -import junit.framework.Assert; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.qpid.junit.concurrency.TestRunnable; -import org.apache.qpid.junit.concurrency.ThreadTestCoordinator; -import org.apache.qpid.test.utils.QpidBrokerTestCase; - -import javax.jms.Connection; -import javax.jms.Message; -import javax.jms.MessageListener; -import javax.jms.Session; - -/** - * This test forces the situation where a session is closed whilst a message consumer is still in its onMessage method. - * Running in AUTO_ACK mode, the close call ought to wait until the onMessage method completes, and the ack is sent - * before closing the connection. - * - * <p><table id="crc"><caption>CRC Card</caption> <tr><th> Responsibilities <th> Collaborations <tr><td> Check that - * closing a connection whilst handling a message, blocks till completion of the handler. </table> - */ -public class CloseBeforeAckTest extends QpidBrokerTestCase -{ - private static final Logger log = LoggerFactory.getLogger(CloseBeforeAckTest.class); - - private Connection connection; - private Session session; - public static final String TEST_QUEUE_NAME = "TestQueue"; - private int TEST_COUNT = 25; - - class TestThread1 extends TestRunnable implements MessageListener - { - public void runWithExceptions() throws Exception - { - // Set this up to listen for message on the test session. - session.createConsumer(session.createQueue(TEST_QUEUE_NAME)).setMessageListener(this); - } - - public void onMessage(Message message) - { - // Give thread 2 permission to close the session. - allow(new int[] { 1 }); - - // Wait until thread 2 has closed the connection, or is blocked waiting for this to complete. - waitFor(new int[] { 1 }, true); - } - } - - private TestThread1 testThread1 = new TestThread1(); - - private TestRunnable testThread2 = - new TestRunnable() - { - public void runWithExceptions() throws Exception - { - // Send a message to be picked up by thread 1. - session.createProducer(null).send(session.createQueue(TEST_QUEUE_NAME), - session.createTextMessage("Hi there thread 1!")); - - // Wait for thread 1 to pick up the message and give permission to continue. - waitFor(new int[] { 0 }, false); - - // Close the connection. - session.close(); - - // Allow thread 1 to continue to completion, if it is erronously still waiting. - allow(new int[] { 1 }); - } - }; - - public void testCloseBeforeAutoAck_QPID_397() throws Exception - { - // Create a session in auto acknowledge mode. This problem shows up in auto acknowledge if the client acks - // message at the end of the onMessage method, after a close has been sent. - session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - - ThreadTestCoordinator tt = new ThreadTestCoordinator(2); - - tt.addTestThread(testThread1, 0); - tt.addTestThread(testThread2, 1); - tt.setDeadlockTimeout(500); - tt.run(); - - String errorMessage = tt.joinAndRetrieveMessages(); - - // Print any error messages or exceptions. - log.debug(errorMessage); - - if (!tt.getExceptions().isEmpty()) - { - for (Exception e : tt.getExceptions()) - { - log.debug("Exception thrown during test thread: ", e); - } - } - - Assert.assertTrue(errorMessage, "".equals(errorMessage)); - } - - public void closeBeforeAutoAckManyTimes() throws Exception - { - for (int i = 0; i < TEST_COUNT; i++) - { - testCloseBeforeAutoAck_QPID_397(); - } - } - - protected void setUp() throws Exception - { - super.setUp(); - connection = getConnection("guest", "guest"); - } - - protected void tearDown() throws Exception - { - super.tearDown(); - } -} |
