Repository: qpid-jms-amqp-0-x Updated Branches: refs/heads/master 983827591 -> 8706236c1
NO-JIRA: [System Tests] Restart CPP broker on same listening port and reuse working directory. Also allow a modulesDir to be passed to the cppd executable in order to enable built modules (which may include the persistent store) Project: http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/commit/8706236c Tree: http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/tree/8706236c Diff: http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/diff/8706236c Branch: refs/heads/master Commit: 8706236c1a2ecb5e6a46bc3cec68b395dcd1f1eb Parents: 9838275 Author: Keith Wall <[email protected]> Authored: Wed May 16 23:18:40 2018 +0100 Committer: Keith Wall <[email protected]> Committed: Thu May 17 08:38:23 2018 +0100 ---------------------------------------------------------------------- README.txt | 2 +- systests/pom.xml | 2 + .../core/AbstractSpawnQpidBrokerAdmin.java | 70 ++++++++---- .../apache/qpid/systest/core/LogConsumer.java | 26 +++++ .../core/brokerj/SpawnQpidBrokerAdmin.java | 6 +- .../systest/core/cpp/SpawnQpidBrokerAdmin.java | 109 ++++++++++++++++--- .../connection/FailoverBehaviourTest.java | 2 + 7 files changed, 178 insertions(+), 39 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/blob/8706236c/README.txt ---------------------------------------------------------------------- diff --git a/README.txt b/README.txt index 4145e54..c1a077f 100644 --- a/README.txt +++ b/README.txt @@ -36,7 +36,7 @@ Execute system tests against cpp broker available on PATH Execute system tests against cpp broker by providing path to broker executable explicitly - mvn verify -Pcpp -Dqpid.systest.broker.executable=/home/alex/qpid/qpidd + mvn verify -Pcpp -Dqpid.systest.broker.executable=/home/alex/qpid/qpidd -Dqpid.systest.broker.moduleDir=/home/alex/qpid/ Execute the unit tests and then produce the code coverage report http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/blob/8706236c/systests/pom.xml ---------------------------------------------------------------------- diff --git a/systests/pom.xml b/systests/pom.xml index 3376828..fd48b94 100644 --- a/systests/pom.xml +++ b/systests/pom.xml @@ -213,6 +213,7 @@ <properties> <qpid.systest.broker.executable>qpidd</qpid.systest.broker.executable> + <qpid.systest.broker.moduleDir></qpid.systest.broker.moduleDir> <qpid.systest.broker_admin>org.apache.qpid.systest.core.cpp.SpawnQpidBrokerAdmin</qpid.systest.broker_admin> </properties> <build> @@ -222,6 +223,7 @@ <artifactId>maven-surefire-plugin</artifactId> <configuration> <systemPropertyVariables> + <qpid.systest.broker.moduleDir>${qpid.systest.broker.moduleDir}</qpid.systest.broker.moduleDir> <qpid.systest.broker.executable>${qpid.systest.broker.executable}</qpid.systest.broker.executable> <qpid.systest.broker_admin>${qpid.systest.broker_admin}</qpid.systest.broker_admin> <qpid.systest.broker.clean.between.tests>${qpid.systest.broker.clean.between.tests}</qpid.systest.broker.clean.between.tests> http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/blob/8706236c/systests/src/main/java/org/apache/qpid/systest/core/AbstractSpawnQpidBrokerAdmin.java ---------------------------------------------------------------------- diff --git a/systests/src/main/java/org/apache/qpid/systest/core/AbstractSpawnQpidBrokerAdmin.java b/systests/src/main/java/org/apache/qpid/systest/core/AbstractSpawnQpidBrokerAdmin.java index 103cbc7..45b5024 100644 --- a/systests/src/main/java/org/apache/qpid/systest/core/AbstractSpawnQpidBrokerAdmin.java +++ b/systests/src/main/java/org/apache/qpid/systest/core/AbstractSpawnQpidBrokerAdmin.java @@ -72,10 +72,9 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin private volatile List<ListeningPort> _ports; private volatile Process _process; private volatile Integer _pid; - private volatile String _currentWorkDirectory; private ExecutorService _executorService; - private Class _currentTestClass; - private Method _currentTestMethod; + protected Class _currentTestClass; + protected Method _currentTestMethod; @Override public void beforeTestClass(final Class testClass) @@ -186,31 +185,31 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin protected abstract ProcessBuilder createBrokerProcessBuilder(final String workDirectory, final Class testClass) throws IOException; + public LogConsumer getLogConsumer() + { + return new LogConsumer() + { + @Override + public void accept(final String line) + { + } + }; + } protected void runBroker(final Class testClass, final Method method, final String readyLogPattern, final String stopLogPattern, final String portListeningLogPattern, - final String processPIDLogPattern) throws IOException + final String processPIDLogPattern, String currentWorkDirectory) throws IOException { - String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis())); - String test = testClass.getSimpleName(); - if (method != null) - { - test += "-" + method.getName(); - } - _currentWorkDirectory = - Files.createTempDirectory(String.format("qpid-work-%s-%s-", timestamp, test)) - .toString(); - - LOGGER.debug("Spawning broker working folder: {}", _currentWorkDirectory); + LOGGER.debug("Spawning broker working folder: {}", currentWorkDirectory); int startUpTime = Integer.getInteger(SYSTEST_PROPERTY_SPAWN_BROKER_STARTUP_TIME, 30000); LOGGER.debug("Spawning broker permitted start-up time: {}", startUpTime); - ProcessBuilder processBuilder = createBrokerProcessBuilder(_currentWorkDirectory, testClass); + ProcessBuilder processBuilder = createBrokerProcessBuilder(currentWorkDirectory, testClass); processBuilder.redirectErrorStream(true); Map<String, String> processEnvironment = processBuilder.environment(); @@ -223,6 +222,7 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin _process = processBuilder.start(); BrokerSystemOutputHandler brokerSystemOutputHandler = new BrokerSystemOutputHandler(_process.getInputStream(), + getLogConsumer(), readyLogPattern, stopLogPattern, processPIDLogPattern, @@ -312,6 +312,25 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin } } + protected String getWorkingDirectory(final Class testClass, final Method method) + { + try + { + String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis())); + String test = testClass.getSimpleName(); + if (method != null) + { + test += "-" + method.getName(); + } + return Files.createTempDirectory(String.format("qpid-work-%s-%s-", timestamp, test)) + .toString(); + } + catch (IOException e) + { + throw new IllegalStateException(e); + } + } + protected void shutdownBroker() { try @@ -342,13 +361,14 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin } _pid = null; _process = null; - if (_currentWorkDirectory != null && Boolean.getBoolean(SYSTEST_PROPERTY_BROKER_CLEAN_BETWEEN_TESTS)) - { - if (FileUtils.delete(new File(_currentWorkDirectory), true)) - { - _currentWorkDirectory = null; - } - } + } + } + + protected void cleanWorkDirectory(final String currentWorkDirectory) + { + if (currentWorkDirectory != null && Boolean.getBoolean(SYSTEST_PROPERTY_BROKER_CLEAN_BETWEEN_TESTS)) + { + FileUtils.delete(new File(currentWorkDirectory), true); } } @@ -493,11 +513,13 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin private final Pattern _pidPattern; private final Pattern _amqpPortPattern; private final CountDownLatch _readyLatch; + private final LogConsumer _logConsumer; private volatile boolean _seenReady; private volatile int _pid; private BrokerSystemOutputHandler(InputStream in, + LogConsumer logConsumer, String readyRegExp, String stoppedRedExp, String pidRegExp, @@ -505,6 +527,7 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin CountDownLatch readyLatch, String loggerName) { + _logConsumer = logConsumer; _amqpPorts = new ArrayList<>(); _seenReady = false; _in = new BufferedReader(new InputStreamReader(in)); @@ -524,6 +547,7 @@ public abstract class AbstractSpawnQpidBrokerAdmin implements BrokerAdmin String line; while ((line = _in.readLine()) != null) { + _logConsumer.accept(line); _out.info(line); checkPortListeningLog(line, _amqpPortPattern, _amqpPorts); http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/blob/8706236c/systests/src/main/java/org/apache/qpid/systest/core/LogConsumer.java ---------------------------------------------------------------------- diff --git a/systests/src/main/java/org/apache/qpid/systest/core/LogConsumer.java b/systests/src/main/java/org/apache/qpid/systest/core/LogConsumer.java new file mode 100644 index 0000000..43a7b2c --- /dev/null +++ b/systests/src/main/java/org/apache/qpid/systest/core/LogConsumer.java @@ -0,0 +1,26 @@ +/* + * 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.systest.core; + +public interface LogConsumer +{ + void accept(final String line); +} http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/blob/8706236c/systests/src/main/java/org/apache/qpid/systest/core/brokerj/SpawnQpidBrokerAdmin.java ---------------------------------------------------------------------- diff --git a/systests/src/main/java/org/apache/qpid/systest/core/brokerj/SpawnQpidBrokerAdmin.java b/systests/src/main/java/org/apache/qpid/systest/core/brokerj/SpawnQpidBrokerAdmin.java index f635a5d..b3c967f 100644 --- a/systests/src/main/java/org/apache/qpid/systest/core/brokerj/SpawnQpidBrokerAdmin.java +++ b/systests/src/main/java/org/apache/qpid/systest/core/brokerj/SpawnQpidBrokerAdmin.java @@ -77,6 +77,7 @@ public class SpawnQpidBrokerAdmin extends AbstractSpawnQpidBrokerAdmin private volatile boolean _isPersistentStore; private volatile String _virtualHostNodeName; + private volatile String _workingDirectory; @Override public boolean supportsPersistence() @@ -138,7 +139,8 @@ public class SpawnQpidBrokerAdmin extends AbstractSpawnQpidBrokerAdmin String amqpListening = System.getProperty(SYSTEST_PROPERTY_BROKER_LISTENING_LOG, "BRK-1002 : Starting : Listening on (\\w*) port ([0-9]+)"); String process = System.getProperty(SYSTEST_PROPERTY_BROKER_PROCESS_LOG, "BRK-1017 : Process : PID : ([0-9]+)"); - runBroker(testClass, null, ready, stopped, amqpListening, process); + _workingDirectory = getWorkingDirectory(testClass, null); + runBroker(testClass, null, ready, stopped, amqpListening, process, _workingDirectory); } catch (IOException e) { @@ -150,6 +152,8 @@ public class SpawnQpidBrokerAdmin extends AbstractSpawnQpidBrokerAdmin protected void cleanUp(final Class testClass) { shutdownBroker(); + cleanWorkDirectory(_workingDirectory); + _workingDirectory = null; } @Override http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/blob/8706236c/systests/src/main/java/org/apache/qpid/systest/core/cpp/SpawnQpidBrokerAdmin.java ---------------------------------------------------------------------- diff --git a/systests/src/main/java/org/apache/qpid/systest/core/cpp/SpawnQpidBrokerAdmin.java b/systests/src/main/java/org/apache/qpid/systest/core/cpp/SpawnQpidBrokerAdmin.java index 3c48c2c..5cc27d2 100644 --- a/systests/src/main/java/org/apache/qpid/systest/core/cpp/SpawnQpidBrokerAdmin.java +++ b/systests/src/main/java/org/apache/qpid/systest/core/cpp/SpawnQpidBrokerAdmin.java @@ -20,23 +20,52 @@ package org.apache.qpid.systest.core.cpp; +import java.io.File; import java.io.IOException; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.apache.qpid.systest.core.AbstractSpawnQpidBrokerAdmin; import org.apache.qpid.systest.core.BrokerAdminException; +import org.apache.qpid.systest.core.LogConsumer; public class SpawnQpidBrokerAdmin extends AbstractSpawnQpidBrokerAdmin { private static final String SYSTEST_PROPERTY_BROKER_EXECUTABLE = "qpid.systest.broker.executable"; + private static final String SYSTEST_PROPERTY_BROKER_MODULE_DIR = "qpid.systest.broker.moduleDir"; + private static final String SYSTEST_PROPERTY_BROKER_STORE_INITIALIZED = "qpid.systest.broker.storeInitialized"; private static final String BROKER_OUTPUT_LOG_RUNNING = "Broker \\(pid=([0-9]+)\\) running"; private static final String BROKER_OUTPUT_LOG_SHUT_DOWN = "Broker \\(pid=([0-9]+)\\) shut-down"; + private static final String BROKER_OUTPUT_STORE_INITIALIZED = "Store module initialized"; private static final String BROKER_OUTPUT_LOG_LISTENING = "Listening on (TCP/TCP6) port ([0-9]+)"; + private final String _storeInitalised; + private final String _moduleDir; + private final String _ready; + private final String _stopped; + private final String _amqpListening; + private final String _process; + private volatile String _workingDirectory; + private boolean _supportsPersistence = false; + private int _previousPort = 0; + + public SpawnQpidBrokerAdmin() + { + _storeInitalised = System.getProperty(SYSTEST_PROPERTY_BROKER_STORE_INITIALIZED, BROKER_OUTPUT_STORE_INITIALIZED); + _moduleDir = System.getProperty(SYSTEST_PROPERTY_BROKER_MODULE_DIR); + _ready = System.getProperty(SYSTEST_PROPERTY_BROKER_READY_LOG, BROKER_OUTPUT_LOG_RUNNING); + _stopped = System.getProperty(SYSTEST_PROPERTY_BROKER_STOPPED_LOG, BROKER_OUTPUT_LOG_SHUT_DOWN); + _amqpListening = System.getProperty(SYSTEST_PROPERTY_BROKER_LISTENING_LOG, + BROKER_OUTPUT_LOG_LISTENING); + _process = System.getProperty(SYSTEST_PROPERTY_BROKER_PROCESS_LOG, BROKER_OUTPUT_LOG_RUNNING); + } + @Override public boolean supportsPersistence() { - return false; + return _supportsPersistence; } @Override @@ -75,16 +104,35 @@ public class SpawnQpidBrokerAdmin extends AbstractSpawnQpidBrokerAdmin } @Override + public LogConsumer getLogConsumer() + { + final LogConsumer superConsumer = super.getLogConsumer(); + return new LogConsumer() + { + @Override + public void accept(final String line) + { + superConsumer.accept(line); + if (line != null && line.contains(_storeInitalised)) + { + _supportsPersistence = true; + } + } + }; + } + + @Override protected void begin(final Class testClass, final Method method) { + _workingDirectory = getWorkingDirectory(testClass, method); + doRunBroker(testClass, method); + } + + private void doRunBroker(final Class testClass, final Method method) + { try { - String ready = System.getProperty(SYSTEST_PROPERTY_BROKER_READY_LOG, BROKER_OUTPUT_LOG_RUNNING); - String stopped = System.getProperty(SYSTEST_PROPERTY_BROKER_STOPPED_LOG, BROKER_OUTPUT_LOG_SHUT_DOWN); - String amqpListening = System.getProperty(SYSTEST_PROPERTY_BROKER_LISTENING_LOG, - BROKER_OUTPUT_LOG_LISTENING); - String process = System.getProperty(SYSTEST_PROPERTY_BROKER_PROCESS_LOG, BROKER_OUTPUT_LOG_RUNNING); - runBroker(testClass, method, ready, stopped, amqpListening, process); + runBroker(testClass, method, _ready, _stopped, _amqpListening, _process, _workingDirectory); } catch (IOException e) { @@ -93,26 +141,59 @@ public class SpawnQpidBrokerAdmin extends AbstractSpawnQpidBrokerAdmin } @Override + public void restart() + { + try + { + _previousPort = getBrokerAddress(PortType.AMQP).getPort(); + } + catch (IllegalArgumentException e) + { + _previousPort = 0; + } + + try + { + shutdownBroker(); + doRunBroker(_currentTestClass, _currentTestMethod); + } + finally + { + _previousPort = 0; + } + } + + @Override protected void end(final Class testClass, final Method method) { shutdownBroker(); + cleanWorkDirectory(_workingDirectory); + _workingDirectory = null; } @Override - protected ProcessBuilder createBrokerProcessBuilder(final String workDirectory, final Class testClass) - throws IOException + protected ProcessBuilder createBrokerProcessBuilder(final String workDirectory, + final Class testClass) { - String[] cmd = new String[]{ + List<String> cmd = new ArrayList<>(Arrays.asList( System.getProperty(SYSTEST_PROPERTY_BROKER_EXECUTABLE, "qpidd"), "-p", - "0", + String.format("%d", _previousPort), "--data-dir", escapePath(workDirectory), "-t", "--auth", - "no", - "--no-module-dir" - }; + "no")); + + if (_moduleDir != null && _moduleDir.length() > 0 && new File(_moduleDir).isDirectory()) + { + cmd.add("--module-dir"); + cmd.add(escapePath(_moduleDir)); + } + else + { + cmd.add("--no-module-dir"); + } return new ProcessBuilder(cmd); } http://git-wip-us.apache.org/repos/asf/qpid-jms-amqp-0-x/blob/8706236c/systests/src/test/java/org/apache/qpid/systest/connection/FailoverBehaviourTest.java ---------------------------------------------------------------------- diff --git a/systests/src/test/java/org/apache/qpid/systest/connection/FailoverBehaviourTest.java b/systests/src/test/java/org/apache/qpid/systest/connection/FailoverBehaviourTest.java index 6520fdb..6654a4a 100644 --- a/systests/src/test/java/org/apache/qpid/systest/connection/FailoverBehaviourTest.java +++ b/systests/src/test/java/org/apache/qpid/systest/connection/FailoverBehaviourTest.java @@ -28,6 +28,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.Assume.assumeThat; +import static org.junit.Assume.assumeTrue; import java.text.MessageFormat; import java.util.Collections; @@ -306,6 +307,7 @@ public class FailoverBehaviourTest extends JmsTestBase implements ExceptionListe @Test public void testRollbackAfterReceivingAfterFailover() throws Exception { + assumeTrue(getBrokerAdmin().supportsPersistence()); init(Session.SESSION_TRANSACTED, true); produceMessages(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
