/*
* 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.jmeter.report.dashboard;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.Map;
import java.util.Set;
import org.apache.jmeter.junit.JMeterTestCase;
import org.apache.jmeter.report.config.ReportGeneratorConfiguration;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.oro.text.regex.PatternMatcher;
import org.junit.Test;
import jodd.props.Props;
public class ApdexPerTransactionTest extends JMeterTestCase {
// prop in the file mixes comma, semicolon and spans several lines.
// it also includes hardcoded sample names mixed with regexes
private static final String apdexString = "sample(\\d+):1000|2000;samples12:3000|4000;scenar01-12:5000|6000";
@Test
public void testgetApdexPerTransactionProperty() throws Exception {
final Props props = new Props();
final String REPORT_GENERATOR_KEY_PREFIX = "jmeter.reportgenerator";
final char KEY_DELIMITER = '.';
final String REPORT_GENERATOR_KEY_APDEX_PER_TRANSACTION = REPORT_GENERATOR_KEY_PREFIX
+ KEY_DELIMITER + "apdex_per_transaction";
props.load(this.getClass().getResourceAsStream("reportgenerator_test.properties"));
final String apdexPerTransaction = getOptionalProperty(props,
REPORT_GENERATOR_KEY_APDEX_PER_TRANSACTION);
assertEquals(apdexString, apdexPerTransaction);
}
@Test
public void testgetApdexPerTransactionPropertySimple() throws Exception {
final Props props = new Props();
props.load(this.getClass().getResourceAsStream("reportgenerator_test.properties"));
final String title = getOptionalProperty(props,
"jmeter.reportgenerator.graph.responseTimePercentiles.title");
assertNotNull("title should not be null", title);
}
@Test
public void testGetApdexPerTransactionParts() {
Map<String, Long[]> apdex = ReportGeneratorConfiguration.getApdexPerTransactionParts(apdexString);
assertNotNull("map should not be null", apdex);
assertEquals(3, apdex.size());
Set<String> keys = apdex.keySet();
assertTrue(keys.contains("samples12"));
assertTrue(keys.contains("scenar01-12"));
assertTrue(keys.contains("sample(\\d+)"));
assertArrayEquals(new Long[] {1000L, 2000L}, apdex.get("sample(\\d+)"));
}
@Test
public void testGetApdexPerTransactionPartsOneCustomization() {
Map<String, Long[]> apdex = ReportGeneratorConfiguration.getApdexPerTransactionParts("sample(\\d+):1000|2000");
assertNotNull("map should not be null", apdex);
assertEquals(1, apdex.size());
Set<String> keys = apdex.keySet();
assertTrue(keys.contains("sample(\\d+)"));
assertArrayEquals(new Long[] {1000L, 2000L}, apdex.get("sample(\\d+)"));
}
@Test
public void testGetApdexPerTransactionNoValue() {
Map<String, Long[]> apdex = ReportGeneratorConfiguration.getApdexPerTransactionParts("");
assertNotNull("map should not be null", apdex);
assertEquals(0, apdex.size());
apdex = ReportGeneratorConfiguration.getApdexPerTransactionParts(" ");
assertNotNull("map should not be null", apdex);
assertEquals(0, apdex.size());
}
@Test
public void testGetApdexPerTransactionWrongFormat() {
Map<String, Long[]> apdex =
ReportGeneratorConfiguration.getApdexPerTransactionParts("sample1|123:434");
assertNotNull("map should not be null", apdex);
assertEquals(0, apdex.size());
}
@Test
public void testSampleNameMatching() {
/* matching pairs :
* sample(\d+) sample2
* sample(\d+) sample12
* scenar01-12 scenar01-12
* samples12 samples12
* */
String[] sampleNames = {"sample2","sample12", "scenar01-12", "samples12"};
Map<String, Long[]> apdex = ReportGeneratorConfiguration.getApdexPerTransactionParts(apdexString);
for (String sampleName : sampleNames) {
boolean hasMatched = false;
for (Map.Entry<String, Long[]> entry : apdex.entrySet()) {
org.apache.oro.text.regex.Pattern regex = JMeterUtils.getPatternCache().getPattern(entry.getKey());
PatternMatcher matcher = JMeterUtils.getMatcher();
if(matcher.matches(sampleName, regex)) {
hasMatched= true;
}
}
assertTrue(hasMatched);
}
}
private static String getOptionalProperty(Props props, String key) {
return getProperty(props, key, null);
}
private static String getProperty(Props props, String key, String defaultValue) {
String value = props.getValue(key);
if (value == null) {
return defaultValue;
}
return value;
}
}