Multiple conditions in while controller - jmeter

Is it possible to add two conditions in while controller? My two conditions are Complete ="True" and Results >200.
I tried using it by setting Complete = False and Results=0 in user defined variables and used it in while controller as follows:
${__javaScript("${Complete}" != "true")} && ${__javaScript((parseInt(${Results}) >90)}.
But it is looping indefinitely. Please help.

Try the following condition (working for me):
${__jexl3("${Complete}" == "False" && ${Results} >= 0,)}
where Complete - False & Results - 0.
For above values, condition will be evaluated to true, hence executes the children of the While Controller.
Note: Please change the conditions == & >= symbols and values False && 0 as per your requirements.
You must reset the values inside the While Controller, to make the condition evaluated to false, otherwise you will struck in infinite loop.
References:
https://jmeter.apache.org/usermanual/component_reference.html#While_Controller
https://www.blazemeter.com/blog/using-while-controller-jmeter

For Multiple Condition in While Loop using Groovey Function for '&&' and '||' for the same field.
${__groovy(!(vars.get('ocrstatus_1').equals('500') || vars.get('ocrstatus_1').equals('1000')) ,)}

Related

Terraform CIDR block variable validation

Terraform variable validation for CIDR, looking alternative for regex
Below is the tested code in Terraform version 13.0
is there any alternative way to achieve same thing with not using regex?
cidr block - start 172.28.0.0.0/16
variable "vpc_cidr" {
description = "Kubernetes cluster CIDR notation for vpc."
validation {
condition = can(regex("^([0-9]{1,3}\\.){3}[0-9]{1,3}($|/(16))$", var.pod_cidr))
error_message = "Vpc_cidr value must be greater than 172.0.0.0/16."
}
}
how to validate CIDR block 172.28.x.x/16 with cidrsubnet function?
https://www.terraform.io/docs/language/functions/cidrsubnet.html
validation condition - if IP range is outof 172.28.x.x/16 then validation will be failed
I can't think of a direct way to achieve what you want with the functions in today's Terraform, but I think we can break the check into two conditions that, taken together, lead to the same effect:
The zeroth address in the subnet must be 172.28.0.0.
The netmask of the range must be 255.255.0.0.
We can test these two rules using two expressions:
cidrhost(var.vpc_cidr, 0) == "172.28.0.0"
cidrnetmask(var.vpc_cidr) == "255.255.0.0"
Both of these functions can fail if given something that isn't valid CIDR block syntax at all, and cidrnetmask will additionally fail if given an IPv6 address, so we can add try guards to both of them to turn that error into a false result as condition expects:
try(cidrhost(var.vpc_cidr, 0), null) == "172.28.0.0"
try(cidrnetmask(var.vpc_cidr), null) == "255.255.0.0"
The try function will return the result of the first expression that doesn't produce a dynamic error, so in the above examples an invalid input to the cidrhost or cidrnetmask function will cause an expression like null == "172.28.0.0", which will always be false and thus the condition will still not be met.
Finally, we can combine these together using the && operator to get the complete condition expression:
condition = (
try(cidrhost(var.vpc_cidr, 0), null) == "172.28.0.0" &&
try(cidrnetmask(var.vpc_cidr), null) == "255.255.0.0"
)
You have one 0 to many and it should be greater then 172.0.0.0/16. For example:
172.1.0.0/16
not:
172.0.0.0.0/16
A bit of hack, but still:
variable "vpc_cidr" {
validation {
condition = cidrsubnet("${var.pod_cidr}/16", 0, 0) == "172.28.0.0/16"
}
}
I prefer the solution from https://dev.to/drewmullen/terraform-variable-validation-with-samples-1ank
variable "string_like_valid_ipv4_cidr" {
type = string
default = "10.0.0.0/16"
validation {
condition = can(cidrhost(var.string_like_valid_ipv4_cidr, 32))
error_message = "Must be valid IPv4 CIDR."
}
}
Also note, as commented there, that the condition requires a modification to work for /32 addresses.

Why doesn't skipeWhile display the correct results?

SkipWhile() continues to skip elements as long as the entry condition is true. When the condition becomes false, all remaining elements will return.
What I'm trying to do are two types of conditions:
It must enter when loading === false and when arrIds.length > 0
It must enter when loading === false and when arrIds.length === 0
My Example:
combineLatest([this.peopleSelectorsService.loading, this.peopleSelectorsService.allIds])
.pipe(skipWhile((observables) => !observables[0] && observables[1].length === 0))
.subscribe((observables) => {
});
RESULT:
your first emission is [true, []]
your skip condition can be rewritten as:
skipWhile(([loading, items]) => !loading && !items.length)
in english: skip while not loading and there are not items, in your first emission case this evaluates to false && true which is false.
skipWhile stops skipping after one false result, so the first emission stops it from evaluating anymore.
you either need to adjust your logic or use a different operator. can't say for sure as you haven't outlined your expected results. what I SUSPECT you want is:
skipWhile(([loading, items]) => loading || !items.length)
which will skip the first 2 emissions and emit the third.

Stop While loop in jmeter when condition is true

My test plan structure is
Thread Group
--Http request
while loop controller
--http request
--regular expression extractor (get a login config key which is used in while loop)
Regular expression:-"business_type":"(.+?)"
variable name :-business_type
while loop condition: :- ${__javaScript(("${business_type}" === "Apparel & Footwear" && ${counter} < 5),)
I want to stop while loop when the expected business type is found in response.
You need to check 2 condition while one for negative equal the string in While Controller:
${__jexl3(${counter} < 5 && "${business_type}" != "Apparel & Footwear")}
Prefer __jexl3 over __javascript function:
Checking this and using __jexl3 or __groovy function in Condition is advised for performances
Try using "!=" instead of "===".
${__javaScript("${business_type}" != "Apparel & Footwear" && ${counter} < 5)}

Will `&&` always run before `if` on the same line in Ruby

Will every && run before if on the same line in Ruby?
For example:
#building.approved = params[:approved] if xyz && abc && mno...
Can an unlimited number of && be used on the right side of an if without using parentheses?
I'm inclined to use parentheses but I'd like to understand the default behaviour.
Everything after the if must be part of the condition by virtue of the syntax. The only way to get around this is to be really specific:
(#building.approved = params[:approved] if xyz) && abc && ...
Which is obviously not what you're intending here.
Operator binding strength isn't an issue here since if is a syntax element not an operator, so it has the absolute lowest priority.
The only conditions that will be evaluated are the ones that produce a logically false value, or come after one that was logically true as the first one to return logically false will halt the chain.
That is:
if a && b && c
Will stop at a if that is a logically-false value. b and c will not be evaluated. There's no intrinsic limit on chaining though.

Until loop keeps runing even when the phrase is true?

I have the following code:
until (#world.exists? decision || decision == '')
UiHandler.print_error(UiHandler::NO_TILE)
UiHandler.print_turn_message
decision = gets.chomp
end
which should allow the player to skip a turn by entering an empty line. But for some reason the until loop keeps running even when the condition is true
i.e. passing in '1 1' does work and stop the loop, since it exists in world, but passing nothing doesn't, even though puts (#world.exists? decision || decision == '') gives 'true'
What would cause an until loop not to stop even when the condition is met?
Fix is
(#world.exists?(decision) || decision == '')
Otherwise - #world.exists? decision || decision == '' is being treated as #world.exists?(decision || decision == ''), which is not correct expression, you intended to write.
As decision is a string object, which in Ruby is considered as truth value, decision || decision == '' (in the code written by you) will be evaluated as true too. This decision will be passed as a method argument to the method #world.exists? always.

Resources