ASingh
ASingh

Reputation: 3

How can I generate a random Verhoeff number in Apache Jmeter?

Need to pass a new Verhoeff Number every time I execute my script. The already used Verhoeff number is rejected by my application, as a business validation. Can someone help with the script for this?

Upvotes: 0

Views: 180

Answers (1)

Dmitri T
Dmitri T

Reputation: 168147

The Java algorithm implementation is available at the Wikipedia page

In JMeter it's recommended to use Groovy for scripting so you will need to amend it to look like:

/**
 * @see <ahref="http://en.wikipedia.org/wiki/Verhoeff_algorithm"  >  More Info</a>
 * @see <ahref="http://en.wikipedia.org/wiki/Dihedral_group"  >  Dihedral Group</a>
 * @see <ahref="http://mathworld.wolfram.com/DihedralGroupD5.html"  >  Dihedral Group Order 10</a>
 * @author Colm Rice
 */
public class Verhoeff {


    // The multiplication table
    static int[][] d = new int[][]
            {
                    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
                    [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
                    [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
                    [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
                    [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
                    [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
                    [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
                    [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
                    [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
                    [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
            };

    // The permutation table
    static int[][] p = new int[][]
            {
                    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
                    [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
                    [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
                    [8, 9, 1, 6, 0, 4, 3, 5, 2, 7],
                    [9, 4, 5, 3, 1, 2, 6, 8, 7, 0],
                    [4, 2, 8, 6, 5, 7, 3, 9, 0, 1],
                    [2, 7, 9, 3, 8, 0, 6, 4, 1, 5],
                    [7, 0, 4, 6, 9, 1, 3, 2, 5, 8]
            };

    // The inverse table
    static int[] inv = [0, 4, 3, 2, 1, 5, 6, 7, 8, 9];


    /* 
     * For a given number generates a Verhoeff digit
     * 
     */

    public static String generateVerhoeff(String num) {

        int c = 0;
        int[] myArray = stringToReversedIntArray(num);

        for (int i = 0; i < myArray.length; i++) {
            c = d[c][p[((i + 1) % 8)][myArray[i]]];
        }

        return Integer.toString(inv[c]);
    }


    /*
     * Validates that an entered number is Verhoeff compliant.
     * NB: Make sure the check digit is the last one.
     */

    public static boolean validateVerhoeff(String num) {

        int c = 0;
        int[] myArray = stringToReversedIntArray(num);

        for (int i = 0; i < myArray.length; i++) {
            c = d[c][p[(i % 8)][myArray[i]]];
        }

        return (c == 0);
    }


    /*
     * Converts a string to a reversed integer array.
     */

    private static int[] stringToReversedIntArray(String num) {

        int[] myArray = new int[num.length()];

        for (int i = 0; i < num.length(); i++) {
            myArray[i] = Integer.parseInt(num.substring(i, i + 1));
        }

        myArray = reverse(myArray);

        return myArray;

    }

    /*
     * Reverses an int array
     */

    private static int[] reverse(int[] myArray) {
        int[] reversed = new int[myArray.length];

        for (int i = 0; i < myArray.length; i++) {
            reversed[i] = myArray[myArray.length - (i + 1)];
        }

        return reversed;
    }


}

and in order to call this and to store the result into a JMeter Variable you need to use vars shorthand to JMeterVariables class instance, something like:

vars.put('myVar', Verhoeff.generateVerhoeff("your-source-number-here"))

and then you will be able to refer the generated value as ${myVar} where required.

Upvotes: 1

Related Questions