Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-ktest
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-2.6-ktest: ktest: Allow options to be used by other options ktest: Create variables for the ktest config files ktest: Reboot after each patchcheck run ktest: Reboot to good kernel after every bisect run ktest: If test failed due to timeout, print that ktest: Fix post install command
This commit is contained in:
commit
2e77defc5d
|
@ -36,6 +36,7 @@ $default{"REBOOT_ON_SUCCESS"} = 1;
|
|||
$default{"POWEROFF_ON_SUCCESS"} = 0;
|
||||
$default{"BUILD_OPTIONS"} = "";
|
||||
$default{"BISECT_SLEEP_TIME"} = 60; # sleep time between bisects
|
||||
$default{"PATCHCHECK_SLEEP_TIME"} = 60; # sleep time between patch checks
|
||||
$default{"CLEAR_LOG"} = 0;
|
||||
$default{"BISECT_MANUAL"} = 0;
|
||||
$default{"BISECT_SKIP"} = 1;
|
||||
|
@ -96,6 +97,7 @@ my $monitor_pid;
|
|||
my $monitor_cnt = 0;
|
||||
my $sleep_time;
|
||||
my $bisect_sleep_time;
|
||||
my $patchcheck_sleep_time;
|
||||
my $store_failures;
|
||||
my $timeout;
|
||||
my $booted_timeout;
|
||||
|
@ -112,6 +114,7 @@ my $successes = 0;
|
|||
|
||||
my %entered_configs;
|
||||
my %config_help;
|
||||
my %variable;
|
||||
|
||||
$config_help{"MACHINE"} = << "EOF"
|
||||
The machine hostname that you will test.
|
||||
|
@ -260,6 +263,39 @@ sub get_ktest_configs {
|
|||
}
|
||||
}
|
||||
|
||||
sub process_variables {
|
||||
my ($value) = @_;
|
||||
my $retval = "";
|
||||
|
||||
# We want to check for '\', and it is just easier
|
||||
# to check the previous characet of '$' and not need
|
||||
# to worry if '$' is the first character. By adding
|
||||
# a space to $value, we can just check [^\\]\$ and
|
||||
# it will still work.
|
||||
$value = " $value";
|
||||
|
||||
while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
|
||||
my $begin = $1;
|
||||
my $var = $2;
|
||||
my $end = $3;
|
||||
# append beginning of value to retval
|
||||
$retval = "$retval$begin";
|
||||
if (defined($variable{$var})) {
|
||||
$retval = "$retval$variable{$var}";
|
||||
} else {
|
||||
# put back the origin piece.
|
||||
$retval = "$retval\$\{$var\}";
|
||||
}
|
||||
$value = $end;
|
||||
}
|
||||
$retval = "$retval$value";
|
||||
|
||||
# remove the space added in the beginning
|
||||
$retval =~ s/ //;
|
||||
|
||||
return "$retval"
|
||||
}
|
||||
|
||||
sub set_value {
|
||||
my ($lvalue, $rvalue) = @_;
|
||||
|
||||
|
@ -269,10 +305,22 @@ sub set_value {
|
|||
if ($rvalue =~ /^\s*$/) {
|
||||
delete $opt{$lvalue};
|
||||
} else {
|
||||
$rvalue = process_variables($rvalue);
|
||||
$opt{$lvalue} = $rvalue;
|
||||
}
|
||||
}
|
||||
|
||||
sub set_variable {
|
||||
my ($lvalue, $rvalue) = @_;
|
||||
|
||||
if ($rvalue =~ /^\s*$/) {
|
||||
delete $variable{$lvalue};
|
||||
} else {
|
||||
$rvalue = process_variables($rvalue);
|
||||
$variable{$lvalue} = $rvalue;
|
||||
}
|
||||
}
|
||||
|
||||
sub read_config {
|
||||
my ($config) = @_;
|
||||
|
||||
|
@ -385,6 +433,22 @@ sub read_config {
|
|||
$repeats{$val} = $repeat;
|
||||
}
|
||||
}
|
||||
} elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
|
||||
next if ($skip);
|
||||
|
||||
my $lvalue = $1;
|
||||
my $rvalue = $2;
|
||||
|
||||
# process config variables.
|
||||
# Config variables are only active while reading the
|
||||
# config and can be defined anywhere. They also ignore
|
||||
# TEST_START and DEFAULTS, but are skipped if they are in
|
||||
# on of these sections that have SKIP defined.
|
||||
# The save variable can be
|
||||
# defined multiple times and the new one simply overrides
|
||||
# the prevous one.
|
||||
set_variable($lvalue, $rvalue);
|
||||
|
||||
} else {
|
||||
die "$name: $.: Garbage found in config\n$_";
|
||||
}
|
||||
|
@ -838,6 +902,7 @@ sub monitor {
|
|||
|
||||
if ($stop_test_after > 0 && !$booted && !$bug) {
|
||||
if (time - $monitor_start > $stop_test_after) {
|
||||
doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
|
||||
$done = 1;
|
||||
}
|
||||
}
|
||||
|
@ -907,7 +972,7 @@ sub install {
|
|||
return if (!defined($post_install));
|
||||
|
||||
my $cp_post_install = $post_install;
|
||||
$cp_post_install = s/\$KERNEL_VERSION/$version/g;
|
||||
$cp_post_install =~ s/\$KERNEL_VERSION/$version/g;
|
||||
run_command "$cp_post_install" or
|
||||
dodie "Failed to run post install";
|
||||
}
|
||||
|
@ -1247,14 +1312,14 @@ sub run_bisect_test {
|
|||
|
||||
if ($failed) {
|
||||
$result = 0;
|
||||
|
||||
# reboot the box to a good kernel
|
||||
if ($type ne "build") {
|
||||
bisect_reboot;
|
||||
}
|
||||
} else {
|
||||
$result = 1;
|
||||
}
|
||||
|
||||
# reboot the box to a kernel we can ssh to
|
||||
if ($type ne "build") {
|
||||
bisect_reboot;
|
||||
}
|
||||
$in_bisect = 0;
|
||||
|
||||
return $result;
|
||||
|
@ -1763,6 +1828,14 @@ sub config_bisect {
|
|||
success $i;
|
||||
}
|
||||
|
||||
sub patchcheck_reboot {
|
||||
doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
|
||||
reboot;
|
||||
start_monitor;
|
||||
wait_for_monitor $patchcheck_sleep_time;
|
||||
end_monitor;
|
||||
}
|
||||
|
||||
sub patchcheck {
|
||||
my ($i) = @_;
|
||||
|
||||
|
@ -1854,6 +1927,8 @@ sub patchcheck {
|
|||
end_monitor;
|
||||
return 0 if ($failed);
|
||||
|
||||
patchcheck_reboot;
|
||||
|
||||
}
|
||||
$in_patchcheck = 0;
|
||||
success $i;
|
||||
|
@ -1944,7 +2019,7 @@ for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
|
|||
}
|
||||
}
|
||||
|
||||
sub set_test_option {
|
||||
sub __set_test_option {
|
||||
my ($name, $i) = @_;
|
||||
|
||||
my $option = "$name\[$i\]";
|
||||
|
@ -1970,6 +2045,72 @@ sub set_test_option {
|
|||
return undef;
|
||||
}
|
||||
|
||||
sub eval_option {
|
||||
my ($option, $i) = @_;
|
||||
|
||||
# Add space to evaluate the character before $
|
||||
$option = " $option";
|
||||
my $retval = "";
|
||||
|
||||
while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
|
||||
my $start = $1;
|
||||
my $var = $2;
|
||||
my $end = $3;
|
||||
|
||||
# Append beginning of line
|
||||
$retval = "$retval$start";
|
||||
|
||||
# If the iteration option OPT[$i] exists, then use that.
|
||||
# otherwise see if the default OPT (without [$i]) exists.
|
||||
|
||||
my $o = "$var\[$i\]";
|
||||
|
||||
if (defined($opt{$o})) {
|
||||
$o = $opt{$o};
|
||||
$retval = "$retval$o";
|
||||
} elsif (defined($opt{$var})) {
|
||||
$o = $opt{$var};
|
||||
$retval = "$retval$o";
|
||||
} else {
|
||||
$retval = "$retval\$\{$var\}";
|
||||
}
|
||||
|
||||
$option = $end;
|
||||
}
|
||||
|
||||
$retval = "$retval$option";
|
||||
|
||||
$retval =~ s/^ //;
|
||||
|
||||
return $retval;
|
||||
}
|
||||
|
||||
sub set_test_option {
|
||||
my ($name, $i) = @_;
|
||||
|
||||
my $option = __set_test_option($name, $i);
|
||||
return $option if (!defined($option));
|
||||
|
||||
my $prev = "";
|
||||
|
||||
# Since an option can evaluate to another option,
|
||||
# keep iterating until we do not evaluate any more
|
||||
# options.
|
||||
my $r = 0;
|
||||
while ($prev ne $option) {
|
||||
# Check for recursive evaluations.
|
||||
# 100 deep should be more than enough.
|
||||
if ($r++ > 100) {
|
||||
die "Over 100 evaluations accurred with $name\n" .
|
||||
"Check for recursive variables\n";
|
||||
}
|
||||
$prev = $option;
|
||||
$option = eval_option($option, $i);
|
||||
}
|
||||
|
||||
return $option;
|
||||
}
|
||||
|
||||
# First we need to do is the builds
|
||||
for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
|
||||
|
||||
|
@ -2003,6 +2144,7 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
|
|||
$poweroff_after_halt = set_test_option("POWEROFF_AFTER_HALT", $i);
|
||||
$sleep_time = set_test_option("SLEEP_TIME", $i);
|
||||
$bisect_sleep_time = set_test_option("BISECT_SLEEP_TIME", $i);
|
||||
$patchcheck_sleep_time = set_test_option("PATCHCHECK_SLEEP_TIME", $i);
|
||||
$bisect_manual = set_test_option("BISECT_MANUAL", $i);
|
||||
$bisect_skip = set_test_option("BISECT_SKIP", $i);
|
||||
$store_failures = set_test_option("STORE_FAILURES", $i);
|
||||
|
|
|
@ -73,6 +73,95 @@
|
|||
# ktest will fail to execute, and no tests will run.
|
||||
#
|
||||
|
||||
#### Config variables ####
|
||||
#
|
||||
# This config file can also contain "config variables".
|
||||
# These are assigned with ":=" instead of the ktest option
|
||||
# assigment "=".
|
||||
#
|
||||
# The difference between ktest options and config variables
|
||||
# is that config variables can be used multiple times,
|
||||
# where each instance will override the previous instance.
|
||||
# And that they only live at time of processing this config.
|
||||
#
|
||||
# The advantage to config variables are that they can be used
|
||||
# by any option or any other config variables to define thing
|
||||
# that you may use over and over again in the options.
|
||||
#
|
||||
# For example:
|
||||
#
|
||||
# USER := root
|
||||
# TARGET := mybox
|
||||
# TEST_CASE := ssh ${USER}@${TARGET} /path/to/my/test
|
||||
#
|
||||
# TEST_START
|
||||
# MIN_CONFIG = config1
|
||||
# TEST = ${TEST_CASE}
|
||||
#
|
||||
# TEST_START
|
||||
# MIN_CONFIG = config2
|
||||
# TEST = ${TEST_CASE}
|
||||
#
|
||||
# TEST_CASE := ssh ${USER}@${TARGET} /path/to/my/test2
|
||||
#
|
||||
# TEST_START
|
||||
# MIN_CONFIG = config1
|
||||
# TEST = ${TEST_CASE}
|
||||
#
|
||||
# TEST_START
|
||||
# MIN_CONFIG = config2
|
||||
# TEST = ${TEST_CASE}
|
||||
#
|
||||
# TEST_DIR := /home/me/test
|
||||
#
|
||||
# BUILD_DIR = ${TEST_DIR}/linux.git
|
||||
# OUTPUT_DIR = ${TEST_DIR}/test
|
||||
#
|
||||
# Note, the config variables are evaluated immediately, thus
|
||||
# updating TARGET after TEST_CASE has been assigned does nothing
|
||||
# to TEST_CASE.
|
||||
#
|
||||
# As shown in the example, to evaluate a config variable, you
|
||||
# use the ${X} convention. Simple $X will not work.
|
||||
#
|
||||
# If the config variable does not exist, the ${X} will not
|
||||
# be evaluated. Thus:
|
||||
#
|
||||
# MAKE_CMD = PATH=/mypath:${PATH} make
|
||||
#
|
||||
# If PATH is not a config variable, then the ${PATH} in
|
||||
# the MAKE_CMD option will be evaluated by the shell when
|
||||
# the MAKE_CMD option is passed into shell processing.
|
||||
|
||||
#### Using options in other options ####
|
||||
#
|
||||
# Options that are defined in the config file may also be used
|
||||
# by other options. All options are evaulated at time of
|
||||
# use (except that config variables are evaluated at config
|
||||
# processing time).
|
||||
#
|
||||
# If an ktest option is used within another option, instead of
|
||||
# typing it again in that option you can simply use the option
|
||||
# just like you can config variables.
|
||||
#
|
||||
# MACHINE = mybox
|
||||
#
|
||||
# TEST = ssh root@${MACHINE} /path/to/test
|
||||
#
|
||||
# The option will be used per test case. Thus:
|
||||
#
|
||||
# TEST_TYPE = test
|
||||
# TEST = ssh root@{MACHINE}
|
||||
#
|
||||
# TEST_START
|
||||
# MACHINE = box1
|
||||
#
|
||||
# TEST_START
|
||||
# MACHINE = box2
|
||||
#
|
||||
# For both test cases, MACHINE will be evaluated at the time
|
||||
# of the test case. The first test will run ssh root@box1
|
||||
# and the second will run ssh root@box2.
|
||||
|
||||
#### Mandatory Default Options ####
|
||||
|
||||
|
@ -366,6 +455,10 @@
|
|||
# (default 60)
|
||||
#BISECT_SLEEP_TIME = 60
|
||||
|
||||
# The time in between patch checks to sleep (in seconds)
|
||||
# (default 60)
|
||||
#PATCHCHECK_SLEEP_TIME = 60
|
||||
|
||||
# Reboot the target box on error (default 0)
|
||||
#REBOOT_ON_ERROR = 0
|
||||
|
||||
|
|
Loading…
Reference in New Issue