3 # Copyright 2010 - Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
4 # Licensed under the terms of the GNU GPL License version 2
9 use Fcntl qw(F_GETFL F_SETFL O_NONBLOCK);
10 use File::Path qw(mkpath);
11 use File::Copy qw(cp);
24 $default{"NUM_TESTS"} = 1;
25 $default{"REBOOT_TYPE"} = "grub";
26 $default{"TEST_TYPE"} = "test";
27 $default{"BUILD_TYPE"} = "randconfig";
28 $default{"MAKE_CMD"} = "make";
29 $default{"TIMEOUT"} = 120;
30 $default{"TMP_DIR"} = "/tmp/ktest";
31 $default{"SLEEP_TIME"} = 60; # sleep time between tests
32 $default{"BUILD_NOCLEAN"} = 0;
33 $default{"REBOOT_ON_ERROR"} = 0;
34 $default{"POWEROFF_ON_ERROR"} = 0;
35 $default{"REBOOT_ON_SUCCESS"} = 1;
36 $default{"POWEROFF_ON_SUCCESS"} = 0;
37 $default{"BUILD_OPTIONS"} = "";
38 $default{"BISECT_SLEEP_TIME"} = 60; # sleep time between bisects
39 $default{"PATCHCHECK_SLEEP_TIME"} = 60; # sleep time between patch checks
40 $default{"CLEAR_LOG"} = 0;
41 $default{"BISECT_MANUAL"} = 0;
42 $default{"BISECT_SKIP"} = 1;
43 $default{"SUCCESS_LINE"} = "login:";
44 $default{"BOOTED_TIMEOUT"} = 1;
45 $default{"DIE_ON_FAILURE"} = 1;
46 $default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND";
47 $default{"SCP_TO_TARGET"} = "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE";
48 $default{"REBOOT"} = "ssh \$SSH_USER\@\$MACHINE reboot";
49 $default{"STOP_AFTER_SUCCESS"} = 10;
50 $default{"STOP_AFTER_FAILURE"} = 60;
51 $default{"STOP_TEST_AFTER"} = 600;
52 $default{"LOCALVERSION"} = "-test";
70 my $poweroff_on_error;
72 my $powercycle_after_reboot;
73 my $poweroff_after_halt;
90 my $in_patchcheck = 0;
99 my $bisect_sleep_time;
100 my $patchcheck_sleep_time;
106 my $stop_after_success;
107 my $stop_after_failure;
119 $config_help{"MACHINE"} = << "EOF"
120 The machine hostname that you will test.
123 $config_help{"SSH_USER"} = << "EOF"
124 The box is expected to have ssh on normal bootup, provide the user
125 (most likely root, since you need privileged operations)
128 $config_help{"BUILD_DIR"} = << "EOF"
129 The directory that contains the Linux source code (full path).
132 $config_help{"OUTPUT_DIR"} = << "EOF"
133 The directory that the objects will be built (full path).
134 (can not be same as BUILD_DIR)
137 $config_help{"BUILD_TARGET"} = << "EOF"
138 The location of the compiled file to copy to the target.
139 (relative to OUTPUT_DIR)
142 $config_help{"TARGET_IMAGE"} = << "EOF"
143 The place to put your image on the test machine.
146 $config_help{"POWER_CYCLE"} = << "EOF"
147 A script or command to reboot the box.
149 Here is a digital loggers power switch example
150 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
152 Here is an example to reboot a virtual box on the current host
153 with the name "Guest".
154 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
157 $config_help{"CONSOLE"} = << "EOF"
158 The script or command that reads the console
160 If you use ttywatch server, something like the following would work.
161 CONSOLE = nc -d localhost 3001
163 For a virtual machine with guest name "Guest".
164 CONSOLE = virsh console Guest
167 $config_help{"LOCALVERSION"} = << "EOF"
168 Required version ending to differentiate the test
169 from other linux builds on the system.
172 $config_help{"REBOOT_TYPE"} = << "EOF"
173 Way to reboot the box to the test kernel.
174 Only valid options so far are "grub" and "script".
176 If you specify grub, it will assume grub version 1
177 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
178 and select that target to reboot to the kernel. If this is not
179 your setup, then specify "script" and have a command or script
180 specified in REBOOT_SCRIPT to boot to the target.
182 The entry in /boot/grub/menu.lst must be entered in manually.
183 The test will not modify that file.
186 $config_help{"GRUB_MENU"} = << "EOF"
187 The grub title name for the test kernel to boot
188 (Only mandatory if REBOOT_TYPE = grub)
190 Note, ktest.pl will not update the grub menu.lst, you need to
191 manually add an option for the test. ktest.pl will search
192 the grub menu.lst for this option to find what kernel to
195 For example, if in the /boot/grub/menu.lst the test kernel title has:
198 GRUB_MENU = Test Kernel
201 $config_help{"REBOOT_SCRIPT"} = << "EOF"
202 A script to reboot the target into the test kernel
203 (Only mandatory if REBOOT_TYPE = script)
208 sub get_ktest_config {
211 return if (defined($opt{$config}));
213 if (defined($config_help{$config})) {
215 print $config_help{$config};
220 if (defined($default{$config})) {
221 print "\[$default{$config}\] ";
223 $entered_configs{$config} = <STDIN>;
224 $entered_configs{$config} =~ s/^\s*(.*\S)\s*$/$1/;
225 if ($entered_configs{$config} =~ /^\s*$/) {
226 if ($default{$config}) {
227 $entered_configs{$config} = $default{$config};
229 print "Your answer can not be blank\n";
237 sub get_ktest_configs {
238 get_ktest_config("MACHINE");
239 get_ktest_config("SSH_USER");
240 get_ktest_config("BUILD_DIR");
241 get_ktest_config("OUTPUT_DIR");
242 get_ktest_config("BUILD_TARGET");
243 get_ktest_config("TARGET_IMAGE");
244 get_ktest_config("POWER_CYCLE");
245 get_ktest_config("CONSOLE");
246 get_ktest_config("LOCALVERSION");
248 my $rtype = $opt{"REBOOT_TYPE"};
250 if (!defined($rtype)) {
251 if (!defined($opt{"GRUB_MENU"})) {
252 get_ktest_config("REBOOT_TYPE");
253 $rtype = $entered_configs{"REBOOT_TYPE"};
259 if ($rtype eq "grub") {
260 get_ktest_config("GRUB_MENU");
262 get_ktest_config("REBOOT_SCRIPT");
266 sub process_variables {
270 # We want to check for '\', and it is just easier
271 # to check the previous characet of '$' and not need
272 # to worry if '$' is the first character. By adding
273 # a space to $value, we can just check [^\\]\$ and
274 # it will still work.
277 while ($value =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
281 # append beginning of value to retval
282 $retval = "$retval$begin";
283 if (defined($variable{$var})) {
284 $retval = "$retval$variable{$var}";
286 # put back the origin piece.
287 $retval = "$retval\$\{$var\}";
291 $retval = "$retval$value";
293 # remove the space added in the beginning
300 my ($lvalue, $rvalue) = @_;
302 if (defined($opt{$lvalue})) {
303 die "Error: Option $lvalue defined more than once!\n";
305 if ($rvalue =~ /^\s*$/) {
306 delete $opt{$lvalue};
308 $rvalue = process_variables($rvalue);
309 $opt{$lvalue} = $rvalue;
314 my ($lvalue, $rvalue) = @_;
316 if ($rvalue =~ /^\s*$/) {
317 delete $variable{$lvalue};
319 $rvalue = process_variables($rvalue);
320 $variable{$lvalue} = $rvalue;
327 open(IN, $config) || die "can't read file $config";
330 $name =~ s,.*/(.*),$1,;
335 my $num_tests_set = 0;
341 # ignore blank lines and comments
342 next if (/^\s*$/ || /\s*\#/);
344 if (/^\s*TEST_START(.*)/) {
348 if ($num_tests_set) {
349 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
352 my $old_test_num = $test_num;
353 my $old_repeat = $repeat;
355 $test_num += $repeat;
359 if ($rest =~ /\s+SKIP(.*)/) {
366 if ($rest =~ /\s+ITERATE\s+(\d+)(.*)$/) {
369 $repeat_tests{"$test_num"} = $repeat;
372 if ($rest =~ /\s+SKIP(.*)/) {
377 if ($rest !~ /^\s*$/) {
378 die "$name: $.: Gargbage found after TEST_START\n$_";
382 $test_num = $old_test_num;
383 $repeat = $old_repeat;
386 } elsif (/^\s*DEFAULTS(.*)$/) {
391 if ($rest =~ /\s+SKIP(.*)/) {
398 if ($rest !~ /^\s*$/) {
399 die "$name: $.: Gargbage found after DEFAULTS\n$_";
402 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
410 ($lvalue eq "NUM_TESTS" ||
411 $lvalue eq "LOG_FILE" ||
412 $lvalue eq "CLEAR_LOG")) {
413 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
416 if ($lvalue eq "NUM_TESTS") {
418 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
421 die "$name: $.: NUM_TESTS must be set in default section\n";
426 if ($default || $lvalue =~ /\[\d+\]$/) {
427 set_value($lvalue, $rvalue);
429 my $val = "$lvalue\[$test_num\]";
430 set_value($val, $rvalue);
433 $repeats{$val} = $repeat;
436 } elsif (/^\s*([A-Z_\[\]\d]+)\s*:=\s*(.*?)\s*$/) {
442 # process config variables.
443 # Config variables are only active while reading the
444 # config and can be defined anywhere. They also ignore
445 # TEST_START and DEFAULTS, but are skipped if they are in
446 # on of these sections that have SKIP defined.
447 # The save variable can be
448 # defined multiple times and the new one simply overrides
450 set_variable($lvalue, $rvalue);
453 die "$name: $.: Garbage found in config\n$_";
460 $test_num += $repeat - 1;
461 $opt{"NUM_TESTS"} = $test_num;
464 # make sure we have all mandatory configs
469 foreach my $default (keys %default) {
470 if (!defined($opt{$default})) {
471 $opt{$default} = $default{$default};
477 if (defined($opt{"LOG_FILE"})) {
478 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
485 if (defined($opt{"LOG_FILE"})) {
500 # try to reboot normally
501 if (run_command $reboot) {
502 if (defined($powercycle_after_reboot)) {
503 sleep $powercycle_after_reboot;
504 run_command "$power_cycle";
507 # nope? power cycle it.
508 run_command "$power_cycle";
515 return $test_type eq "build" ||
516 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
517 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
521 doprint "CRITICAL FAILURE... ", @_, "\n";
525 if ($reboot_on_error && !do_not_reboot) {
527 doprint "REBOOTING\n";
530 } elsif ($poweroff_on_error && defined($power_off)) {
531 doprint "POWERING OFF\n";
535 if (defined($opt{"LOG_FILE"})) {
536 print " See $opt{LOG_FILE} for more info.\n";
547 my $pid = open($fp, "$console|") or
548 dodie "Can't open console $console";
550 $flags = fcntl($fp, F_GETFL, 0) or
551 dodie "Can't get flags for the socket: $!";
552 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
553 dodie "Can't set flags for the socket: $!";
561 doprint "kill child process $pid\n";
569 if ($monitor_cnt++) {
572 $monitor_fp = \*MONFD;
573 $monitor_pid = open_console $monitor_fp;
577 open(MONFD, "Stop perl from warning about single use of MONFD");
581 if (--$monitor_cnt) {
584 close_console($monitor_fp, $monitor_pid);
587 sub wait_for_monitor {
591 doprint "** Wait for monitor to settle down **\n";
593 # read the monitor and wait for the system to calm down
595 $line = wait_for_input($monitor_fp, $time);
596 print "$line" if (defined($line));
597 } while (defined($line));
598 print "** Monitor flushed **\n";
603 if ($die_on_failure) {
611 # no need to reboot for just building.
612 if (!do_not_reboot) {
613 doprint "REBOOTING\n";
616 wait_for_monitor $sleep_time;
620 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
621 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
622 doprint "KTEST RESULT: TEST $i Failed: ", @_, "\n";
623 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
624 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
626 return 1 if (!defined($store_failures));
629 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
630 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
632 my $type = $build_type;
633 if ($type =~ /useconfig/) {
637 my $dir = "$machine-$test_type-$type-fail-$date";
638 my $faildir = "$store_failures/$dir";
642 die "can't create $faildir";
644 if (-f "$output_config") {
645 cp "$output_config", "$faildir/config" or
646 die "failed to copy .config";
649 cp $buildlog, "$faildir/buildlog" or
650 die "failed to move $buildlog";
653 cp $dmesg, "$faildir/dmesg" or
654 die "failed to move $dmesg";
657 doprint "*** Saved info to $faildir ***\n";
668 $command =~ s/\$SSH_USER/$ssh_user/g;
669 $command =~ s/\$MACHINE/$machine/g;
671 doprint("$command ... ");
673 $pid = open(CMD, "$command 2>&1 |") or
674 (fail "unable to exec $command" and return 0);
676 if (defined($opt{"LOG_FILE"})) {
677 open(LOG, ">>$opt{LOG_FILE}") or
678 dodie "failed to write to log";
682 if (defined($redirect)) {
683 open (RD, ">$redirect") or
684 dodie "failed to write to redirect $redirect";
689 print LOG if ($dolog);
697 close(LOG) if ($dolog);
698 close(RD) if ($dord);
711 my $cp_exec = $ssh_exec;
713 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
714 return run_command "$cp_exec";
718 my ($src, $dst) = @_;
719 my $cp_scp = $scp_to_target;
721 $cp_scp =~ s/\$SRC_FILE/$src/g;
722 $cp_scp =~ s/\$DST_FILE/$dst/g;
724 return run_command "$cp_scp";
729 if ($reboot_type ne "grub") {
732 return if (defined($grub_number));
734 doprint "Find grub menu ... ";
737 my $ssh_grub = $ssh_exec;
738 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
740 open(IN, "$ssh_grub |")
741 or die "unable to get menu.lst";
744 if (/^\s*title\s+$grub_menu\s*$/) {
747 } elsif (/^\s*title\s/) {
753 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
754 if ($grub_number < 0);
755 doprint "$grub_number\n";
760 my ($fp, $time) = @_;
766 if (!defined($time)) {
771 vec($rin, fileno($fp), 1) = 1;
772 $ready = select($rin, undef, undef, $time);
776 # try to read one char at a time
777 while (sysread $fp, $ch, 1) {
779 last if ($ch eq "\n");
782 if (!length($line)) {
790 if ($reboot_type eq "grub") {
791 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch && reboot)'";
795 run_command "$reboot_script";
801 doprint "git rev-list --max-count=1 $commit ... ";
802 my $sha1 = `git rev-list --max-count=1 $commit`;
809 dodie "Failed to get git $commit";
822 my $skip_call_trace = 0;
830 open(DMESG, "> $dmesg") or
831 die "unable to write to $dmesg";
837 my $monitor_start = time;
843 $line = wait_for_input($monitor_fp, $booted_timeout);
845 $line = wait_for_input($monitor_fp);
848 last if (!defined($line));
853 # we are not guaranteed to get a full line
856 if ($full_line =~ /$success_line/) {
858 $success_start = time;
861 if ($booted && defined($stop_after_success) &&
862 $stop_after_success >= 0) {
864 if ($now - $success_start >= $stop_after_success) {
865 doprint "Test forced to stop after $stop_after_success seconds after success\n";
870 if ($full_line =~ /\[ backtrace testing \]/) {
871 $skip_call_trace = 1;
874 if ($full_line =~ /call trace:/i) {
875 if (!$bug && !$skip_call_trace) {
877 $failure_start = time;
881 if ($bug && defined($stop_after_failure) &&
882 $stop_after_failure >= 0) {
884 if ($now - $failure_start >= $stop_after_failure) {
885 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
890 if ($full_line =~ /\[ end of backtrace testing \]/) {
891 $skip_call_trace = 0;
894 if ($full_line =~ /Kernel panic -/) {
895 $failure_start = time;
903 if ($stop_test_after > 0 && !$booted && !$bug) {
904 if (time - $monitor_start > $stop_test_after) {
905 doprint "STOP_TEST_AFTER ($stop_test_after seconds) timed out\n";
914 return 0 if ($in_bisect);
915 fail "failed - got a bug report" and return 0;
919 return 0 if ($in_bisect);
920 fail "failed - never got a boot prompt." and return 0;
928 run_scp "$outputdir/$build_target", "$target_image" or
929 dodie "failed to copy image";
931 my $install_mods = 0;
933 # should we process modules?
935 open(IN, "$output_config") or dodie("Can't read config file");
937 if (/CONFIG_MODULES(=y)?/) {
938 $install_mods = 1 if (defined($1));
944 if (!$install_mods) {
945 doprint "No modules needed\n";
949 run_command "$make INSTALL_MOD_PATH=$tmpdir modules_install" or
950 dodie "Failed to install modules";
952 my $modlib = "/lib/modules/$version";
953 my $modtar = "ktest-mods.tar.bz2";
955 run_ssh "rm -rf $modlib" or
956 dodie "failed to remove old mods: $modlib";
958 # would be nice if scp -r did not follow symbolic links
959 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
960 dodie "making tarball";
962 run_scp "$tmpdir/$modtar", "/tmp" or
963 dodie "failed to copy modules";
965 unlink "$tmpdir/$modtar";
967 run_ssh "'(cd / && tar xf /tmp/$modtar)'" or
968 dodie "failed to tar modules";
970 run_ssh "rm -f /tmp/$modtar";
972 return if (!defined($post_install));
974 my $cp_post_install = $post_install;
975 $cp_post_install =~ s/\$KERNEL_VERSION/$version/g;
976 run_command "$cp_post_install" or
977 dodie "Failed to run post install";
983 my @files = `git show $patch | diffstat -l`;
985 open(IN, "git show $patch |") or
986 dodie "failed to show $patch";
988 if (m,^--- a/(.*),) {
990 $files[$#files] = $1;
995 open(IN, $buildlog) or dodie "Can't open $buildlog";
997 if (/^\s*(.*?):.*(warning|error)/) {
999 foreach my $file (@files) {
1000 my $fullpath = "$builddir/$file";
1001 if ($file eq $err || $fullpath eq $err) {
1002 fail "$file built with warnings" and return 0;
1012 sub make_oldconfig {
1013 my ($defconfig) = @_;
1015 if (!run_command "$defconfig $make oldnoconfig") {
1016 # Perhaps oldnoconfig doesn't exist in this version of the kernel
1017 # try a yes '' | oldconfig
1018 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
1019 run_command "yes '' | $defconfig $make oldconfig" or
1020 dodie "failed make config oldconfig";
1030 if ($type =~ /^useconfig:(.*)/) {
1031 run_command "cp $1 $output_config" or
1032 dodie "could not copy $1 to .config";
1034 $type = "oldconfig";
1037 # old config can ask questions
1038 if ($type eq "oldconfig") {
1039 $type = "oldnoconfig";
1041 # allow for empty configs
1042 run_command "touch $output_config";
1044 run_command "mv $output_config $outputdir/config_temp" or
1045 dodie "moving .config";
1047 if (!$noclean && !run_command "$make mrproper") {
1048 dodie "make mrproper";
1051 run_command "mv $outputdir/config_temp $output_config" or
1052 dodie "moving config_temp";
1054 } elsif (!$noclean) {
1055 unlink "$output_config";
1056 run_command "$make mrproper" or
1057 dodie "make mrproper";
1060 # add something to distinguish this build
1061 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
1062 print OUT "$localversion\n";
1065 if (defined($minconfig)) {
1066 $defconfig = "KCONFIG_ALLCONFIG=$minconfig";
1069 if ($type eq "oldnoconfig") {
1070 make_oldconfig $defconfig;
1072 run_command "$defconfig $make $type" or
1073 dodie "failed make config";
1076 $redirect = "$buildlog";
1077 if (!run_command "$make $build_options") {
1079 # bisect may need this to pass
1080 return 0 if ($in_bisect);
1081 fail "failed build" and return 0;
1089 if (!run_ssh "halt" or defined($power_off)) {
1090 if (defined($poweroff_after_halt)) {
1091 sleep $poweroff_after_halt;
1092 run_command "$power_off";
1096 run_command "$power_off";
1105 doprint "\n\n*******************************************\n";
1106 doprint "*******************************************\n";
1107 doprint "KTEST RESULT: TEST $i SUCCESS!!!! **\n";
1108 doprint "*******************************************\n";
1109 doprint "*******************************************\n";
1111 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
1112 doprint "Reboot and wait $sleep_time seconds\n";
1115 wait_for_monitor $sleep_time;
1121 # get the release name
1122 doprint "$make kernelrelease ... ";
1123 $version = `$make kernelrelease | tail -1`;
1125 doprint "$version\n";
1130 doprint "Pass or fail? [p/f]";
1133 if ($ans eq "p" || $ans eq "P") {
1135 } elsif ($ans eq "f" || $ans eq "F") {
1138 print "Please answer 'P' or 'F'\n";
1143 sub child_run_test {
1146 # child should have no power
1147 $reboot_on_error = 0;
1148 $poweroff_on_error = 0;
1149 $die_on_failure = 1;
1151 run_command $run_test or $failed = 1;
1157 sub child_finished {
1170 doprint "run test $run_test\n";
1174 $SIG{CHLD} = qw(child_finished);
1178 child_run_test if (!$child_pid);
1183 $line = wait_for_input($monitor_fp, 1);
1184 if (defined($line)) {
1186 # we are not guaranteed to get a full line
1187 $full_line .= $line;
1190 if ($full_line =~ /call trace:/i) {
1194 if ($full_line =~ /Kernel panic -/) {
1198 if ($line =~ /\n/) {
1202 } while (!$child_done && !$bug);
1205 my $failure_start = time;
1208 $line = wait_for_input($monitor_fp, 1);
1209 if (defined($line)) {
1213 if ($now - $failure_start >= $stop_after_failure) {
1216 } while (defined($line));
1218 doprint "Detected kernel crash!\n";
1219 # kill the child with extreme prejudice
1223 waitpid $child_pid, 0;
1226 if ($bug || $child_exit) {
1227 return 0 if $in_bisect;
1228 fail "test failed" and return 0;
1233 sub run_git_bisect {
1236 doprint "$command ... ";
1238 my $output = `$command 2>&1`;
1245 dodie "Failed to git bisect";
1248 doprint "SUCCESS\n";
1249 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
1250 doprint "$1 [$2]\n";
1251 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
1253 doprint "Found bad commit... $1\n";
1256 # we already logged it, just print it now.
1264 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
1267 wait_for_monitor $bisect_sleep_time;
1271 # returns 1 on success, 0 on failure, -1 on skip
1272 sub run_bisect_test {
1273 my ($type, $buildtype) = @_;
1282 build $buildtype or $failed = 1;
1284 if ($type ne "build") {
1285 if ($failed && $bisect_skip) {
1289 dodie "Failed on build" if $failed;
1297 monitor or $failed = 1;
1299 if ($type ne "boot") {
1300 if ($failed && $bisect_skip) {
1306 dodie "Failed on boot" if $failed;
1308 do_run_test or $failed = 1;
1319 # reboot the box to a kernel we can ssh to
1320 if ($type ne "build") {
1330 my $buildtype = "oldconfig";
1332 # We should have a minconfig to use?
1333 if (defined($minconfig)) {
1334 $buildtype = "useconfig:$minconfig";
1337 my $ret = run_bisect_test $type, $buildtype;
1339 if ($bisect_manual) {
1340 $ret = answer_bisect;
1343 # Are we looking for where it worked, not failed?
1344 if ($reverse_bisect) {
1350 } elsif ($ret == 0) {
1352 } elsif ($bisect_skip) {
1353 doprint "HIT A BAD COMMIT ... SKIPPING\n";
1363 die "BISECT_GOOD[$i] not defined\n" if (!defined($opt{"BISECT_GOOD[$i]"}));
1364 die "BISECT_BAD[$i] not defined\n" if (!defined($opt{"BISECT_BAD[$i]"}));
1365 die "BISECT_TYPE[$i] not defined\n" if (!defined($opt{"BISECT_TYPE[$i]"}));
1367 my $good = $opt{"BISECT_GOOD[$i]"};
1368 my $bad = $opt{"BISECT_BAD[$i]"};
1369 my $type = $opt{"BISECT_TYPE[$i]"};
1370 my $start = $opt{"BISECT_START[$i]"};
1371 my $replay = $opt{"BISECT_REPLAY[$i]"};
1372 my $start_files = $opt{"BISECT_FILES[$i]"};
1374 if (defined($start_files)) {
1375 $start_files = " -- " . $start_files;
1380 # convert to true sha1's
1381 $good = get_sha1($good);
1382 $bad = get_sha1($bad);
1384 if (defined($opt{"BISECT_REVERSE[$i]"}) &&
1385 $opt{"BISECT_REVERSE[$i]"} == 1) {
1386 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
1387 $reverse_bisect = 1;
1389 $reverse_bisect = 0;
1392 # Can't have a test without having a test to run
1393 if ($type eq "test" && !defined($run_test)) {
1397 my $check = $opt{"BISECT_CHECK[$i]"};
1398 if (defined($check) && $check ne "0") {
1401 my $head = get_sha1("HEAD");
1403 if ($check ne "good") {
1404 doprint "TESTING BISECT BAD [$bad]\n";
1405 run_command "git checkout $bad" or
1406 die "Failed to checkout $bad";
1408 $result = run_bisect $type;
1410 if ($result ne "bad") {
1411 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
1415 if ($check ne "bad") {
1416 doprint "TESTING BISECT GOOD [$good]\n";
1417 run_command "git checkout $good" or
1418 die "Failed to checkout $good";
1420 $result = run_bisect $type;
1422 if ($result ne "good") {
1423 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
1427 # checkout where we started
1428 run_command "git checkout $head" or
1429 die "Failed to checkout $head";
1432 run_command "git bisect start$start_files" or
1433 dodie "could not start bisect";
1435 run_command "git bisect good $good" or
1436 dodie "could not set bisect good to $good";
1438 run_git_bisect "git bisect bad $bad" or
1439 dodie "could not set bisect bad to $bad";
1441 if (defined($replay)) {
1442 run_command "git bisect replay $replay" or
1443 dodie "failed to run replay";
1446 if (defined($start)) {
1447 run_command "git checkout $start" or
1448 dodie "failed to checkout $start";
1453 $result = run_bisect $type;
1454 $test = run_git_bisect "git bisect $result";
1457 run_command "git bisect log" or
1458 dodie "could not capture git bisect log";
1460 run_command "git bisect reset" or
1461 dodie "could not reset git bisect";
1463 doprint "Bad commit was [$bisect_bad]\n";
1476 sub process_config_ignore {
1480 or dodie "Failed to read $config";
1483 if (/^((CONFIG\S*)=.*)/) {
1484 $config_ignore{$2} = $1;
1491 sub read_current_config {
1492 my ($config_ref) = @_;
1494 %{$config_ref} = ();
1495 undef %{$config_ref};
1497 my @key = keys %{$config_ref};
1499 print "did not delete!\n";
1502 open (IN, "$output_config");
1505 if (/^(CONFIG\S+)=(.*)/) {
1506 ${$config_ref}{$1} = $2;
1512 sub get_dependencies {
1515 my $arr = $dependency{$config};
1516 if (!defined($arr)) {
1522 foreach my $dep (@{$arr}) {
1523 print "ADD DEP $dep\n";
1524 @deps = (@deps, get_dependencies $dep);
1533 open(OUT, ">$output_config") or dodie "Can not write to $output_config";
1535 foreach my $config (@configs) {
1536 print OUT "$config_set{$config}\n";
1537 my @deps = get_dependencies $config;
1538 foreach my $dep (@deps) {
1539 print OUT "$config_set{$dep}\n";
1543 foreach my $config (keys %config_ignore) {
1544 print OUT "$config_ignore{$config}\n";
1552 sub compare_configs {
1555 foreach my $item (keys %a) {
1556 if (!defined($b{$item})) {
1557 print "diff $item\n";
1565 print "diff2 $keys[0]\n";
1567 return -1 if ($#keys >= 0);
1572 sub run_config_bisect_test {
1575 return run_bisect_test $type, "oldconfig";
1578 sub process_passed {
1581 doprint "These configs had no failure: (Enabling them for further compiles)\n";
1582 # Passed! All these configs are part of a good compile.
1583 # Add them to the min options.
1584 foreach my $config (keys %configs) {
1585 if (defined($config_list{$config})) {
1586 doprint " removing $config\n";
1587 $config_ignore{$config} = $config_list{$config};
1588 delete $config_list{$config};
1591 doprint "config copied to $outputdir/config_good\n";
1592 run_command "cp -f $output_config $outputdir/config_good";
1595 sub process_failed {
1598 doprint "\n\n***************************************\n";
1599 doprint "Found bad config: $config\n";
1600 doprint "***************************************\n\n";
1603 sub run_config_bisect {
1605 my @start_list = keys %config_list;
1607 if ($#start_list < 0) {
1608 doprint "No more configs to test!!!\n";
1612 doprint "***** RUN TEST ***\n";
1613 my $type = $opt{"CONFIG_BISECT_TYPE[$iteration]"};
1617 my $count = $#start_list + 1;
1618 doprint " $count configs to test\n";
1620 my $half = int($#start_list / 2);
1623 my @tophalf = @start_list[0 .. $half];
1625 create_config @tophalf;
1626 read_current_config \%current_config;
1628 $count = $#tophalf + 1;
1629 doprint "Testing $count configs\n";
1631 # make sure we test something
1632 foreach my $config (@tophalf) {
1633 if (defined($current_config{$config})) {
1639 # try the other half
1640 doprint "Top half produced no set configs, trying bottom half\n";
1641 @tophalf = @start_list[$half + 1 .. $#start_list];
1642 create_config @tophalf;
1643 read_current_config \%current_config;
1644 foreach my $config (@tophalf) {
1645 if (defined($current_config{$config})) {
1651 doprint "Failed: Can't make new config with current configs\n";
1652 foreach my $config (@start_list) {
1653 doprint " CONFIG: $config\n";
1657 $count = $#tophalf + 1;
1658 doprint "Testing $count configs\n";
1661 $ret = run_config_bisect_test $type;
1662 if ($bisect_manual) {
1663 $ret = answer_bisect;
1666 process_passed %current_config;
1670 doprint "This config had a failure.\n";
1671 doprint "Removing these configs that were not set in this config:\n";
1672 doprint "config copied to $outputdir/config_bad\n";
1673 run_command "cp -f $output_config $outputdir/config_bad";
1675 # A config exists in this group that was bad.
1676 foreach my $config (keys %config_list) {
1677 if (!defined($current_config{$config})) {
1678 doprint " removing $config\n";
1679 delete $config_list{$config};
1683 @start_list = @tophalf;
1685 if ($#start_list == 0) {
1686 process_failed $start_list[0];
1690 # remove half the configs we are looking at and see if
1692 $half = int($#start_list / 2);
1693 } while ($#start_list > 0);
1695 # we found a single config, try it again unless we are running manually
1697 if ($bisect_manual) {
1698 process_failed $start_list[0];
1702 my @tophalf = @start_list[0 .. 0];
1704 $ret = run_config_bisect_test $type;
1706 process_passed %current_config;
1710 process_failed $start_list[0];
1717 my $start_config = $opt{"CONFIG_BISECT[$i]"};
1719 my $tmpconfig = "$tmpdir/use_config";
1721 # Make the file with the bad config and the min config
1722 if (defined($minconfig)) {
1723 # read the min config for things to ignore
1724 run_command "cp $minconfig $tmpconfig" or
1725 dodie "failed to copy $minconfig to $tmpconfig";
1731 if (defined($addconfig)) {
1732 run_command "cat $addconfig >> $tmpconfig" or
1733 dodie "failed to append $addconfig";
1737 if (-f $tmpconfig) {
1738 $defconfig = "KCONFIG_ALLCONFIG=$tmpconfig";
1739 process_config_ignore $tmpconfig;
1742 # now process the start config
1743 run_command "cp $start_config $output_config" or
1744 dodie "failed to copy $start_config to $output_config";
1746 # read directly what we want to check
1748 open (IN, $output_config)
1749 or dodie "faied to open $output_config";
1752 if (/^((CONFIG\S*)=.*)/) {
1753 $config_check{$2} = $1;
1758 # Now run oldconfig with the minconfig (and addconfigs)
1759 make_oldconfig $defconfig;
1761 # check to see what we lost (or gained)
1762 open (IN, $output_config)
1763 or dodie "Failed to read $start_config";
1765 my %removed_configs;
1769 if (/^((CONFIG\S*)=.*)/) {
1770 # save off all options
1771 $config_set{$2} = $1;
1772 if (defined($config_check{$2})) {
1773 if (defined($config_ignore{$2})) {
1774 $removed_configs{$2} = $1;
1776 $config_list{$2} = $1;
1778 } elsif (!defined($config_ignore{$2})) {
1779 $added_configs{$2} = $1;
1780 $config_list{$2} = $1;
1786 my @confs = keys %removed_configs;
1788 doprint "Configs overridden by default configs and removed from check:\n";
1789 foreach my $config (@confs) {
1790 doprint " $config\n";
1793 @confs = keys %added_configs;
1795 doprint "Configs appearing in make oldconfig and added:\n";
1796 foreach my $config (@confs) {
1797 doprint " $config\n";
1804 # Sometimes kconfig does weird things. We must make sure
1805 # that the config we autocreate has everything we need
1806 # to test, otherwise we may miss testing configs, or
1807 # may not be able to create a new config.
1808 # Here we create a config with everything set.
1809 create_config (keys %config_list);
1810 read_current_config \%config_test;
1811 foreach my $config (keys %config_list) {
1812 if (!defined($config_test{$config})) {
1815 doprint "Configs not produced by kconfig (will not be checked):\n";
1817 doprint " $config\n";
1818 delete $config_list{$config};
1823 $ret = run_config_bisect;
1826 return $ret if ($ret < 0);
1831 sub patchcheck_reboot {
1832 doprint "Reboot and sleep $patchcheck_sleep_time seconds\n";
1835 wait_for_monitor $patchcheck_sleep_time;
1842 die "PATCHCHECK_START[$i] not defined\n"
1843 if (!defined($opt{"PATCHCHECK_START[$i]"}));
1844 die "PATCHCHECK_TYPE[$i] not defined\n"
1845 if (!defined($opt{"PATCHCHECK_TYPE[$i]"}));
1847 my $start = $opt{"PATCHCHECK_START[$i]"};
1850 if (defined($opt{"PATCHCHECK_END[$i]"})) {
1851 $end = $opt{"PATCHCHECK_END[$i]"};
1854 # Get the true sha1's since we can use things like HEAD~3
1855 $start = get_sha1($start);
1856 $end = get_sha1($end);
1858 my $type = $opt{"PATCHCHECK_TYPE[$i]"};
1860 # Can't have a test without having a test to run
1861 if ($type eq "test" && !defined($run_test)) {
1865 open (IN, "git log --pretty=oneline $end|") or
1866 dodie "could not get git list";
1872 $list[$#list+1] = $_;
1873 last if (/^$start/);
1877 if ($list[$#list] !~ /^$start/) {
1878 fail "SHA1 $start not found";
1881 # go backwards in the list
1882 @list = reverse @list;
1884 my $save_clean = $noclean;
1887 foreach my $item (@list) {
1889 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
1891 doprint "\nProcessing commit $item\n\n";
1893 run_command "git checkout $sha1" or
1894 die "Failed to checkout $sha1";
1896 # only clean on the first and last patch
1897 if ($item eq $list[0] ||
1898 $item eq $list[$#list]) {
1899 $noclean = $save_clean;
1904 if (defined($minconfig)) {
1905 build "useconfig:$minconfig" or return 0;
1907 # ?? no config to use?
1908 build "oldconfig" or return 0;
1911 check_buildlog $sha1 or return 0;
1913 next if ($type eq "build");
1922 monitor or $failed = 1;
1924 if (!$failed && $type ne "boot"){
1925 do_run_test or $failed = 1;
1928 return 0 if ($failed);
1939 $#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
1942 $ktest_config = $ARGV[0];
1943 if (! -f $ktest_config) {
1944 print "$ktest_config does not exist.\n";
1947 print "Create it? [Y/n] ";
1950 if ($ans =~ /^\s*$/) {
1953 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
1954 print "Please answer either 'y' or 'n'.\n";
1956 if ($ans !~ /^y$/i) {
1961 $ktest_config = "ktest.conf";
1964 if (! -f $ktest_config) {
1965 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
1967 # Generated by ktest.pl
1969 # Define each test with TEST_START
1970 # The config options below it will override the defaults
1978 read_config $ktest_config;
1980 # Append any configs entered in manually to the config file.
1981 my @new_configs = keys %entered_configs;
1982 if ($#new_configs >= 0) {
1983 print "\nAppending entered in configs to $ktest_config\n";
1984 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
1985 foreach my $config (@new_configs) {
1986 print OUT "$config = $entered_configs{$config}\n";
1987 $opt{$config} = $entered_configs{$config};
1991 if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
1992 unlink $opt{"LOG_FILE"};
1995 doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
1997 for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
2000 doprint "DEFAULT OPTIONS:\n";
2002 doprint "\nTEST $i OPTIONS";
2003 if (defined($repeat_tests{$i})) {
2004 $repeat = $repeat_tests{$i};
2005 doprint " ITERATE $repeat";
2010 foreach my $option (sort keys %opt) {
2012 if ($option =~ /\[(\d+)\]$/) {
2018 doprint "$option = $opt{$option}\n";
2022 sub __set_test_option {
2023 my ($name, $i) = @_;
2025 my $option = "$name\[$i\]";
2027 if (defined($opt{$option})) {
2028 return $opt{$option};
2031 foreach my $test (keys %repeat_tests) {
2033 $i < $test + $repeat_tests{$test}) {
2034 $option = "$name\[$test\]";
2035 if (defined($opt{$option})) {
2036 return $opt{$option};
2041 if (defined($opt{$name})) {
2049 my ($option, $i) = @_;
2051 # Add space to evaluate the character before $
2052 $option = " $option";
2055 while ($option =~ /(.*?[^\\])\$\{(.*?)\}(.*)/) {
2060 # Append beginning of line
2061 $retval = "$retval$start";
2063 # If the iteration option OPT[$i] exists, then use that.
2064 # otherwise see if the default OPT (without [$i]) exists.
2066 my $o = "$var\[$i\]";
2068 if (defined($opt{$o})) {
2070 $retval = "$retval$o";
2071 } elsif (defined($opt{$var})) {
2073 $retval = "$retval$o";
2075 $retval = "$retval\$\{$var\}";
2081 $retval = "$retval$option";
2088 sub set_test_option {
2089 my ($name, $i) = @_;
2091 my $option = __set_test_option($name, $i);
2092 return $option if (!defined($option));
2096 # Since an option can evaluate to another option,
2097 # keep iterating until we do not evaluate any more
2100 while ($prev ne $option) {
2101 # Check for recursive evaluations.
2102 # 100 deep should be more than enough.
2104 die "Over 100 evaluations accurred with $name\n" .
2105 "Check for recursive variables\n";
2108 $option = eval_option($option, $i);
2114 # First we need to do is the builds
2115 for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
2119 my $makecmd = set_test_option("MAKE_CMD", $i);
2121 $machine = set_test_option("MACHINE", $i);
2122 $ssh_user = set_test_option("SSH_USER", $i);
2123 $tmpdir = set_test_option("TMP_DIR", $i);
2124 $outputdir = set_test_option("OUTPUT_DIR", $i);
2125 $builddir = set_test_option("BUILD_DIR", $i);
2126 $test_type = set_test_option("TEST_TYPE", $i);
2127 $build_type = set_test_option("BUILD_TYPE", $i);
2128 $build_options = set_test_option("BUILD_OPTIONS", $i);
2129 $power_cycle = set_test_option("POWER_CYCLE", $i);
2130 $reboot = set_test_option("REBOOT", $i);
2131 $noclean = set_test_option("BUILD_NOCLEAN", $i);
2132 $minconfig = set_test_option("MIN_CONFIG", $i);
2133 $run_test = set_test_option("TEST", $i);
2134 $addconfig = set_test_option("ADD_CONFIG", $i);
2135 $reboot_type = set_test_option("REBOOT_TYPE", $i);
2136 $grub_menu = set_test_option("GRUB_MENU", $i);
2137 $post_install = set_test_option("POST_INSTALL", $i);
2138 $reboot_script = set_test_option("REBOOT_SCRIPT", $i);
2139 $reboot_on_error = set_test_option("REBOOT_ON_ERROR", $i);
2140 $poweroff_on_error = set_test_option("POWEROFF_ON_ERROR", $i);
2141 $die_on_failure = set_test_option("DIE_ON_FAILURE", $i);
2142 $power_off = set_test_option("POWER_OFF", $i);
2143 $powercycle_after_reboot = set_test_option("POWERCYCLE_AFTER_REBOOT", $i);
2144 $poweroff_after_halt = set_test_option("POWEROFF_AFTER_HALT", $i);
2145 $sleep_time = set_test_option("SLEEP_TIME", $i);
2146 $bisect_sleep_time = set_test_option("BISECT_SLEEP_TIME", $i);
2147 $patchcheck_sleep_time = set_test_option("PATCHCHECK_SLEEP_TIME", $i);
2148 $bisect_manual = set_test_option("BISECT_MANUAL", $i);
2149 $bisect_skip = set_test_option("BISECT_SKIP", $i);
2150 $store_failures = set_test_option("STORE_FAILURES", $i);
2151 $timeout = set_test_option("TIMEOUT", $i);
2152 $booted_timeout = set_test_option("BOOTED_TIMEOUT", $i);
2153 $console = set_test_option("CONSOLE", $i);
2154 $success_line = set_test_option("SUCCESS_LINE", $i);
2155 $stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i);
2156 $stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i);
2157 $stop_test_after = set_test_option("STOP_TEST_AFTER", $i);
2158 $build_target = set_test_option("BUILD_TARGET", $i);
2159 $ssh_exec = set_test_option("SSH_EXEC", $i);
2160 $scp_to_target = set_test_option("SCP_TO_TARGET", $i);
2161 $target_image = set_test_option("TARGET_IMAGE", $i);
2162 $localversion = set_test_option("LOCALVERSION", $i);
2164 chdir $builddir || die "can't change directory to $builddir";
2168 die "can't create $tmpdir";
2171 $ENV{"SSH_USER"} = $ssh_user;
2172 $ENV{"MACHINE"} = $machine;
2174 $target = "$ssh_user\@$machine";
2176 $buildlog = "$tmpdir/buildlog-$machine";
2177 $dmesg = "$tmpdir/dmesg-$machine";
2178 $make = "$makecmd O=$outputdir";
2179 $output_config = "$outputdir/.config";
2181 if ($reboot_type eq "grub") {
2182 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
2183 } elsif (!defined($reboot_script)) {
2184 dodie "REBOOT_SCRIPT not defined"
2187 my $run_type = $build_type;
2188 if ($test_type eq "patchcheck") {
2189 $run_type = $opt{"PATCHCHECK_TYPE[$i]"};
2190 } elsif ($test_type eq "bisect") {
2191 $run_type = $opt{"BISECT_TYPE[$i]"};
2192 } elsif ($test_type eq "config_bisect") {
2193 $run_type = $opt{"CONFIG_BISECT_TYPE[$i]"};
2196 # mistake in config file?
2197 if (!defined($run_type)) {
2198 $run_type = "ERROR";
2202 doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type\n\n";
2207 if (!defined($minconfig)) {
2208 $minconfig = $addconfig;
2210 } elsif (defined($addconfig)) {
2211 run_command "cat $addconfig $minconfig > $tmpdir/add_config" or
2212 dodie "Failed to create temp config";
2213 $minconfig = "$tmpdir/add_config";
2216 my $checkout = $opt{"CHECKOUT[$i]"};
2217 if (defined($checkout)) {
2218 run_command "git checkout $checkout" or
2219 die "failed to checkout $checkout";
2222 if ($test_type eq "bisect") {
2225 } elsif ($test_type eq "config_bisect") {
2228 } elsif ($test_type eq "patchcheck") {
2233 if ($build_type ne "nobuild") {
2234 build $build_type or next;
2237 if ($test_type ne "build") {
2244 monitor or $failed = 1;;
2246 if (!$failed && $test_type ne "boot" && defined($run_test)) {
2247 do_run_test or $failed = 1;
2256 if ($opt{"POWEROFF_ON_SUCCESS"}) {
2258 } elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot) {
2262 doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";