diff options
Diffstat (limited to 'qpid/java/systests')
6 files changed, 160 insertions, 35 deletions
diff --git a/qpid/java/systests/pom.xml b/qpid/java/systests/pom.xml index 62f1a89480..a732c9a00c 100644 --- a/qpid/java/systests/pom.xml +++ b/qpid/java/systests/pom.xml @@ -26,10 +26,10 @@ <artifactId>qpid-systests</artifactId> <properties> - <broker.home.dir>target/qpid-broker/${project.version}</broker.home.dir> + <broker.home.dir>target${file.separator}qpid-broker${file.separator}${project.version}</broker.home.dir> <!-- test properties --> - <qpid.home>${basedir}/${broker.home.dir}</qpid.home> - <qpid.home.qbtc.output>${qpid.home}/qbtc-output</qpid.home.qbtc.output> + <qpid.home>${basedir}${file.separator}${broker.home.dir}</qpid.home> + <qpid.home.qbtc.output>${qpid.home}${file.separator}qbtc-output</qpid.home.qbtc.output> </properties> <dependencies> diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/scripts/QpidPasswdTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/scripts/QpidPasswdTest.java index 1158a1d220..e483660f4c 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/scripts/QpidPasswdTest.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/scripts/QpidPasswdTest.java @@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit; import org.apache.qpid.test.utils.Piper; import org.apache.qpid.test.utils.QpidTestCase; +import org.apache.qpid.util.SystemUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +36,10 @@ public class QpidPasswdTest extends QpidTestCase public void testRunScript() throws Exception { + if(SystemUtils.isWindows()) + { + return; + } Process process = null; try { diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/server/failover/FailoverMethodTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/server/failover/FailoverMethodTest.java index babe2d207d..9e2bd28c43 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/server/failover/FailoverMethodTest.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/server/failover/FailoverMethodTest.java @@ -29,6 +29,7 @@ import org.apache.qpid.AMQException; import org.apache.qpid.client.AMQConnection; import org.apache.qpid.client.AMQConnectionURL; import org.apache.qpid.test.utils.QpidBrokerTestCase; +import org.apache.qpid.util.SystemUtils; import javax.jms.ExceptionListener; import javax.jms.JMSException; @@ -49,6 +50,12 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL */ public void testFailoverRoundRobinDelay() throws Exception { + if (SystemUtils.isWindows()) + { + //TODO Test requires redevelopment - timings/behaviour on windows mean it fails + return; + } + //note: The first broker has no connect delay and the default 1 retry // while the tcp:localhost broker has 3 retries with a 2s connect delay String connectionString = "amqp://guest:guest@/test?brokerlist=" + @@ -77,7 +84,7 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL long duration = (end - start); //Failover should take more that 6 seconds. - // 3 Retires + // 3 Retries // so VM Broker NoDelay 0 (Connect) NoDelay 0 // then TCP NoDelay 0 Delay 1 Delay 2 Delay 3 // so 3 delays of 2s in total for connection @@ -99,6 +106,12 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL public void testFailoverSingleDelay() throws Exception { + if (SystemUtils.isWindows()) + { + //TODO Test requires redevelopment - timings/behaviour on windows mean it fails + return; + } + String connectionString = "amqp://guest:guest@/test?brokerlist='tcp://localhost:" + getPort() + "?connectdelay='2000',retries='3''"; AMQConnectionURL url = new AMQConnectionURL(connectionString); @@ -123,7 +136,7 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL long duration = (end - start); //Failover should take more that 6 seconds. - // 3 Retires + // 3 Retries // so NoDelay 0 (Connect) NoDelay 0 Delay 1 Delay 2 Delay 3 // so 3 delays of 2s in total for connection // so max time is 6 seconds of delay + 1 second of runtime. == 7 seconds @@ -151,16 +164,9 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL */ public void testNoFailover() throws Exception { - if (!isInternalBroker()) + if (SystemUtils.isWindows()) { - // QPID-3359 - // These tests always used to be inVM tests, then QPID-2815, with removal of ivVM, - // converted the test to use QpidBrokerTestCase. However, since then we notice this - // test fails on slower CI boxes. It turns out the test design is *extremely* - // sensitive the length of time the broker takes to start up. - // - // Making the test a same-VM test to temporarily avoid the issue. In long term, test - // needs redesigned to avoid the issue. + //TODO Test requires redevelopment - timings/behaviour on windows mean it fails return; } @@ -185,7 +191,7 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL try { //Wait before starting broker - // The wait should allow atleast 1 retries to fail before broker is ready + // The wait should allow at least 1 retries to fail before broker is ready Thread.sleep(750); startBroker(); } @@ -198,15 +204,13 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL brokerStart.start(); long start = System.currentTimeMillis(); - //Start the connection so it will use the retries AMQConnection connection = new AMQConnection(url); long end = System.currentTimeMillis(); - long duration = (end - start); - // Check that we actually had a delay had a delay in connection + // Check that we actually had a delay in connection assertTrue("Initial connection should be longer than 1 delay : " + CONNECT_DELAY + " <:(" + duration + ")", duration > CONNECT_DELAY); @@ -222,8 +226,7 @@ public class FailoverMethodTest extends QpidBrokerTestCase implements ExceptionL stopBroker(); _failoverComplete.await(30, TimeUnit.SECONDS); - assertEquals("failoverLatch was not decremented in given timeframe", - 0, _failoverComplete.getCount()); + assertEquals("failoverLatch was not decremented in given timeframe", 0, _failoverComplete.getCount()); end = System.currentTimeMillis(); diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BrokerRestTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BrokerRestTest.java index b5d036c9e4..30a9ea2f21 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BrokerRestTest.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BrokerRestTest.java @@ -42,6 +42,7 @@ import org.apache.qpid.server.model.VirtualHost; import org.apache.qpid.server.store.MessageStoreCreator; import org.apache.qpid.test.client.UnroutableMessageTestExceptionListener; import org.apache.qpid.test.utils.TestBrokerConfiguration; +import org.apache.qpid.util.SystemUtils; public class BrokerRestTest extends QpidRestTestCase { @@ -237,8 +238,7 @@ public class BrokerRestTest extends QpidRestTestCase assertEquals("Unexpected value of attribute " + Broker.BUILD_VERSION, QpidProperties.getBuildVersion(), brokerDetails.get(Broker.BUILD_VERSION)); - assertEquals("Unexpected value of attribute " + Broker.OPERATING_SYSTEM, OS_NAME + " " - + System.getProperty("os.version") + " " + System.getProperty("os.arch"), + assertEquals("Unexpected value of attribute " + Broker.OPERATING_SYSTEM, SystemUtils.getOSString(), brokerDetails.get(Broker.OPERATING_SYSTEM)); assertEquals( "Unexpected value of attribute " + Broker.PLATFORM, diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java index 8248fc9de2..7ff1d09cb2 100755 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java @@ -21,8 +21,6 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -31,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; + import javax.jms.BytesMessage; import javax.jms.Connection; import javax.jms.Destination; @@ -48,6 +47,7 @@ import javax.jms.Topic; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; + import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.XMLConfiguration; import org.apache.commons.lang.StringUtils; @@ -72,6 +72,7 @@ import org.apache.qpid.server.store.MessageStoreConstants; import org.apache.qpid.server.store.MessageStoreCreator; import org.apache.qpid.url.URLSyntaxException; import org.apache.qpid.util.FileUtils; +import org.apache.qpid.util.SystemUtils; /** * Qpid base class for system testing test cases. @@ -131,6 +132,7 @@ public class QpidBrokerTestCase extends QpidTestCase private static final String BROKER_LANGUAGE = "broker.language"; protected static final String BROKER_TYPE = "broker.type"; private static final String BROKER_COMMAND = "broker.command"; + private static final String BROKER_COMMAND_PLATFORM = "broker.command." + SystemUtils.getOSConfigSuffix(); private static final String BROKER_CLEAN_BETWEEN_TESTS = "broker.clean.between.tests"; private static final String BROKER_VERSION = "broker.version"; protected static final String BROKER_READY = "broker.ready"; @@ -158,13 +160,13 @@ public class QpidBrokerTestCase extends QpidTestCase public static final int FAILING_PORT = Integer.parseInt(System.getProperty("test.port.alt")); public static final int DEFAULT_MANAGEMENT_PORT = Integer.getInteger("test.mport", DEFAULT_JMXPORT_REGISTRYSERVER); public static final int DEFAULT_SSL_PORT = Integer.getInteger("test.port.ssl", DEFAULT_SSL_PORT_VALUE); - public static final String OS_NAME = System.getProperty("os.name"); - public static final boolean IS_OS_WINDOWS = String.valueOf(OS_NAME).toLowerCase().contains("windows"); protected String _brokerLanguage = System.getProperty(BROKER_LANGUAGE, JAVA); protected BrokerType _brokerType = BrokerType.valueOf(System.getProperty(BROKER_TYPE, "").toUpperCase()); - protected BrokerCommandHelper _brokerCommandHelper = new BrokerCommandHelper(System.getProperty(BROKER_COMMAND)); + private static final String BROKER_COMMAND_TEMPLATE = System.getProperty(BROKER_COMMAND_PLATFORM, System.getProperty(BROKER_COMMAND)); + protected BrokerCommandHelper _brokerCommandHelper = new BrokerCommandHelper(BROKER_COMMAND_TEMPLATE); + private Boolean _brokerCleanBetweenTests = Boolean.getBoolean(BROKER_CLEAN_BETWEEN_TESTS); private final AmqpProtocolVersion _brokerVersion = AmqpProtocolVersion.valueOf(System.getProperty(BROKER_VERSION, "")); protected String _output = System.getProperty(TEST_OUTPUT, System.getProperty("java.io.tmpdir")); @@ -499,8 +501,21 @@ public class QpidBrokerTestCase extends QpidTestCase String qpidHome = System.getProperty(QPID_HOME); processEnv.put(QPID_HOME, qpidHome); //Augment Path with bin directory in QPID_HOME. - processEnv.put("PATH", processEnv.get("PATH").concat(File.pathSeparator + qpidHome + "/bin")); + boolean foundPath = false; + final String pathEntry = qpidHome + File.separator + "bin"; + for(Map.Entry<String,String> entry : processEnv.entrySet()) + { + if(entry.getKey().equalsIgnoreCase("path")) + { + entry.setValue(entry.getValue().concat(File.pathSeparator + pathEntry)); + foundPath = true; + } + } + if(!foundPath) + { + processEnv.put("PATH", pathEntry); + } //Add the test name to the broker run. // DON'T change PNAME, qpid.stop needs this value. processEnv.put("QPID_PNAME", "-DPNAME=QPBRKR -DTNAME=\"" + getTestName() + "\""); @@ -565,8 +580,14 @@ public class QpidBrokerTestCase extends QpidTestCase _interleaveBrokerLog ? _brokerLogPrefix : null); p.start(); + StringBuilder cmdLine = new StringBuilder(cmd[0]); + for(int i = 1; i< cmd.length; i++) + { + cmdLine.append(' '); + cmdLine.append(cmd[i]); + } - SpawnedBrokerHolder holder = new SpawnedBrokerHolder(process, qpidWork, portsUsedByBroker); + SpawnedBrokerHolder holder = new SpawnedBrokerHolder(process, qpidWork, portsUsedByBroker, cmdLine.toString()); if (!p.await(30, TimeUnit.SECONDS)) { _logger.info("broker failed to become ready (" + p.getReady() + "):" + p.getStopLine()); @@ -639,7 +660,16 @@ public class QpidBrokerTestCase extends QpidTestCase private String relativeToQpidHome(String file) { - return file.replace(System.getProperty(QPID_HOME,"QPID_HOME") + File.separator,""); + _logger.debug("Converting path to be relative to QPID_HOME: " + file); + + final String qpidHome = System.getProperty(QPID_HOME,"QPID_HOME"); + _logger.debug("QPID_HOME is: " + qpidHome); + + if(!file.startsWith(qpidHome)) { + throw new RuntimeException("Provided path is not a child of the QPID_HOME directory: " + qpidHome); + } + + return file.replace(qpidHome + File.separator,""); } protected String getPathRelativeToWorkingDirectory(String file) @@ -653,7 +683,7 @@ public class QpidBrokerTestCase extends QpidTestCase { String configPath = configLocation.getAbsolutePath(); String workingDirectoryPath = workingDirectory.getCanonicalPath(); - if (IS_OS_WINDOWS) + if (SystemUtils.isWindows()) { configPath = configPath.toLowerCase(); workingDirectoryPath = workingDirectoryPath.toLowerCase(); diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java index bce97a574a..4752aec352 100644 --- a/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java +++ b/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java @@ -20,24 +20,32 @@ */ package org.apache.qpid.test.utils; +import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; +import org.apache.qpid.util.SystemUtils; public class SpawnedBrokerHolder implements BrokerHolder { private static final Logger LOGGER = Logger.getLogger(SpawnedBrokerHolder.class); - private final boolean _isWindows = String.valueOf(System.getProperty("os.name")).toLowerCase().contains("windows"); private final Process _process; private final Integer _pid; private final String _workingDirectory; private Set<Integer> _portsUsedByBroker; + private final String _brokerCommand; - public SpawnedBrokerHolder(final Process process, final String workingDirectory, Set<Integer> portsUsedByBroker) + public SpawnedBrokerHolder(final Process process, final String workingDirectory, Set<Integer> portsUsedByBroker, + String brokerCmd) { if(process == null) { @@ -48,6 +56,7 @@ public class SpawnedBrokerHolder implements BrokerHolder _pid = retrieveUnixPidIfPossible(); _workingDirectory = workingDirectory; _portsUsedByBroker = portsUsedByBroker; + _brokerCommand = brokerCmd; } @Override @@ -58,6 +67,11 @@ public class SpawnedBrokerHolder implements BrokerHolder public void shutdown() { + if(SystemUtils.isWindows()) + { + doWindowsKill(); + } + LOGGER.info("Destroying broker process"); _process.destroy(); @@ -66,12 +80,85 @@ public class SpawnedBrokerHolder implements BrokerHolder waitUntilPortsAreFree(); } + private void doWindowsKill() + { + try + { + Process p = Runtime.getRuntime().exec(new String[] {"wmic", "process", "list"}); + BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + String line; + String headers = reader.readLine(); + int processIdOffset = headers.indexOf(" ProcessId") + 1; + int parentProcessIdOffset = headers.indexOf(" ParentProcessId") + 1; + String parentProcess = null; + Map<String,List<String>> parentProcessMap = new HashMap<String, List<String>>(); + + while ((line = reader.readLine()) != null) + { + if(line.length() > processIdOffset) + { + String processIdStr = line.substring(processIdOffset); + processIdStr = processIdStr.substring(0, processIdStr.indexOf(' ')); + processIdStr.trim(); + + String parentProcessIdStr = line.substring(parentProcessIdOffset); + parentProcessIdStr = parentProcessIdStr.substring(0, parentProcessIdStr.indexOf(' ')); + parentProcessIdStr.trim(); + if(parentProcessIdStr.length() > 0 && (parentProcess == null || parentProcess.equals(parentProcessIdStr))) + { + List<String> children = parentProcessMap.get(parentProcessIdStr); + if(children == null) + { + children = new ArrayList<String>(); + parentProcessMap.put(parentProcessIdStr,children); + } + children.add(processIdStr); + } + if(line.substring(0,_brokerCommand.length()+7).toLowerCase().contains(_brokerCommand.toLowerCase())) + { + parentProcess = processIdStr; + } + + } + if(parentProcess != null) + { + List<String> children = parentProcessMap.get(parentProcess); + if(children != null) + { + for(String child : children) + { + p = Runtime.getRuntime().exec(new String[] {"taskkill", "/PID", child, "/T", "/F"}); + reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + while((line = reader.readLine()) != null) + { + } + } + } + p = Runtime.getRuntime().exec(new String[] {"taskkill", "/PID", parentProcess, "/T", "/F"}); + reader = new BufferedReader(new InputStreamReader(p.getInputStream())); + while((line = reader.readLine()) != null) + { + } + } + + } + } + catch (IOException e) + { + LOGGER.error("Error whilst killing process " + _brokerCommand, e); + } + } + @Override public void kill() { if (_pid == null) { - LOGGER.info("Destroying broker process"); + if(SystemUtils.isWindows()) + { + doWindowsKill(); + } + LOGGER.info("Destroying broker process (no PID)"); _process.destroy(); } else @@ -113,7 +200,7 @@ public class SpawnedBrokerHolder implements BrokerHolder private Integer retrieveUnixPidIfPossible() { - if(!_isWindows) + if(!SystemUtils.isWindows()) { try { |
