Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/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
  • Loading branch information
torvalds committed May 23, 2011
2 parents caebc16 + 2a62512 commit 2e77def
Show file tree
Hide file tree
Showing 2 changed files with 242 additions and 7 deletions.
156 changes: 149 additions & 7 deletions tools/testing/ktest/ktest.pl
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
$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;
Expand Down Expand Up @@ -96,6 +97,7 @@
my $monitor_cnt = 0;
my $sleep_time;
my $bisect_sleep_time;
my $patchcheck_sleep_time;
my $store_failures;
my $timeout;
my $booted_timeout;
Expand All @@ -112,6 +114,7 @@

my %entered_configs;
my %config_help;
my %variable;

$config_help{"MACHINE"} = << "EOF"
The machine hostname that you will test.
Expand Down Expand Up @@ -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) = @_;

Expand All @@ -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) = @_;

Expand Down Expand Up @@ -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$_";
}
Expand Down Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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";
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) = @_;

Expand Down Expand Up @@ -1854,6 +1927,8 @@ sub patchcheck {
end_monitor;
return 0 if ($failed);

patchcheck_reboot;

}
$in_patchcheck = 0;
success $i;
Expand Down Expand Up @@ -1944,7 +2019,7 @@ sub patchcheck {
}
}

sub set_test_option {
sub __set_test_option {
my ($name, $i) = @_;

my $option = "$name\[$i\]";
Expand All @@ -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++) {

Expand Down Expand Up @@ -2003,6 +2144,7 @@ sub set_test_option {
$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);
Expand Down
93 changes: 93 additions & 0 deletions tools/testing/ktest/sample.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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 ####

Expand Down Expand Up @@ -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

Expand Down

0 comments on commit 2e77def

Please sign in to comment.