Commit 8d735212 authored by Steven Rostedt's avatar Steven Rostedt Committed by Steven Rostedt

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: default avatarSteven Rostedt <rostedt@goodmis.org>
parent a9f84424
...@@ -304,7 +304,7 @@ sub get_ktest_configs { ...@@ -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 { ...@@ -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 { ...@@ -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 $c = $d++;
while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
my $express = $1;
my $val = process_variables($value); 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 { ...@@ -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 @@ ...@@ -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
# #
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment