You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ch...@apache.org on 2009/06/15 17:19:50 UTC
svn commit: r784806 - in /activemq/sandbox/activemq-flow:
activemq-all/src/test/java/org/apache/activemq/legacy/
activemq-all/src/test/java/org/apache/activemq/legacy/broker/
activemq-all/src/test/java/org/apache/activemq/legacy/transport/discovery/
ac...
Author: chirino
Date: Mon Jun 15 15:19:48 2009
New Revision: 784806
URL: http://svn.apache.org/viewvc?rev=784806&view=rev
Log:
moved the handy AutoFailTestSupport and CombinationTestSupport classes to the util package.
Added:
activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/
activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/AutoFailTestSupport.java (with props)
activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/CombinationTestSupport.java (with props)
Removed:
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/AutoFailTestSupport.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/CombinationTestSupport.java
Modified:
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQConnectionFactoryTest.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQXAConnectionFactoryTest.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/EmbeddedBrokerTestSupport.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsMultipleClientsTestSupport.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsRollbackRedeliveryTest.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsTestSupport.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/MessageGroupTest.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/broker/BrokerTestSupport.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/discovery/DiscoveryTransportNoBrokerTest.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/InactivityMonitorTest.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/WireformatNegociationTest.java
activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/usecases/ExpiredMessagesTest.java
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQConnectionFactoryTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQConnectionFactoryTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQConnectionFactoryTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQConnectionFactoryTest.java Mon Jun 15 15:19:48 2009
@@ -30,6 +30,7 @@
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQMessageConsumer;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.legacy.broker.BrokerRegistry;
import org.apache.activemq.legacy.broker.BrokerService;
import org.apache.activemq.legacy.broker.TransportConnector;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQXAConnectionFactoryTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQXAConnectionFactoryTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQXAConnectionFactoryTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/ActiveMQXAConnectionFactoryTest.java Mon Jun 15 15:19:48 2009
@@ -40,6 +40,7 @@
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.ActiveMQXAConnectionFactory;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.legacy.broker.BrokerRegistry;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/EmbeddedBrokerTestSupport.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/EmbeddedBrokerTestSupport.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/EmbeddedBrokerTestSupport.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/EmbeddedBrokerTestSupport.java Mon Jun 15 15:19:48 2009
@@ -23,6 +23,7 @@
import junit.framework.TestCase;
import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.apache.activemq.legacy.broker.BrokerService;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsMultipleClientsTestSupport.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsMultipleClientsTestSupport.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsMultipleClientsTestSupport.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsMultipleClientsTestSupport.java Mon Jun 15 15:19:48 2009
@@ -38,6 +38,7 @@
import javax.jms.TopicSubscriber;
import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsRollbackRedeliveryTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsRollbackRedeliveryTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsRollbackRedeliveryTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsRollbackRedeliveryTest.java Mon Jun 15 15:19:48 2009
@@ -32,6 +32,7 @@
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.RedeliveryPolicy;
+import org.apache.activemq.apollo.AutoFailTestSupport;
import org.apache.activemq.legacy.broker.BrokerService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsTestSupport.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsTestSupport.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsTestSupport.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/JmsTestSupport.java Mon Jun 15 15:19:48 2009
@@ -35,6 +35,7 @@
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.legacy.broker.BrokerFactory;
import org.apache.activemq.legacy.broker.BrokerService;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/MessageGroupTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/MessageGroupTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/MessageGroupTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/MessageGroupTest.java Mon Jun 15 15:19:48 2009
@@ -7,6 +7,7 @@
import javax.jms.Session;
import javax.jms.TextMessage;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.commons.logging.Log;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/broker/BrokerTestSupport.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/broker/BrokerTestSupport.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/broker/BrokerTestSupport.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/broker/BrokerTestSupport.java Mon Jun 15 15:19:48 2009
@@ -28,7 +28,6 @@
import javax.jms.DeliveryMode;
import javax.jms.MessageNotWriteableException;
-import org.apache.activemq.legacy.CombinationTestSupport;
import org.apache.activemq.legacy.broker.BrokerFactory;
import org.apache.activemq.legacy.broker.BrokerService;
import org.apache.activemq.legacy.broker.region.RegionBroker;
@@ -38,6 +37,7 @@
import org.apache.activemq.legacy.broker.region.policy.RoundRobinDispatchPolicy;
import org.apache.activemq.legacy.store.PersistenceAdapter;
import org.apache.activemq.legacy.usage.SystemUsage;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.activemq.command.ConnectionId;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/discovery/DiscoveryTransportNoBrokerTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/discovery/DiscoveryTransportNoBrokerTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/discovery/DiscoveryTransportNoBrokerTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/discovery/DiscoveryTransportNoBrokerTest.java Mon Jun 15 15:19:48 2009
@@ -20,7 +20,7 @@
import javax.jms.JMSException;
import org.apache.activemq.ActiveMQConnectionFactory;
-import org.apache.activemq.legacy.CombinationTestSupport;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/InactivityMonitorTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/InactivityMonitorTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/InactivityMonitorTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/InactivityMonitorTest.java Mon Jun 15 15:19:48 2009
@@ -24,8 +24,8 @@
import javax.net.SocketFactory;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.WireFormatInfo;
-import org.apache.activemq.legacy.CombinationTestSupport;
import org.apache.activemq.openwire.OpenWireFormat;
import org.apache.activemq.transport.Transport;
import org.apache.activemq.transport.TransportAcceptListener;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/WireformatNegociationTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/WireformatNegociationTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/WireformatNegociationTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/transport/tcp/WireformatNegociationTest.java Mon Jun 15 15:19:48 2009
@@ -24,9 +24,9 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.command.CommandTypes;
import org.apache.activemq.command.WireFormatInfo;
-import org.apache.activemq.legacy.CombinationTestSupport;
import org.apache.activemq.transport.Transport;
import org.apache.activemq.transport.TransportAcceptListener;
import org.apache.activemq.transport.TransportFactory;
Modified: activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/usecases/ExpiredMessagesTest.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/usecases/ExpiredMessagesTest.java?rev=784806&r1=784805&r2=784806&view=diff
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/usecases/ExpiredMessagesTest.java (original)
+++ activemq/sandbox/activemq-flow/activemq-all/src/test/java/org/apache/activemq/legacy/usecases/ExpiredMessagesTest.java Mon Jun 15 15:19:48 2009
@@ -27,11 +27,11 @@
import junit.framework.Test;
import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.apollo.CombinationTestSupport;
import org.apache.activemq.broker.jmx.DestinationViewMBean;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
-import org.apache.activemq.legacy.CombinationTestSupport;
import org.apache.activemq.legacy.broker.BrokerService;
Added: activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/AutoFailTestSupport.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/AutoFailTestSupport.java?rev=784806&view=auto
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/AutoFailTestSupport.java (added)
+++ activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/AutoFailTestSupport.java Mon Jun 15 15:19:48 2009
@@ -0,0 +1,141 @@
+/**
+ * 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.activemq.apollo;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import junit.framework.TestCase;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Enforces a test case to run for only an allotted time to prevent them from
+ * hanging and breaking the whole testing.
+ *
+ * @version $Revision: 1.0 $
+ */
+
+public abstract class AutoFailTestSupport extends TestCase {
+ public static final int EXIT_SUCCESS = 0;
+ public static final int EXIT_ERROR = 1;
+ private static final Log LOG = LogFactory.getLog(AutoFailTestSupport.class);
+
+ private long maxTestTime = 5 * 60 * 1000; // 5 mins by default
+ private Thread autoFailThread;
+
+ private boolean verbose = true;
+ private boolean useAutoFail; // Disable auto fail by default
+ private AtomicBoolean isTestSuccess;
+
+ protected void setUp() throws Exception {
+ // Runs the auto fail thread before performing any setup
+ if (isAutoFail()) {
+ startAutoFailThread();
+ }
+ super.setUp();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+
+ // Stops the auto fail thread only after performing any clean up
+ stopAutoFailThread();
+ }
+
+ /**
+ * Manually start the auto fail thread. To start it automatically, just set
+ * the auto fail to true before calling any setup methods. As a rule, this
+ * method is used only when you are not sure, if the setUp and tearDown
+ * method is propagated correctly.
+ */
+ public void startAutoFailThread() {
+ setAutoFail(true);
+ isTestSuccess = new AtomicBoolean(false);
+ autoFailThread = new Thread(new Runnable() {
+ public void run() {
+ try {
+ // Wait for test to finish succesfully
+ Thread.sleep(getMaxTestTime());
+ } catch (InterruptedException e) {
+ // This usually means the test was successful
+ } finally {
+ // Check if the test was able to tear down succesfully,
+ // which usually means, it has finished its run.
+ if (!isTestSuccess.get()) {
+ LOG.error("Test case has exceeded the maximum allotted time to run of: " + getMaxTestTime() + " ms.");
+ LOG.fatal("Test case has exceeded the maximum allotted time to run of: " + getMaxTestTime() + " ms.");
+ System.exit(EXIT_ERROR);
+ }
+ }
+ }
+ }, "AutoFailThread");
+
+ if (verbose) {
+ LOG.info("Starting auto fail thread...");
+ }
+
+ LOG.info("Starting auto fail thread...");
+ autoFailThread.start();
+ }
+
+ /**
+ * Manually stops the auto fail thread. As a rule, this method is used only
+ * when you are not sure, if the setUp and tearDown method is propagated
+ * correctly.
+ */
+ public void stopAutoFailThread() {
+ if (isAutoFail() && autoFailThread != null && autoFailThread.isAlive()) {
+ isTestSuccess.set(true);
+
+ if (verbose) {
+ LOG.info("Stopping auto fail thread...");
+ }
+
+ LOG.info("Stopping auto fail thread...");
+ autoFailThread.interrupt();
+ }
+ }
+
+ /**
+ * Sets the auto fail value. As a rule, this should be used only before any
+ * setup methods is called to automatically enable the auto fail thread in
+ * the setup method of the test case.
+ *
+ * @param val
+ */
+ public void setAutoFail(boolean val) {
+ this.useAutoFail = val;
+ }
+
+ public boolean isAutoFail() {
+ return this.useAutoFail;
+ }
+
+ /**
+ * The assigned value will only be reflected when the auto fail thread has
+ * started its run. Value is in milliseconds.
+ *
+ * @param val
+ */
+ public void setMaxTestTime(long val) {
+ this.maxTestTime = val;
+ }
+
+ public long getMaxTestTime() {
+ return this.maxTestTime;
+ }
+}
Propchange: activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/AutoFailTestSupport.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/CombinationTestSupport.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/CombinationTestSupport.java?rev=784806&view=auto
==============================================================================
--- activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/CombinationTestSupport.java (added)
+++ activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/CombinationTestSupport.java Mon Jun 15 15:19:48 2009
@@ -0,0 +1,231 @@
+/**
+ * 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.activemq.apollo;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Poor mans way of getting JUnit to run a test case through a few different
+ * combinations of options. Usage: If you have a test case called testFoo what
+ * you want to run through a few combinations, of of values for the attributes
+ * age and color, you would something like: <code>
+ * public void initCombosForTestFoo() {
+ * addCombinationValues( "age", new Object[]{ new Integer(21), new Integer(30) } );
+ * addCombinationValues( "color", new Object[]{"blue", "green"} );
+ * }
+ * </code>
+ * The testFoo test case would be run for each possible combination of age and
+ * color that you setup in the initCombosForTestFoo method. Before each
+ * combination is run, the age and color fields of the test class are set to one
+ * of the values defined. This is done before the normal setUp method is called.
+ * If you want the test combinations to show up as separate test runs in the
+ * JUnit reports, add a suite method to your test case similar to: <code>
+ * public static Test suite() {
+ * return suite(FooTest.class);
+ * }
+ * </code>
+ *
+ * @version $Revision: 1.5 $
+ */
+public abstract class CombinationTestSupport extends AutoFailTestSupport {
+
+ private static final Log LOG = LogFactory.getLog(CombinationTestSupport.class);
+
+ private HashMap<String, ComboOption> comboOptions = new HashMap<String, ComboOption>();
+ private boolean combosEvaluated;
+ private Map options;
+
+ static class ComboOption {
+ final String attribute;
+ final LinkedHashSet<Object> values = new LinkedHashSet<Object>();
+
+ public ComboOption(String attribute, Collection<Object> options) {
+ this.attribute = attribute;
+ this.values.addAll(options);
+ }
+ }
+
+ public void addCombinationValues(String attribute, Object[] options) {
+ ComboOption co = this.comboOptions.get(attribute);
+ if (co == null) {
+ this.comboOptions.put(attribute, new ComboOption(attribute, Arrays.asList(options)));
+ } else {
+ co.values.addAll(Arrays.asList(options));
+ }
+ }
+
+ public void runBare() throws Throwable {
+ if (combosEvaluated) {
+ super.runBare();
+ } else {
+ CombinationTestSupport[] combinations = getCombinations();
+ for (int i = 0; i < combinations.length; i++) {
+ CombinationTestSupport test = combinations[i];
+ if (getName() == null || getName().equals(test.getName())) {
+ test.runBare();
+ }
+ }
+ }
+ }
+
+ private void setOptions(Map options) throws NoSuchFieldException, IllegalAccessException {
+ this.options = options;
+ for (Iterator iterator = options.keySet().iterator(); iterator.hasNext();) {
+ String attribute = (String)iterator.next();
+ Object value = options.get(attribute);
+ try {
+ Field field = getClass().getField(attribute);
+ field.set(this, value);
+ } catch (Throwable e) {
+ LOG.info("Could not set field '" + attribute + "' to value '" + value + "', make sure the field exists and is public.");
+ }
+ }
+ }
+
+ private CombinationTestSupport[] getCombinations() {
+ try {
+ Method method = getClass().getMethod("initCombos", null);
+ method.invoke(this, null);
+ } catch (Throwable e) {
+ }
+
+ String name = getName().split(" ")[0];
+ String comboSetupMethodName = "initCombosFor" + Character.toUpperCase(name.charAt(0)) + name.substring(1);
+ try {
+ Method method = getClass().getMethod(comboSetupMethodName, null);
+ method.invoke(this, null);
+ } catch (Throwable e) {
+ }
+
+ try {
+ ArrayList<HashMap<String, Object>> expandedOptions = new ArrayList<HashMap<String, Object>>();
+ expandCombinations(new ArrayList<ComboOption>(comboOptions.values()), expandedOptions);
+
+ if (expandedOptions.isEmpty()) {
+ combosEvaluated = true;
+ return new CombinationTestSupport[] {this};
+ } else {
+
+ ArrayList<CombinationTestSupport> result = new ArrayList<CombinationTestSupport>();
+ // Run the test case for each possible combination
+ for (Iterator<HashMap<String, Object>> iter = expandedOptions.iterator(); iter.hasNext();) {
+ CombinationTestSupport combo = (CombinationTestSupport)TestSuite.createTest(getClass(), name);
+ combo.combosEvaluated = true;
+ combo.setOptions(iter.next());
+ result.add(combo);
+ }
+
+ CombinationTestSupport rc[] = new CombinationTestSupport[result.size()];
+ result.toArray(rc);
+ return rc;
+ }
+ } catch (Throwable e) {
+ combosEvaluated = true;
+ return new CombinationTestSupport[] {this};
+ }
+
+ }
+
+ private void expandCombinations(List<ComboOption> optionsLeft, List<HashMap<String, Object>> expandedCombos) {
+ if (!optionsLeft.isEmpty()) {
+ HashMap<String, Object> map;
+ if (comboOptions.size() == optionsLeft.size()) {
+ map = new HashMap<String, Object>();
+ expandedCombos.add(map);
+ } else {
+ map = expandedCombos.get(expandedCombos.size() - 1);
+ }
+
+ LinkedList<ComboOption> l = new LinkedList<ComboOption>(optionsLeft);
+ ComboOption comboOption = l.removeLast();
+ int i = 0;
+ for (Iterator<Object> iter = comboOption.values.iterator(); iter.hasNext();) {
+ Object value = iter.next();
+ if (i != 0) {
+ map = new HashMap<String, Object>(map);
+ expandedCombos.add(map);
+ }
+ map.put(comboOption.attribute, value);
+ expandCombinations(l, expandedCombos);
+ i++;
+ }
+ }
+ }
+
+ public static Test suite(Class<? extends CombinationTestSupport> clazz) {
+ TestSuite suite = new TestSuite();
+
+ ArrayList<String> names = new ArrayList<String>();
+ Method[] methods = clazz.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ String name = methods[i].getName();
+ if (names.contains(name) || !isPublicTestMethod(methods[i])) {
+ continue;
+ }
+ names.add(name);
+ Test test = TestSuite.createTest(clazz, name);
+ if (test instanceof CombinationTestSupport) {
+ CombinationTestSupport[] combinations = ((CombinationTestSupport)test).getCombinations();
+ for (int j = 0; j < combinations.length; j++) {
+ suite.addTest(combinations[j]);
+ }
+ } else {
+ suite.addTest(test);
+ }
+ }
+ return suite;
+ }
+
+ private static boolean isPublicTestMethod(Method m) {
+ return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
+ }
+
+ private static boolean isTestMethod(Method m) {
+ String name = m.getName();
+ Class[] parameters = m.getParameterTypes();
+ Class returnType = m.getReturnType();
+ return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
+ }
+
+ public String getName() {
+ return getName(false);
+ }
+
+ public String getName(boolean original) {
+ if (options != null && !original) {
+ return super.getName() + " " + options;
+ }
+ return super.getName();
+ }
+}
Propchange: activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/CombinationTestSupport.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: activemq/sandbox/activemq-flow/activemq-util/src/test/java/org/apache/activemq/apollo/CombinationTestSupport.java
------------------------------------------------------------------------------
svn:executable = *