package com.xceptance.xlt.common.util.action.validation; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.junit.Assert; import com.xceptance.xlt.api.util.XltLogger; import com.xceptance.xlt.common.util.action.data.URLActionData; import com.xceptance.xlt.common.util.action.data.URLActionDataStore; import com.xceptance.xlt.common.util.action.data.URLActionDataValidation; /** * Handles a {@link URLActionDataValidation} item. <br> * <ul> * <li>Reads the selectionMode & selectionContent of {@link URLActionDataStore}. * <li>Selects the described elements in {@link URLActionDataExecutableResult}. * <li>Validates the result of the selection with the described validationMode & validationContent in * {@link URLActionDataStore}. * <li>For this use {@link #validate(URLActionDataValidation, URLActionDataExecutableResult) validate()}. * </ul> * * @author matthias mitterreiter */ public class URLActionDataValidationResponseHandler { private String actionName; public URLActionDataValidationResponseHandler() { XltLogger.runTimeLogger.debug("Creating new Instance"); } /** * Does the following: * <ul> * <li>fetches the elements from the {@link URLActionDataExecutableResult result} that suit the described criteria * in {@link URLActionDataValidation validation}. * <li>validates the found elements. * </ul> * * @param validation * : the description of the validation process. * @param result * : the response to validate in form of a {@link URLActionDataExecutableResult}. * @throws IllegalArgumentException * if the validation was wrong or failed. */ public void validate(final URLActionDataValidation validation, final URLActionDataExecutableResult result, final URLActionData action) { XltLogger.runTimeLogger.debug("Validating: \"" + validation.getName() + "\""); if(action != null){ actionName = action.getName(); XltLogger.runTimeLogger.debug("Action name is not specified"); } try { handleValidation(validation, result); } catch (final Exception e) { throw new IllegalArgumentException(e.getMessage() + " at Action: \"" + actionName + "\"", e); } } private void handleValidation(final URLActionDataValidation validation, final URLActionDataExecutableResult result) { final List<String> resultSelection = selectFromResult(validation, result); validateContent(resultSelection, validation); } private List<String> selectFromResult(final URLActionDataValidation validation, final URLActionDataExecutableResult result) { final String selectionMode = validation.getSelectionMode(); List<String> resultSelection = new ArrayList<String>(); switch (selectionMode) { case URLActionDataValidation.XPATH: resultSelection = handleXPathValidationItem(validation, result); break; case URLActionDataValidation.REGEXP: resultSelection = handleRegExValidationItem(validation, result); break; case URLActionDataValidation.HEADER: resultSelection = handleHeaderValidationItem(validation, result); break; case URLActionDataValidation.COOKIE: resultSelection = handleCookieValidationItem(validation, result); break; default: throw new IllegalArgumentException("SelectionMode: \"" + validation.getSelectionMode() + "\" is not supported!"); } return resultSelection; } private void validateContent(final List<String> resultSelection, final URLActionDataValidation validation) { final String validationMode = validation.getValidationMode(); switch (validationMode) { case URLActionDataValidation.EXISTS: validateExists(resultSelection, validation); break; case URLActionDataValidation.COUNT: validateCount(resultSelection, validation); break; case URLActionDataValidation.MATCHES: validateMatches(resultSelection, validation); break; case URLActionDataValidation.TEXT: validateText(resultSelection, validation); break; default: throw new IllegalArgumentException("ValidationMode: \"" + validation.getValidationMode() + "\" is not supported!"); } } private void validateExists(final List<String> resultSelection, final URLActionDataValidation validation) { XltLogger.runTimeLogger.debug("Validating \"" + validation.getName() + "\": EXISTANCE"); Assert.assertFalse(getNotFoundFailMessage(validation), resultSelection.isEmpty()); } private void validateCount(final List<String> resultSelection, final URLActionDataValidation validation) { validateExists(resultSelection, validation); final int expectedLength = Integer.valueOf(validation.getValidationContent()); final int actualLength = resultSelection.size(); XltLogger.runTimeLogger.debug("Validating \"" + validation.getName() + "\": COUNT:" + expectedLength + " = \"" + actualLength + "\""); Assert.assertEquals(getFailMessage(validation), expectedLength, actualLength); } private void validateMatches(final List<String> resultSelection, final URLActionDataValidation validation) { validateExists(resultSelection, validation); final String matcherString = resultSelection.get(0); final String patternString = validation.getValidationContent(); XltLogger.runTimeLogger.debug("Validating \"" + validation.getName() + "\": MATCHES: \"" + matcherString + "\" matches \"" + patternString + "\""); final Pattern pattern = Pattern.compile(patternString); final Matcher matcher = pattern.matcher(matcherString); Assert.assertTrue(getFailMessage(validation), matcher.find()); } private void validateText(final List<String> resultSelection, final URLActionDataValidation validation) { validateExists(resultSelection, validation); final String expectedText = validation.getValidationContent(); final String actualText = resultSelection.get(0); XltLogger.runTimeLogger.debug("Validating \"" + validation.getName() + "\": TEXT: " + "'" + expectedText + "'" + " = " + "'" + actualText + "'"); Assert.assertEquals(getFailMessage(validation), expectedText, actualText); } private List<String> handleCookieValidationItem(final URLActionDataValidation validation, final URLActionDataExecutableResult result) { return result.getCookieAsStringByName(validation.getSelectionContent()); } private List<String> handleXPathValidationItem(final URLActionDataValidation validation, final URLActionDataExecutableResult result) { return result.getByXPath(validation.getSelectionContent()); } private List<String> handleRegExValidationItem(final URLActionDataValidation validation, final URLActionDataExecutableResult result) { return result.getByRegEx(validation.getSelectionContent()); } private List<String> handleHeaderValidationItem(final URLActionDataValidation validation, final URLActionDataExecutableResult result) { return result.getHeaderByName(validation.getSelectionContent()); } private String getNotFoundFailMessage(final URLActionDataValidation validation) { final String message = MessageFormat.format("Validation \"{0}\" failed for action \"{1}\", because for {2} = \"{3}\" no Elements were found! ", validation.getName(), actionName, validation.getSelectionMode(), validation.getSelectionContent()); return message; } private String getFailMessage(final URLActionDataValidation validation) { final String message = MessageFormat.format("Validation \"{0}\" failed for action \"{1}\", Mode: \"{2}\":", validation.getName(), actionName, validation.getValidationMode()); return message; } }