JMeter response assertion validation against xml response failed - perl

XML response :
<silent><send-sss destination="*1234">TEST mId=dev oId=XXXXXXXXX</send-sms></silent>
JMeter response assertion:
Pattern matching Rule: contains
Pattern to test: silent
Failed Reason:
org.apache.oro.text.MalformedCachePatternException: Invalid expression: *1234
?+* follows nothing in expression
Could anyone please let me know what should be there is an assertion that it should fail. I tried using few patterns but it didn't work for me.

In Response Assertion to find part of a string you need to choose Substring in Pattern Matching rules
Contains, Matches: Perl5-style regular expressions
Equals, Substring: plain text, case-sensitive
If you choose Contains (meaning regular expression) , you need to escape *, then use
\*1234

For XML response types it makes more sense to go for XPath Assertion which allows checking response using arbitrary XPath queries.
If you want to test presence of <silent> tag only the relevant XPath query would be as simple as //silent.
With regards to Response Assertion, its Contains mode is PatternMatcher.contains() so it requires a regular expression, not a simple String so you should be using something like .*silent.* as the pattern.
See How to Use JMeter Assertions in Three Easy Steps article for more information on defining custom pass/fail criteria using JMeter Assertions.

Related

Mojolicious route with a parameter not matching if the parameter contains %2f

I have the following route
$r->get('/select_folder/:mail')->to('mail#change_folder');
It works well almost every time but when the route contains the %2f sequence of characters, equivalent to / it works as if %2f is a path separatator instead of a escaped sequence.
This is an example input:
http://127.0.0.1:5000/select_folder/%5bGmail%5d%2fDestacados
This is part of the error:
None of these routes could generate a response for your GET request for /select_folder/[Gmail]/Destacados, maybe you need to add a new one?
I would like to know some way to get a parameter like this as an url part without using GET or POST parameters.
You can use wildcard placeholders to allow / to be part of the matched parameter.
$r->get('/select_folder/*mail')->to('mail#change_folder');
The reason why %2F is interpreted as a / is because the URL is decoded before being applied to routing.
Finally I have discovered how to use regular expressions to solve the problem.
$r->get('/select_folder/:folder'=>[folder=>qr/.*/])->to('mail#change_folder');
I made :folder match any character, now it is working.

Must HTTP Status Codes be strings?

The Responses object contains a {HTTP Status Code: Response} mapping.
In all the examples I found, the status code is provided as a string:
{"200": {"description": "a pet to be returned"}}
I couldn't find any requirement for it to be a string and integers are accepted by the validators I tried.
All I found was a PR changing from integer to string in all YAML examples.
Should I only use strings?
Edit: In JSON, only strings are valid keys. So the question could be rephrased as "which of the following two assumptions is correct"?
OpenAPI doesn't specify that HTTP Status Codes should be strings because that's implicit (JSON format). However, validation and display tools are being loose about that requirement.
OpenAPI uses some kind of "JSON superset" in which integer keys are considered valid.
From this GH issue, the keys must be strings:
OpenAPI can be represented canonically in either JSON or YAML, as you say in JSON only strings can be keys. With regard to YAML:
This field MUST be enclosed in quotation marks (for example, "200") for compatibility between JSON and YAML.
This has the effect that the key is always a string type.
This is not really a specification, but rather a requirement of the JSON format.

How to make 123456789 from image as a dynamic variable in Jmeter

I have my XML Body data (attached screenshot below),
From screenshot you can see value 123456789 in Signature.
I'm looking to make 123456789 a dynamic variable value, So that JMeter automatically gets that value from server whenever I run script.
I'm looking something like Regular expression extractor but for SOAP request.
You can add Regular Expression Extractor with values:
Reference Name: aSignature
Regular expression: (\d+)</aSignature>
Template: $1$
Match No: 1
You'll get First match of all numbers before aSignature end tag.
It'll save value in a variable you can use later as ${aSignature} (or vars.get("aSignature") in JSR223 component)
Using Regular expression is better than using XPath according to jmeter mailing, ubik and testautomationguru.
Add XPath Extractor as a child of your request
Configure it as follows:
Reference Name: anything meaningful, i.e. signature
XPath Expression: //*[local-name()='aSignature']/text()
Refer the extracted value as ${signature} where required.
References:
XPath Tutorial
XPath 1.0 Language Specification
Using the XPath Extractor in JMeter
XPath local-name() function

extracting UUID from response in jmeter

i am using Jmeter to simulate multiple users to upload a file into server
i used Badboy to record a script and export it to Jmeter
to upload a file a need to get the UUID that is responded by the server so i can use it for the rest of the HTTP request i have tried to use regular expression extractor using this expression
${UUID} = \S*
but it did not work also i used the uuid function to generate a random UUID but i could not configure it in a way to make the request repeated until match the UUID the have been returned by the server
any one can help me?
For extracting UUID you'll need to configure Regular Expression Extractor Post Processor as follows:
Reference Name: anything meaningful, i.e. UUID
Regular Expression: for Version 4 UUID it would be something like ([a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12})
Template: $1$
You can test your regular expression against returned data using View Results Tree Listener (select RegExp Tester from dropdown)
For more information refer to Using RegEx (Regular Expression Extractor) with JMeter guide.

Tomcat, JAX-RS, Jersey, #PathParam: how to pass dots and slashes?

Having a method like this:
#GET #Path("/name/{name}")
#Produces(MediaType.TEXT_PLAIN)
public String getProperty(#PathParam("name") String name) {
System.out.println(name);
}
How do I pass a value like "test./test"?
/name/test./test gives HTTP 404
/name/test.%2Ftest gives HTTP 400
/name/test.%252Ftest prints test%2Ftest
But if I do name = URLDecoder.decode(name); it prints /test and the first part of test. disappears.
There is one or two questions like this already but they are old and there was no good solution found, I thought I'll ask again.
The pattern in the #Path annotation is internally turned into a regular expression, with the template parts matching only selected characters by default. In particular, they normally don't match / characters; that's almost always the right thing to do (as it lets you put templates part way through a path) but in this case it isn't as you're wanting to consume the whole subsequent path. To get everything, we have to override the regular expression fragment for that particular template; this is actually pretty easy, since we just put in the template fragment a : followed by the RE that we want to use:
#GET #Produces(MediaType.TEXT_PLAIN)
#Path("/name/{name:.+}")
public String getProperty(#PathParam("name") String name) {
return name;
}
This will match all characters after the /name/ (up to but not including any ? query part) but will only match if there's something there at all. Be aware that if you have any other #Path("/name/...") things about, things can get really confusing! So don't do that.
If you using tomcat, and want pass / in pathparam. besides the #Path("/name/{name:.+}") stuff as 'Donal Fellows' said, you should add -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true to your jvm arguments, see also tomcat security-howto.
Try specifying the encoding type, the following works for me with /name/test.%252Ftest:
System.out.println(URLDecoder.decode(name, "UTF-8"));
return URLDecoder.decode(name, "UTF-8");
Glassfish v4 accept encoded scape for slash %2f. Then we can pass the encoded String test.%2Ftest and get the result test./test using URLDecoder.decode(name, "UTF-8"). I think this is a better solution especially when you have many params in one request. Using the path #Path("/name/{name:.+}") is great solution when we have few parameters in a request.
Using %252f complicates the client request becouse are needed to contruct the encoding request String manually. With glassfish v4 it's easy to use percent encoding with URLEncoder.encode in client and URLDecoder.decode in server to wished Strings. The most programing languages has percent encoding and decoding, therefore it's perfect solution.
I tried enable encoded slash in glassfish v3 but no success, here is the sintaxe I tried used
bin\asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.encoded-slash-enabled=true configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.encoded-slash-enabled=true
Command set executed successfully.
Regards
Cassio Seffrin