summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Wall <kwall@apache.org>2014-03-07 17:24:48 +0000
committerKeith Wall <kwall@apache.org>2014-03-07 17:24:48 +0000
commit9bcbad89194862ef37832b9936ba8fc5fa58c47b (patch)
treed25b12bf16782b329eeda01c6a62e81a91842254
parent713dbcd70b5d2da2488c09676f18f1752683654e (diff)
downloadqpid-python-9bcbad89194862ef37832b9936ba8fc5fa58c47b.tar.gz
QPID-5612: JMS benchmarking tool [Part of the existing Java Broker Performance Test suite]
Simple tool that uses the existing performance test suite to give a message throughput statistics (msg/s) and (Kbytes/s) for a use case involving a producer/consumer (on separate connections) with persistent messages on transactional sessions. The test scales the number of connections through 1, 2, 5 and 10 and reports separate statistics for each. The duration of the test and message size can be overridden from the command line via system properties -Dqpid.disttest.duration and -Dqpid.disttest.messageSize respectively. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1575336 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Benchmark.java246
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java14
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java25
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluator.java27
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java42
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/BenchmarkResultWriter.java68
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/ResultsCsvWriter.java (renamed from qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ResultsFileWriter.java)15
-rw-r--r--qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/ResultsWriter.java34
-rw-r--r--qpid/java/perftests/src/main/resources/Benchmark.js77
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluatorTest.java29
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java15
-rw-r--r--qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/ResultsFileWriterTest.java (renamed from qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ResultsFileWriterTest.java)9
12 files changed, 577 insertions, 24 deletions
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Benchmark.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Benchmark.java
new file mode 100644
index 0000000000..4ebbaf7da3
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/Benchmark.java
@@ -0,0 +1,246 @@
+/*
+ *
+ * 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.disttest;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import org.apache.qpid.disttest.controller.Controller;
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.controller.config.Config;
+import org.apache.qpid.disttest.controller.config.ConfigReader;
+import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.results.BenchmarkResultWriter;
+import org.apache.qpid.disttest.results.ResultsWriter;
+import org.apache.qpid.disttest.results.aggregation.Aggregator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Performs a performance benchmark using the performance test suite. The performance test
+ * script (Benchmark.js) is normally found on the classpath.
+ *
+ * Typical command line usage:
+ *
+ * java -cp ".:./lib/*" -Dqpid.disttest.duration=1000 -Dqpid.disttest.messageSize=2048 -Dqpid.dest_syntax=BURL
+ * org.apache.qpid.disttest.Benchmark
+ * report-message-totals=false jndi-config=etc/perftests-jndi.properties
+ *
+ * The classpath must contain the JMS client and the performance test JAR.
+ *
+ */
+public class Benchmark
+{
+ private static final Logger LOGGER = LoggerFactory.getLogger(Benchmark.class);
+
+ private static final String REPORT_MESSAGE_TOTALS = "report-message-totals";
+ private static final String JNDI_CONFIG_PROP = "jndi-config";
+ private static final String JNDI_CONFIG_DEFAULT = "perftests-jndi.properties";
+ private static final String TEST_CONFIG_PROP = "test-config";
+
+ @SuppressWarnings("serial")
+ private Map<String,String> _cliOptions = new HashMap<String, String>()
+ {{
+ put(JNDI_CONFIG_PROP, JNDI_CONFIG_DEFAULT);
+ put(TEST_CONFIG_PROP, "/Benchmark.js");
+ put(REPORT_MESSAGE_TOTALS, "false");
+ }};
+
+ private final ConfigFileHelper _configFileHelper = new ConfigFileHelper();
+
+ private final Aggregator _aggregator = new Aggregator();
+
+ public static void main(String[] args) throws Exception
+ {
+ Benchmark benchmark = new Benchmark();
+ benchmark.parseArgumentsIntoConfig(args);
+ benchmark.doBenchMark();
+ }
+
+ private void parseArgumentsIntoConfig(String[] args)
+ {
+ ArgumentParser argumentParser = new ArgumentParser();
+ argumentParser.parseArgumentsIntoConfig(getCliOptions(), args);
+ }
+
+
+ private Context getContext()
+ {
+ String jndiConfig = getJndiConfig();
+ try
+ {
+ final Properties properties = new Properties();
+ properties.load(new FileInputStream(jndiConfig));
+ return new InitialContext(properties);
+ }
+ catch (Exception e)
+ {
+ throw new DistributedTestException("Exception while loading JNDI properties from '" + jndiConfig + "'", e);
+ }
+ }
+
+
+ private void doBenchMark() throws Exception
+ {
+ Context context = getContext();
+ ControllerJmsDelegate jmsDelegate = new ControllerJmsDelegate(context);
+
+ try
+ {
+ runTests(jmsDelegate);
+ }
+ finally
+ {
+ jmsDelegate.closeConnections();
+ }
+ }
+
+ private String getJndiConfig()
+ {
+ return getCliOptions().get(JNDI_CONFIG_PROP);
+ }
+
+ private boolean getReportMessageTotals()
+ {
+ return Boolean.parseBoolean(getCliOptions().get(REPORT_MESSAGE_TOTALS));
+ }
+
+ private Map<String,String> getCliOptions()
+ {
+ return _cliOptions;
+ }
+ private void runTests(ControllerJmsDelegate jmsDelegate)
+ {
+ Controller controller = new Controller(jmsDelegate, DistributedTestConstants.REGISTRATION_TIMEOUT, DistributedTestConstants.COMMAND_RESPONSE_TIMEOUT);
+
+ String testConfigPath = getCliOptions().get(TEST_CONFIG_PROP);
+ List<String> testConfigFiles = _configFileHelper.getTestConfigFiles(testConfigPath);
+ createClients(testConfigFiles);
+
+ try
+ {
+ List<ResultsForAllTests> results = new ArrayList<ResultsForAllTests>();
+
+ for (String testConfigFile : testConfigFiles)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ controller.setConfig(testConfig);
+
+ controller.awaitClientRegistrations();
+
+ LOGGER.info("Running test : " + testConfigFile);
+ ResultsForAllTests testResult = runTest(controller, testConfigFile);
+ results.add(testResult);
+ }
+ }
+ catch(Exception e)
+ {
+ LOGGER.error("Problem running test", e);
+ }
+ finally
+ {
+ controller.stopAllRegisteredClients();
+ }
+ }
+
+ private ResultsForAllTests runTest(Controller controller, String testConfigFile)
+ {
+ ResultsWriter _resultsWriter = new BenchmarkResultWriter(getReportMessageTotals());
+
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ controller.setConfig(testConfig);
+
+ ResultsForAllTests rawResultsForAllTests = controller.runAllTests();
+ ResultsForAllTests resultsForAllTests = _aggregator.aggregateResults(rawResultsForAllTests);
+
+ _resultsWriter.writeResults(resultsForAllTests, testConfigFile);
+
+ return resultsForAllTests;
+ }
+
+ private void createClients(final List<String> testConfigFiles)
+ {
+ int maxNumberOfClients = 0;
+ for (String testConfigFile : testConfigFiles)
+ {
+ final Config testConfig = buildTestConfigFrom(testConfigFile);
+ final int numClients = testConfig.getTotalNumberOfClients();
+ maxNumberOfClients = Math.max(numClients, maxNumberOfClients);
+ }
+
+ //we must create the required test clients, running in single-jvm mode
+ for (int i = 1; i <= maxNumberOfClients; i++)
+ {
+ ClientRunner clientRunner = new ClientRunner();
+ clientRunner.setJndiPropertiesFileLocation(getJndiConfig());
+ clientRunner.runClients();
+ }
+ }
+
+ private Config buildTestConfigFrom(String testConfigFile)
+ {
+ ConfigReader configReader = new ConfigReader();
+ Config testConfig;
+ InputStream configStream = null;
+ try
+ {
+ configStream = getClass().getResourceAsStream(testConfigFile);
+ if (configStream != null)
+ {
+ testConfig = configReader.readConfig(new InputStreamReader(configStream), testConfigFile.endsWith(".js"));
+ }
+ else
+ {
+ testConfig = configReader.getConfigFromFile(testConfigFile);
+ }
+ }
+ catch (IOException e)
+ {
+ throw new DistributedTestException("Exception while loading test config from '"
+ + testConfigFile + "'. Tried both classpath and filesystem", e);
+ }
+ finally
+ {
+ if (configStream != null)
+ {
+ try
+ {
+ configStream.close();
+ }
+ catch (IOException e)
+ {
+ }
+ }
+ }
+
+ return testConfig;
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
index 449130a328..a790011663 100644
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ControllerRunner.java
@@ -20,7 +20,7 @@
package org.apache.qpid.disttest;
import java.io.File;
-import java.io.FileNotFoundException;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -32,6 +32,8 @@ import org.apache.qpid.disttest.controller.config.Config;
import org.apache.qpid.disttest.controller.config.ConfigReader;
import org.apache.qpid.disttest.db.ResultsDbWriter;
import org.apache.qpid.disttest.jms.ControllerJmsDelegate;
+import org.apache.qpid.disttest.results.ResultsCsvWriter;
+import org.apache.qpid.disttest.results.ResultsWriter;
import org.apache.qpid.disttest.results.aggregation.Aggregator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -55,7 +57,7 @@ public class ControllerRunner extends AbstractRunner
private final ConfigFileHelper _configFileHelper = new ConfigFileHelper();
- private ResultsFileWriter _resultsFileWriter;
+ private ResultsWriter _resultsFileWriter;
private ResultsDbWriter _resultsDbWriter;
@@ -108,7 +110,7 @@ public class ControllerRunner extends AbstractRunner
{
String outputDirString = getCliOptions().get(ControllerRunner.OUTPUT_DIR_PROP);
File outputDir = new File(outputDirString);
- _resultsFileWriter = new ResultsFileWriter(outputDir);
+ _resultsFileWriter = new ResultsCsvWriter(outputDir);
}
private void runTests(ControllerJmsDelegate jmsDelegate)
@@ -155,7 +157,7 @@ public class ControllerRunner extends AbstractRunner
ResultsForAllTests rawResultsForAllTests = controller.runAllTests();
ResultsForAllTests resultsForAllTests = _aggregator.aggregateResults(rawResultsForAllTests);
- _resultsFileWriter.writeResultsToFile(resultsForAllTests, testConfigFile);
+ _resultsFileWriter.writeResults(resultsForAllTests, testConfigFile);
if(_resultsDbWriter != null)
{
_resultsDbWriter.writeResults(resultsForAllTests);
@@ -194,9 +196,9 @@ public class ControllerRunner extends AbstractRunner
{
testConfig = configReader.getConfigFromFile(testConfigFile);
}
- catch (FileNotFoundException e)
+ catch (IOException e)
{
- throw new DistributedTestException("Exception while loading test config from " + testConfigFile, e);
+ throw new DistributedTestException("Exception while loading test config from '" + testConfigFile + "'", e);
}
return testConfig;
}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java
index bd7d239a90..1f0368e87e 100644
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ConfigReader.java
@@ -21,6 +21,7 @@ package org.apache.qpid.disttest.controller.config;
import java.io.FileNotFoundException;
import java.io.FileReader;
+import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
@@ -36,7 +37,7 @@ public class ConfigReader
{
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigReader.class);
- public Config getConfigFromFile(String fileName) throws FileNotFoundException
+ public Config getConfigFromFile(String fileName) throws IOException
{
Reader reader = getConfigReader(fileName);
@@ -44,7 +45,24 @@ public class ConfigReader
return config;
}
- protected Reader getConfigReader(String fileName) throws FileNotFoundException
+ public Config readConfig(Reader reader)
+ {
+ return readConfig(reader, false);
+ }
+
+ public Config readConfig(Reader reader, boolean isJavascript)
+ {
+ if (isJavascript)
+ {
+ return readJson(new StringReader(new JavaScriptConfigEvaluator().evaluateJavaScript(reader)));
+ }
+ else
+ {
+ return readJson(reader);
+ }
+ }
+
+ private Reader getConfigReader(String fileName) throws IOException
{
Reader reader = null;
if (fileName.endsWith(".js"))
@@ -60,7 +78,8 @@ public class ConfigReader
return reader;
}
- public Config readConfig(Reader reader)
+
+ private Config readJson(Reader reader)
{
Gson gson = new GsonBuilder()
.registerTypeAdapter(PropertyValue.class, new PropertyValueAdapter())
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluator.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluator.java
index bbc22af00f..d760ffe06d 100644
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluator.java
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluator.java
@@ -20,9 +20,10 @@
*/
package org.apache.qpid.disttest.controller.config;
-import java.io.FileNotFoundException;
import java.io.FileReader;
+import java.io.IOException;
import java.io.InputStreamReader;
+import java.io.Reader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
@@ -41,7 +42,26 @@ public class JavaScriptConfigEvaluator
public static final String TEST_CONFIG_VARIABLE_NAME = "jsonObject";
- public String evaluateJavaScript(String fileName) throws FileNotFoundException
+ public String evaluateJavaScript(String fileName) throws IOException
+ {
+ FileReader fileReader = null;
+ try
+ {
+ fileReader = new FileReader(fileName);
+ String result = evaluateJavaScript(fileReader);
+ LOGGER.debug("Evaluated javascript file " + fileName + ". Generated the following JSON: " + result);
+ return result;
+ }
+ finally
+ {
+ if (fileReader != null)
+ {
+ fileReader.close();
+ }
+ }
+ }
+
+ public String evaluateJavaScript(Reader fileReader)
{
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
@@ -49,7 +69,7 @@ public class JavaScriptConfigEvaluator
{
engine.eval(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("json2.js")));
engine.eval(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("test-utils.js")));
- engine.eval(new FileReader(fileName));
+ engine.eval(fileReader);
engine.eval("jsonString = JSON.stringify(" + TEST_CONFIG_VARIABLE_NAME + ")");
}
catch (ScriptException e)
@@ -58,7 +78,6 @@ public class JavaScriptConfigEvaluator
}
String result = (String) engine.get("jsonString");
- LOGGER.debug("Evaluated javascript file " + fileName + ". Generated the following JSON: " + result);
return result;
}
}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java
index 88c188d3ac..a5f6fb84cf 100644
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/controller/config/ProducerConfig.java
@@ -21,10 +21,17 @@ package org.apache.qpid.disttest.controller.config;
import javax.jms.Message;
+import org.apache.commons.lang.ObjectUtils;
import org.apache.qpid.disttest.message.CreateProducerCommand;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class ProducerConfig extends ParticipantConfig
{
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProducerConfig.class);
+
+ public static final String MESSAGE_SIZE_OVERRIDE_SYSTEM_PROPERTY = "qpid.disttest.messageSize";
+
private int _deliveryMode;
private int _messageSize;
private int _priority;
@@ -33,6 +40,9 @@ public class ProducerConfig extends ParticipantConfig
private long _startDelay;
private String _messageProviderName;
+ /** used to ensure we only log about the overridden message size once */
+ private boolean _alreadyLoggedAboutOverriddenMessageSize;
+
// For Gson
public ProducerConfig()
{
@@ -78,7 +88,10 @@ public class ProducerConfig extends ParticipantConfig
command.setSessionName(sessionName);
command.setDeliveryMode(_deliveryMode);
- command.setMessageSize(_messageSize);
+
+ Integer messageSize = (Integer)ObjectUtils.defaultIfNull(getOverriddenMessageSize(), _messageSize);
+
+ command.setMessageSize(messageSize);
command.setPriority(_priority);
command.setTimeToLive(_timeToLive);
command.setInterval(_interval);
@@ -87,4 +100,31 @@ public class ProducerConfig extends ParticipantConfig
return command;
}
+
+ private Integer getOverriddenMessageSize()
+ {
+ String overriddenMessageSizeString = System.getProperty(MESSAGE_SIZE_OVERRIDE_SYSTEM_PROPERTY);
+ if(overriddenMessageSizeString != null)
+ {
+ try
+ {
+ int overriddenMessageSize = Integer.valueOf(overriddenMessageSizeString);
+
+ if(!_alreadyLoggedAboutOverriddenMessageSize)
+ {
+ LOGGER.info("Applied overridden maximum duration " + overriddenMessageSize);
+ _alreadyLoggedAboutOverriddenMessageSize = true;
+ }
+
+ return overriddenMessageSize;
+ }
+ catch (NumberFormatException e)
+ {
+ LOGGER.error("Couldn't parse overridden message size " + overriddenMessageSizeString, e);
+ }
+ }
+
+ return null;
+ }
+
}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/BenchmarkResultWriter.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/BenchmarkResultWriter.java
new file mode 100644
index 0000000000..a184b53668
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/BenchmarkResultWriter.java
@@ -0,0 +1,68 @@
+/*
+ * 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.disttest.results;
+
+import java.util.List;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.message.ParticipantResult;
+import org.apache.qpid.disttest.results.aggregation.ITestResult;
+
+public class BenchmarkResultWriter implements ResultsWriter
+{
+ private final boolean _reportMessageTotals;
+
+ public BenchmarkResultWriter(boolean reportMessageTotals)
+ {
+ _reportMessageTotals = reportMessageTotals;
+ }
+
+ @Override
+ public void writeResults(ResultsForAllTests resultsForAllTests, String testConfigFile)
+ {
+ for (ITestResult allResult : resultsForAllTests.getAllParticipantsResult().getTestResults())
+ {
+ ParticipantResult allRowData = allResult.getParticipantResults().iterator().next();
+
+ if (allRowData.getErrorMessage() == null)
+ {
+ final String output;
+ if (_reportMessageTotals)
+ {
+ output = String.format("%s : %,d (total payload/bytes) : %,d (time taken/ms) : %,d (total messages) : %,d (messages/s) %,.2f (Kbytes/s)",
+ allResult.getName(), allRowData.getTotalPayloadProcessed(), allRowData.getTimeTaken(), allRowData.getNumberOfMessagesProcessed(), allRowData.getMessageThroughput(), allRowData.getThroughput());
+ }
+ else
+ {
+ output = String.format("%s : %,d (messages/s) %,.2f (Kbytes/s)", allResult.getName(), allRowData.getMessageThroughput(), allRowData.getThroughput());
+ }
+ System.out.println(output);
+ }
+ else
+ {
+ System.err.println(allRowData.getErrorMessage());
+ }
+ }
+ }
+
+ @Override
+ public void writeResultsSummary(List<ResultsForAllTests> allResultsList)
+ {
+ }
+}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ResultsFileWriter.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/ResultsCsvWriter.java
index 81b717403d..a041233ea3 100644
--- a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/ResultsFileWriter.java
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/ResultsCsvWriter.java
@@ -16,22 +16,23 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.qpid.disttest;
+package org.apache.qpid.disttest.results;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
+import org.apache.qpid.disttest.DistributedTestException;
import org.apache.qpid.disttest.controller.ResultsForAllTests;
import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
import org.apache.qpid.disttest.results.formatting.CSVFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class ResultsFileWriter
+public class ResultsCsvWriter implements ResultsWriter
{
- private static final Logger LOGGER = LoggerFactory.getLogger(ResultsFileWriter.class);
+ private static final Logger LOGGER = LoggerFactory.getLogger(ResultsCsvWriter.class);
static final String TEST_SUMMARY_FILE_NAME = "test-summary.csv";
@@ -41,17 +42,19 @@ public class ResultsFileWriter
private TestResultAggregator _testResultAggregator = new TestResultAggregator();
- public ResultsFileWriter(File outputDir)
+ public ResultsCsvWriter(File outputDir)
{
_outputDir = outputDir;
}
- public void writeResultsToFile(ResultsForAllTests resultsForAllTests, String testConfigFile)
+ @Override
+ public void writeResults(ResultsForAllTests resultsForAllTests, String testConfigFile)
{
final String outputFile = generateOutputCsvNameFrom(testConfigFile);
writeResultsToOutputFile(resultsForAllTests, outputFile);
}
+ @Override
public void writeResultsSummary(List<ResultsForAllTests> allResultsList)
{
ResultsForAllTests combinedResults = _testResultAggregator.aggregateTestResults(allResultsList);
@@ -99,7 +102,7 @@ public class ResultsFileWriter
}
}
- void setCsvFormater(CSVFormatter csvFormater)
+ public void setCsvFormater(CSVFormatter csvFormater)
{
_csvFormater = csvFormater;
}
diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/ResultsWriter.java b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/ResultsWriter.java
new file mode 100644
index 0000000000..4cc8c9cf87
--- /dev/null
+++ b/qpid/java/perftests/src/main/java/org/apache/qpid/disttest/results/ResultsWriter.java
@@ -0,0 +1,34 @@
+/*
+ *
+ * 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.disttest.results;
+
+import java.util.List;
+
+import org.apache.qpid.disttest.controller.ResultsForAllTests;
+
+public interface ResultsWriter
+{
+
+ void writeResults(ResultsForAllTests resultsForAllTests, String testConfigFile);
+
+ void writeResultsSummary(List<ResultsForAllTests> allResultsList);
+
+} \ No newline at end of file
diff --git a/qpid/java/perftests/src/main/resources/Benchmark.js b/qpid/java/perftests/src/main/resources/Benchmark.js
new file mode 100644
index 0000000000..bcdcc1edfb
--- /dev/null
+++ b/qpid/java/perftests/src/main/resources/Benchmark.js
@@ -0,0 +1,77 @@
+
+var jsonObject = {
+ _tests:[]
+};
+
+var duration = 30000;
+var queueName = "direct://amq.direct//benchmark?durable='true'";
+
+var numbersOfParticipants = [1, 2, 5, 10];
+
+for(participantIndex=0; participantIndex < numbersOfParticipants.length; participantIndex++)
+{
+ var numberOfProducers = numbersOfParticipants[participantIndex];
+ var numberOfConsumers = numbersOfParticipants[participantIndex];
+ var test = {
+ "_name": "" + numberOfProducers + " producer(s) and " + numberOfConsumers + " consumer(s), each on separate connections, persistent messaging with transactional sessions",
+ "_queues":[
+ {
+ "_name": queueName,
+ "_durable": true
+ }
+ ],
+ "_clients":
+ QPID.times(numberOfProducers,
+ {
+ "_name": "producingClient__PRODUCING_CLIENT_INDEX",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_producers": [
+ {
+ "_name": "Producer__PRODUCING_CLIENT_INDEX",
+ "_destinationName": queueName,
+ "_maximumDuration": duration,
+ "_deliveryMode": 2,
+ "_messageSize": 1024
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "__PRODUCING_CLIENT_INDEX")
+ .concat(QPID.times(numberOfConsumers,
+ {
+ "_name": "consumingClient__CONSUMING_CLIENT_INDEX",
+ "_connections":[
+ {
+ "_name": "connection1",
+ "_factory": "connectionfactory",
+ "_sessions": [
+ {
+ "_sessionName": "session1",
+ "_acknowledgeMode": 0,
+ "_consumers": [
+ {
+ "_name": "Consumer__CONSUMING_CLIENT_INDEX",
+ "_destinationName": queueName,
+ "_maximumDuration": duration
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "__CONSUMING_CLIENT_INDEX"))
+ };
+
+ jsonObject._tests= jsonObject._tests.concat(test);
+}
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluatorTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluatorTest.java
index 55c1d4a7bd..174bd8092c 100644
--- a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluatorTest.java
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/JavaScriptConfigEvaluatorTest.java
@@ -22,6 +22,7 @@ package org.apache.qpid.disttest.controller.config;
import static org.apache.commons.beanutils.PropertyUtils.getProperty;
+import java.io.FileReader;
import java.util.List;
import java.util.TreeMap;
@@ -59,6 +60,34 @@ public class JavaScriptConfigEvaluatorTest extends QpidTestCase
assertEquals("Unexpected iterating attribute", "1", getProperty(country1, "_regions.[0]._towns.[0]._iteratingAttribute"));
}
+ public void testEvaluateJavaScriptWithReader() throws Exception
+ {
+ String jsFilePath = TestFileUtils.createTempFileFromResource(this, "JavaScriptConfigEvaluatorTest-test-config.js").getAbsolutePath();
+
+ FileReader fileReader = new FileReader(jsFilePath);
+ String rawConfig = new JavaScriptConfigEvaluator().evaluateJavaScript(fileReader);
+
+ Object configAsObject = getObject(rawConfig);
+
+ // Tests are produced by the QPID.iterations js function
+ assertEquals("Unexpected number of countries", 2, getPropertyAsList(configAsObject, "_countries").size());
+
+ Object country0 = getProperty(configAsObject, "_countries.[0]");
+ assertEquals("Unexpected country name", "Country", getProperty(country0, "_name"));
+ assertEquals("Unexpected country iteration number", 0, getPropertyAsInt(country0, "_iterationNumber"));
+
+ assertEquals("Unexpected number of regions", 2, getPropertyAsList(country0, "_regions").size());
+ // Region names are produced by the QPID.times js function
+ assertEquals("Unexpected region name", "repeatingRegion0", getProperty(country0, "_regions.[0]._name"));
+ assertEquals("Unexpected region name", "repeatingRegion1", getProperty(country0, "_regions.[1]._name"));
+ // Iterating attribute are produced by the QPID.iterations js function
+ assertEquals("Unexpected iterating attribute", "0", getProperty(country0, "_regions.[0]._towns.[0]._iteratingAttribute"));
+
+ Object country1 = getProperty(configAsObject, "_countries.[1]");
+ assertEquals("Unexpected country iteration number", 1, getPropertyAsInt(country1, "_iterationNumber"));
+ assertEquals("Unexpected iterating attribute", "1", getProperty(country1, "_regions.[0]._towns.[0]._iteratingAttribute"));
+ }
+
private int getPropertyAsInt(Object configAsObject, String property) throws Exception
{
Number propertyValue = (Number) getProperty(configAsObject, property);
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java
index 44fca4bb7c..ea9a406b1d 100644
--- a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/controller/config/ProducerConfigTest.java
@@ -41,6 +41,21 @@ public class ProducerConfigTest extends QpidTestCase
assertEquals(Message.DEFAULT_TIME_TO_LIVE, p.getTimeToLive());
}
+ public void testMessageSizeDefault()
+ {
+ CreateProducerCommand producer = new ProducerConfig().createCommand("session1");
+ assertEquals("Unexpected default message size", 1024, producer.getMessageSize());
+ }
+
+ public void testMessageSizeDefaultOverride()
+ {
+ final long overriddenMessageSize = 4096;
+ setTestSystemProperty(ProducerConfig.MESSAGE_SIZE_OVERRIDE_SYSTEM_PROPERTY, String.valueOf(overriddenMessageSize));
+
+ CreateProducerCommand producer2 = new ProducerConfig().createCommand("session1");
+ assertEquals("Unexpected message size", overriddenMessageSize, producer2.getMessageSize());
+ }
+
public void testCreateProducerCommand()
{
String destination = "url:/destination";
diff --git a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ResultsFileWriterTest.java b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/ResultsFileWriterTest.java
index ab55e8003d..db306ea1a4 100644
--- a/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/ResultsFileWriterTest.java
+++ b/qpid/java/perftests/src/test/java/org/apache/qpid/disttest/results/ResultsFileWriterTest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.qpid.disttest;
+package org.apache.qpid.disttest.results;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -25,6 +25,7 @@ import java.io.File;
import java.util.Arrays;
import org.apache.qpid.disttest.controller.ResultsForAllTests;
+import org.apache.qpid.disttest.results.ResultsCsvWriter;
import org.apache.qpid.disttest.results.aggregation.TestResultAggregator;
import org.apache.qpid.disttest.results.formatting.CSVFormatter;
import org.apache.qpid.test.utils.QpidTestCase;
@@ -38,7 +39,7 @@ public class ResultsFileWriterTest extends QpidTestCase
private File _outputDir = TestFileUtils.createTestDirectory();
- private ResultsFileWriter _resultsFileWriter = new ResultsFileWriter(_outputDir);
+ private ResultsCsvWriter _resultsFileWriter = new ResultsCsvWriter(_outputDir);
@Override
public void setUp()
@@ -54,7 +55,7 @@ public class ResultsFileWriterTest extends QpidTestCase
String expectedCsvContents = "expected-csv-contents";
when(_csvFormater.format(resultsForAllTests)).thenReturn(expectedCsvContents);
- _resultsFileWriter.writeResultsToFile(resultsForAllTests, "config.json");
+ _resultsFileWriter.writeResults(resultsForAllTests, "config.json");
File resultsFile = new File(_outputDir, "config.csv");
@@ -77,7 +78,7 @@ public class ResultsFileWriterTest extends QpidTestCase
_resultsFileWriter.writeResultsSummary(Arrays.asList(results1, results2));
- File summaryFile = new File(_outputDir, ResultsFileWriter.TEST_SUMMARY_FILE_NAME);
+ File summaryFile = new File(_outputDir, ResultsCsvWriter.TEST_SUMMARY_FILE_NAME);
assertEquals(expectedSummaryFileContents, FileUtils.readFileAsString(summaryFile));
}