Extract hex data in JMeter - jmeter

I want to extract a hex data from a response in JMeter.
I have extract the text value and I want to convert it to hex but I don't know how to do it.
I want to put the hex data in a variable
If you have another method to extract hex data in JMeter, I'll take it.
Edit
I tried to put on a Beanshell Postprocessor sample :
import java.math.BigInteger;
vars.put("CHALLENGE",new BigInteger(1, vars.get("CHALLENGE").getBytes(/*YOUR_CHARSET?*/)));
But I have this error :
Static method format( java.lang.String, java.math.BigInteger ) not found in class'java.lang.String'

You should use Integer.toHexString
Returns a string representation of the integer argument as an unsigned integer in base 16.
In your case to override (why not use different variable?) variable:
vars.put("CHALLENGE", Integer.toHexString(vars.get("CHALLENGE").getBytes()));

You can perform conversion using:
JSR223 Test Elements
Groovy language
DatatypeConverter class
Demo:

Related

How to compare date from DB and JSON

From Database I am getting Date value as "2011-03-31 00:00:00.0"
From JSON response I am getting value as "2011-03-31"
How can I trim "00:00:00" from Database result and compare it with JSON response in JMeter using JSR223 assertion.
I don't think "trimming" is good option, I would rather go for "parsing"
Here is an example of converting 2 dates in different formats to Date object and comparing them
The code is supposed to be used in the JSR223 Assertion
def valueFromDB = Date.parse('yyyy-MM-dd hh:mm:ss.S', vars.get('valueFromDB'))
def valueFromJSON = Date.parse('yyyy-MM-dd', vars.get('valueFromJSON'))
if (!valueFromDB.equals(valueFromJSON)) {
AssertionResult.setFailure(true)
AssertionResult.setFailureMessage('Dates mismatch')
}
Replace valueFromDB and valueFromJSON with your own JMeter Variables names holding these values from the database and from JSON.
More information: Scripting JMeter Assertions in Groovy - A Tutorial

JMeter BeanShell SHA-256 different hash values

I'm calling a api serice that requires a http header with the hash value of the request body.
I'm trying to use a beanshell post processor in JMeter to automatically create the sha-256 hash of the request body. The hash value is right up until I introduce a line break in the request body (which is a pain as the JSON message spans several lines!)
I assume it's something to do with hidden characters however I can't work out what is going wrong! :(
When I compare the hash generated by JMeter to seperate Hash generator tools it is an exact match until there are line breaks, then JMeter is wrong.
Why is JMeter generating an incorrect hash when there are line breaks?
My code is:
[import org.apache.commons.httpclient.auth.DigestScheme; // necessary imports
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.protocol.http.control.Header;
import org.apache.jmeter.services.FileServer;
import javax.xml.bind.DatatypeConverter;
import java.security.*;
String body = sampler.getArguments().getArgument(0).getValue();
String hash = DigestUtils.sha256Hex(body);
log.info(hash);
What is your input data and what output do you expect?
Since JMeter 3.1 it is recommended to switch to JSR223 Test Elements and Groovy language so:
Given the following request body:
{
"foo": "bar"
}
And the next Groovy code to generate a SHA-256 hex string:
def sha256Hex = { input ->
java.security.MessageDigest.getInstance("SHA-256")
.digest(input.getBytes("UTF-8")).encodeHex().toString()
}
log.info(sha256Hex(sampler.getArguments().getArgument(0).getValue()))
I'm getting dbc67f71c921b5b7649481a5123d94dfa919748d2962889681d96438033c548f value which is basically the same I can see using https://hash.online-convert.com/sha256-generator generator.

Function __base64Encode not works with Random Variable

Problem with usage __base64Encode function to encode Random Variable.
I use Random Variable to generate unique email for user. (in each iteration of test scenario)
I want to use :
${__base64Encode(${randomvar})} which generate encoded ${randomvar}
Real example user defined variable 'babretr' defined below:
babretr=${__base64Encode(${randomMail}${timeStamp}#jmeter.soi:Kazek2017#)}
after base64 encode looks:
babretr=JHtyYW5kb21NYWlsfTIwMTcwNTE5MDg0MTI0NDcyWkBqbWV0ZXIuc29pOkthemVrMjAxN0A=
after base64 decode looks:
${randomMail}20170519084124472Z#jmeter.soi:Kazek2017#
Jmeter Random Variable ${randomMail} is not encoded.
With different variables problem does not exist.
You could add Beanshell PreProcessor on your sampler and put something like:
import java.util.Base64;
import org.apache.commons.lang3.RandomStringUtils;
String sufix = "#jmeter.soi:Kazek2017#";
String address = Base64.getEncoder().encodeToString(new String(
RandomStringUtils.random(10) + vars.get("timeStamp") + sufix).getBytes());
vars.put("encodedAddress", address);
After that, just use ${encodedAddress} in your sampler.

Looping through JSON response + in JMETER

I am using Jmeter for performance testing and stuck at following point:
I am getting a JSON response from Webapi as follows:
PersonInfoList:
Person
[0]
{
id: 1
name: Steve
}
[1]
Person
{
id: 2
name: Mark
}
I need to get the ids based on the count of this JSON array and create a comma separated string as ("Expected value" = 1,2)
I know how to read a particular element using JSON Post processor or Regex processor but am unable to loop through the array and create a string as explained so that I can use this value in my next sampler request.
Please help me out with this: I am using Jmeter 3.0 and if this could be achieved without using external third party libs that would be great. Sorry for the JSON syntax above
Actually similar functionality comes with JSON Path PostProcessor which appeared in JMeter 3.0. In order to get all the values in a single variable configure JSON Path PostProcessor as follows:
Variable Names: anything meaningful, i.e. id
JSON Path Expressions: $..id or whatever you use to extract the ids
Match Numbers: -1
Compute concatenation var (suffix _ALL): check
As a result you'll get id_ALL variable which will contain all JSON Path expression matches (comma-separated)
More "universal" answer which will be applicable for any other extractor types and in fact will allow to concatenate any arbitrary JMeter Variables is using scripting (besides if you need this "expected value and parentheses)
In order to concatenate all variables which names start with "id" into a single string add Beanshell PostProcessor somewhere after JSON Path PostProcessor and put the following code into "Script" area
StringBuilder result = new StringBuilder();
result.append("(\"Expected value\" = ");
Iterator iterator = vars.getIterator();
while (iterator.hasNext()) {
Map.Entry e = (Map.Entry) iterator.next();
if (e.getKey().matches("id_(\\d+)")) {
result.append(e.getValue());
result.append(",");
}
}
result.append(")");
vars.put("expected_value", result.toString());
Above code will store the resulting string into ${expected value} JMeter Variable. See How to Use BeanShell: JMeter's Favorite Built-in Component article for more information regarding bypassing JMeter limitations using scripting and using JMeter and Java API from Beanshell test elements.
Demo:

Jmeter extract data using BeanShell PreProcessor and add parameters

Having the following request:
From this I extract using the Regular Expression Extractor the following string:
%5B1172%2C63%2C61%2C66%2C69%2C68%5D
I decode this using the urldecode function: ${__urldecode(${Groups_g2})}
Decoded: [1172,63,61,66,69,68]
On the following request I want to extract the values using the BeanShell PreProcessor to obtain a list of parameters like this one:
I know that I have to use sampler.addArgument but i can't figure how to extract data from the list and add the values as parameters.
Try the following:
Put ${__urldecode(${Groups_g2})} into Beanshell PreProcessor's Parameters input field
Enter the following code into Script area
String params = Parameters.substring(1, Parameters.length() - 1); // remove square brackets
int counter = 1;
for (String param : params.split(",")) {
sampler.addArgument("parameter" + counter, param);
counter++;
}
I have no idea what parameter names need to look like, hopefully above information will be helpful.
HTTP Request with no parameters:
Beanshell PreProcessor
Parameters in View Results Tree Listener
For more information on Beanshell scripting in Apache JMeter check out How to use BeanShell: JMeter's favorite built-in component guide.

Resources