mirror of https://gitee.com/openkylin/linux.git
ktest: Add processing of complex conditionals
The IF statements for DEFAULTS and TEST_START sections now handle complex statements (&&,||) Example: TEST_START IF (DEFINED ALL_TESTS || ${MYTEST} == boottest) && ${MACHINE} == gandalf Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
This commit is contained in:
parent
a9f84424be
commit
8d735212e4
|
@ -304,7 +304,7 @@ sub get_ktest_configs {
|
||||||
}
|
}
|
||||||
|
|
||||||
sub process_variables {
|
sub process_variables {
|
||||||
my ($value) = @_;
|
my ($value, $remove_undef) = @_;
|
||||||
my $retval = "";
|
my $retval = "";
|
||||||
|
|
||||||
# We want to check for '\', and it is just easier
|
# We want to check for '\', and it is just easier
|
||||||
|
@ -322,6 +322,10 @@ sub process_variables {
|
||||||
$retval = "$retval$begin";
|
$retval = "$retval$begin";
|
||||||
if (defined($variable{$var})) {
|
if (defined($variable{$var})) {
|
||||||
$retval = "$retval$variable{$var}";
|
$retval = "$retval$variable{$var}";
|
||||||
|
} elsif (defined($remove_undef) && $remove_undef) {
|
||||||
|
# for if statements, any variable that is not defined,
|
||||||
|
# we simple convert to 0
|
||||||
|
$retval = "${retval}0";
|
||||||
} else {
|
} else {
|
||||||
# put back the origin piece.
|
# put back the origin piece.
|
||||||
$retval = "$retval\$\{$var\}";
|
$retval = "$retval\$\{$var\}";
|
||||||
|
@ -403,10 +407,40 @@ sub value_defined {
|
||||||
defined($opt{$2});
|
defined($opt{$2});
|
||||||
}
|
}
|
||||||
|
|
||||||
sub process_if {
|
my $d = 0;
|
||||||
my ($name, $value) = @_;
|
sub process_expression {
|
||||||
|
my ($name, $val) = @_;
|
||||||
|
|
||||||
my $val = process_variables($value);
|
my $c = $d++;
|
||||||
|
|
||||||
|
while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
|
||||||
|
my $express = $1;
|
||||||
|
|
||||||
|
if (process_expression($name, $express)) {
|
||||||
|
$val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
|
||||||
|
} else {
|
||||||
|
$val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$d--;
|
||||||
|
my $OR = "\\|\\|";
|
||||||
|
my $AND = "\\&\\&";
|
||||||
|
|
||||||
|
while ($val =~ s/^(.*?)($OR|$AND)//) {
|
||||||
|
my $express = $1;
|
||||||
|
my $op = $2;
|
||||||
|
|
||||||
|
if (process_expression($name, $express)) {
|
||||||
|
if ($op eq "||") {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($op eq "&&") {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ($val =~ /(.*)(==|\!=|>=|<=|>|<)(.*)/) {
|
if ($val =~ /(.*)(==|\!=|>=|<=|>|<)(.*)/) {
|
||||||
my $ret = process_compare($1, $2, $3);
|
my $ret = process_compare($1, $2, $3);
|
||||||
|
@ -431,7 +465,16 @@ sub process_if {
|
||||||
}
|
}
|
||||||
|
|
||||||
die ("$name: $.: Undefined content $val in if statement\n");
|
die ("$name: $.: Undefined content $val in if statement\n");
|
||||||
return 1;
|
}
|
||||||
|
|
||||||
|
sub process_if {
|
||||||
|
my ($name, $value) = @_;
|
||||||
|
|
||||||
|
# Convert variables and replace undefined ones with 0
|
||||||
|
my $val = process_variables($value, 1);
|
||||||
|
my $ret = process_expression $name, $val;
|
||||||
|
|
||||||
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub __read_config {
|
sub __read_config {
|
||||||
|
|
|
@ -154,6 +154,16 @@
|
||||||
# MAKE_CMD := make ARCH=x86
|
# MAKE_CMD := make ARCH=x86
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
# And/or ops (&&,||) may also be used to make complex conditionals.
|
||||||
|
#
|
||||||
|
# TEST_START IF (DEFINED ALL_TESTS || ${MYTEST} == boottest) && ${MACHINE} == gandalf
|
||||||
|
#
|
||||||
|
# Notice the use of paranthesis. Without any paranthesis the above would be
|
||||||
|
# processed the same as:
|
||||||
|
#
|
||||||
|
# TEST_START IF DEFINED ALL_TESTS || (${MYTEST} == boottest && ${MACHINE} == gandalf)
|
||||||
|
#
|
||||||
|
#
|
||||||
#
|
#
|
||||||
# INCLUDE file
|
# INCLUDE file
|
||||||
#
|
#
|
||||||
|
|
Loading…
Reference in New Issue