All Downloads are FREE. Search and download functionalities are using the official Maven repository.

step.artefacts.handlers.PerformanceAssertHandler Maven / Gradle / Ivy

package step.artefacts.handlers;

import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import step.artefacts.Aggregation;
import step.artefacts.Aggregator;
import step.artefacts.Comparator;
import step.artefacts.Filter;
import step.artefacts.PerformanceAssert;
import step.artefacts.reports.PerformanceAssertReportNode;
import step.core.accessors.AbstractOrganizableObject;
import step.core.artefacts.handlers.ArtefactHandler;
import step.core.artefacts.reports.ReportNode;
import step.core.artefacts.reports.ReportNodeStatus;
import step.core.reports.Error;
import step.core.reports.ErrorType;
import step.plans.assertions.PerformanceAssertPlugin;
import step.plans.assertions.PerformanceAssertSession;

public class PerformanceAssertHandler extends ArtefactHandler {

	@Override
	public void initProperties(ReportNode parentReportNode, PerformanceAssert artefact) {
		PerformanceAssertSession performanceAssertSession = new PerformanceAssertSession();
		context.getVariablesManager().putVariable(parentReportNode, PerformanceAssertPlugin.$PERFORMANCE_ASSERT_SESSION, performanceAssertSession);
	}

	@Override
	protected void createReportSkeleton_(PerformanceAssertReportNode parentNode, PerformanceAssert testArtefact) {
		
	}

	@Override
	protected void execute_(PerformanceAssertReportNode reportNode, PerformanceAssert artefact) throws Exception {
		PerformanceAssertSession session = (PerformanceAssertSession) context.getVariablesManager().getVariable(PerformanceAssertPlugin.$PERFORMANCE_ASSERT_SESSION);
		List errors = new ArrayList<>();
		if(session != null) {
			List filters = artefact.getFilters();
			
			List> matchingAggregations = session.getAggregations().stream().filter(a->matchesFilters(filters, a.getValue())).collect(Collectors.toList());
			if(matchingAggregations.size() > 0) {
				for (Entry entry : matchingAggregations) {
					Aggregation aggregation = entry.getValue();
					Aggregator aggregator = artefact.getAggregator();
					Comparator comparator = artefact.getComparator();
					Number actualValue = aggregator.getValueFunction().apply(aggregation);
					Number expectedValue = artefact.getExpectedValue().get();
					if (!comparator.getComparatorFunction().apply(actualValue, expectedValue)) {
						String errorMessage = aggregator.getDescription() + " of " + aggregation.getName()
						+ " expected to be " + comparator.getErrorDescription() + " " + expectedValue + " but was "
						+ actualValue;
						errors.add(errorMessage);
					}
				}
			} else {
				errors.add("No measurement is matching the defined filters.");
			}
		}
		if(errors.size()>0) {
			reportNode.setError(new Error(ErrorType.BUSINESS, errors.stream().collect(Collectors.joining("; "))));
			reportNode.setStatus(ReportNodeStatus.FAILED);
		} else {
			reportNode.setStatus(ReportNodeStatus.PASSED);
		}
	}

	protected boolean matchesFilters(List filters, Aggregation aggregation) {
		boolean allFiltersMatch = true;
		for (Filter filter : filters) {
			String field = filter.getField().get();
			if(field == null || field.equals(AbstractOrganizableObject.NAME)) {
				String name = aggregation.getName();
				String filterExpression = filter.getFilter().get();
				if(!filter.getFilterType().getFilterFunction().apply(name, filterExpression)) {
					allFiltersMatch = false;
				}
			} else {
				throw new RuntimeException("Unsupported filter field "+field);
			}
		}
		return allFiltersMatch;
	}

	@Override
	protected PerformanceAssertReportNode createReportNode_(ReportNode parentReportNode, PerformanceAssert artefact) {
		return new PerformanceAssertReportNode();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy