aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing
diff options
context:
space:
mode:
Diffstat (limited to 'tools/testing')
-rwxr-xr-xtools/testing/ktest/ktest.pl53
-rw-r--r--tools/testing/ktest/sample.conf10
2 files changed, 58 insertions, 5 deletions
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl
index d292c2d8dfe9..1bda07f6d673 100755
--- a/tools/testing/ktest/ktest.pl
+++ b/tools/testing/ktest/ktest.pl
@@ -304,7 +304,7 @@ sub get_ktest_configs {
304} 304}
305 305
306sub process_variables { 306sub process_variables {
307 my ($value) = @_; 307 my ($value, $remove_undef) = @_;
308 my $retval = ""; 308 my $retval = "";
309 309
310 # We want to check for '\', and it is just easier 310 # We want to check for '\', and it is just easier
@@ -322,6 +322,10 @@ sub process_variables {
322 $retval = "$retval$begin"; 322 $retval = "$retval$begin";
323 if (defined($variable{$var})) { 323 if (defined($variable{$var})) {
324 $retval = "$retval$variable{$var}"; 324 $retval = "$retval$variable{$var}";
325 } elsif (defined($remove_undef) && $remove_undef) {
326 # for if statements, any variable that is not defined,
327 # we simple convert to 0
328 $retval = "${retval}0";
325 } else { 329 } else {
326 # put back the origin piece. 330 # put back the origin piece.
327 $retval = "$retval\$\{$var\}"; 331 $retval = "$retval\$\{$var\}";
@@ -403,10 +407,40 @@ sub value_defined {
403 defined($opt{$2}); 407 defined($opt{$2});
404} 408}
405 409
406sub process_if { 410my $d = 0;
407 my ($name, $value) = @_; 411sub process_expression {
412 my ($name, $val) = @_;
413
414 my $c = $d++;
415
416 while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) {
417 my $express = $1;
418
419 if (process_expression($name, $express)) {
420 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /;
421 } else {
422 $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /;
423 }
424 }
425
426 $d--;
427 my $OR = "\\|\\|";
428 my $AND = "\\&\\&";
408 429
409 my $val = process_variables($value); 430 while ($val =~ s/^(.*?)($OR|$AND)//) {
431 my $express = $1;
432 my $op = $2;
433
434 if (process_expression($name, $express)) {
435 if ($op eq "||") {
436 return 1;
437 }
438 } else {
439 if ($op eq "&&") {
440 return 0;
441 }
442 }
443 }
410 444
411 if ($val =~ /(.*)(==|\!=|>=|<=|>|<)(.*)/) { 445 if ($val =~ /(.*)(==|\!=|>=|<=|>|<)(.*)/) {
412 my $ret = process_compare($1, $2, $3); 446 my $ret = process_compare($1, $2, $3);
@@ -431,7 +465,16 @@ sub process_if {
431 } 465 }
432 466
433 die ("$name: $.: Undefined content $val in if statement\n"); 467 die ("$name: $.: Undefined content $val in if statement\n");
434 return 1; 468}
469
470sub process_if {
471 my ($name, $value) = @_;
472
473 # Convert variables and replace undefined ones with 0
474 my $val = process_variables($value, 1);
475 my $ret = process_expression $name, $val;
476
477 return $ret;
435} 478}
436 479
437sub __read_config { 480sub __read_config {
diff --git a/tools/testing/ktest/sample.conf b/tools/testing/ktest/sample.conf
index 7b49f07b6423..dbedfa196727 100644
--- a/tools/testing/ktest/sample.conf
+++ b/tools/testing/ktest/sample.conf
@@ -154,6 +154,16 @@
154# MAKE_CMD := make ARCH=x86 154# MAKE_CMD := make ARCH=x86
155# 155#
156# 156#
157# And/or ops (&&,||) may also be used to make complex conditionals.
158#
159# TEST_START IF (DEFINED ALL_TESTS || ${MYTEST} == boottest) && ${MACHINE} == gandalf
160#
161# Notice the use of paranthesis. Without any paranthesis the above would be
162# processed the same as:
163#
164# TEST_START IF DEFINED ALL_TESTS || (${MYTEST} == boottest && ${MACHINE} == gandalf)
165#
166#
157# 167#
158# INCLUDE file 168# INCLUDE file
159# 169#