// Copyright � 2004-2007 ASERT. Released under the Canoo Webtest license. package com.canoo.webtest.extension; import com.canoo.webtest.boundary.StreamBoundary; import com.canoo.webtest.engine.Context; import com.canoo.webtest.engine.StepFailedException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Stores a digest value for the response (or part of the response) into a property.<p> * <p/> * Either ant or dynamic properties are supported. A stored digest value can * be used when invoking subsequent steps for verification purposes. * * @author Paul King, ASERT * @webtest.step category="Extension" * name="storeDigest" * description="Stores a digest value for the response (or part of the response) into a property. This is useful when you don't care what the value within a response is but you want to ensure that the generated content hasn't changed. If any single character in the response changes, so will the digest. Supports content filters such as <stepref name='lineSeparatorFilter'/> and <stepref name='replaceFilter'/> to allow you to filter out changes that you don't care about and the <stepref name='table' category='Core'/> locator step if you are interested in content within a table." */ public class StoreDigest extends AbstractProcessContentStep { private String fAlgorithm; /** * Calculate the digest value * * @param context The context for the response text to calculate the checksum for * @return The digest value */ protected String processContent(final Context context) { final MessageDigest md = tryGetDigest(); md.update(StreamBoundary.tryGetBytes(context, this)); final byte[] digest = md.digest(); return hexRepresentation(digest); } private MessageDigest tryGetDigest() { try { return MessageDigest.getInstance(getType() == null ? "SHA-1" : getType()); } catch (final NoSuchAlgorithmException e) { throw new StepFailedException("No such message digest algorithm '" + getType() + "' available.", this); } } public static String hexRepresentation(final byte[] digest) { final StringBuffer hexString = new StringBuffer(); for (int i = 0; i < digest.length; i++) { final byte b = digest[i]; hexString.append(Integer.toHexString(0xFF & b)); hexString.append(" "); } return hexString.toString().trim(); } /** * Sets the type of message digest algorithm to use.<p> * * @param value message digest algorithm to use * @webtest.parameter required="no" default="SHA-1" * description="The type of message digest algorithm to use, e.g. 'MD5' or 'SHA-1'." */ public void setType(final String value) { fAlgorithm = value; } public String getType() { return fAlgorithm; } }