diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 18:43:21 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 18:43:21 -0500 |
| commit | c69d0a15d240a854f6d620ac7d5238a41883a920 (patch) | |
| tree | 61a1014167d33e9a8e8bd08a8d3f0b736d57aa03 | |
| parent | 9043a2650cd21f96f831a97f516c2c302e21fb70 (diff) | |
| parent | 7328735cbf68b7cd4d7ef16e172013743cdc2bc4 (diff) | |
Merge tag 'ktest-v3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest
Pull ktest update from Steven Rostedt:
"Added ability to have all builds test warnings.
Fixed failing reboot when the reboot produces a non fatal error.
Config reading fixes and other cleanups"
* tag 'ktest-v3.9' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
ktest: Remove indexes from warnings check
ktest: Ignore warnings during reboot
ktest: Search for linux banner for successful reboot
ktest: Add make_warnings_file and process full warnings
ktest: Allow a test option to use its default option
ktest: Strip off '\n' when reading which files were modified
ktest: Do not require CONSOLE for build or install bisects
| -rw-r--r-- | tools/testing/ktest/examples/include/patchcheck.conf | 37 | ||||
| -rwxr-xr-x | tools/testing/ktest/ktest.pl | 190 | ||||
| -rw-r--r-- | tools/testing/ktest/sample.conf | 44 |
3 files changed, 253 insertions, 18 deletions
diff --git a/tools/testing/ktest/examples/include/patchcheck.conf b/tools/testing/ktest/examples/include/patchcheck.conf index 339d3e1700ff..0eb0a5ac77da 100644 --- a/tools/testing/ktest/examples/include/patchcheck.conf +++ b/tools/testing/ktest/examples/include/patchcheck.conf | |||
| @@ -14,6 +14,16 @@ | |||
| 14 | PATCH_START := HEAD~3 | 14 | PATCH_START := HEAD~3 |
| 15 | PATCH_END := HEAD | 15 | PATCH_END := HEAD |
| 16 | 16 | ||
| 17 | # Use the oldconfig if build_type wasn't defined | ||
| 18 | DEFAULTS IF NOT DEFINED BUILD_TYPE | ||
| 19 | DO_BUILD_TYPE := oldconfig | ||
| 20 | |||
| 21 | DEFAULTS ELSE | ||
| 22 | DO_BUILD_TYPE := ${BUILD_TYPE} | ||
| 23 | |||
| 24 | DEFAULTS | ||
| 25 | |||
| 26 | |||
| 17 | # Change PATCH_CHECKOUT to be the branch you want to test. The test will | 27 | # Change PATCH_CHECKOUT to be the branch you want to test. The test will |
| 18 | # do a git checkout of this branch before starting. Obviously both | 28 | # do a git checkout of this branch before starting. Obviously both |
| 19 | # PATCH_START and PATCH_END must be in this branch (and PATCH_START must | 29 | # PATCH_START and PATCH_END must be in this branch (and PATCH_START must |
| @@ -43,6 +53,31 @@ PATCH_TEST_TYPE := boot | |||
| 43 | # (space delimited) | 53 | # (space delimited) |
| 44 | #IGNORE_WARNINGS = 39eaf7ef884dcc44f7ff1bac803ca2a1dcf43544 6edb2a8a385f0cdef51dae37ff23e74d76d8a6ce | 54 | #IGNORE_WARNINGS = 39eaf7ef884dcc44f7ff1bac803ca2a1dcf43544 6edb2a8a385f0cdef51dae37ff23e74d76d8a6ce |
| 45 | 55 | ||
| 56 | # Instead of just checking for warnings to files that are changed | ||
| 57 | # it can be advantageous to check for any new warnings. If a | ||
| 58 | # header file is changed, it could cause a warning in a file not | ||
| 59 | # touched by the commit. To detect these kinds of warnings, you | ||
| 60 | # can use the WARNINGS_FILE option. | ||
| 61 | # | ||
| 62 | # If the variable CREATE_WARNINGS_FILE is set, this config will | ||
| 63 | # enable the WARNINGS_FILE during the patchcheck test. Also, | ||
| 64 | # before running the patchcheck test, it will create the | ||
| 65 | # warnings file. | ||
| 66 | # | ||
| 67 | DEFAULTS IF DEFINED CREATE_WARNINGS_FILE | ||
| 68 | WARNINGS_FILE = ${OUTPUT_DIR}/warnings_file | ||
| 69 | |||
| 70 | TEST_START IF DEFINED CREATE_WARNINGS_FILE | ||
| 71 | # WARNINGS_FILE is already set by the DEFAULTS above | ||
| 72 | TEST_TYPE = make_warnings_file | ||
| 73 | # Checkout the commit before the patches to test, | ||
| 74 | # and record all the warnings that exist before the patches | ||
| 75 | # to test are added | ||
| 76 | CHECKOUT = ${PATCHCHECK_START}~1 | ||
| 77 | # Force a full build | ||
| 78 | BUILD_NOCLEAN = 0 | ||
| 79 | BUILD_TYPE = ${DO_BUILD_TYPE} | ||
| 80 | |||
| 46 | # If you are running a multi test, and the test failed on the first | 81 | # If you are running a multi test, and the test failed on the first |
| 47 | # test but on, say the 5th patch. If you want to restart on the | 82 | # test but on, say the 5th patch. If you want to restart on the |
| 48 | # fifth patch, set PATCH_START1. This will make the first test start | 83 | # fifth patch, set PATCH_START1. This will make the first test start |
| @@ -61,6 +96,7 @@ PATCHCHECK_TYPE = ${PATCH_TEST_TYPE} | |||
| 61 | PATCHCHECK_START = ${PATCH_START1} | 96 | PATCHCHECK_START = ${PATCH_START1} |
| 62 | PATCHCHECK_END = ${PATCH_END} | 97 | PATCHCHECK_END = ${PATCH_END} |
| 63 | CHECKOUT = ${PATCH_CHECKOUT} | 98 | CHECKOUT = ${PATCH_CHECKOUT} |
| 99 | BUILD_TYPE = ${DO_BUILD_TYPE} | ||
| 64 | 100 | ||
| 65 | TEST_START IF ${TEST} == patchcheck && ${MULTI} | 101 | TEST_START IF ${TEST} == patchcheck && ${MULTI} |
| 66 | TEST_TYPE = patchcheck | 102 | TEST_TYPE = patchcheck |
| @@ -72,3 +108,4 @@ PATCHCHECK_END = ${PATCH_END} | |||
| 72 | CHECKOUT = ${PATCH_CHECKOUT} | 108 | CHECKOUT = ${PATCH_CHECKOUT} |
| 73 | # Use multi to test different compilers? | 109 | # Use multi to test different compilers? |
| 74 | MAKE_CMD = CC=gcc-4.5.1 make | 110 | MAKE_CMD = CC=gcc-4.5.1 make |
| 111 | BUILD_TYPE = ${DO_BUILD_TYPE} | ||
diff --git a/tools/testing/ktest/ktest.pl b/tools/testing/ktest/ktest.pl index 35fc584a4ffe..4e67d52eb3a2 100755 --- a/tools/testing/ktest/ktest.pl +++ b/tools/testing/ktest/ktest.pl | |||
| @@ -126,6 +126,7 @@ my $start_minconfig_defined; | |||
| 126 | my $output_minconfig; | 126 | my $output_minconfig; |
| 127 | my $minconfig_type; | 127 | my $minconfig_type; |
| 128 | my $use_output_minconfig; | 128 | my $use_output_minconfig; |
| 129 | my $warnings_file; | ||
| 129 | my $ignore_config; | 130 | my $ignore_config; |
| 130 | my $ignore_errors; | 131 | my $ignore_errors; |
| 131 | my $addconfig; | 132 | my $addconfig; |
| @@ -193,6 +194,9 @@ my $patchcheck_end; | |||
| 193 | # which would require more options. | 194 | # which would require more options. |
| 194 | my $buildonly = 1; | 195 | my $buildonly = 1; |
| 195 | 196 | ||
| 197 | # tell build not to worry about warnings, even when WARNINGS_FILE is set | ||
| 198 | my $warnings_ok = 0; | ||
| 199 | |||
| 196 | # set when creating a new config | 200 | # set when creating a new config |
| 197 | my $newconfig = 0; | 201 | my $newconfig = 0; |
| 198 | 202 | ||
| @@ -235,6 +239,7 @@ my %option_map = ( | |||
| 235 | "START_MIN_CONFIG" => \$start_minconfig, | 239 | "START_MIN_CONFIG" => \$start_minconfig, |
| 236 | "MIN_CONFIG_TYPE" => \$minconfig_type, | 240 | "MIN_CONFIG_TYPE" => \$minconfig_type, |
| 237 | "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig, | 241 | "USE_OUTPUT_MIN_CONFIG" => \$use_output_minconfig, |
| 242 | "WARNINGS_FILE" => \$warnings_file, | ||
| 238 | "IGNORE_CONFIG" => \$ignore_config, | 243 | "IGNORE_CONFIG" => \$ignore_config, |
| 239 | "TEST" => \$run_test, | 244 | "TEST" => \$run_test, |
| 240 | "ADD_CONFIG" => \$addconfig, | 245 | "ADD_CONFIG" => \$addconfig, |
| @@ -619,6 +624,18 @@ sub set_value { | |||
| 619 | # Note if a test is something other than build, then we | 624 | # Note if a test is something other than build, then we |
| 620 | # will need other manditory options. | 625 | # will need other manditory options. |
| 621 | if ($prvalue ne "install") { | 626 | if ($prvalue ne "install") { |
| 627 | # for bisect, we need to check BISECT_TYPE | ||
| 628 | if ($prvalue ne "bisect") { | ||
| 629 | $buildonly = 0; | ||
| 630 | } | ||
| 631 | } else { | ||
| 632 | # install still limits some manditory options. | ||
| 633 | $buildonly = 2; | ||
| 634 | } | ||
| 635 | } | ||
| 636 | |||
| 637 | if ($buildonly && $lvalue =~ /^BISECT_TYPE(\[.*\])?$/ && $prvalue ne "build") { | ||
| 638 | if ($prvalue ne "install") { | ||
| 622 | $buildonly = 0; | 639 | $buildonly = 0; |
| 623 | } else { | 640 | } else { |
| 624 | # install still limits some manditory options. | 641 | # install still limits some manditory options. |
| @@ -1062,7 +1079,7 @@ sub read_config { | |||
| 1062 | } | 1079 | } |
| 1063 | 1080 | ||
| 1064 | sub __eval_option { | 1081 | sub __eval_option { |
| 1065 | my ($option, $i) = @_; | 1082 | my ($name, $option, $i) = @_; |
| 1066 | 1083 | ||
| 1067 | # Add space to evaluate the character before $ | 1084 | # Add space to evaluate the character before $ |
| 1068 | $option = " $option"; | 1085 | $option = " $option"; |
| @@ -1094,7 +1111,11 @@ sub __eval_option { | |||
| 1094 | my $o = "$var\[$i\]"; | 1111 | my $o = "$var\[$i\]"; |
| 1095 | my $parento = "$var\[$parent\]"; | 1112 | my $parento = "$var\[$parent\]"; |
| 1096 | 1113 | ||
| 1097 | if (defined($opt{$o})) { | 1114 | # If a variable contains itself, use the default var |
| 1115 | if (($var eq $name) && defined($opt{$var})) { | ||
| 1116 | $o = $opt{$var}; | ||
| 1117 | $retval = "$retval$o"; | ||
| 1118 | } elsif (defined($opt{$o})) { | ||
| 1098 | $o = $opt{$o}; | 1119 | $o = $opt{$o}; |
| 1099 | $retval = "$retval$o"; | 1120 | $retval = "$retval$o"; |
| 1100 | } elsif ($repeated && defined($opt{$parento})) { | 1121 | } elsif ($repeated && defined($opt{$parento})) { |
| @@ -1118,7 +1139,7 @@ sub __eval_option { | |||
| 1118 | } | 1139 | } |
| 1119 | 1140 | ||
| 1120 | sub eval_option { | 1141 | sub eval_option { |
| 1121 | my ($option, $i) = @_; | 1142 | my ($name, $option, $i) = @_; |
| 1122 | 1143 | ||
| 1123 | my $prev = ""; | 1144 | my $prev = ""; |
| 1124 | 1145 | ||
| @@ -1134,7 +1155,7 @@ sub eval_option { | |||
| 1134 | "Check for recursive variables\n"; | 1155 | "Check for recursive variables\n"; |
| 1135 | } | 1156 | } |
| 1136 | $prev = $option; | 1157 | $prev = $option; |
| 1137 | $option = __eval_option($option, $i); | 1158 | $option = __eval_option($name, $option, $i); |
| 1138 | } | 1159 | } |
| 1139 | 1160 | ||
| 1140 | return $option; | 1161 | return $option; |
| @@ -1191,11 +1212,24 @@ sub reboot { | |||
| 1191 | } | 1212 | } |
| 1192 | 1213 | ||
| 1193 | if (defined($time)) { | 1214 | if (defined($time)) { |
| 1194 | if (wait_for_monitor($time, $reboot_success_line)) { | 1215 | |
| 1216 | # We only want to get to the new kernel, don't fail | ||
| 1217 | # if we stumble over a call trace. | ||
| 1218 | my $save_ignore_errors = $ignore_errors; | ||
| 1219 | $ignore_errors = 1; | ||
| 1220 | |||
| 1221 | # Look for the good kernel to boot | ||
| 1222 | if (wait_for_monitor($time, "Linux version")) { | ||
| 1195 | # reboot got stuck? | 1223 | # reboot got stuck? |
| 1196 | doprint "Reboot did not finish. Forcing power cycle\n"; | 1224 | doprint "Reboot did not finish. Forcing power cycle\n"; |
| 1197 | run_command "$power_cycle"; | 1225 | run_command "$power_cycle"; |
| 1198 | } | 1226 | } |
| 1227 | |||
| 1228 | $ignore_errors = $save_ignore_errors; | ||
| 1229 | |||
| 1230 | # Still need to wait for the reboot to finish | ||
| 1231 | wait_for_monitor($time, $reboot_success_line); | ||
| 1232 | |||
| 1199 | end_monitor; | 1233 | end_monitor; |
| 1200 | } | 1234 | } |
| 1201 | } | 1235 | } |
| @@ -1279,6 +1313,7 @@ sub start_monitor { | |||
| 1279 | } | 1313 | } |
| 1280 | 1314 | ||
| 1281 | sub end_monitor { | 1315 | sub end_monitor { |
| 1316 | return if (!defined $console); | ||
| 1282 | if (--$monitor_cnt) { | 1317 | if (--$monitor_cnt) { |
| 1283 | return; | 1318 | return; |
| 1284 | } | 1319 | } |
| @@ -1585,7 +1620,7 @@ sub wait_for_input | |||
| 1585 | 1620 | ||
| 1586 | $rin = ''; | 1621 | $rin = ''; |
| 1587 | vec($rin, fileno($fp), 1) = 1; | 1622 | vec($rin, fileno($fp), 1) = 1; |
| 1588 | $ready = select($rin, undef, undef, $time); | 1623 | ($ready, $time) = select($rin, undef, undef, $time); |
| 1589 | 1624 | ||
| 1590 | $line = ""; | 1625 | $line = ""; |
| 1591 | 1626 | ||
| @@ -1891,23 +1926,102 @@ sub get_version { | |||
| 1891 | 1926 | ||
| 1892 | sub start_monitor_and_boot { | 1927 | sub start_monitor_and_boot { |
| 1893 | # Make sure the stable kernel has finished booting | 1928 | # Make sure the stable kernel has finished booting |
| 1894 | start_monitor; | 1929 | |
| 1895 | wait_for_monitor 5; | 1930 | # Install bisects, don't need console |
| 1896 | end_monitor; | 1931 | if (defined $console) { |
| 1932 | start_monitor; | ||
| 1933 | wait_for_monitor 5; | ||
| 1934 | end_monitor; | ||
| 1935 | } | ||
| 1897 | 1936 | ||
| 1898 | get_grub_index; | 1937 | get_grub_index; |
| 1899 | get_version; | 1938 | get_version; |
| 1900 | install; | 1939 | install; |
| 1901 | 1940 | ||
| 1902 | start_monitor; | 1941 | start_monitor if (defined $console); |
| 1903 | return monitor; | 1942 | return monitor; |
| 1904 | } | 1943 | } |
| 1905 | 1944 | ||
| 1945 | my $check_build_re = ".*:.*(warning|error|Error):.*"; | ||
| 1946 | my $utf8_quote = "\\x{e2}\\x{80}(\\x{98}|\\x{99})"; | ||
| 1947 | |||
| 1948 | sub process_warning_line { | ||
| 1949 | my ($line) = @_; | ||
| 1950 | |||
| 1951 | chomp $line; | ||
| 1952 | |||
| 1953 | # for distcc heterogeneous systems, some compilers | ||
| 1954 | # do things differently causing warning lines | ||
| 1955 | # to be slightly different. This makes an attempt | ||
| 1956 | # to fixe those issues. | ||
| 1957 | |||
| 1958 | # chop off the index into the line | ||
| 1959 | # using distcc, some compilers give different indexes | ||
| 1960 | # depending on white space | ||
| 1961 | $line =~ s/^(\s*\S+:\d+:)\d+/$1/; | ||
| 1962 | |||
| 1963 | # Some compilers use UTF-8 extended for quotes and some don't. | ||
| 1964 | $line =~ s/$utf8_quote/'/g; | ||
| 1965 | |||
| 1966 | return $line; | ||
| 1967 | } | ||
| 1968 | |||
| 1969 | # Read buildlog and check against warnings file for any | ||
| 1970 | # new warnings. | ||
| 1971 | # | ||
| 1972 | # Returns 1 if OK | ||
| 1973 | # 0 otherwise | ||
| 1906 | sub check_buildlog { | 1974 | sub check_buildlog { |
| 1975 | return 1 if (!defined $warnings_file); | ||
| 1976 | |||
| 1977 | my %warnings_list; | ||
| 1978 | |||
| 1979 | # Failed builds should not reboot the target | ||
| 1980 | my $save_no_reboot = $no_reboot; | ||
| 1981 | $no_reboot = 1; | ||
| 1982 | |||
| 1983 | if (-f $warnings_file) { | ||
| 1984 | open(IN, $warnings_file) or | ||
| 1985 | dodie "Error opening $warnings_file"; | ||
| 1986 | |||
| 1987 | while (<IN>) { | ||
| 1988 | if (/$check_build_re/) { | ||
| 1989 | my $warning = process_warning_line $_; | ||
| 1990 | |||
| 1991 | $warnings_list{$warning} = 1; | ||
| 1992 | } | ||
| 1993 | } | ||
| 1994 | close(IN); | ||
| 1995 | } | ||
| 1996 | |||
| 1997 | # If warnings file didn't exist, and WARNINGS_FILE exist, | ||
| 1998 | # then we fail on any warning! | ||
| 1999 | |||
| 2000 | open(IN, $buildlog) or dodie "Can't open $buildlog"; | ||
| 2001 | while (<IN>) { | ||
| 2002 | if (/$check_build_re/) { | ||
| 2003 | my $warning = process_warning_line $_; | ||
| 2004 | |||
| 2005 | if (!defined $warnings_list{$warning}) { | ||
| 2006 | fail "New warning found (not in $warnings_file)\n$_\n"; | ||
| 2007 | $no_reboot = $save_no_reboot; | ||
| 2008 | return 0; | ||
| 2009 | } | ||
| 2010 | } | ||
| 2011 | } | ||
| 2012 | $no_reboot = $save_no_reboot; | ||
| 2013 | close(IN); | ||
| 2014 | } | ||
| 2015 | |||
| 2016 | sub check_patch_buildlog { | ||
| 1907 | my ($patch) = @_; | 2017 | my ($patch) = @_; |
| 1908 | 2018 | ||
| 1909 | my @files = `git show $patch | diffstat -l`; | 2019 | my @files = `git show $patch | diffstat -l`; |
| 1910 | 2020 | ||
| 2021 | foreach my $file (@files) { | ||
| 2022 | chomp $file; | ||
| 2023 | } | ||
| 2024 | |||
| 1911 | open(IN, "git show $patch |") or | 2025 | open(IN, "git show $patch |") or |
| 1912 | dodie "failed to show $patch"; | 2026 | dodie "failed to show $patch"; |
| 1913 | while (<IN>) { | 2027 | while (<IN>) { |
| @@ -3055,11 +3169,13 @@ sub patchcheck { | |||
| 3055 | build "oldconfig" or return 0; | 3169 | build "oldconfig" or return 0; |
| 3056 | } | 3170 | } |
| 3057 | 3171 | ||
| 3058 | 3172 | # No need to do per patch checking if warnings file exists | |
| 3059 | if (!defined($ignored_warnings{$sha1})) { | 3173 | if (!defined($warnings_file) && !defined($ignored_warnings{$sha1})) { |
| 3060 | check_buildlog $sha1 or return 0; | 3174 | check_patch_buildlog $sha1 or return 0; |
| 3061 | } | 3175 | } |
| 3062 | 3176 | ||
| 3177 | check_buildlog or return 0; | ||
| 3178 | |||
| 3063 | next if ($type eq "build"); | 3179 | next if ($type eq "build"); |
| 3064 | 3180 | ||
| 3065 | my $failed = 0; | 3181 | my $failed = 0; |
| @@ -3617,6 +3733,39 @@ sub make_min_config { | |||
| 3617 | return 1; | 3733 | return 1; |
| 3618 | } | 3734 | } |
| 3619 | 3735 | ||
| 3736 | sub make_warnings_file { | ||
| 3737 | my ($i) = @_; | ||
| 3738 | |||
| 3739 | if (!defined($warnings_file)) { | ||
| 3740 | dodie "Must define WARNINGS_FILE for make_warnings_file test"; | ||
| 3741 | } | ||
| 3742 | |||
| 3743 | if ($build_type eq "nobuild") { | ||
| 3744 | dodie "BUILD_TYPE can not be 'nobuild' for make_warnings_file test"; | ||
| 3745 | } | ||
| 3746 | |||
| 3747 | build $build_type or dodie "Failed to build"; | ||
| 3748 | |||
| 3749 | open(OUT, ">$warnings_file") or dodie "Can't create $warnings_file"; | ||
| 3750 | |||
| 3751 | open(IN, $buildlog) or dodie "Can't open $buildlog"; | ||
| 3752 | while (<IN>) { | ||
| 3753 | |||
| 3754 | # Some compilers use UTF-8 extended for quotes | ||
| 3755 | # for distcc heterogeneous systems, this causes issues | ||
| 3756 | s/$utf8_quote/'/g; | ||
| 3757 | |||
| 3758 | if (/$check_build_re/) { | ||
| 3759 | print OUT; | ||
| 3760 | } | ||
| 3761 | } | ||
| 3762 | close(IN); | ||
| 3763 | |||
| 3764 | close(OUT); | ||
| 3765 | |||
| 3766 | success $i; | ||
| 3767 | } | ||
| 3768 | |||
| 3620 | $#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n"; | 3769 | $#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n"; |
| 3621 | 3770 | ||
| 3622 | if ($#ARGV == 0) { | 3771 | if ($#ARGV == 0) { |
| @@ -3662,7 +3811,7 @@ EOF | |||
| 3662 | read_config $ktest_config; | 3811 | read_config $ktest_config; |
| 3663 | 3812 | ||
| 3664 | if (defined($opt{"LOG_FILE"})) { | 3813 | if (defined($opt{"LOG_FILE"})) { |
| 3665 | $opt{"LOG_FILE"} = eval_option($opt{"LOG_FILE"}, -1); | 3814 | $opt{"LOG_FILE"} = eval_option("LOG_FILE", $opt{"LOG_FILE"}, -1); |
| 3666 | } | 3815 | } |
| 3667 | 3816 | ||
| 3668 | # Append any configs entered in manually to the config file. | 3817 | # Append any configs entered in manually to the config file. |
| @@ -3739,7 +3888,7 @@ sub set_test_option { | |||
| 3739 | my $option = __set_test_option($name, $i); | 3888 | my $option = __set_test_option($name, $i); |
| 3740 | return $option if (!defined($option)); | 3889 | return $option if (!defined($option)); |
| 3741 | 3890 | ||
| 3742 | return eval_option($option, $i); | 3891 | return eval_option($name, $option, $i); |
| 3743 | } | 3892 | } |
| 3744 | 3893 | ||
| 3745 | # First we need to do is the builds | 3894 | # First we need to do is the builds |
| @@ -3818,9 +3967,9 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
| 3818 | $run_type = $bisect_type; | 3967 | $run_type = $bisect_type; |
| 3819 | } elsif ($test_type eq "config_bisect") { | 3968 | } elsif ($test_type eq "config_bisect") { |
| 3820 | $run_type = $config_bisect_type; | 3969 | $run_type = $config_bisect_type; |
| 3821 | } | 3970 | } elsif ($test_type eq "make_min_config") { |
| 3822 | 3971 | $run_type = ""; | |
| 3823 | if ($test_type eq "make_min_config") { | 3972 | } elsif ($test_type eq "make_warnings_file") { |
| 3824 | $run_type = ""; | 3973 | $run_type = ""; |
| 3825 | } | 3974 | } |
| 3826 | 3975 | ||
| @@ -3877,10 +4026,15 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) { | |||
| 3877 | } elsif ($test_type eq "make_min_config") { | 4026 | } elsif ($test_type eq "make_min_config") { |
| 3878 | make_min_config $i; | 4027 | make_min_config $i; |
| 3879 | next; | 4028 | next; |
| 4029 | } elsif ($test_type eq "make_warnings_file") { | ||
| 4030 | $no_reboot = 1; | ||
| 4031 | make_warnings_file $i; | ||
| 4032 | next; | ||
| 3880 | } | 4033 | } |
| 3881 | 4034 | ||
| 3882 | if ($build_type ne "nobuild") { | 4035 | if ($build_type ne "nobuild") { |
| 3883 | build $build_type or next; | 4036 | build $build_type or next; |
| 4037 | check_buildlog or next; | ||
| 3884 | } | 4038 | } |
| 3885 | 4039 | ||
| 3886 | if ($test_type eq "install") { | 4040 | if ($test_type eq "install") { |
diff --git a/tools/testing/ktest/sample.conf b/tools/testing/ktest/sample.conf index 4012e9330344..0a290fb4cd5e 100644 --- a/tools/testing/ktest/sample.conf +++ b/tools/testing/ktest/sample.conf | |||
| @@ -793,6 +793,20 @@ | |||
| 793 | # Example for a virtual guest call "Guest". | 793 | # Example for a virtual guest call "Guest". |
| 794 | #POWER_OFF = virsh destroy Guest | 794 | #POWER_OFF = virsh destroy Guest |
| 795 | 795 | ||
| 796 | # To have the build fail on "new" warnings, create a file that | ||
| 797 | # contains a list of all known warnings (they must match exactly | ||
| 798 | # to the line with 'warning:', 'error:' or 'Error:'. If the option | ||
| 799 | # WARNINGS_FILE is set, then that file will be read, and if the | ||
| 800 | # build detects a warning, it will examine this file and if the | ||
| 801 | # warning does not exist in it, it will fail the build. | ||
| 802 | # | ||
| 803 | # Note, if this option is defined to a file that does not exist | ||
| 804 | # then any warning will fail the build. | ||
| 805 | # (see make_warnings_file below) | ||
| 806 | # | ||
| 807 | # (optional, default undefined) | ||
| 808 | #WARNINGS_FILE = ${OUTPUT_DIR}/warnings_file | ||
| 809 | |||
| 796 | # The way to execute a command on the target | 810 | # The way to execute a command on the target |
| 797 | # (default ssh $SSH_USER@$MACHINE $SSH_COMMAND";) | 811 | # (default ssh $SSH_USER@$MACHINE $SSH_COMMAND";) |
| 798 | # The variables SSH_USER, MACHINE and SSH_COMMAND are defined | 812 | # The variables SSH_USER, MACHINE and SSH_COMMAND are defined |
| @@ -1222,3 +1236,33 @@ | |||
| 1222 | # MIN_CONFIG_TYPE = test | 1236 | # MIN_CONFIG_TYPE = test |
| 1223 | # TEST = ssh ${USER}@${MACHINE} echo hi | 1237 | # TEST = ssh ${USER}@${MACHINE} echo hi |
| 1224 | # | 1238 | # |
| 1239 | # | ||
| 1240 | # | ||
| 1241 | # | ||
| 1242 | # For TEST_TYPE = make_warnings_file | ||
| 1243 | # | ||
| 1244 | # If you want the build to fail when a new warning is discovered | ||
| 1245 | # you set the WARNINGS_FILE to point to a file of known warnings. | ||
| 1246 | # | ||
| 1247 | # The test "make_warnings_file" will let you create a new warnings | ||
| 1248 | # file before you run other tests, like patchcheck. | ||
| 1249 | # | ||
| 1250 | # What this test does is to run just a build, you still need to | ||
| 1251 | # specify BUILD_TYPE to tell the test what type of config to use. | ||
| 1252 | # A BUILD_TYPE of nobuild will fail this test. | ||
| 1253 | # | ||
| 1254 | # The test will do the build and scan for all warnings. Any warning | ||
| 1255 | # it discovers will be saved in the WARNINGS_FILE (required) option. | ||
| 1256 | # | ||
| 1257 | # It is recommended (but not necessary) to make sure BUILD_NOCLEAN is | ||
| 1258 | # off, so that a full build is done (make mrproper is performed). | ||
| 1259 | # That way, all warnings will be captured. | ||
| 1260 | # | ||
| 1261 | # Example: | ||
| 1262 | # | ||
| 1263 | # TEST_TYPE = make_warnings_file | ||
| 1264 | # WARNINGS_FILE = ${OUTPUT_DIR} | ||
| 1265 | # BUILD_TYPE = useconfig:oldconfig | ||
| 1266 | # CHECKOUT = v3.8 | ||
| 1267 | # BUILD_NOCLEAN = 0 | ||
| 1268 | # | ||
