Added: qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/AbstractBrokerHolder.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/AbstractBrokerHolder.java?rev=1720539&view=auto ============================================================================== --- qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/AbstractBrokerHolder.java (added) +++ qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/AbstractBrokerHolder.java Thu Dec 17 12:59:43 2015 @@ -0,0 +1,271 @@ +/* + * 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.utils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.apache.qpid.server.BrokerOptions; +import org.apache.qpid.util.FileUtils; + +public abstract class AbstractBrokerHolder implements BrokerHolder +{ + private static final String RELATIVE_BROKER_CONFIG_PATH = "config.json"; + private static final AtomicInteger BROKER_INDEX = new AtomicInteger(); + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractBrokerHolder.class); + + private final String _classQualifiedTestName; + private final File _logFile; + private final String _brokerStoreType; + private final String _configurationPath; + private final int _brokerIndex; + private final String _amqpTcpPortRegExp; + private final String _initialConfigurationPath; + private final String _httpTcpPortRegExp; + private final String _amqpTlsPortRegExp; + private final String _httpTlsPortRegExp; + private final Path _qpidWorkDir; + + private TestBrokerConfiguration _configuration; + private int _amqpPort; + private int _httpPort; + private int _amqpTlsPort; + private int _httpsPort; + + public AbstractBrokerHolder(int port, String classQualifiedTestName, File logFile) + { + _amqpPort = port; + _brokerIndex = BROKER_INDEX.getAndIncrement(); + _classQualifiedTestName = classQualifiedTestName; + _logFile = logFile; + _initialConfigurationPath = System.getProperty("broker.config"); + _brokerStoreType = System.getProperty("broker.config-store-type", "JSON"); + _amqpTcpPortRegExp = + System.getProperty("broker.amqpTcpPortRegEx", "BRK-1002 : Starting : Listening on TCP port (\\d+)"); + _httpTcpPortRegExp = System.getProperty("broker.httpTcpPortRegEx", + "MNG-1002 : Starting : HTTP : Listening on TCP port (\\d+)"); + _amqpTlsPortRegExp = + System.getProperty("broker.amqpTlsPortRegEx", "BRK-1002 : Starting : Listening on SSL port (\\d+)"); + _httpTlsPortRegExp = System.getProperty("broker.httpTlsPortRegEx", + "MNG-1002 : Starting : HTTP : Listening on SSL port (\\d+)"); + + try + { + _qpidWorkDir = Files.createTempDirectory("qpid-work-" + _classQualifiedTestName + "-" + _brokerIndex + "-"); + _configurationPath = _qpidWorkDir.toAbsolutePath().resolve(RELATIVE_BROKER_CONFIG_PATH).toString(); + } + catch (IOException e) + { + throw new RuntimeException("Cannot create work directory", e); + } + } + + @Override + public Path getWorkDir() + { + return _qpidWorkDir; + } + + @Override + public String getConfigurationPath() + { + return _configurationPath; + } + + @Override + public int getBrokerIndex() + { + return _brokerIndex; + } + + @Override + public int getAmqpPort() + { + return _amqpPort; + } + + @Override + public int getHttpPort() + { + return _httpPort; + } + + @Override + public int getHttpsPort() + { + return _httpsPort; + } + + @Override + public int getAmqpTlsPort() + { + return _amqpTlsPort; + } + + @Override + public void cleanUp() + { + getConfiguration().cleanUp(); + FileUtils.delete(getWorkDir().toFile(), true); + } + + @Override + public TestBrokerConfiguration getConfiguration() + { + if (_configuration == null) + { + _configuration = createBrokerConfiguration(); + } + return _configuration; + } + + @Override + public void restart() throws Exception + { + shutdown(); + start(); + } + + @Override + public void start() throws Exception + { + start(false); + } + + @Override + public void start(boolean managementMode) throws Exception + { + saveConfiguration(getConfiguration()); + BrokerOptions options = createBrokerOptions(managementMode, _amqpPort); + start(options); + if (_amqpPort <= 0) + { + _amqpPort = scrubPortFromLog(_logFile, _amqpTcpPortRegExp); + } + if (_amqpTlsPort <= 0) + { + _amqpTlsPort = scrubPortFromLog(_logFile, _amqpTlsPortRegExp); + } + if (_httpPort <= 0) + { + _httpPort = scrubPortFromLog(_logFile, _httpTcpPortRegExp); + } + if (_httpsPort <= 0) + { + _httpsPort = scrubPortFromLog(_logFile, _httpTlsPortRegExp); + } + } + + @Override + public void createVirtualHostNode(final String virtualHostNodeName, + final String storeType, + final String storeDir, + final String blueprint) + { + getConfiguration().createVirtualHostNode(virtualHostNodeName, storeType, storeDir, blueprint); + } + + protected TestBrokerConfiguration createBrokerConfiguration() + { + return new TestBrokerConfiguration(_brokerStoreType, new File(_initialConfigurationPath).getAbsolutePath()); + } + + protected String getClassQualifiedTestName() + { + return _classQualifiedTestName; + } + + protected void waitUntilPortsAreFree() + { + Set<Integer> ports = new HashSet<>(); + ports.add(getAmqpPort()); + ports.add(getAmqpTlsPort()); + ports.add(getHttpPort()); + ports.add(getHttpsPort()); + new PortHelper().waitUntilPortsAreFree(ports); + } + + abstract protected String getLogPrefix(); + + abstract void start(final BrokerOptions options) throws Exception; + + private void saveConfiguration(TestBrokerConfiguration testConfiguration) + { + if (testConfiguration != null && !testConfiguration.isSaved()) + { + LOGGER.info("Saving test broker configuration at: " + _configurationPath); + testConfiguration.save(new File(_configurationPath)); + testConfiguration.setSaved(true); + } + } + + private BrokerOptions createBrokerOptions(boolean managementMode, int amqpPort) + { + BrokerOptions options = new BrokerOptions(); + + options.setConfigProperty("qpid.work_dir", getWorkDir().toString()); + options.setConfigProperty("test.port", String.valueOf(amqpPort)); + options.setConfigProperty("test.hport", String.valueOf(getHttpPort())); + options.setConfigurationStoreType(_brokerStoreType); + options.setConfigurationStoreLocation(_configurationPath); + options.setManagementMode(managementMode); + if (managementMode) + { + options.setManagementModePassword(QpidBrokerTestCase.MANAGEMENT_MODE_PASSWORD); + } + options.setStartupLoggedToSystemOut(false); + return options; + } + + private int scrubPortFromLog(final File logFile, final String portRegEx) throws IOException + { + final String logPrefix = getLogPrefix(); + Pattern portPattern = Pattern.compile(portRegEx); + try (BufferedReader br = new BufferedReader(new FileReader(logFile))) + { + String line = null; + while ((line = br.readLine()) != null) + { + if (logPrefix == null || line.contains(logPrefix)) + { + Matcher matcher = portPattern.matcher(line); + if (matcher.find() && matcher.groupCount() > 0) + { + return Integer.valueOf(matcher.group(1)).intValue(); + } + } + } + } + return 0; + } + +}
Modified: qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerCommandHelper.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerCommandHelper.java?rev=1720539&r1=1720538&r2=1720539&view=diff ============================================================================== --- qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerCommandHelper.java (original) +++ qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerCommandHelper.java Thu Dec 17 12:59:43 2015 @@ -36,7 +36,7 @@ public class BrokerCommandHelper _brokerCommandTemplateAsList = split(brokerCommandTemplate); } - public String[] getBrokerCommand(int port, String storePath, String storeType) + public String[] getBrokerCommand(int port, String qpidWork, String storePath, String storeType) { String[] command = new String[_brokerCommandTemplateAsList.size()]; int i=0; @@ -44,6 +44,7 @@ public class BrokerCommandHelper { command[i] = commandPart .replace("@PORT", "" + port) + .replace("@QPID_WORK", qpidWork) .replace("@STORE_PATH", storePath) .replace("@STORE_TYPE", storeType); i++; Modified: qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java?rev=1720539&r1=1720538&r2=1720539&view=diff ============================================================================== --- qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java (original) +++ qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/BrokerHolder.java Thu Dec 17 12:59:43 2015 @@ -20,14 +20,26 @@ */ package org.apache.qpid.test.utils; -import org.apache.qpid.server.BrokerOptions; +import java.nio.file.Path; public interface BrokerHolder { - public void start(BrokerOptions options) throws Exception; + void start() throws Exception; + void start(boolean managementMode) throws Exception; + void restart() throws Exception; void shutdown(); void kill(); + void cleanUp(); String dumpThreads(); + void createVirtualHostNode(String virtualHostNodeName, String storeType, String storeDir, String blueprint); + TestBrokerConfiguration getConfiguration(); + String getConfigurationPath(); + Path getWorkDir(); + int getBrokerIndex(); + int getAmqpPort(); + int getHttpPort(); + int getHttpsPort(); + int getAmqpTlsPort(); enum BrokerType { Modified: qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java?rev=1720539&r1=1720538&r2=1720539&view=diff ============================================================================== --- qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java (original) +++ qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/InternalBrokerHolder.java Thu Dec 17 12:59:43 2015 @@ -20,8 +20,8 @@ */ package org.apache.qpid.test.utils; +import java.io.File; import java.security.PrivilegedAction; -import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import javax.security.auth.Subject; @@ -34,19 +34,16 @@ import org.apache.qpid.server.BrokerOpti import org.apache.qpid.server.security.SecurityManager; import org.apache.qpid.server.util.Action; -public class InternalBrokerHolder implements BrokerHolder +public class InternalBrokerHolder extends AbstractBrokerHolder { private final static Logger LOGGER = LoggerFactory.getLogger(InternalBrokerHolder.class); private final static UncaughtExceptionHandler UNCAUGHT_EXCEPTION_HANDLER = new UncaughtExceptionHandler(); - private final QpidBrokerTestCase _testCase; - private final Set<Integer> _portsUsedByBroker; private volatile Broker _broker; - public InternalBrokerHolder(Set<Integer> portsUsedByBroker, final QpidBrokerTestCase testCase) + public InternalBrokerHolder(int port, final String classQualifiedTestName, final File logFile) { - _portsUsedByBroker = portsUsedByBroker; - _testCase = testCase; + super(port, classQualifiedTestName, logFile); } @Override @@ -75,16 +72,19 @@ public class InternalBrokerHolder implem { super.shutdown(); } - catch(IllegalStateException e) + catch (IllegalStateException e) { - System.out.println("IllegalStateException occurred on broker shutdown in test " + _testCase.getName()); + System.out.println("IllegalStateException occurred on broker shutdown in test " + + getClassQualifiedTestName()); throw e; } } }; + _broker.startup(options); } + @Override public void shutdown() { LOGGER.info("Shutting down Broker instance"); @@ -94,7 +94,7 @@ public class InternalBrokerHolder implem @Override public Object run() { - if(_broker != null) + if (_broker != null) { _broker.shutdown(); } @@ -105,11 +105,11 @@ public class InternalBrokerHolder implem }); waitUntilPortsAreFree(); - _testCase.assertEquals( - "One or more uncaught exceptions occurred prior to end of this test. Check test logs.", - 0, - UNCAUGHT_EXCEPTION_HANDLER.getAndResetCount()); - + if (UNCAUGHT_EXCEPTION_HANDLER.getAndResetCount() > 0) + { + throw new RuntimeException( + "One or more uncaught exceptions occurred prior to end of this test. Check test logs."); + } LOGGER.info("Broker instance shutdown"); } @@ -120,11 +120,6 @@ public class InternalBrokerHolder implem shutdown(); } - private void waitUntilPortsAreFree() - { - new PortHelper().waitUntilPortsAreFree(_portsUsedByBroker); - } - @Override public String dumpThreads() { @@ -134,7 +129,13 @@ public class InternalBrokerHolder implem @Override public String toString() { - return "InternalBrokerHolder [_portsUsedByBroker=" + _portsUsedByBroker + "]"; + return "InternalBrokerHolder [amqpPort=" + getAmqpPort() + "]"; + } + + @Override + protected String getLogPrefix() + { + return null; } private static class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler @@ -158,7 +159,7 @@ public class InternalBrokerHolder implem { count = _count.get(); } - while(!_count.compareAndSet(count, 0)); + while (!_count.compareAndSet(count, 0)); return count; } } Modified: qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java?rev=1720539&r1=1720538&r2=1720539&view=diff ============================================================================== --- qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java (original) +++ qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/QpidBrokerTestCase.java Thu Dec 17 12:59:43 2015 @@ -19,7 +19,11 @@ package org.apache.qpid.test.utils; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import javax.jms.BytesMessage; import javax.jms.Connection; @@ -43,67 +47,54 @@ import ch.qos.logback.classic.sift.Sifti import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.Appender; import ch.qos.logback.core.FileAppender; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; import org.apache.qpid.QpidException; -import org.apache.qpid.client.BrokerDetails; import org.apache.qpid.client.AMQConnectionFactory; import org.apache.qpid.client.AMQConnectionURL; import org.apache.qpid.client.AMQQueue; import org.apache.qpid.client.AMQTopic; +import org.apache.qpid.client.BrokerDetails; import org.apache.qpid.exchange.ExchangeDefaults; import org.apache.qpid.jms.ConnectionURL; import org.apache.qpid.server.Broker; -import org.apache.qpid.server.BrokerOptions; -import org.apache.qpid.server.configuration.BrokerProperties; -import org.apache.qpid.server.configuration.updater.TaskExecutor; -import org.apache.qpid.server.configuration.updater.TaskExecutorImpl; -import org.apache.qpid.server.logging.BrokerLogbackSocketLogger; -import org.apache.qpid.server.logging.BrokerNameAndLevelLogInclusionRule; -import org.apache.qpid.server.model.BrokerLogger; -import org.apache.qpid.server.model.BrokerLogInclusionRule; -import org.apache.qpid.server.model.ConfiguredObject; -import org.apache.qpid.server.model.Port; import org.apache.qpid.server.model.Protocol; -import org.apache.qpid.server.model.VirtualHostNode; import org.apache.qpid.server.store.MemoryConfigurationStore; -import org.apache.qpid.server.virtualhostnode.AbstractVirtualHostNode; -import org.apache.qpid.server.virtualhostnode.JsonVirtualHostNode; import org.apache.qpid.url.URLSyntaxException; -import org.apache.qpid.util.FileUtils; -import org.apache.qpid.util.SystemUtils; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.slf4j.MDC; /** * Qpid base class for system testing test cases. */ public class QpidBrokerTestCase extends QpidTestCase { - private TaskExecutor _taskExecutor; - public static final int LOGBACK_REMOTE_PORT = LogbackSocketPortNumberDefiner.getLogbackSocketPortNumber(); - public static final String GUEST_USERNAME = "guest"; public static final String GUEST_PASSWORD = "guest"; - - private final File _configFile = new File(System.getProperty("broker.config")); - protected final String _brokerStoreType = System.getProperty("broker.config-store-type", "JSON"); + public static final String PROFILE_USE_SSL = "profile.use_ssl"; + public static final String TEST_AMQP_PORT_PROTOCOLS_PROPERTY = "test.amqp_port_protocols"; + public static final int DEFAULT_PORT = Integer.getInteger("test.port", 0); + public static final int FAILING_PORT = Integer.getInteger("test.port.alt", 0); + public static final int DEFAULT_SSL_PORT = Integer.getInteger("test.port.ssl", 0); + public static final String QUEUE = "queue"; + public static final String TOPIC = "topic"; + public static final String MANAGEMENT_MODE_PASSWORD = "mm_password"; protected static final Logger _logger = LoggerFactory.getLogger(QpidBrokerTestCase.class); - protected static final int LOGMONITOR_TIMEOUT = 5000; - - protected long RECEIVE_TIMEOUT = Long.getLong("qpid.test_receive_timeout", 1000l); - - - private Map<String, String> _propertiesSetForBroker = new HashMap<String, String>(); - - private Map<Integer, TestBrokerConfiguration> _brokerConfigurations; - + protected static final long RECEIVE_TIMEOUT = Long.getLong("qpid.test_receive_timeout", 1000L); protected static final String INDEX = "index"; protected static final String CONTENT = "content"; - + protected static final int DEFAULT_MESSAGE_SIZE = 1024; private static final String DEFAULT_INITIAL_CONTEXT = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory"; + private static final String JAVA = "java"; + private static final String BROKER_LANGUAGE = System.getProperty("broker.language", JAVA); + private static final BrokerHolder.BrokerType DEFAULT_BROKER_TYPE = BrokerHolder.BrokerType.valueOf( + System.getProperty("broker.type", BrokerHolder.BrokerType.INTERNAL.name()).toUpperCase()); + private static final Boolean BROKER_CLEAN_BETWEEN_TESTS = Boolean.getBoolean("broker.clean.between.tests"); + private static final Boolean BROKER_PERSISTENT = Boolean.getBoolean("broker.persistent"); + private static final Protocol BROKER_PROTOCOL = + Protocol.valueOf("AMQP_" + System.getProperty("broker.version", "v0_9").substring(1)); + private static List<BrokerHolder> _brokerList = new ArrayList<>(); static { @@ -115,112 +106,17 @@ public class QpidBrokerTestCase extends } } - // system properties - 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"; - private static final String TEST_OUTPUT = "test.output"; - private static final String BROKER_PERSITENT = "broker.persistent"; - public static final String PROFILE_USE_SSL = "profile.use_ssl"; - - public static final int DEFAULT_PORT_VALUE = 5672; - public static final int DEFAULT_SSL_PORT_VALUE = 5671; - public static final int DEFAULT_HTTP_MANAGEMENT_PORT_VALUE = 8080; - - public static final String TEST_AMQP_PORT_PROTOCOLS_PROPERTY="test.amqp_port_protocols"; - - // values - protected static final String JAVA = "java"; - - public static final int DEFAULT_PORT = Integer.getInteger("test.port", DEFAULT_PORT_VALUE); - public static final int FAILING_PORT = Integer.parseInt(System.getProperty("test.port.alt")); - public static final int DEFAULT_HTTP_MANAGEMENT_PORT = Integer.getInteger("test.hport", DEFAULT_HTTP_MANAGEMENT_PORT_VALUE); - public static final int DEFAULT_SSL_PORT = Integer.getInteger("test.port.ssl", DEFAULT_SSL_PORT_VALUE); - - protected String _brokerLanguage = System.getProperty(BROKER_LANGUAGE, JAVA); - protected BrokerHolder.BrokerType _brokerType = BrokerHolder.BrokerType.valueOf(System.getProperty(BROKER_TYPE, "") - .toUpperCase()); - - private static final String BROKER_COMMAND_TEMPLATE = System.getProperty(BROKER_COMMAND_PLATFORM, - System.getProperty(BROKER_COMMAND)); - - private Boolean _brokerCleanBetweenTests = Boolean.getBoolean(BROKER_CLEAN_BETWEEN_TESTS); - private final Protocol _brokerProtocol = Protocol.valueOf("AMQP_" + System.getProperty(BROKER_VERSION, " ") - .substring(1)); - protected String _output = System.getProperty(TEST_OUTPUT, System.getProperty("java.io.tmpdir")); - protected Boolean _brokerPersistent = Boolean.getBoolean(BROKER_PERSITENT); - - protected Map<Integer, BrokerHolder> _brokers = new HashMap<Integer, BrokerHolder>(); - - protected InitialContext _initialContext; + private final Map<String, String> _propertiesSetForBroker = new HashMap<>(); + private final List<Connection> _connections = new ArrayList<>(); protected AMQConnectionFactory _connectionFactory; - - // the connections created for a given test - protected List<Connection> _connections = new ArrayList<Connection>(); - public static final String QUEUE = "queue"; - public static final String TOPIC = "topic"; - public static final String MANAGEMENT_MODE_PASSWORD = "mm_password"; - - /** Map to hold test defined environment properties */ - private Map<String, String> _env; - - /** Ensure our messages have some sort of size */ - protected static final int DEFAULT_MESSAGE_SIZE = 1024; - - /** Size to create our message*/ - private int _messageSize = DEFAULT_MESSAGE_SIZE; - private String _brokerCommandTemplate; - - public File getOutputFile() - { - final ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - File appender = getFileFromSiftingAppender(logger); - - return appender; - } - - private File getFileFromSiftingAppender(final ch.qos.logback.classic.Logger logger) - { - String key = MDC.get(QpidTestCase.CLASS_QUALIFIED_TEST_NAME); - - for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext(); /* do nothing */ ) - { - Appender<ILoggingEvent> appender = index.next(); - if (appender instanceof SiftingAppender) - { - SiftingAppender siftingAppender = (SiftingAppender) appender; - Appender subAppender = siftingAppender.getAppenderTracker().find(key); - if (subAppender instanceof FileAppender) - { - return new File(((FileAppender)subAppender).getFile()); - } - } - } - return null; - } - - /** Type of message*/ - protected enum MessageType - { - BYTES, - MAP, - OBJECT, - STREAM, - TEXT - } - private MessageType _messageType = MessageType.TEXT; + private BrokerHolder _defaultBroker; + private MessageType _messageType = MessageType.TEXT; public QpidBrokerTestCase() { super(); - _brokerConfigurations = new HashMap<>(); - _brokerCommandTemplate = BROKER_COMMAND_TEMPLATE; - - if (JAVA.equals(_brokerLanguage)) + if (JAVA.equals(BROKER_LANGUAGE)) { try { @@ -233,97 +129,12 @@ public class QpidBrokerTestCase extends } } - public TestBrokerConfiguration getBrokerConfiguration(int port) - { - int actualPort = getPort(port); - - synchronized (_brokerConfigurations) - { - TestBrokerConfiguration configuration = _brokerConfigurations.get(actualPort); - if (configuration == null) - { - configuration = createBrokerConfiguration(actualPort); - } - return configuration; - } - } - - public TestBrokerConfiguration getBrokerConfiguration() - { - return getBrokerConfiguration(DEFAULT_PORT); - } - - public TestBrokerConfiguration createBrokerConfiguration(int port) - { - int actualPort = getPort(port); - if(_taskExecutor == null) - { - _taskExecutor = new TaskExecutorImpl(); - _taskExecutor.start(); - } - TestBrokerConfiguration configuration = new TestBrokerConfiguration(_brokerStoreType, _configFile.getAbsolutePath(), _taskExecutor); - synchronized (_brokerConfigurations) - { - _brokerConfigurations.put(actualPort, configuration); - } - if (actualPort != DEFAULT_PORT) - { - configuration.setObjectAttribute(Port.class, TestBrokerConfiguration.ENTRY_NAME_AMQP_PORT, Port.PORT, actualPort); - - String remotelogback = "remotelogback"; - - Map<String, String> mdc = new HashMap<>(); - mdc.put(CLASS_QUALIFIED_TEST_NAME, getClassQualifiedTestName()); - mdc.put("origin", "B-" + actualPort); - - Map<String, Object> loggerAttrs = new HashMap<>(); - loggerAttrs.put(BrokerLogger.TYPE, BrokerLogbackSocketLogger.TYPE); - loggerAttrs.put(BrokerLogbackSocketLogger.NAME, remotelogback); - loggerAttrs.put(BrokerLogbackSocketLogger.PORT, LOGBACK_REMOTE_PORT); - - loggerAttrs.put(BrokerLogbackSocketLogger.MAPPED_DIAGNOSTIC_CONTEXT, - mdc); - - configuration.addObjectConfiguration(BrokerLogger.class, loggerAttrs); - - Map<String, Object> qpidRuleAttrs = new HashMap<>(); - qpidRuleAttrs.put(BrokerLogInclusionRule.NAME, "Qpid"); - qpidRuleAttrs.put(BrokerLogInclusionRule.TYPE, BrokerNameAndLevelLogInclusionRule.TYPE); - qpidRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LEVEL, "DEBUG"); - qpidRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LOGGER_NAME, "org.apache.qpid.*"); - - configuration.addObjectConfiguration(BrokerLogger.class, - remotelogback, BrokerLogInclusionRule.class, qpidRuleAttrs); - - Map<String, Object> operationalLoggingRuleAttrs = new HashMap<>(); - operationalLoggingRuleAttrs.put(BrokerLogInclusionRule.NAME, "Operational"); - operationalLoggingRuleAttrs.put(BrokerLogInclusionRule.TYPE, BrokerNameAndLevelLogInclusionRule.TYPE); - operationalLoggingRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LEVEL, "INFO"); - operationalLoggingRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LOGGER_NAME, "qpid.message.*"); - - configuration.addObjectConfiguration(BrokerLogger.class, - remotelogback, BrokerLogInclusionRule.class, operationalLoggingRuleAttrs); - - String workDir = System.getProperty("QPID_WORK") + File.separator + TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST + File.separator + actualPort; - configuration.setObjectAttribute(VirtualHostNode.class, TestBrokerConfiguration.ENTRY_NAME_VIRTUAL_HOST, JsonVirtualHostNode.STORE_PATH, workDir); - } - - return configuration; - } - - public Logger getLogger() - { - return QpidBrokerTestCase._logger; - } - @Override public void runBare() throws Throwable { - // Initialize this for each test run - _env = new HashMap<String, String>(); - try { + _defaultBroker = new BrokerHolderFactory().create(DEFAULT_BROKER_TYPE, DEFAULT_PORT, this); super.runBare(); } catch (Exception e) @@ -338,457 +149,62 @@ public class QpidBrokerTestCase extends // reset properties used in the test revertSystemProperties(); - if (_brokerCleanBetweenTests) - { - final String qpidWork = System.getProperty("QPID_WORK"); - cleanBrokerWork(qpidWork); - createBrokerWork(qpidWork); - } - _logger.info("========== stop " + getTestName() + " =========="); - - } - } - - @Override - protected void setUp() throws Exception - { - super.setUp(); - _taskExecutor = new TaskExecutorImpl(); - _taskExecutor.start(); - if (!_configFile.exists()) - { - fail("Unable to test without config file:" + _configFile); - } - - startBroker(); - } - - /** - * The returned set of port numbers is only a guess because it assumes no ports have been overridden - * using system properties. - */ - protected Set<Integer> guessAllPortsUsedByBroker(int mainPort) - { - Set<Integer> ports = new HashSet<>(); - - ports.add(mainPort); - ports.add(DEFAULT_SSL_PORT); - - return ports; - } - - /** - * Get the Port that is use by the current broker - * - * @return the current port - */ - protected int getPort() - { - return getPort(0); - } - - protected int getPort(int port) - { - if (!_brokerType.equals(BrokerHolder.BrokerType.EXTERNAL)) - { - return port == 0 ? DEFAULT_PORT : port; - } - else - { - return port; - } - } - - public void startBroker() throws Exception - { - startBroker(0); - } - - public void startBroker(int port) throws Exception - { - startBroker(port, false); - } - - public void startBroker(int port, boolean managementMode) throws Exception - { - int actualPort = getPort(port); - TestBrokerConfiguration configuration = getBrokerConfiguration(actualPort); - startBroker(actualPort, configuration, managementMode); - } - - public void startBroker(int port, TestBrokerConfiguration testConfiguration) throws Exception - { - startBroker(port, testConfiguration, false); - } - - protected void startBroker(int port, - TestBrokerConfiguration testConfiguration, - boolean managementMode) throws Exception - { - port = getPort(port); - - if(_brokers.get(port) != null) - { - throw new IllegalStateException("There is already an existing broker running on port " + port); - } - - String testConfig = saveTestConfiguration(port, testConfiguration); - BrokerOptions options = getBrokerOptions(managementMode, testConfig); - BrokerHolder holder = new BrokerHolderFactory().create(_brokerType, port, this); - _brokers.put(port, holder); - holder.start(options); - } - - private boolean existingInternalBroker() - { - for(BrokerHolder holder : _brokers.values()) - { - if(holder instanceof InternalBrokerHolder) - { - return true; - } } - - return false; } - public String getTestConfigFile(int port) - { - return _output + File.separator + getTestQueueName() + "-" + port + "-config"; - } - - protected String getPathRelativeToWorkingDirectory(String file) - { - File configLocation = new File(file); - File workingDirectory = new File(System.getProperty("user.dir")); - - _logger.debug("Converting path to be relative to working directory: " + file); - - try - { - String configPath = configLocation.getAbsolutePath(); - String workingDirectoryPath = workingDirectory.getCanonicalPath(); - if (SystemUtils.isWindows()) - { - configPath = configPath.toLowerCase(); - workingDirectoryPath = workingDirectoryPath.toLowerCase(); - } - if(!configPath.startsWith(workingDirectoryPath)) - { - throw new RuntimeException("Provided path is not a child of the working directory: " + workingDirectoryPath); - } - - String substring = configPath.replace(workingDirectoryPath, "").substring(1); - _logger.debug("Converted relative path: " + substring); - - return substring; - } - catch (IOException e) - { - throw new RuntimeException("Problem while converting to relative path", e); - } - } - - protected String saveTestConfiguration(int port, TestBrokerConfiguration testConfiguration) - { - String testConfig = getTestConfigFile(port); - String relative = getPathRelativeToWorkingDirectory(testConfig); - if (testConfiguration != null && !testConfiguration.isSaved()) - { - _logger.info("Saving test broker configuration at: " + testConfig); - testConfiguration.save(new File(testConfig)); - testConfiguration.setSaved(true); - } - return relative; - } - - protected void cleanBrokerWork(final String qpidWork) - { - if (qpidWork != null) - { - _logger.info("Cleaning broker work dir: " + qpidWork); - - File file = new File(qpidWork); - if (file.exists()) - { - final boolean success = FileUtils.delete(file, true); - if(!success) - { - throw new RuntimeException("Failed to recursively delete beneath : " + file); - } - } - } - } - - protected void createBrokerWork(final String qpidWork) - { - if (qpidWork != null) - { - final File dir = new File(qpidWork); - dir.mkdirs(); - if (!dir.isDirectory()) - { - throw new RuntimeException("Failed to created Qpid work directory : " + qpidWork); - } - } - } - - public void stopBroker() - { - stopBroker(0); - } - - public void stopAllBrokers() - { - boolean exceptionOccured = false; - Set<Integer> runningBrokerPorts = new HashSet<Integer>(getBrokerPortNumbers()); - for (int brokerPortNumber : runningBrokerPorts) - { - if (!stopBrokerSafely(brokerPortNumber)) - { - exceptionOccured = true; - } - } - if (exceptionOccured) - { - throw new RuntimeException("Exception occurred on stopping of test broker. Please, examine logs for details"); - } - } - - protected boolean stopBrokerSafely(int brokerPortNumber) - { - boolean success = true; - BrokerHolder broker = _brokers.get(brokerPortNumber); - try - { - stopBroker(brokerPortNumber); - } - catch(Exception e) - { - success = false; - _logger.error("Failed to stop broker " + broker + " at port " + brokerPortNumber, e); - if (broker != null) - { - // save the thread dump in case of dead locks - try - { - _logger.error("Broker " + broker + " thread dump:" + broker.dumpThreads()); - } - finally - { - // try to kill broker - try - { - broker.kill(); - } - catch(Exception killException) - { - // ignore - } - } - } - } - return success; - } - - public void stopBroker(int port) - { - if (isBrokerPresent(port)) - { - port = getPort(port); - - _logger.info("stopping broker on port : " + port); - BrokerHolder broker = _brokers.remove(port); - broker.shutdown(); - } - } - - public void killBroker() + public Logger getLogger() { - killBroker(0); + return QpidBrokerTestCase._logger; } - public void killBroker(int port) + public File getOutputFile() { - if (isBrokerPresent(port)) - { - port = getPort(port); + final ch.qos.logback.classic.Logger logger = + (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - _logger.info("killing broker on port : " + port); - BrokerHolder broker = _brokers.remove(port); - broker.kill(); - } + return getFileFromSiftingAppender(logger); } - public boolean isBrokerPresent(int port) + public BrokerHolder getDefaultBroker() { - port = getPort(port); - - return _brokers.containsKey(port); + return _defaultBroker; } - public BrokerHolder getBroker(int port) throws Exception + public void startDefaultBroker() throws Exception { - port = getPort(port); - return _brokers.get(port); + startDefaultBroker(false); } - public Set<Integer> getBrokerPortNumbers() + public void startDefaultBroker(boolean managementMode) throws Exception { - return new HashSet<Integer>(_brokers.keySet()); + getDefaultBroker().start(managementMode); + setTestSystemProperty("test.port", getDefaultBroker().getAmqpPort() + ""); } - /** - * Creates a new virtual host node in broker configuration for given broker port - * @param brokerPort broker port - * @param virtualHostNodeName virtual host node name - */ - protected void createTestVirtualHostNode(int brokerPort, String virtualHostNodeName, boolean withBlueprint) + public void stopDefaultBroker() throws Exception { - String storeType = getTestProfileVirtualHostNodeType(); - String storeDir = null; - - if (System.getProperty("profile", "").startsWith("java-dby-mem")) - { - storeDir = ":memory:"; - } - else if (!MemoryConfigurationStore.TYPE.equals(storeType)) - { - storeDir = "${QPID_WORK}" + File.separator + virtualHostNodeName + File.separator + brokerPort; - } - - // add new virtual host node with vhost blueprint configuration to the broker store - Map<String, Object> attributes = new HashMap<String, Object>(); - attributes.put(VirtualHostNode.NAME, virtualHostNodeName); - attributes.put(VirtualHostNode.TYPE, storeType); - if (storeDir != null) - { - attributes.put(JsonVirtualHostNode.STORE_PATH, storeDir); - } - - if (withBlueprint) - { - final String blueprint = getTestProfileVirtualHostNodeBlueprint(); - - attributes.put(ConfiguredObject.CONTEXT, - Collections.singletonMap(AbstractVirtualHostNode.VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, - blueprint)); - } - - int port = getPort(brokerPort); - getBrokerConfiguration(port).addObjectConfiguration(VirtualHostNode.class, attributes); + getDefaultBroker().shutdown(); } - protected void createTestVirtualHostNode(int brokerPort, String virtualHostNodeName) + public TestBrokerConfiguration getDefaultBrokerConfiguration() { - createTestVirtualHostNode(brokerPort, virtualHostNodeName, true); + return getDefaultBroker().getConfiguration(); } - /** - * Set a System property that is to be applied only to the external test - * broker. - * - * This is a convenience method to enable the setting of a -Dproperty=value - * entry in QPID_OPTS - * - * This is only useful for the External Java Broker tests. - * - * @param property the property name - * @param value the value to set the property to - */ - protected void setBrokerOnlySystemProperty(String property, String value) + public BrokerHolder createSpawnedBroker() throws Exception { - synchronized (_propertiesSetForBroker) - { - if (!_propertiesSetForBroker.containsKey(property)) - { - _propertiesSetForBroker.put(property, value); - } - } + return createSpawnedBroker(0); } - /** - * Set a System (-D) property for this test run. - * - * This convenience method copies the current VMs System Property - * for the external VM Broker. - * - * @param property the System property to set - */ - protected void setSystemProperty(String property) + public BrokerHolder createSpawnedBroker(int amqpPort) throws Exception { - String value = System.getProperty(property); - if (value != null) - { - setSystemProperty(property, value); - } + return new BrokerHolderFactory().create(BrokerHolder.BrokerType.SPAWNED, amqpPort, this); } - /** - * Set a System property for the duration of this test. - * - * When the test run is complete the value will be reverted. - * - * The values set using this method will also be propagated to the external - * Java Broker via a -D value defined in QPID_OPTS. - * - * If the value should not be set on the broker then use - * setTestClientSystemProperty(). - * - * @param property the property to set - * @param value the new value to use - */ - protected void setSystemProperty(String property, String value) + public void killDefaultBroker() { - synchronized(_propertiesSetForBroker) - { - // Record the value for the external broker - if (value == null) - { - _propertiesSetForBroker.remove(property); - } - else - { - _propertiesSetForBroker.put(property, value); - } - } - //Set the value for the test client vm aswell. - setTestClientSystemProperty(property, value); - } - - /** - * Set a System property for the client (and broker if using the same vm) of this test. - * - * @param property The property to set - * @param value the value to set it to. - */ - protected void setTestClientSystemProperty(String property, String value) - { - setTestSystemProperty(property, value); - } - - /** - * Restore the System property values that were set before this test run. - */ - protected void revertSystemProperties() - { - revertTestSystemProperties(); - - // We don't change the current VMs settings for Broker only properties - // so we can just clear this map - _propertiesSetForBroker.clear(); - } - - /** - * Add an environment variable for the external broker environment - * - * @param property the property to set - * @param value the value to set it to - */ - protected void setBrokerEnvironment(String property, String value) - { - _env.put(property, value); + getDefaultBroker().kill(); } /** @@ -798,53 +214,22 @@ public class QpidBrokerTestCase extends */ public boolean isBroker08() { - return _brokerProtocol.equals(Protocol.AMQP_0_8); + return BROKER_PROTOCOL.equals(Protocol.AMQP_0_8); } public boolean isBroker010() { - return _brokerProtocol.equals(Protocol.AMQP_0_10); + return BROKER_PROTOCOL.equals(Protocol.AMQP_0_10); } public Protocol getBrokerProtocol() { - return _brokerProtocol; - } - - protected boolean isJavaBroker() - { - return _brokerLanguage.equals("java"); - } - - protected boolean isCppBroker() - { - return _brokerLanguage.equals("cpp"); - } - - protected boolean isExternalBroker() - { - return !isInternalBroker(); - } - - protected boolean isInternalBroker() - { - return _brokerType.equals(BrokerHolder.BrokerType.INTERNAL); - } - - protected boolean isBrokerStorePersistent() - { - return _brokerPersistent; + return BROKER_PROTOCOL; } - public void restartBroker() throws Exception + public void restartDefaultBroker() throws Exception { - restartBroker(0); - } - - public void restartBroker(int port) throws Exception - { - stopBroker(port); - startBroker(port); + getDefaultBroker().restart(); } /** @@ -852,16 +237,11 @@ public class QpidBrokerTestCase extends * i.e. -Djava.naming.provider.url="..//example010.properties" * * @return an initial context - * * @throws NamingException if there is an error getting the context */ public InitialContext getInitialContext() throws NamingException { - if (_initialContext == null) - { - _initialContext = new InitialContext(); - } - return _initialContext; + return new InitialContext(); } /** @@ -869,8 +249,7 @@ public class QpidBrokerTestCase extends * Default factory is "local" * * @return A connection factory - * - * @throws Exception if there is an error getting the factory + * @throws NamingException if there is an error getting the factory */ public AMQConnectionFactory getConnectionFactory() throws NamingException { @@ -892,10 +271,8 @@ public class QpidBrokerTestCase extends * Get a connection factory for the currently used broker * * @param factoryName The factory name - * * @return A connection factory - * - * @throws Exception if there is an error getting the factory + * @throws NamingException if there is an error getting the factory */ public AMQConnectionFactory getConnectionFactory(String factoryName) throws NamingException { @@ -907,18 +284,11 @@ public class QpidBrokerTestCase extends return getConnection(GUEST_USERNAME, GUEST_PASSWORD); } - protected Connection getConnectionWithSyncPublishing() throws URLSyntaxException, NamingException, JMSException - { - Map<String, String> options = new HashMap<>(); - options.put(ConnectionURL.OPTIONS_SYNC_PUBLISH, "all"); - return getConnectionWithOptions(options); - } - public Connection getConnectionWithOptions(Map<String, String> options) - throws URLSyntaxException, NamingException, JMSException + throws URLSyntaxException, NamingException, JMSException { ConnectionURL curl = new AMQConnectionURL(getConnectionFactory().getConnectionURLString()); - for(Map.Entry<String,String> entry : options.entrySet()) + for (Map.Entry<String, String> entry : options.entrySet()) { curl.setOption(entry.getKey(), entry.getValue()); } @@ -929,7 +299,6 @@ public class QpidBrokerTestCase extends return getConnection(curl); } - public Connection getConnection(ConnectionURL url) throws JMSException { _logger.debug("get connection for " + url.getURL()); @@ -945,10 +314,8 @@ public class QpidBrokerTestCase extends * * @param username The user name * @param password The user password - * * @return a newly created connection - * - * @throws Exception if there is an error getting the connection + * @throws JMSException NamingException if there is an error getting the connection */ public Connection getConnection(String username, String password) throws JMSException, NamingException { @@ -959,44 +326,10 @@ public class QpidBrokerTestCase extends return con; } - protected Connection getClientConnection(String username, String password, String id) throws JMSException, URLSyntaxException, - QpidException, NamingException - { - _logger.debug("get connection for id " + id); - Connection con = getConnectionFactory().createConnection(username, password, id); - //add the connection in the list of connections - _connections.add(con); - return con; - } - - /** - * Useful, for example, to avoid the connection being automatically closed in {@link #tearDown()} - * if it has deliberately been put into an error state already. - */ - protected void forgetConnection(Connection connection) - { - _logger.debug("Forgetting about connection " + connection); - boolean removed = _connections.remove(connection); - assertTrue( - "The supplied connection " + connection + " should have been one that I already know about", - removed); - } - - /** - * Return a uniqueName for this test. - * In this case it returns a queue Named by the TestCase and TestName - * - * @return String name for a queue - */ - protected String getTestQueueName() - { - return getClass().getSimpleName() + "-" + getName(); - } - /** * Return a Queue specific for this test. * Uses getTestQueueName() as the name of the queue - * @return + * */ public Queue getTestQueue() { @@ -1006,71 +339,22 @@ public class QpidBrokerTestCase extends /** * Return a Topic specific for this test. * Uses getTestQueueName() as the name of the topic - * @return + * */ public Topic getTestTopic() { return new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, getTestQueueName()); } - @Override - protected void tearDown() throws java.lang.Exception - { - super.tearDown(); - - // close all the connections used by this test. - for (Connection c : _connections) - { - c.close(); - } - if(_taskExecutor != null) - { - _taskExecutor.stop(); - } - } - - /** - * Consume all the messages in the specified queue. Helper to ensure - * persistent tests don't leave data behind. - * - * @param queue the queue to purge - * - * @return the count of messages drained - * - * @throws Exception if a problem occurs - */ - protected int drainQueue(Queue queue) throws Exception - { - Connection connection = getConnection(); - - Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); - - MessageConsumer consumer = session.createConsumer(queue); - - connection.start(); - - int count = 0; - while (consumer.receive(1000) != null) - { - count++; - } - - connection.close(); - - return count; - } - /** * Send messages to the given destination. - * + * <p/> * If session is transacted then messages will be committed before returning * - * @param session the session to use for sending + * @param session the session to use for sending * @param destination where to send them to - * @param count no. of messages to send - * + * @param count no. of messages to send * @return the sent messages - * * @throws Exception */ public List<Message> sendMessage(Session session, Destination destination, @@ -1081,17 +365,15 @@ public class QpidBrokerTestCase extends /** * Send messages to the given destination. - * + * <p/> * If session is transacted then messages will be committed before returning * - * @param session the session to use for sending + * @param session the session to use for sending * @param destination where to send them to - * @param count no. of messages to send - * - * @param batchSize the batchSize in which to commit, 0 means no batching, - * but a single commit at the end + * @param count no. of messages to send + * @param batchSize the batchSize in which to commit, 0 means no batching, + * but a single commit at the end * @return the sent message - * * @throws Exception */ public List<Message> sendMessage(Session session, Destination destination, @@ -1102,24 +384,22 @@ public class QpidBrokerTestCase extends /** * Send messages to the given destination. - * + * <p/> * If session is transacted then messages will be committed before returning * - * @param session the session to use for sending + * @param session the session to use for sending * @param destination where to send them to - * @param count no. of messages to send - * - * @param offset offset allows the INDEX value of the message to be adjusted. - * @param batchSize the batchSize in which to commit, 0 means no batching, - * but a single commit at the end + * @param count no. of messages to send + * @param offset offset allows the INDEX value of the message to be adjusted. + * @param batchSize the batchSize in which to commit, 0 means no batching, + * but a single commit at the end * @return the sent message - * * @throws Exception */ public List<Message> sendMessage(Session session, Destination destination, int count, int offset, int batchSize) throws Exception { - List<Message> messages = new ArrayList<Message>(count); + List<Message> messages = new ArrayList<>(count); MessageProducer producer = session.createProducer(destination); @@ -1147,7 +427,7 @@ public class QpidBrokerTestCase extends // we have no batchSize or // our count is not divible by batchSize. if (session.getTransacted() && - ( batchSize == 0 || (i-1) % batchSize != 0)) + (batchSize == 0 || (i - 1) % batchSize != 0)) { session.commit(); } @@ -1157,7 +437,7 @@ public class QpidBrokerTestCase extends public Message createNextMessage(Session session, int msgCount) throws JMSException { - Message message = createMessage(session, _messageSize); + Message message = createMessage(session, DEFAULT_MESSAGE_SIZE); message.setIntProperty(INDEX, msgCount); return message; @@ -1198,7 +478,7 @@ public class QpidBrokerTestCase extends return message; } - public BrokerDetails getBroker() + public BrokerDetails getBrokerDetailsFromDefaultConnectionUrl() { try { @@ -1220,16 +500,6 @@ public class QpidBrokerTestCase extends return null; } - protected int getFailingPort() - { - return FAILING_PORT; - } - - public int getHttpManagementPort(int mainPort) - { - return mainPort + (DEFAULT_HTTP_MANAGEMENT_PORT - DEFAULT_PORT); - } - public void assertProducingConsuming(final Connection connection) throws Exception { Session session = connection.createSession(true, Session.SESSION_TRANSACTED); @@ -1245,33 +515,294 @@ public class QpidBrokerTestCase extends session.close(); } - protected BrokerOptions getBrokerOptions(boolean managementMode, String testConfig) + @Override + protected void setUp() throws Exception + { + super.setUp(); + startDefaultBroker(); + } + + @Override + protected void tearDown() throws java.lang.Exception + { + try + { + for (Connection c : _connections) + { + c.close(); + } + } + finally + { + try + { + _defaultBroker.shutdown(); + } + finally + { + super.tearDown(); + } + } + } + + protected int getDefaultAmqpPort() + { + return getDefaultBroker().getAmqpPort(); + } + + protected boolean stopBrokerSafely(BrokerHolder broker) + { + boolean success = true; + try + { + broker.shutdown(); + + if (BROKER_CLEAN_BETWEEN_TESTS) + { + broker.cleanUp(); + } + } + catch (Exception e) + { + success = false; + _logger.error("Failed to stop broker " + broker, e); + if (broker != null) + { + // save the thread dump in case of dead locks + try + { + _logger.error("Broker " + broker + " thread dump:" + broker.dumpThreads()); + } + finally + { + try + { + broker.kill(); + } + catch (Exception killException) + { + // ignore + } + } + } + } + return success; + } + + protected void createTestVirtualHostNode(String virtualHostNodeName) + { + createTestVirtualHostNode(getDefaultBroker(), virtualHostNodeName, true); + } + + protected void createTestVirtualHostNode(BrokerHolder broker, String virtualHostNodeName, boolean withBlueprint) + { + String storeType = getTestProfileVirtualHostNodeType(); + String storeDir = null; + + if (System.getProperty("profile", "").startsWith("java-dby-mem")) + { + storeDir = ":memory:"; + } + else if (!MemoryConfigurationStore.TYPE.equals(storeType)) + { + storeDir = "${qpid.work_dir}" + File.separator + virtualHostNodeName; + } + + String blueprint = null; + if (withBlueprint) + { + blueprint = getTestProfileVirtualHostNodeBlueprint(); + } + + broker.createVirtualHostNode(virtualHostNodeName, storeType, storeDir, blueprint); + } + + /** + * Set a System property for the duration of this test. + * <p/> + * When the test run is complete the value will be reverted. + * <p/> + * The values set using this method will also be propagated to the external + * Java Broker via a -D value defined in QPID_OPTS. + * <p/> + * If the value should not be set on the broker then use + * setTestClientSystemProperty(). + * + * @param property the property to set + * @param value the new value to use + */ + protected void setSystemProperty(String property, String value) + { + synchronized (_propertiesSetForBroker) + { + // Record the value for the external broker + if (value == null) + { + _propertiesSetForBroker.remove(property); + } + else + { + _propertiesSetForBroker.put(property, value); + } + } + //Set the value for the test client vm aswell. + setTestClientSystemProperty(property, value); + } + + /** + * Set a System property for the client (and broker if using the same vm) of this test. + * + * @param property The property to set + * @param value the value to set it to. + */ + protected void setTestClientSystemProperty(String property, String value) + { + setTestSystemProperty(property, value); + } + + /** + * Restore the System property values that were set before this test run. + */ + protected void revertSystemProperties() + { + revertTestSystemProperties(); + + // We don't change the current VMs settings for Broker only properties + // so we can just clear this map + _propertiesSetForBroker.clear(); + } + + protected boolean isJavaBroker() + { + return BROKER_LANGUAGE.equals("java"); + } + + protected boolean isCppBroker() + { + return BROKER_LANGUAGE.equals("cpp"); + } + + protected boolean isExternalBroker() + { + return !isInternalBroker(); + } + + protected boolean isInternalBroker() + { + return DEFAULT_BROKER_TYPE.equals(BrokerHolder.BrokerType.INTERNAL); + } + + protected boolean isBrokerStorePersistent() + { + return BROKER_PERSISTENT; + } + + protected Connection getConnectionWithSyncPublishing() throws URLSyntaxException, NamingException, JMSException + { + Map<String, String> options = new HashMap<>(); + options.put(ConnectionURL.OPTIONS_SYNC_PUBLISH, "all"); + return getConnectionWithOptions(options); + } + + protected Connection getClientConnection(String username, String password, String id) + throws JMSException, URLSyntaxException, + QpidException, NamingException + { + _logger.debug("get connection for id " + id); + Connection con = getConnectionFactory().createConnection(username, password, id); + //add the connection in the list of connections + _connections.add(con); + return con; + } + + /** + * Useful, for example, to avoid the connection being automatically closed in {@link #tearDown()} + * if it has deliberately been put into an error state already. + */ + protected void forgetConnection(Connection connection) + { + _logger.debug("Forgetting about connection " + connection); + boolean removed = _connections.remove(connection); + assertTrue( + "The supplied connection " + connection + " should have been one that I already know about", + removed); + } + + /** + * Return a uniqueName for this test. + * In this case it returns a queue Named by the TestCase and TestName + * + * @return String name for a queue + */ + protected String getTestQueueName() + { + return getClass().getSimpleName() + "-" + getName(); + } + + protected int getFailingPort() + { + return FAILING_PORT; + } + + private File getFileFromSiftingAppender(final ch.qos.logback.classic.Logger logger) + { + String key = MDC.get(QpidTestCase.CLASS_QUALIFIED_TEST_NAME); + + for (Iterator<Appender<ILoggingEvent>> index = logger.iteratorForAppenders(); index.hasNext(); /* do nothing */) + { + Appender<ILoggingEvent> appender = index.next(); + if (appender instanceof SiftingAppender) + { + SiftingAppender siftingAppender = (SiftingAppender) appender; + Appender subAppender = siftingAppender.getAppenderTracker().find(key); + if (subAppender instanceof FileAppender) + { + return new File(((FileAppender) subAppender).getFile()); + } + } + } + return null; + } + + private boolean existingInternalBroker() { - BrokerOptions options = new BrokerOptions(); + for (BrokerHolder holder : _brokerList) + { + if (holder instanceof InternalBrokerHolder) + { + return true; + } + } + + return false; + } - options.setConfigurationStoreType(_brokerStoreType); - options.setConfigurationStoreLocation(testConfig); - options.setManagementMode(managementMode); - if (managementMode) + private void stopAllBrokers() + { + boolean exceptionOccurred = false; + for (BrokerHolder brokerHolder : _brokerList) + { + if (!stopBrokerSafely(brokerHolder)) + { + exceptionOccurred = true; + } + } + _brokerList.clear(); + if (exceptionOccurred) { - options.setManagementModePassword(MANAGEMENT_MODE_PASSWORD); + throw new RuntimeException("Exception occurred on stopping of test broker. Please, examine logs for details"); } - options.setStartupLoggedToSystemOut(false); - return options; } private Map<String, String> getJvmProperties() { - Map<String,String> jvmOptions = new HashMap(); + Map<String, String> jvmOptions = new HashMap<>(); synchronized (_propertiesSetForBroker) { jvmOptions.putAll(_propertiesSetForBroker); copySystemProperty("test.port", jvmOptions); - copySystemProperty("test.mport", jvmOptions); - copySystemProperty("test.cport", jvmOptions); copySystemProperty("test.hport", jvmOptions); - copySystemProperty("test.hsport", jvmOptions); copySystemProperty("test.port.ssl", jvmOptions); copySystemProperty("test.port.alt", jvmOptions); copySystemProperty("test.port.alt.ssl", jvmOptions); @@ -1294,40 +825,41 @@ public class QpidBrokerTestCase extends } } - private Map<String, String> getEnvironmentProperties() - { - return new HashMap<>(_env); - } - - private String getBrokerCommandTemplate() - { - return _brokerCommandTemplate; - } - - protected boolean isBrokerCleanBetweenTests() + /** + * Type of message + */ + protected enum MessageType { - return _brokerCleanBetweenTests; + BYTES, + MAP, + OBJECT, + STREAM, + TEXT } public static class BrokerHolderFactory { - public BrokerHolder create(BrokerHolder.BrokerType brokerType, int port, QpidBrokerTestCase testCase) { - Set<Integer> portsUsedByBroker = testCase.guessAllPortsUsedByBroker(port); + // This will force the creation of the file appender + _logger.debug("Creating BrokerHolder"); + + final File logFile = testCase.getOutputFile(); + final String classQualifiedTestName = testCase.getClassQualifiedTestName(); BrokerHolder holder = null; if (brokerType.equals(BrokerHolder.BrokerType.INTERNAL) && !testCase.existingInternalBroker()) { - holder = new InternalBrokerHolder(portsUsedByBroker, testCase); + holder = new InternalBrokerHolder(port, classQualifiedTestName, logFile); } else if (!brokerType.equals(BrokerHolder.BrokerType.EXTERNAL)) { + Map<String, String> jvmOptions = testCase.getJvmProperties(); + Map<String, String> environmentProperties = new HashMap<>(testCase._propertiesSetForBroker); - Map<String,String> jvmOptions = testCase.getJvmProperties(); - Map<String,String> environmentProperties = testCase.getEnvironmentProperties(); - - holder = new SpawnedBrokerHolder(testCase.getBrokerCommandTemplate(), port, testCase.getTestName(), jvmOptions, environmentProperties, brokerType, portsUsedByBroker); + holder = new SpawnedBrokerHolder(port, classQualifiedTestName, logFile, + jvmOptions, environmentProperties); } + _brokerList.add(holder); return holder; } } Modified: qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java?rev=1720539&r1=1720538&r2=1720539&view=diff ============================================================================== --- qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java (original) +++ qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/SpawnedBrokerHolder.java Thu Dec 17 12:59:43 2015 @@ -30,7 +30,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; @@ -38,19 +37,21 @@ import org.slf4j.LoggerFactory; import org.apache.qpid.server.BrokerOptions; import org.apache.qpid.server.configuration.BrokerProperties; +import org.apache.qpid.server.logging.BrokerLogbackSocketLogger; +import org.apache.qpid.server.logging.BrokerNameAndLevelLogInclusionRule; import org.apache.qpid.server.logging.messages.BrokerMessages; -import org.apache.qpid.util.FileUtils; +import org.apache.qpid.server.model.BrokerLogInclusionRule; +import org.apache.qpid.server.model.BrokerLogger; import org.apache.qpid.util.SystemUtils; -public class SpawnedBrokerHolder implements BrokerHolder +public class SpawnedBrokerHolder extends AbstractBrokerHolder { private static final Logger LOGGER = LoggerFactory.getLogger(SpawnedBrokerHolder.class); protected static final String BROKER_READY = System.getProperty("broker.ready", BrokerMessages.READY().toString()); private static final String BROKER_STOPPED = System.getProperty("broker.stopped", BrokerMessages.STOPPED().toString()); + private static final String BROKER_COMMAND_PLATFORM = "broker.command." + SystemUtils.getOSConfigSuffix(); + private static final String BROKER_COMMAND_TEMPLATE = System.getProperty(BROKER_COMMAND_PLATFORM, System.getProperty("broker.command")); - private final BrokerType _type; - private final int _port; - private final String _name; private final Map<String, String> _jvmOptions; private final Map<String, String> _environmentSettings; protected BrokerCommandHelper _brokerCommandHelper; @@ -58,28 +59,36 @@ public class SpawnedBrokerHolder impleme private Process _process; private Integer _pid; private List<String> _windowsPids; - private Set<Integer> _portsUsedByBroker; private String _brokerCommand; + private String _pseudoThreadName; - public SpawnedBrokerHolder(String brokerCommandTemplate, int port, String name, Map<String, String> jvmOptions, Map<String, String> environmentSettings, BrokerType type, Set<Integer> portsUsedByBroker) + public SpawnedBrokerHolder(final int port, + final String classQualifiedTestName, + final File logFile, + Map<String, String> jvmOptions, + Map<String, String> environmentSettings) { - _type = type; - _portsUsedByBroker = portsUsedByBroker; - _port = port; - _name = name; + super(port, classQualifiedTestName, logFile); _jvmOptions = jvmOptions; _environmentSettings = environmentSettings; - _brokerCommandHelper = new BrokerCommandHelper(brokerCommandTemplate); + _brokerCommandHelper = new BrokerCommandHelper(BROKER_COMMAND_TEMPLATE); + _pseudoThreadName = "BROKER-" + getBrokerIndex(); } @Override public void start(BrokerOptions brokerOptions) throws Exception { - // Add the port to QPID_WORK to ensure unique working dirs for multi broker tests - final String qpidWork = getQpidWork(_type, _port); - - String[] cmd = _brokerCommandHelper.getBrokerCommand(_port, brokerOptions.getConfigurationStoreLocation(), brokerOptions.getConfigurationStoreType()); + Map<String, String> mdc = new HashMap<>(); + mdc.put(QpidBrokerTestCase.CLASS_QUALIFIED_TEST_NAME, getClassQualifiedTestName()); + mdc.put("origin", getLogPrefix()); + + LOGGER.debug("Spawning broker with options: {} jvmOptions: {} environmentSettings: {}", brokerOptions, _jvmOptions, _environmentSettings); + + String[] cmd = _brokerCommandHelper.getBrokerCommand(Integer.parseInt(brokerOptions.getConfigProperties().get("test.port")), + brokerOptions.getConfigProperties().get("qpid.work_dir"), + brokerOptions.getConfigurationStoreLocation(), + brokerOptions.getConfigurationStoreType()); if (brokerOptions.isManagementMode()) { String[] newCmd = new String[cmd.length + 3]; @@ -112,8 +121,7 @@ public class SpawnedBrokerHolder impleme } //Add the test name to the broker run. // DON'T change PNAME, qpid.stop needs this value. - processEnv.put("QPID_PNAME", "-DPNAME=QPBRKR -DTNAME=\"" + _name + "\""); - processEnv.put("QPID_WORK", qpidWork); + processEnv.put("QPID_PNAME", "-DPNAME=QPBRKR -DTNAME=\"" + getClassQualifiedTestName() + "\""); // Add all the environment settings the test requested if (!_environmentSettings.isEmpty()) @@ -142,20 +150,15 @@ public class SpawnedBrokerHolder impleme } processEnv.put("QPID_OPTS", qpidOpts); - // cpp broker requires that the work directory is created - createBrokerWork(qpidWork); - _process = pb.start(); Piper standardOutputPiper = new Piper(_process.getInputStream(), BROKER_READY, BROKER_STOPPED, - "STD", "BROKER-" + _port); + _pseudoThreadName, getClass().getName()); standardOutputPiper.start(); - new Piper(_process.getErrorStream(), null, null, "ERROR", "BROKER-" + _port).start(); - StringBuilder cmdLine = new StringBuilder(cmd[0]); for(int i = 1; i< cmd.length; i++) { @@ -176,7 +179,6 @@ public class SpawnedBrokerHolder impleme } //Ensure broker has stopped _process.destroy(); - cleanBrokerWork(qpidWork); throw new RuntimeException("broker failed to become ready:" + standardOutputPiper.getStopLine()); } @@ -188,7 +190,6 @@ public class SpawnedBrokerHolder impleme //test that the broker is still running and hasn't exited unexpectedly int exit = _process.exitValue(); LOGGER.info("broker aborted: " + exit); - cleanBrokerWork(qpidWork); throw new RuntimeException("broker aborted: " + exit); } catch (IllegalThreadStateException e) @@ -211,60 +212,28 @@ public class SpawnedBrokerHolder impleme } } - protected void createBrokerWork(final String qpidWork) - { - if (qpidWork != null) - { - final File dir = new File(qpidWork); - dir.mkdirs(); - if (!dir.isDirectory()) - { - throw new RuntimeException("Failed to created Qpid work directory : " + qpidWork); - } - } - } - - private String getQpidWork(BrokerType broker, int port) + @Override + public void shutdown() { - if (!broker.equals(BrokerType.EXTERNAL)) + if(SystemUtils.isWindows()) { - return System.getProperty(BrokerProperties.PROPERTY_QPID_WORK) + File.separator + port; + doWindowsKill(); } - return System.getProperty(BrokerProperties.PROPERTY_QPID_WORK); - } - - private void cleanBrokerWork(final String qpidWork) - { - if (qpidWork != null) + if (_process != null) { - LOGGER.info("Cleaning broker work dir: " + qpidWork); + LOGGER.info("Destroying broker process"); + _process.destroy(); - File file = new File(qpidWork); - if (file.exists()) - { - final boolean success = FileUtils.delete(file, true); - if(!success) - { - throw new RuntimeException("Failed to recursively delete beneath : " + file); - } - } + reapChildProcess(); + waitUntilPortsAreFree(); } } - public void shutdown() + @Override + protected String getLogPrefix() { - if(SystemUtils.isWindows()) - { - doWindowsKill(); - } - - LOGGER.info("Destroying broker process"); - _process.destroy(); - - reapChildProcess(); - - waitUntilPortsAreFree(); + return _pseudoThreadName; } private List<String> retrieveWindowsPidsIfPossible() @@ -472,11 +441,6 @@ public class SpawnedBrokerHolder impleme } } - private void waitUntilPortsAreFree() - { - new PortHelper().waitUntilPortsAreFree(_portsUsedByBroker); - } - @Override public String dumpThreads() { @@ -502,7 +466,48 @@ public class SpawnedBrokerHolder impleme @Override public String toString() { - return "SpawnedBrokerHolder [_pid=" + _pid + ", _portsUsedByBroker=" - + _portsUsedByBroker + "]"; + return "SpawnedBrokerHolder [_pid=" + _pid + ", _amqpPort=" + + getAmqpPort() + "]"; } + + @Override + protected TestBrokerConfiguration createBrokerConfiguration() + { + TestBrokerConfiguration configuration = super.createBrokerConfiguration(); + + String remotelogback = "remotelogback"; + + Map<String, String> mdc = new HashMap<>(); + mdc.put(QpidBrokerTestCase.CLASS_QUALIFIED_TEST_NAME, getClassQualifiedTestName()); + mdc.put("origin", getLogPrefix()); + + Map<String, Object> loggerAttrs = new HashMap<>(); + loggerAttrs.put(BrokerLogger.TYPE, BrokerLogbackSocketLogger.TYPE); + loggerAttrs.put(BrokerLogbackSocketLogger.NAME, remotelogback); + loggerAttrs.put(BrokerLogbackSocketLogger.PORT, QpidBrokerTestCase.LOGBACK_REMOTE_PORT); + loggerAttrs.put(BrokerLogbackSocketLogger.MAPPED_DIAGNOSTIC_CONTEXT, mdc); + + configuration.addObjectConfiguration(BrokerLogger.class, loggerAttrs); + + Map<String, Object> qpidRuleAttrs = new HashMap<>(); + qpidRuleAttrs.put(BrokerLogInclusionRule.NAME, "Qpid"); + qpidRuleAttrs.put(BrokerLogInclusionRule.TYPE, BrokerNameAndLevelLogInclusionRule.TYPE); + qpidRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LEVEL, "DEBUG"); + qpidRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LOGGER_NAME, "org.apache.qpid.*"); + + configuration.addObjectConfiguration(BrokerLogger.class, remotelogback, + BrokerLogInclusionRule.class, qpidRuleAttrs); + + Map<String, Object> operationalLoggingRuleAttrs = new HashMap<>(); + operationalLoggingRuleAttrs.put(BrokerLogInclusionRule.NAME, "Operational"); + operationalLoggingRuleAttrs.put(BrokerLogInclusionRule.TYPE, BrokerNameAndLevelLogInclusionRule.TYPE); + operationalLoggingRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LEVEL, "INFO"); + operationalLoggingRuleAttrs.put(BrokerNameAndLevelLogInclusionRule.LOGGER_NAME, "qpid.message.*"); + + configuration.addObjectConfiguration(BrokerLogger.class, remotelogback, + BrokerLogInclusionRule.class, operationalLoggingRuleAttrs); + + return configuration; + } + } Modified: qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java URL: http://svn.apache.org/viewvc/qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java?rev=1720539&r1=1720538&r2=1720539&view=diff ============================================================================== --- qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java (original) +++ qpid/java/trunk/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java Thu Dec 17 12:59:43 2015 @@ -22,8 +22,10 @@ package org.apache.qpid.test.utils; import static org.mockito.Mockito.mock; +import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -39,8 +41,10 @@ import java.util.Map; import java.util.UUID; import org.apache.qpid.server.BrokerOptions; +import org.apache.qpid.server.configuration.updater.CurrentThreadTaskExecutor; import org.apache.qpid.server.configuration.updater.TaskExecutor; import org.apache.qpid.server.logging.EventLogger; +import org.apache.qpid.server.management.plugin.HttpManagement; import org.apache.qpid.server.model.*; import org.apache.qpid.server.model.adapter.FileBasedGroupProvider; import org.apache.qpid.server.model.adapter.FileBasedGroupProviderImpl; @@ -53,6 +57,7 @@ import org.apache.qpid.server.store.Conf import org.apache.qpid.server.store.ConfiguredObjectRecordImpl; import org.apache.qpid.server.store.DurableConfigurationStore; import org.apache.qpid.server.store.handler.ConfiguredObjectRecordHandler; +import org.apache.qpid.server.virtualhostnode.JsonVirtualHostNode; import org.apache.qpid.util.Strings; public class TestBrokerConfiguration @@ -76,14 +81,16 @@ public class TestBrokerConfiguration private DurableConfigurationStore _store; private boolean _saved; + private File _passwdFile; - public TestBrokerConfiguration(String storeType, String initialStoreLocation, final TaskExecutor taskExecutor) + public TestBrokerConfiguration(String storeType, String initialStoreLocation) { BrokerOptions brokerOptions = new BrokerOptions(); - _taskExecutor = taskExecutor; + _taskExecutor = new CurrentThreadTaskExecutor(); + _taskExecutor.start(); _storeType = storeType; brokerOptions.setInitialConfigurationLocation(initialStoreLocation); - final AbstractSystemConfig parentObject = new JsonSystemConfigImpl(taskExecutor, + final AbstractSystemConfig parentObject = new JsonSystemConfigImpl(_taskExecutor, mock(EventLogger.class), brokerOptions.convertToSystemConfigAttributes()); @@ -226,7 +233,6 @@ public class TestBrokerConfiguration } }); - configurationStore.openConfigurationStore(parentObject,true,initialRecords.toArray(new ConfiguredObjectRecord[initialRecords.size()])); configurationStore.closeConfigurationStore(); parentObject.close(); @@ -300,9 +306,15 @@ public class TestBrokerConfiguration public UUID addHttpManagementConfiguration() { - Map<String, Object> attributes = new HashMap<String, Object>(); + setObjectAttribute(AuthenticationProvider.class, TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER, + "secureOnlyMechanisms", "{}"); + setObjectAttribute(Port.class, TestBrokerConfiguration.ENTRY_NAME_HTTP_PORT, Port.AUTHENTICATION_PROVIDER, + TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER); + + Map<String, Object> attributes = new HashMap<>(); attributes.put(Plugin.TYPE, MANAGEMENT_HTTP_PLUGIN_TYPE); attributes.put(Plugin.NAME, ENTRY_NAME_HTTP_MANAGEMENT); + attributes.put(HttpManagement.HTTP_BASIC_AUTHENTICATION_ENABLED, true); return addObjectConfiguration(Plugin.class, attributes); } @@ -383,6 +395,75 @@ public class TestBrokerConfiguration return findObject(category, name).getAttributes(); } + public void createVirtualHostNode(final String virtualHostNodeName, + final String storeType, + final String storeDir, + final String blueprint) + { + Map<String, Object> attributes = new HashMap<>(); + attributes.put(VirtualHostNode.NAME, virtualHostNodeName); + attributes.put(VirtualHostNode.TYPE, storeType); + if (storeDir != null) + { + attributes.put(JsonVirtualHostNode.STORE_PATH, storeDir); + } + + if (blueprint != null) + { + attributes.put(VirtualHostNode.CONTEXT, + Collections.singletonMap(VirtualHostNode.VIRTUALHOST_BLUEPRINT_CONTEXT_VAR, blueprint)); + } + + addObjectConfiguration(VirtualHostNode.class, attributes); + } + + public void configureTemporaryPasswordFile(String... users) throws IOException + { + _passwdFile = createTemporaryPasswordFile(users); + + setObjectAttribute(AuthenticationProvider.class, TestBrokerConfiguration.ENTRY_NAME_AUTHENTICATION_PROVIDER, + "path", _passwdFile.getAbsolutePath()); + } + + public void cleanUp() + { + if (_passwdFile != null) + { + if (_passwdFile.exists()) + { + _passwdFile.delete(); + } + } + } + + public File createTemporaryPasswordFile(String[] users) throws IOException + { + BufferedWriter writer = null; + try + { + File testFile = File.createTempFile(this.getClass().getName(),"tmp"); + testFile.deleteOnExit(); + + writer = new BufferedWriter(new FileWriter(testFile)); + for (int i = 0; i < users.length; i++) + { + String username = users[i]; + writer.write(username + ":" + username); + writer.newLine(); + } + + return testFile; + + } + finally + { + if (writer != null) + { + writer.close(); + } + } + } + private static class RecordFindingVisitor implements ConfiguredObjectRecordHandler { private final Class<? extends ConfiguredObject> _category; --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org