/* * 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.processor; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.report.core.Sample; import org.apache.jmeter.samplers.SampleSaveConfiguration; import org.apache.jmeter.util.JMeterUtils; /** * <p> * The class ErrorSummaryConsumer provides a consumer that calculates error * statistics. * </p> * * @since 3.0 */ public class ErrorsSummaryConsumer extends AbstractSummaryConsumer<Long> { static final boolean ASSERTION_RESULTS_FAILURE_MESSAGE = JMeterUtils .getPropDefault( SampleSaveConfiguration.ASSERTION_RESULTS_FAILURE_MESSAGE_PROP, true); static final String ASSERTION_FAILED = "Assertion failed"; //$NON-NLS-1$ private static final Long ZERO = Long.valueOf(0); private long errorCount = 0L; /** * Instantiates a new errors summary consumer. */ public ErrorsSummaryConsumer() { super(false); } /* * (non-Javadoc) * * @see * org.apache.jmeter.report.processor.AbstractSummaryConsumer#createDataResult * (java.lang.String) */ @Override protected ListResultData createDataResult(String key, Long data) { ListResultData result = new ListResultData(); result.addResult(new ValueResultData(key != null ? key : JMeterUtils .getResString("reportgenerator_summary_total"))); result.addResult(new ValueResultData(data)); result.addResult(new ValueResultData(Double.valueOf((double) data.longValue() * 100 / errorCount))); result.addResult(new ValueResultData(Double.valueOf((double) data.longValue() * 100 / getOverallInfo().getData().doubleValue()))); return result; } /* * (non-Javadoc) * * @see * org.apache.jmeter.report.processor.AbstractSummaryConsumer#getKeyFromSample * (org.apache.jmeter.report.core.Sample) */ @Override protected String getKeyFromSample(Sample sample) { String responseCode = sample.getResponseCode(); String responseMessage = sample.getResponseMessage(); String key = responseCode + (!StringUtils.isEmpty(responseMessage) ? "/" + StringEscapeUtils.escapeJson(responseMessage) : ""); if (isSuccessCode(responseCode)) { key = ASSERTION_FAILED; if (ASSERTION_RESULTS_FAILURE_MESSAGE) { String msg = sample.getFailureMessage(); if (!StringUtils.isEmpty(msg)) { key = StringEscapeUtils.escapeJson(msg); } } } return key; } /* * (non-Javadoc) * * @see * org.apache.jmeter.report.processor.AbstractSummaryConsumer#updateData * (org.apache.jmeter.report.processor.AbstractSummaryConsumer.SummaryInfo, * org.apache.jmeter.report.core.Sample) */ @Override protected void updateData(SummaryInfo info, Sample sample) { // Initialize overall data if they don't exist SummaryInfo overallInfo = getOverallInfo(); Long overallData = overallInfo.getData(); if (overallData == null) { overallData = ZERO; } overallInfo.setData(Long.valueOf(overallData.longValue() + 1)); // Process only failed samples if (!sample.getSuccess()) { errorCount++; Long data = info.getData(); if (data == null) { data = ZERO; } info.setData(Long.valueOf(data.longValue() + 1)); } } /** * Determine if the HTTP status code is successful or not i.e. in range 200 * to 399 inclusive * * @param codeAsString * status code to check * @return whether in range 200-399 or not * * FIXME Duplicates HTTPSamplerBase#isSuccessCode but it's in http * protocol */ static boolean isSuccessCode(String codeAsString) { if (StringUtils.isNumeric(codeAsString)) { try { int code = Integer.parseInt(codeAsString); return code >= 200 && code <= 399; } catch (NumberFormatException ex) { return false; } } return false; } /* * (non-Javadoc) * * @see org.apache.jmeter.report.processor.SampleConsumer#stopConsuming() */ @Override public void stopConsuming() { super.stopConsuming(); // Reset state errorCount = 0L; } /* * (non-Javadoc) * * @see * org.apache.jmeter.report.processor.AbstractSummaryConsumer#createResultTitles * () */ @Override protected ListResultData createResultTitles() { ListResultData titles = new ListResultData(); titles.addResult(new ValueResultData(JMeterUtils .getResString("reportgenerator_summary_errors_type"))); titles.addResult(new ValueResultData(JMeterUtils .getResString("reportgenerator_summary_errors_count"))); titles.addResult(new ValueResultData(JMeterUtils .getResString("reportgenerator_summary_errors_rate_error"))); titles.addResult(new ValueResultData(JMeterUtils .getResString("reportgenerator_summary_errors_rate_all"))); return titles; } }