diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-08 18:41:10 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-08 18:41:10 -0500 |
commit | 98393b8ff2ca98b5b984e73a291b81b326e25184 (patch) | |
tree | eebde91713a68c633a322cce66821b67c434d4b9 | |
parent | 3b7546211d53f600e15ca7867adbf3c085b8ecc9 (diff) | |
parent | 815e2bd7d609da9c7615ea28a3990064a394312f (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest: (21 commits)
ktest: Evaluate variables entered on the command line
ktest: Add variable ${PWD}
ktest: Add another monitor flush before installing kernel
ktest: Do not opencode reboot in grub setting
ktest: Add processing of complex conditionals
ktest: Fix parsing of config section lines
ktest: Sort make_min_config configs by dependecies
ktest: Add DEFINED keyword for IF statements
ktest: Add OVERRIDE keyword to DEFAULTS section
ktest: Consolidate TEST_TYPE and DEFAULT code
ktest: Add INCLUDE keyword to include other config files
ktest: Let IF keyword take comparisons
ktest: Add IF and ELSE to config sections
ktest: Do not reboot on config or build issues
ktest: Add option REBOOT_SUCCESS_LINE to stop waiting after a reboot
ktest: Add NO_INSTALL option to not install for a test
ktest: Fail when grub menu not found
ktest: Include monitor in reboot code
ktest: Only need to save .config when doing mrproper
ktest: Create outputdir if it does not exist
...
-rwxr-xr-x | tools/testing/ktest/ktest.pl | 515 | ||||
-rw-r--r-- | tools/testing/ktest/sample.conf | 146 |
2 files changed, 553 insertions, 108 deletions
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl index 8d02ccb10c59..30e2befd6f2a 100755 --- a/tools/testing/ktest/ktest.pl +++ b/tools/testing/ktest/ktest.pl | |||
@@ -42,6 +42,7 @@ $default{"BISECT_MANUAL"} = 0; | |||
42 | $default{"BISECT_SKIP"} = 1; | 42 | $default{"BISECT_SKIP"} = 1; |
43 | $default{"SUCCESS_LINE"} = "login:"; | 43 | $default{"SUCCESS_LINE"} = "login:"; |
44 | $default{"DETECT_TRIPLE_FAULT"} = 1; | 44 | $default{"DETECT_TRIPLE_FAULT"} = 1; |
45 | $default{"NO_INSTALL"} = 0; | ||
45 | $default{"BOOTED_TIMEOUT"} = 1; | 46 | $default{"BOOTED_TIMEOUT"} = 1; |
46 | $default{"DIE_ON_FAILURE"} = 1; | 47 | $default{"DIE_ON_FAILURE"} = 1; |
47 | $default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND"; | 48 | $default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND"; |
@@ -84,6 +85,7 @@ my $grub_number; | |||
84 | my $target; | 85 | my $target; |
85 | my $make; | 86 | my $make; |
86 | my $post_install; | 87 | my $post_install; |
88 | my $no_install; | ||
87 | my $noclean; | 89 | my $noclean; |
88 | my $minconfig; | 90 | my $minconfig; |
89 | my $start_minconfig; | 91 | my $start_minconfig; |
@@ -115,6 +117,7 @@ my $timeout; | |||
115 | my $booted_timeout; | 117 | my $booted_timeout; |
116 | my $detect_triplefault; | 118 | my $detect_triplefault; |
117 | my $console; | 119 | my $console; |
120 | my $reboot_success_line; | ||
118 | my $success_line; | 121 | my $success_line; |
119 | my $stop_after_success; | 122 | my $stop_after_success; |
120 | my $stop_after_failure; | 123 | my $stop_after_failure; |
@@ -130,6 +133,12 @@ my %config_help; | |||
130 | my %variable; | 133 | my %variable; |
131 | my %force_config; | 134 | my %force_config; |
132 | 135 | ||
136 | # do not force reboots on config problems | ||
137 | my $no_reboot = 1; | ||
138 | |||
139 | # default variables that can be used | ||
140 | chomp ($variable{"PWD"} = `pwd`); | ||
141 | |||
133 | $config_help{"MACHINE"} = << "EOF" | 142 | $config_help{"MACHINE"} = << "EOF" |
134 | The machine hostname that you will test. | 143 | The machine hostname that you will test. |
135 | EOF | 144 | EOF |
@@ -241,6 +250,7 @@ sub read_yn { | |||
241 | 250 | ||
242 | sub get_ktest_config { | 251 | sub get_ktest_config { |
243 | my ($config) = @_; | 252 | my ($config) = @_; |
253 | my $ans; | ||
244 | 254 | ||
245 | return if (defined($opt{$config})); | 255 | return if (defined($opt{$config})); |
246 | 256 | ||
@@ -254,16 +264,17 @@ sub get_ktest_config { | |||
254 | if (defined($default{$config})) { | 264 | if (defined($default{$config})) { |
255 | print "\[$default{$config}\] "; | 265 | print "\[$default{$config}\] "; |
256 | } | 266 | } |
257 | $entered_configs{$config} = <STDIN>; | 267 | $ans = <STDIN>; |
258 | $entered_configs{$config} =~ s/^\s*(.*\S)\s*$/$1/; | 268 | $ans =~ s/^\s*(.*\S)\s*$/$1/; |
259 | if ($entered_configs{$config} =~ /^\s*$/) { | 269 | if ($ans =~ /^\s*$/) { |
260 | if ($default{$config}) { | 270 | if ($default{$config}) { |
261 | $entered_configs{$config} = $default{$config}; | 271 | $ans = $default{$config}; |
262 | } else { | 272 | } else { |
263 | print "Your answer can not be blank\n"; | 273 | print "Your answer can not be blank\n"; |
264 | next; | 274 | next; |
265 | } | 275 | } |
266 | } | 276 | } |
277 | $entered_configs{$config} = process_variables($ans); | ||
267 | last; | 278 | last; |
268 | } | 279 | } |
269 | } | 280 | } |
@@ -298,7 +309,7 @@ sub get_ktest_configs { | |||
298 | } | 309 | } |
299 | 310 | ||
300 | sub process_variables { | 311 | sub process_variables { |
301 | my ($value) = @_; | 312 | my ($value, $remove_undef) = @_; |
302 | my $retval = ""; | 313 | my $retval = ""; |
303 | 314 | ||
304 | # We want to check for '\', and it is just easier | 315 | # We want to check for '\', and it is just easier |
@@ -316,6 +327,10 @@ sub process_variables { | |||
316 | $retval = "$retval$begin"; | 327 | $retval = "$retval$begin"; |
317 | if (defined($variable{$var})) { | 328 | if (defined($variable{$var})) { |
318 | $retval = "$retval$variable{$var}"; | 329 | $retval = "$retval$variable{$var}"; |
330 | } elsif (defined($remove_undef) && $remove_undef) { | ||
331 | # for if statements, any variable that is not defined, | ||
332 | # we simple convert to 0 | ||
333 | $retval = "${retval}0"; | ||
319 | } else { | 334 | } else { |
320 | # put back the origin piece. | 335 | # put back the origin piece. |
321 | $retval = "$retval\$\{$var\}"; | 336 | $retval = "$retval\$\{$var\}"; |
@@ -331,10 +346,17 @@ sub process_variables { | |||
331 | } | 346 | } |
332 | 347 | ||
333 | sub set_value { | 348 | sub set_value { |
334 | my ($lvalue, $rvalue) = @_; | 349 | my ($lvalue, $rvalue, $override, $overrides, $name) = @_; |
335 | 350 | ||
336 | if (defined($opt{$lvalue})) { | 351 | if (defined($opt{$lvalue})) { |
337 | die "Error: Option $lvalue defined more than once!\n"; | 352 | if (!$override || defined(${$overrides}{$lvalue})) { |
353 | my $extra = ""; | ||
354 | if ($override) { | ||
355 | $extra = "In the same override section!\n"; | ||
356 | } | ||
357 | die "$name: $.: Option $lvalue defined more than once!\n$extra"; | ||
358 | } | ||
359 | ${$overrides}{$lvalue} = $rvalue; | ||
338 | } | 360 | } |
339 | if ($rvalue =~ /^\s*$/) { | 361 | if ($rvalue =~ /^\s*$/) { |
340 | delete $opt{$lvalue}; | 362 | delete $opt{$lvalue}; |
@@ -355,86 +377,274 @@ sub set_variable { | |||
355 | } | 377 | } |
356 | } | 378 | } |
357 | 379 | ||
358 | sub read_config { | 380 | sub process_compare { |
359 | my ($config) = @_; | 381 | my ($lval, $cmp, $rval) = @_; |
382 | |||
383 | # remove whitespace | ||
384 | |||
385 | $lval =~ s/^\s*//; | ||
386 | $lval =~ s/\s*$//; | ||
387 | |||
388 | $rval =~ s/^\s*//; | ||
389 | $rval =~ s/\s*$//; | ||
390 | |||
391 | if ($cmp eq "==") { | ||
392 | return $lval eq $rval; | ||
393 | } elsif ($cmp eq "!=") { | ||
394 | return $lval ne $rval; | ||
395 | } | ||
396 | |||
397 | my $statement = "$lval $cmp $rval"; | ||
398 | my $ret = eval $statement; | ||
399 | |||
400 | # $@ stores error of eval | ||
401 | if ($@) { | ||
402 | return -1; | ||
403 | } | ||
404 | |||
405 | return $ret; | ||
406 | } | ||
407 | |||
408 | sub value_defined { | ||
409 | my ($val) = @_; | ||
410 | |||
411 | return defined($variable{$2}) || | ||
412 | defined($opt{$2}); | ||
413 | } | ||
414 | |||
415 | my $d = 0; | ||
416 | sub process_expression { | ||
417 | my ($name, $val) = @_; | ||
418 | |||
419 | my $c = $d++; | ||
420 | |||
421 | while ($val =~ s/\(([^\(]*?)\)/\&\&\&\&VAL\&\&\&\&/) { | ||
422 | my $express = $1; | ||
423 | |||
424 | if (process_expression($name, $express)) { | ||
425 | $val =~ s/\&\&\&\&VAL\&\&\&\&/ 1 /; | ||
426 | } else { | ||
427 | $val =~ s/\&\&\&\&VAL\&\&\&\&/ 0 /; | ||
428 | } | ||
429 | } | ||
430 | |||
431 | $d--; | ||
432 | my $OR = "\\|\\|"; | ||
433 | my $AND = "\\&\\&"; | ||
434 | |||
435 | while ($val =~ s/^(.*?)($OR|$AND)//) { | ||
436 | my $express = $1; | ||
437 | my $op = $2; | ||
438 | |||
439 | if (process_expression($name, $express)) { | ||
440 | if ($op eq "||") { | ||
441 | return 1; | ||
442 | } | ||
443 | } else { | ||
444 | if ($op eq "&&") { | ||
445 | return 0; | ||
446 | } | ||
447 | } | ||
448 | } | ||
449 | |||
450 | if ($val =~ /(.*)(==|\!=|>=|<=|>|<)(.*)/) { | ||
451 | my $ret = process_compare($1, $2, $3); | ||
452 | if ($ret < 0) { | ||
453 | die "$name: $.: Unable to process comparison\n"; | ||
454 | } | ||
455 | return $ret; | ||
456 | } | ||
457 | |||
458 | if ($val =~ /^\s*(NOT\s*)?DEFINED\s+(\S+)\s*$/) { | ||
459 | if (defined $1) { | ||
460 | return !value_defined($2); | ||
461 | } else { | ||
462 | return value_defined($2); | ||
463 | } | ||
464 | } | ||
465 | |||
466 | if ($val =~ /^\s*0\s*$/) { | ||
467 | return 0; | ||
468 | } elsif ($val =~ /^\s*\d+\s*$/) { | ||
469 | return 1; | ||
470 | } | ||
471 | |||
472 | die ("$name: $.: Undefined content $val in if statement\n"); | ||
473 | } | ||
474 | |||
475 | sub process_if { | ||
476 | my ($name, $value) = @_; | ||
477 | |||
478 | # Convert variables and replace undefined ones with 0 | ||
479 | my $val = process_variables($value, 1); | ||
480 | my $ret = process_expression $name, $val; | ||
481 | |||
482 | return $ret; | ||
483 | } | ||
360 | 484 | ||
361 | open(IN, $config) || die "can't read file $config"; | 485 | sub __read_config { |
486 | my ($config, $current_test_num) = @_; | ||
487 | |||
488 | my $in; | ||
489 | open($in, $config) || die "can't read file $config"; | ||
362 | 490 | ||
363 | my $name = $config; | 491 | my $name = $config; |
364 | $name =~ s,.*/(.*),$1,; | 492 | $name =~ s,.*/(.*),$1,; |
365 | 493 | ||
366 | my $test_num = 0; | 494 | my $test_num = $$current_test_num; |
367 | my $default = 1; | 495 | my $default = 1; |
368 | my $repeat = 1; | 496 | my $repeat = 1; |
369 | my $num_tests_set = 0; | 497 | my $num_tests_set = 0; |
370 | my $skip = 0; | 498 | my $skip = 0; |
371 | my $rest; | 499 | my $rest; |
500 | my $line; | ||
372 | my $test_case = 0; | 501 | my $test_case = 0; |
502 | my $if = 0; | ||
503 | my $if_set = 0; | ||
504 | my $override = 0; | ||
373 | 505 | ||
374 | while (<IN>) { | 506 | my %overrides; |
507 | |||
508 | while (<$in>) { | ||
375 | 509 | ||
376 | # ignore blank lines and comments | 510 | # ignore blank lines and comments |
377 | next if (/^\s*$/ || /\s*\#/); | 511 | next if (/^\s*$/ || /\s*\#/); |
378 | 512 | ||
379 | if (/^\s*TEST_START(.*)/) { | 513 | if (/^\s*(TEST_START|DEFAULTS)\b(.*)/) { |
380 | 514 | ||
381 | $rest = $1; | 515 | my $type = $1; |
516 | $rest = $2; | ||
517 | $line = $2; | ||
382 | 518 | ||
383 | if ($num_tests_set) { | 519 | my $old_test_num; |
384 | die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n"; | 520 | my $old_repeat; |
385 | } | 521 | $override = 0; |
522 | |||
523 | if ($type eq "TEST_START") { | ||
524 | |||
525 | if ($num_tests_set) { | ||
526 | die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n"; | ||
527 | } | ||
386 | 528 | ||
387 | my $old_test_num = $test_num; | 529 | $old_test_num = $test_num; |
388 | my $old_repeat = $repeat; | 530 | $old_repeat = $repeat; |
389 | 531 | ||
390 | $test_num += $repeat; | 532 | $test_num += $repeat; |
391 | $default = 0; | 533 | $default = 0; |
392 | $repeat = 1; | 534 | $repeat = 1; |
535 | } else { | ||
536 | $default = 1; | ||
537 | } | ||
393 | 538 | ||
394 | if ($rest =~ /\s+SKIP(.*)/) { | 539 | # If SKIP is anywhere in the line, the command will be skipped |
395 | $rest = $1; | 540 | if ($rest =~ s/\s+SKIP\b//) { |
396 | $skip = 1; | 541 | $skip = 1; |
397 | } else { | 542 | } else { |
398 | $test_case = 1; | 543 | $test_case = 1; |
399 | $skip = 0; | 544 | $skip = 0; |
400 | } | 545 | } |
401 | 546 | ||
402 | if ($rest =~ /\s+ITERATE\s+(\d+)(.*)$/) { | 547 | if ($rest =~ s/\sELSE\b//) { |
403 | $repeat = $1; | 548 | if (!$if) { |
404 | $rest = $2; | 549 | die "$name: $.: ELSE found with out matching IF section\n$_"; |
405 | $repeat_tests{"$test_num"} = $repeat; | 550 | } |
551 | $if = 0; | ||
552 | |||
553 | if ($if_set) { | ||
554 | $skip = 1; | ||
555 | } else { | ||
556 | $skip = 0; | ||
557 | } | ||
406 | } | 558 | } |
407 | 559 | ||
408 | if ($rest =~ /\s+SKIP(.*)/) { | 560 | if ($rest =~ s/\sIF\s+(.*)//) { |
409 | $rest = $1; | 561 | if (process_if($name, $1)) { |
410 | $skip = 1; | 562 | $if_set = 1; |
563 | } else { | ||
564 | $skip = 1; | ||
565 | } | ||
566 | $if = 1; | ||
567 | } else { | ||
568 | $if = 0; | ||
569 | $if_set = 0; | ||
411 | } | 570 | } |
412 | 571 | ||
413 | if ($rest !~ /^\s*$/) { | 572 | if (!$skip) { |
414 | die "$name: $.: Gargbage found after TEST_START\n$_"; | 573 | if ($type eq "TEST_START") { |
574 | if ($rest =~ s/\s+ITERATE\s+(\d+)//) { | ||
575 | $repeat = $1; | ||
576 | $repeat_tests{"$test_num"} = $repeat; | ||
577 | } | ||
578 | } elsif ($rest =~ s/\sOVERRIDE\b//) { | ||
579 | # DEFAULT only | ||
580 | $override = 1; | ||
581 | # Clear previous overrides | ||
582 | %overrides = (); | ||
583 | } | ||
584 | } | ||
585 | |||
586 | if (!$skip && $rest !~ /^\s*$/) { | ||
587 | die "$name: $.: Gargbage found after $type\n$_"; | ||
415 | } | 588 | } |
416 | 589 | ||
417 | if ($skip) { | 590 | if ($skip && $type eq "TEST_START") { |
418 | $test_num = $old_test_num; | 591 | $test_num = $old_test_num; |
419 | $repeat = $old_repeat; | 592 | $repeat = $old_repeat; |
420 | } | 593 | } |
421 | 594 | ||
422 | } elsif (/^\s*DEFAULTS(.*)$/) { | 595 | } elsif (/^\s*ELSE\b(.*)$/) { |
423 | $default = 1; | 596 | if (!$if) { |
424 | 597 | die "$name: $.: ELSE found with out matching IF section\n$_"; | |
598 | } | ||
425 | $rest = $1; | 599 | $rest = $1; |
426 | 600 | if ($if_set) { | |
427 | if ($rest =~ /\s+SKIP(.*)/) { | ||
428 | $rest = $1; | ||
429 | $skip = 1; | 601 | $skip = 1; |
602 | $rest = ""; | ||
430 | } else { | 603 | } else { |
431 | $skip = 0; | 604 | $skip = 0; |
605 | |||
606 | if ($rest =~ /\sIF\s+(.*)/) { | ||
607 | # May be a ELSE IF section. | ||
608 | if (!process_if($name, $1)) { | ||
609 | $skip = 1; | ||
610 | } | ||
611 | $rest = ""; | ||
612 | } else { | ||
613 | $if = 0; | ||
614 | } | ||
432 | } | 615 | } |
433 | 616 | ||
434 | if ($rest !~ /^\s*$/) { | 617 | if ($rest !~ /^\s*$/) { |
435 | die "$name: $.: Gargbage found after DEFAULTS\n$_"; | 618 | die "$name: $.: Gargbage found after DEFAULTS\n$_"; |
436 | } | 619 | } |
437 | 620 | ||
621 | } elsif (/^\s*INCLUDE\s+(\S+)/) { | ||
622 | |||
623 | next if ($skip); | ||
624 | |||
625 | if (!$default) { | ||
626 | die "$name: $.: INCLUDE can only be done in default sections\n$_"; | ||
627 | } | ||
628 | |||
629 | my $file = process_variables($1); | ||
630 | |||
631 | if ($file !~ m,^/,) { | ||
632 | # check the path of the config file first | ||
633 | if ($config =~ m,(.*)/,) { | ||
634 | if (-f "$1/$file") { | ||
635 | $file = "$1/$file"; | ||
636 | } | ||
637 | } | ||
638 | } | ||
639 | |||
640 | if ( ! -r $file ) { | ||
641 | die "$name: $.: Can't read file $file\n$_"; | ||
642 | } | ||
643 | |||
644 | if (__read_config($file, \$test_num)) { | ||
645 | $test_case = 1; | ||
646 | } | ||
647 | |||
438 | } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) { | 648 | } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) { |
439 | 649 | ||
440 | next if ($skip); | 650 | next if ($skip); |
@@ -460,10 +670,10 @@ sub read_config { | |||
460 | } | 670 | } |
461 | 671 | ||
462 | if ($default || $lvalue =~ /\[\d+\]$/) { | 672 | if ($default || $lvalue =~ /\[\d+\]$/) { |
463 | set_value($lvalue, $rvalue); | 673 | set_value($lvalue, $rvalue, $override, \%overrides, $name); |
464 | } else { | 674 | } else { |
465 | my $val = "$lvalue\[$test_num\]"; | 675 | my $val = "$lvalue\[$test_num\]"; |
466 | set_value($val, $rvalue); | 676 | set_value($val, $rvalue, $override, \%overrides, $name); |
467 | 677 | ||
468 | if ($repeat > 1) { | 678 | if ($repeat > 1) { |
469 | $repeats{$val} = $repeat; | 679 | $repeats{$val} = $repeat; |
@@ -490,13 +700,26 @@ sub read_config { | |||
490 | } | 700 | } |
491 | } | 701 | } |
492 | 702 | ||
493 | close(IN); | ||
494 | |||
495 | if ($test_num) { | 703 | if ($test_num) { |
496 | $test_num += $repeat - 1; | 704 | $test_num += $repeat - 1; |
497 | $opt{"NUM_TESTS"} = $test_num; | 705 | $opt{"NUM_TESTS"} = $test_num; |
498 | } | 706 | } |
499 | 707 | ||
708 | close($in); | ||
709 | |||
710 | $$current_test_num = $test_num; | ||
711 | |||
712 | return $test_case; | ||
713 | } | ||
714 | |||
715 | sub read_config { | ||
716 | my ($config) = @_; | ||
717 | |||
718 | my $test_case; | ||
719 | my $test_num = 0; | ||
720 | |||
721 | $test_case = __read_config $config, \$test_num; | ||
722 | |||
500 | # make sure we have all mandatory configs | 723 | # make sure we have all mandatory configs |
501 | get_ktest_configs; | 724 | get_ktest_configs; |
502 | 725 | ||
@@ -603,8 +826,20 @@ sub doprint { | |||
603 | } | 826 | } |
604 | 827 | ||
605 | sub run_command; | 828 | sub run_command; |
829 | sub start_monitor; | ||
830 | sub end_monitor; | ||
831 | sub wait_for_monitor; | ||
606 | 832 | ||
607 | sub reboot { | 833 | sub reboot { |
834 | my ($time) = @_; | ||
835 | |||
836 | if (defined($time)) { | ||
837 | start_monitor; | ||
838 | # flush out current monitor | ||
839 | # May contain the reboot success line | ||
840 | wait_for_monitor 1; | ||
841 | } | ||
842 | |||
608 | # try to reboot normally | 843 | # try to reboot normally |
609 | if (run_command $reboot) { | 844 | if (run_command $reboot) { |
610 | if (defined($powercycle_after_reboot)) { | 845 | if (defined($powercycle_after_reboot)) { |
@@ -615,12 +850,17 @@ sub reboot { | |||
615 | # nope? power cycle it. | 850 | # nope? power cycle it. |
616 | run_command "$power_cycle"; | 851 | run_command "$power_cycle"; |
617 | } | 852 | } |
853 | |||
854 | if (defined($time)) { | ||
855 | wait_for_monitor($time, $reboot_success_line); | ||
856 | end_monitor; | ||
857 | } | ||
618 | } | 858 | } |
619 | 859 | ||
620 | sub do_not_reboot { | 860 | sub do_not_reboot { |
621 | my $i = $iteration; | 861 | my $i = $iteration; |
622 | 862 | ||
623 | return $test_type eq "build" || | 863 | return $test_type eq "build" || $no_reboot || |
624 | ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") || | 864 | ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") || |
625 | ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build"); | 865 | ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build"); |
626 | } | 866 | } |
@@ -693,16 +933,29 @@ sub end_monitor { | |||
693 | } | 933 | } |
694 | 934 | ||
695 | sub wait_for_monitor { | 935 | sub wait_for_monitor { |
696 | my ($time) = @_; | 936 | my ($time, $stop) = @_; |
937 | my $full_line = ""; | ||
697 | my $line; | 938 | my $line; |
939 | my $booted = 0; | ||
698 | 940 | ||
699 | doprint "** Wait for monitor to settle down **\n"; | 941 | doprint "** Wait for monitor to settle down **\n"; |
700 | 942 | ||
701 | # read the monitor and wait for the system to calm down | 943 | # read the monitor and wait for the system to calm down |
702 | do { | 944 | while (!$booted) { |
703 | $line = wait_for_input($monitor_fp, $time); | 945 | $line = wait_for_input($monitor_fp, $time); |
704 | print "$line" if (defined($line)); | 946 | last if (!defined($line)); |
705 | } while (defined($line)); | 947 | print "$line"; |
948 | $full_line .= $line; | ||
949 | |||
950 | if (defined($stop) && $full_line =~ /$stop/) { | ||
951 | doprint "wait for monitor detected $stop\n"; | ||
952 | $booted = 1; | ||
953 | } | ||
954 | |||
955 | if ($line =~ /\n/) { | ||
956 | $full_line = ""; | ||
957 | } | ||
958 | } | ||
706 | print "** Monitor flushed **\n"; | 959 | print "** Monitor flushed **\n"; |
707 | } | 960 | } |
708 | 961 | ||
@@ -719,10 +972,7 @@ sub fail { | |||
719 | # no need to reboot for just building. | 972 | # no need to reboot for just building. |
720 | if (!do_not_reboot) { | 973 | if (!do_not_reboot) { |
721 | doprint "REBOOTING\n"; | 974 | doprint "REBOOTING\n"; |
722 | reboot; | 975 | reboot $sleep_time; |
723 | start_monitor; | ||
724 | wait_for_monitor $sleep_time; | ||
725 | end_monitor; | ||
726 | } | 976 | } |
727 | 977 | ||
728 | my $name = ""; | 978 | my $name = ""; |
@@ -854,9 +1104,12 @@ sub get_grub_index { | |||
854 | open(IN, "$ssh_grub |") | 1104 | open(IN, "$ssh_grub |") |
855 | or die "unable to get menu.lst"; | 1105 | or die "unable to get menu.lst"; |
856 | 1106 | ||
1107 | my $found = 0; | ||
1108 | |||
857 | while (<IN>) { | 1109 | while (<IN>) { |
858 | if (/^\s*title\s+$grub_menu\s*$/) { | 1110 | if (/^\s*title\s+$grub_menu\s*$/) { |
859 | $grub_number++; | 1111 | $grub_number++; |
1112 | $found = 1; | ||
860 | last; | 1113 | last; |
861 | } elsif (/^\s*title\s/) { | 1114 | } elsif (/^\s*title\s/) { |
862 | $grub_number++; | 1115 | $grub_number++; |
@@ -865,7 +1118,7 @@ sub get_grub_index { | |||
865 | close(IN); | 1118 | close(IN); |
866 | 1119 | ||
867 | die "Could not find '$grub_menu' in /boot/grub/menu on $machine" | 1120 | die "Could not find '$grub_menu' in /boot/grub/menu on $machine" |
868 | if ($grub_number < 0); | 1121 | if (!$found); |
869 | doprint "$grub_number\n"; | 1122 | doprint "$grub_number\n"; |
870 | } | 1123 | } |
871 | 1124 | ||
@@ -902,7 +1155,8 @@ sub wait_for_input | |||
902 | 1155 | ||
903 | sub reboot_to { | 1156 | sub reboot_to { |
904 | if ($reboot_type eq "grub") { | 1157 | if ($reboot_type eq "grub") { |
905 | run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch && reboot)'"; | 1158 | run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch)'"; |
1159 | reboot; | ||
906 | return; | 1160 | return; |
907 | } | 1161 | } |
908 | 1162 | ||
@@ -1083,6 +1337,8 @@ sub do_post_install { | |||
1083 | 1337 | ||
1084 | sub install { | 1338 | sub install { |
1085 | 1339 | ||
1340 | return if ($no_install); | ||
1341 | |||
1086 | run_scp "$outputdir/$build_target", "$target_image" or | 1342 | run_scp "$outputdir/$build_target", "$target_image" or |
1087 | dodie "failed to copy image"; | 1343 | dodie "failed to copy image"; |
1088 | 1344 | ||
@@ -1140,6 +1396,11 @@ sub get_version { | |||
1140 | } | 1396 | } |
1141 | 1397 | ||
1142 | sub start_monitor_and_boot { | 1398 | sub start_monitor_and_boot { |
1399 | # Make sure the stable kernel has finished booting | ||
1400 | start_monitor; | ||
1401 | wait_for_monitor 5; | ||
1402 | end_monitor; | ||
1403 | |||
1143 | get_grub_index; | 1404 | get_grub_index; |
1144 | get_version; | 1405 | get_version; |
1145 | install; | 1406 | install; |
@@ -1250,6 +1511,10 @@ sub build { | |||
1250 | 1511 | ||
1251 | unlink $buildlog; | 1512 | unlink $buildlog; |
1252 | 1513 | ||
1514 | # Failed builds should not reboot the target | ||
1515 | my $save_no_reboot = $no_reboot; | ||
1516 | $no_reboot = 1; | ||
1517 | |||
1253 | if (defined($pre_build)) { | 1518 | if (defined($pre_build)) { |
1254 | my $ret = run_command $pre_build; | 1519 | my $ret = run_command $pre_build; |
1255 | if (!$ret && defined($pre_build_die) && | 1520 | if (!$ret && defined($pre_build_die) && |
@@ -1272,15 +1537,15 @@ sub build { | |||
1272 | # allow for empty configs | 1537 | # allow for empty configs |
1273 | run_command "touch $output_config"; | 1538 | run_command "touch $output_config"; |
1274 | 1539 | ||
1275 | run_command "mv $output_config $outputdir/config_temp" or | 1540 | if (!$noclean) { |
1276 | dodie "moving .config"; | 1541 | run_command "mv $output_config $outputdir/config_temp" or |
1542 | dodie "moving .config"; | ||
1277 | 1543 | ||
1278 | if (!$noclean && !run_command "$make mrproper") { | 1544 | run_command "$make mrproper" or dodie "make mrproper"; |
1279 | dodie "make mrproper"; | ||
1280 | } | ||
1281 | 1545 | ||
1282 | run_command "mv $outputdir/config_temp $output_config" or | 1546 | run_command "mv $outputdir/config_temp $output_config" or |
1283 | dodie "moving config_temp"; | 1547 | dodie "moving config_temp"; |
1548 | } | ||
1284 | 1549 | ||
1285 | } elsif (!$noclean) { | 1550 | } elsif (!$noclean) { |
1286 | unlink "$output_config"; | 1551 | unlink "$output_config"; |
@@ -1318,10 +1583,15 @@ sub build { | |||
1318 | 1583 | ||
1319 | if (!$build_ret) { | 1584 | if (!$build_ret) { |
1320 | # bisect may need this to pass | 1585 | # bisect may need this to pass |
1321 | return 0 if ($in_bisect); | 1586 | if ($in_bisect) { |
1587 | $no_reboot = $save_no_reboot; | ||
1588 | return 0; | ||
1589 | } | ||
1322 | fail "failed build" and return 0; | 1590 | fail "failed build" and return 0; |
1323 | } | 1591 | } |
1324 | 1592 | ||
1593 | $no_reboot = $save_no_reboot; | ||
1594 | |||
1325 | return 1; | 1595 | return 1; |
1326 | } | 1596 | } |
1327 | 1597 | ||
@@ -1356,10 +1626,7 @@ sub success { | |||
1356 | 1626 | ||
1357 | if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) { | 1627 | if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) { |
1358 | doprint "Reboot and wait $sleep_time seconds\n"; | 1628 | doprint "Reboot and wait $sleep_time seconds\n"; |
1359 | reboot; | 1629 | reboot $sleep_time; |
1360 | start_monitor; | ||
1361 | wait_for_monitor $sleep_time; | ||
1362 | end_monitor; | ||
1363 | } | 1630 | } |
1364 | } | 1631 | } |
1365 | 1632 | ||
@@ -1500,10 +1767,7 @@ sub run_git_bisect { | |||
1500 | 1767 | ||
1501 | sub bisect_reboot { | 1768 | sub bisect_reboot { |
1502 | doprint "Reboot and sleep $bisect_sleep_time seconds\n"; | 1769 | doprint "Reboot and sleep $bisect_sleep_time seconds\n"; |
1503 | reboot; | 1770 | reboot $bisect_sleep_time; |
1504 | start_monitor; | ||
1505 | wait_for_monitor $bisect_sleep_time; | ||
1506 | end_monitor; | ||
1507 | } | 1771 | } |
1508 | 1772 | ||
1509 | # returns 1 on success, 0 on failure, -1 on skip | 1773 | # returns 1 on success, 0 on failure, -1 on skip |
@@ -2066,10 +2330,7 @@ sub config_bisect { | |||
2066 | 2330 | ||
2067 | sub patchcheck_reboot { | 2331 | sub patchcheck_reboot { |
2068 | doprint "Reboot and sleep $patchcheck_sleep_time seconds\n"; | 2332 | doprint "Reboot and sleep $patchcheck_sleep_time seconds\n"; |
2069 | reboot; | 2333 | reboot $patchcheck_sleep_time; |
2070 | start_monitor; | ||
2071 | wait_for_monitor $patchcheck_sleep_time; | ||
2072 | end_monitor; | ||
2073 | } | 2334 | } |
2074 | 2335 | ||
2075 | sub patchcheck { | 2336 | sub patchcheck { |
@@ -2178,12 +2439,31 @@ sub patchcheck { | |||
2178 | } | 2439 | } |
2179 | 2440 | ||
2180 | my %depends; | 2441 | my %depends; |
2442 | my %depcount; | ||
2181 | my $iflevel = 0; | 2443 | my $iflevel = 0; |
2182 | my @ifdeps; | 2444 | my @ifdeps; |
2183 | 2445 | ||
2184 | # prevent recursion | 2446 | # prevent recursion |
2185 | my %read_kconfigs; | 2447 | my %read_kconfigs; |
2186 | 2448 | ||
2449 | sub add_dep { | ||
2450 | # $config depends on $dep | ||
2451 | my ($config, $dep) = @_; | ||
2452 | |||
2453 | if (defined($depends{$config})) { | ||
2454 | $depends{$config} .= " " . $dep; | ||
2455 | } else { | ||
2456 | $depends{$config} = $dep; | ||
2457 | } | ||
2458 | |||
2459 | # record the number of configs depending on $dep | ||
2460 | if (defined $depcount{$dep}) { | ||
2461 | $depcount{$dep}++; | ||
2462 | } else { | ||
2463 | $depcount{$dep} = 1; | ||
2464 | } | ||
2465 | } | ||
2466 | |||
2187 | # taken from streamline_config.pl | 2467 | # taken from streamline_config.pl |
2188 | sub read_kconfig { | 2468 | sub read_kconfig { |
2189 | my ($kconfig) = @_; | 2469 | my ($kconfig) = @_; |
@@ -2230,30 +2510,19 @@ sub read_kconfig { | |||
2230 | $config = $2; | 2510 | $config = $2; |
2231 | 2511 | ||
2232 | for (my $i = 0; $i < $iflevel; $i++) { | 2512 | for (my $i = 0; $i < $iflevel; $i++) { |
2233 | if ($i) { | 2513 | add_dep $config, $ifdeps[$i]; |
2234 | $depends{$config} .= " " . $ifdeps[$i]; | ||
2235 | } else { | ||
2236 | $depends{$config} = $ifdeps[$i]; | ||
2237 | } | ||
2238 | $state = "DEP"; | ||
2239 | } | 2514 | } |
2240 | 2515 | ||
2241 | # collect the depends for the config | 2516 | # collect the depends for the config |
2242 | } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) { | 2517 | } elsif ($state eq "NEW" && /^\s*depends\s+on\s+(.*)$/) { |
2243 | 2518 | ||
2244 | if (defined($depends{$1})) { | 2519 | add_dep $config, $1; |
2245 | $depends{$config} .= " " . $1; | ||
2246 | } else { | ||
2247 | $depends{$config} = $1; | ||
2248 | } | ||
2249 | 2520 | ||
2250 | # Get the configs that select this config | 2521 | # Get the configs that select this config |
2251 | } elsif ($state ne "NONE" && /^\s*select\s+(\S+)/) { | 2522 | } elsif ($state eq "NEW" && /^\s*select\s+(\S+)/) { |
2252 | if (defined($depends{$1})) { | 2523 | |
2253 | $depends{$1} .= " " . $config; | 2524 | # selected by depends on config |
2254 | } else { | 2525 | add_dep $1, $config; |
2255 | $depends{$1} = $config; | ||
2256 | } | ||
2257 | 2526 | ||
2258 | # Check for if statements | 2527 | # Check for if statements |
2259 | } elsif (/^if\s+(.*\S)\s*$/) { | 2528 | } elsif (/^if\s+(.*\S)\s*$/) { |
@@ -2365,11 +2634,18 @@ sub make_new_config { | |||
2365 | close OUT; | 2634 | close OUT; |
2366 | } | 2635 | } |
2367 | 2636 | ||
2637 | sub chomp_config { | ||
2638 | my ($config) = @_; | ||
2639 | |||
2640 | $config =~ s/CONFIG_//; | ||
2641 | |||
2642 | return $config; | ||
2643 | } | ||
2644 | |||
2368 | sub get_depends { | 2645 | sub get_depends { |
2369 | my ($dep) = @_; | 2646 | my ($dep) = @_; |
2370 | 2647 | ||
2371 | my $kconfig = $dep; | 2648 | my $kconfig = chomp_config $dep; |
2372 | $kconfig =~ s/CONFIG_//; | ||
2373 | 2649 | ||
2374 | $dep = $depends{"$kconfig"}; | 2650 | $dep = $depends{"$kconfig"}; |
2375 | 2651 | ||
@@ -2419,8 +2695,7 @@ sub test_this_config { | |||
2419 | return undef; | 2695 | return undef; |
2420 | } | 2696 | } |
2421 | 2697 | ||
2422 | my $kconfig = $config; | 2698 | my $kconfig = chomp_config $config; |
2423 | $kconfig =~ s/CONFIG_//; | ||
2424 | 2699 | ||
2425 | # Test dependencies first | 2700 | # Test dependencies first |
2426 | if (defined($depends{"$kconfig"})) { | 2701 | if (defined($depends{"$kconfig"})) { |
@@ -2510,6 +2785,14 @@ sub make_min_config { | |||
2510 | 2785 | ||
2511 | my @config_keys = keys %min_configs; | 2786 | my @config_keys = keys %min_configs; |
2512 | 2787 | ||
2788 | # All configs need a depcount | ||
2789 | foreach my $config (@config_keys) { | ||
2790 | my $kconfig = chomp_config $config; | ||
2791 | if (!defined $depcount{$kconfig}) { | ||
2792 | $depcount{$kconfig} = 0; | ||
2793 | } | ||
2794 | } | ||
2795 | |||
2513 | # Remove anything that was set by the make allnoconfig | 2796 | # Remove anything that was set by the make allnoconfig |
2514 | # we shouldn't need them as they get set for us anyway. | 2797 | # we shouldn't need them as they get set for us anyway. |
2515 | foreach my $config (@config_keys) { | 2798 | foreach my $config (@config_keys) { |
@@ -2548,8 +2831,13 @@ sub make_min_config { | |||
2548 | # Now disable each config one by one and do a make oldconfig | 2831 | # Now disable each config one by one and do a make oldconfig |
2549 | # till we find a config that changes our list. | 2832 | # till we find a config that changes our list. |
2550 | 2833 | ||
2551 | # Put configs that did not modify the config at the end. | ||
2552 | my @test_configs = keys %min_configs; | 2834 | my @test_configs = keys %min_configs; |
2835 | |||
2836 | # Sort keys by who is most dependent on | ||
2837 | @test_configs = sort { $depcount{chomp_config($b)} <=> $depcount{chomp_config($a)} } | ||
2838 | @test_configs ; | ||
2839 | |||
2840 | # Put configs that did not modify the config at the end. | ||
2553 | my $reset = 1; | 2841 | my $reset = 1; |
2554 | for (my $i = 0; $i < $#test_configs; $i++) { | 2842 | for (my $i = 0; $i < $#test_configs; $i++) { |
2555 | if (!defined($nochange_config{$test_configs[0]})) { | 2843 | if (!defined($nochange_config{$test_configs[0]})) { |
@@ -2659,10 +2947,7 @@ sub make_min_config { | |||
2659 | } | 2947 | } |
2660 | 2948 | ||
2661 | doprint "Reboot and wait $sleep_time seconds\n"; | 2949 | doprint "Reboot and wait $sleep_time seconds\n"; |
2662 | reboot; | 2950 | reboot $sleep_time; |
2663 | start_monitor; | ||
2664 | wait_for_monitor $sleep_time; | ||
2665 | end_monitor; | ||
2666 | } | 2951 | } |
2667 | 2952 | ||
2668 | success $i; | 2953 | success $i; |
@@ -2783,6 +3068,9 @@ sub set_test_option { | |||
2783 | # First we need to do is the builds | 3068 | # First we need to do is the builds |
2784 | for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | 3069 | for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { |
2785 | 3070 | ||
3071 | # Do not reboot on failing test options | ||
3072 | $no_reboot = 1; | ||
3073 | |||
2786 | $iteration = $i; | 3074 | $iteration = $i; |
2787 | 3075 | ||
2788 | my $makecmd = set_test_option("MAKE_CMD", $i); | 3076 | my $makecmd = set_test_option("MAKE_CMD", $i); |
@@ -2811,6 +3099,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
2811 | $reboot_type = set_test_option("REBOOT_TYPE", $i); | 3099 | $reboot_type = set_test_option("REBOOT_TYPE", $i); |
2812 | $grub_menu = set_test_option("GRUB_MENU", $i); | 3100 | $grub_menu = set_test_option("GRUB_MENU", $i); |
2813 | $post_install = set_test_option("POST_INSTALL", $i); | 3101 | $post_install = set_test_option("POST_INSTALL", $i); |
3102 | $no_install = set_test_option("NO_INSTALL", $i); | ||
2814 | $reboot_script = set_test_option("REBOOT_SCRIPT", $i); | 3103 | $reboot_script = set_test_option("REBOOT_SCRIPT", $i); |
2815 | $reboot_on_error = set_test_option("REBOOT_ON_ERROR", $i); | 3104 | $reboot_on_error = set_test_option("REBOOT_ON_ERROR", $i); |
2816 | $poweroff_on_error = set_test_option("POWEROFF_ON_ERROR", $i); | 3105 | $poweroff_on_error = set_test_option("POWEROFF_ON_ERROR", $i); |
@@ -2832,6 +3121,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
2832 | $console = set_test_option("CONSOLE", $i); | 3121 | $console = set_test_option("CONSOLE", $i); |
2833 | $detect_triplefault = set_test_option("DETECT_TRIPLE_FAULT", $i); | 3122 | $detect_triplefault = set_test_option("DETECT_TRIPLE_FAULT", $i); |
2834 | $success_line = set_test_option("SUCCESS_LINE", $i); | 3123 | $success_line = set_test_option("SUCCESS_LINE", $i); |
3124 | $reboot_success_line = set_test_option("REBOOT_SUCCESS_LINE", $i); | ||
2835 | $stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i); | 3125 | $stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i); |
2836 | $stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i); | 3126 | $stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i); |
2837 | $stop_test_after = set_test_option("STOP_TEST_AFTER", $i); | 3127 | $stop_test_after = set_test_option("STOP_TEST_AFTER", $i); |
@@ -2850,9 +3140,11 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
2850 | 3140 | ||
2851 | chdir $builddir || die "can't change directory to $builddir"; | 3141 | chdir $builddir || die "can't change directory to $builddir"; |
2852 | 3142 | ||
2853 | if (!-d $tmpdir) { | 3143 | foreach my $dir ($tmpdir, $outputdir) { |
2854 | mkpath($tmpdir) or | 3144 | if (!-d $dir) { |
2855 | die "can't create $tmpdir"; | 3145 | mkpath($dir) or |
3146 | die "can't create $dir"; | ||
3147 | } | ||
2856 | } | 3148 | } |
2857 | 3149 | ||
2858 | $ENV{"SSH_USER"} = $ssh_user; | 3150 | $ENV{"SSH_USER"} = $ssh_user; |
@@ -2889,8 +3181,11 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
2889 | $run_type = "ERROR"; | 3181 | $run_type = "ERROR"; |
2890 | } | 3182 | } |
2891 | 3183 | ||
3184 | my $installme = ""; | ||
3185 | $installme = " no_install" if ($no_install); | ||
3186 | |||
2892 | doprint "\n\n"; | 3187 | doprint "\n\n"; |
2893 | doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type\n\n"; | 3188 | doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type$installme\n\n"; |
2894 | 3189 | ||
2895 | unlink $dmesg; | 3190 | unlink $dmesg; |
2896 | unlink $buildlog; | 3191 | unlink $buildlog; |
@@ -2911,6 +3206,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
2911 | die "failed to checkout $checkout"; | 3206 | die "failed to checkout $checkout"; |
2912 | } | 3207 | } |
2913 | 3208 | ||
3209 | $no_reboot = 0; | ||
3210 | |||
3211 | |||
2914 | if ($test_type eq "bisect") { | 3212 | if ($test_type eq "bisect") { |
2915 | bisect $i; | 3213 | bisect $i; |
2916 | next; | 3214 | next; |
@@ -2929,6 +3227,13 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
2929 | build $build_type or next; | 3227 | build $build_type or next; |
2930 | } | 3228 | } |
2931 | 3229 | ||
3230 | if ($test_type eq "install") { | ||
3231 | get_version; | ||
3232 | install; | ||
3233 | success $i; | ||
3234 | next; | ||
3235 | } | ||
3236 | |||
2932 | if ($test_type ne "build") { | 3237 | if ($test_type ne "build") { |
2933 | my $failed = 0; | 3238 | my $failed = 0; |
2934 | start_monitor_and_boot or $failed = 1; | 3239 | start_monitor_and_boot or $failed = 1; |
diff --git a/tools/testing/ktest/sample.conf b/tools/testing/ktest/sample.conf index b8bcd14b5a4d..dbedfa196727 100644 --- a/tools/testing/ktest/sample.conf +++ b/tools/testing/ktest/sample.conf | |||
@@ -72,6 +72,128 @@ | |||
72 | # the same option name under the same test or as default | 72 | # the same option name under the same test or as default |
73 | # ktest will fail to execute, and no tests will run. | 73 | # ktest will fail to execute, and no tests will run. |
74 | # | 74 | # |
75 | # DEFAULTS OVERRIDE | ||
76 | # | ||
77 | # Options defined in the DEFAULTS section can not be duplicated | ||
78 | # even if they are defined in two different DEFAULT sections. | ||
79 | # This is done to catch mistakes where an option is added but | ||
80 | # the previous option was forgotten about and not commented. | ||
81 | # | ||
82 | # The OVERRIDE keyword can be added to a section to allow this | ||
83 | # section to override other DEFAULT sections values that have | ||
84 | # been defined previously. It will only override options that | ||
85 | # have been defined before its use. Options defined later | ||
86 | # in a non override section will still error. The same option | ||
87 | # can not be defined in the same section even if that section | ||
88 | # is marked OVERRIDE. | ||
89 | # | ||
90 | # | ||
91 | # | ||
92 | # Both TEST_START and DEFAULTS sections can also have the IF keyword | ||
93 | # The value after the IF must evaluate into a 0 or non 0 positive | ||
94 | # integer, and can use the config variables (explained below). | ||
95 | # | ||
96 | # DEFAULTS IF ${IS_X86_32} | ||
97 | # | ||
98 | # The above will process the DEFAULTS section if the config | ||
99 | # variable IS_X86_32 evaluates to a non zero positive integer | ||
100 | # otherwise if it evaluates to zero, it will act the same | ||
101 | # as if the SKIP keyword was used. | ||
102 | # | ||
103 | # The ELSE keyword can be used directly after a section with | ||
104 | # a IF statement. | ||
105 | # | ||
106 | # TEST_START IF ${RUN_NET_TESTS} | ||
107 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-network | ||
108 | # | ||
109 | # ELSE | ||
110 | # | ||
111 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-normal | ||
112 | # | ||
113 | # | ||
114 | # The ELSE keyword can also contain an IF statement to allow multiple | ||
115 | # if then else sections. But all the sections must be either | ||
116 | # DEFAULT or TEST_START, they can not be a mixture. | ||
117 | # | ||
118 | # TEST_START IF ${RUN_NET_TESTS} | ||
119 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-network | ||
120 | # | ||
121 | # ELSE IF ${RUN_DISK_TESTS} | ||
122 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-tests | ||
123 | # | ||
124 | # ELSE IF ${RUN_CPU_TESTS} | ||
125 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-cpu | ||
126 | # | ||
127 | # ELSE | ||
128 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-network | ||
129 | # | ||
130 | # The if statement may also have comparisons that will and for | ||
131 | # == and !=, strings may be used for both sides. | ||
132 | # | ||
133 | # BOX_TYPE := x86_32 | ||
134 | # | ||
135 | # DEFAULTS IF ${BOX_TYPE} == x86_32 | ||
136 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-32 | ||
137 | # ELSE | ||
138 | # BUILD_TYPE = useconfig:${CONFIG_DIR}/config-64 | ||
139 | # | ||
140 | # The DEFINED keyword can be used by the IF statements too. | ||
141 | # It returns true if the given config variable or option has been defined | ||
142 | # or false otherwise. | ||
143 | # | ||
144 | # | ||
145 | # DEFAULTS IF DEFINED USE_CC | ||
146 | # CC := ${USE_CC} | ||
147 | # ELSE | ||
148 | # CC := gcc | ||
149 | # | ||
150 | # | ||
151 | # As well as NOT DEFINED. | ||
152 | # | ||
153 | # DEFAULTS IF NOT DEFINED MAKE_CMD | ||
154 | # MAKE_CMD := make ARCH=x86 | ||
155 | # | ||
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 | # | ||
167 | # | ||
168 | # INCLUDE file | ||
169 | # | ||
170 | # The INCLUDE keyword may be used in DEFAULT sections. This will | ||
171 | # read another config file and process that file as well. The included | ||
172 | # file can include other files, add new test cases or default | ||
173 | # statements. Config variables will be passed to these files and changes | ||
174 | # to config variables will be seen by top level config files. Including | ||
175 | # a file is processed just like the contents of the file was cut and pasted | ||
176 | # into the top level file, except, that include files that end with | ||
177 | # TEST_START sections will have that section ended at the end of | ||
178 | # the include file. That is, an included file is included followed | ||
179 | # by another DEFAULT keyword. | ||
180 | # | ||
181 | # Unlike other files referenced in this config, the file path does not need | ||
182 | # to be absolute. If the file does not start with '/', then the directory | ||
183 | # that the current config file was located in is used. If no config by the | ||
184 | # given name is found there, then the current directory is searched. | ||
185 | # | ||
186 | # INCLUDE myfile | ||
187 | # DEFAULT | ||
188 | # | ||
189 | # is the same as: | ||
190 | # | ||
191 | # INCLUDE myfile | ||
192 | # | ||
193 | # Note, if the include file does not contain a full path, the file is | ||
194 | # searched first by the location of the original include file, and then | ||
195 | # by the location that ktest.pl was executed in. | ||
196 | # | ||
75 | 197 | ||
76 | #### Config variables #### | 198 | #### Config variables #### |
77 | # | 199 | # |
@@ -253,9 +375,10 @@ | |||
253 | 375 | ||
254 | # The default test type (default test) | 376 | # The default test type (default test) |
255 | # The test types may be: | 377 | # The test types may be: |
256 | # build - only build the kernel, do nothing else | 378 | # build - only build the kernel, do nothing else |
257 | # boot - build and boot the kernel | 379 | # install - build and install, but do nothing else (does not reboot) |
258 | # test - build, boot and if TEST is set, run the test script | 380 | # boot - build, install, and boot the kernel |
381 | # test - build, boot and if TEST is set, run the test script | ||
259 | # (If TEST is not set, it defaults back to boot) | 382 | # (If TEST is not set, it defaults back to boot) |
260 | # bisect - Perform a bisect on the kernel (see BISECT_TYPE below) | 383 | # bisect - Perform a bisect on the kernel (see BISECT_TYPE below) |
261 | # patchcheck - Do a test on a series of commits in git (see PATCHCHECK below) | 384 | # patchcheck - Do a test on a series of commits in git (see PATCHCHECK below) |
@@ -293,6 +416,13 @@ | |||
293 | # or on some systems: | 416 | # or on some systems: |
294 | #POST_INSTALL = ssh user@target /sbin/dracut -f /boot/initramfs-test.img $KERNEL_VERSION | 417 | #POST_INSTALL = ssh user@target /sbin/dracut -f /boot/initramfs-test.img $KERNEL_VERSION |
295 | 418 | ||
419 | # If for some reason you just want to boot the kernel and you do not | ||
420 | # want the test to install anything new. For example, you may just want | ||
421 | # to boot test the same kernel over and over and do not want to go through | ||
422 | # the hassle of installing anything, you can set this option to 1 | ||
423 | # (default 0) | ||
424 | #NO_INSTALL = 1 | ||
425 | |||
296 | # If there is a script that you require to run before the build is done | 426 | # If there is a script that you require to run before the build is done |
297 | # you can specify it with PRE_BUILD. | 427 | # you can specify it with PRE_BUILD. |
298 | # | 428 | # |
@@ -415,6 +545,14 @@ | |||
415 | # (default "login:") | 545 | # (default "login:") |
416 | #SUCCESS_LINE = login: | 546 | #SUCCESS_LINE = login: |
417 | 547 | ||
548 | # To speed up between reboots, defining a line that the | ||
549 | # default kernel produces that represents that the default | ||
550 | # kernel has successfully booted and can be used to pass | ||
551 | # a new test kernel to it. Otherwise ktest.pl will wait till | ||
552 | # SLEEP_TIME to continue. | ||
553 | # (default undefined) | ||
554 | #REBOOT_SUCCESS_LINE = login: | ||
555 | |||
418 | # In case the console constantly fills the screen, having | 556 | # In case the console constantly fills the screen, having |
419 | # a specified time to stop the test after success is recommended. | 557 | # a specified time to stop the test after success is recommended. |
420 | # (in seconds) | 558 | # (in seconds) |
@@ -480,6 +618,8 @@ | |||
480 | # another test. If a reboot to the reliable kernel happens, | 618 | # another test. If a reboot to the reliable kernel happens, |
481 | # we wait SLEEP_TIME for the console to stop producing output | 619 | # we wait SLEEP_TIME for the console to stop producing output |
482 | # before starting the next test. | 620 | # before starting the next test. |
621 | # | ||
622 | # You can speed up reboot times even more by setting REBOOT_SUCCESS_LINE. | ||
483 | # (default 60) | 623 | # (default 60) |
484 | #SLEEP_TIME = 60 | 624 | #SLEEP_TIME = 60 |
485 | 625 | ||