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{"CLEAR_LOG"} = 0;
40 $default{"BISECT_MANUAL"} = 0;
41 $default{"BISECT_SKIP"} = 1;
42 $default{"SUCCESS_LINE"} = "login:";
43 $default{"BOOTED_TIMEOUT"} = 1;
44 $default{"DIE_ON_FAILURE"} = 1;
45 $default{"SSH_EXEC"} = "ssh \$SSH_USER\@\$MACHINE \$SSH_COMMAND";
46 $default{"SCP_TO_TARGET"} = "scp \$SRC_FILE \$SSH_USER\@\$MACHINE:\$DST_FILE";
47 $default{"REBOOT"} = "ssh \$SSH_USER\@\$MACHINE reboot";
48 $default{"STOP_AFTER_SUCCESS"} = 10;
49 $default{"STOP_AFTER_FAILURE"} = 60;
50 $default{"STOP_TEST_AFTER"} = 600;
51 $default{"LOCALVERSION"} = "-test";
69 my $poweroff_on_error;
71 my $powercycle_after_reboot;
72 my $poweroff_after_halt;
89 my $in_patchcheck = 0;
98 my $bisect_sleep_time;
104 my $stop_after_success;
105 my $stop_after_failure;
116 $config_help{"MACHINE"} = << "EOF"
117 The machine hostname that you will test.
120 $config_help{"SSH_USER"} = << "EOF"
121 The box is expected to have ssh on normal bootup, provide the user
122 (most likely root, since you need privileged operations)
125 $config_help{"BUILD_DIR"} = << "EOF"
126 The directory that contains the Linux source code (full path).
129 $config_help{"OUTPUT_DIR"} = << "EOF"
130 The directory that the objects will be built (full path).
131 (can not be same as BUILD_DIR)
134 $config_help{"BUILD_TARGET"} = << "EOF"
135 The location of the compiled file to copy to the target.
136 (relative to OUTPUT_DIR)
139 $config_help{"TARGET_IMAGE"} = << "EOF"
140 The place to put your image on the test machine.
143 $config_help{"POWER_CYCLE"} = << "EOF"
144 A script or command to reboot the box.
146 Here is a digital loggers power switch example
147 POWER_CYCLE = wget --no-proxy -O /dev/null -q --auth-no-challenge 'http://admin:admin\@power/outlet?5=CCL'
149 Here is an example to reboot a virtual box on the current host
150 with the name "Guest".
151 POWER_CYCLE = virsh destroy Guest; sleep 5; virsh start Guest
154 $config_help{"CONSOLE"} = << "EOF"
155 The script or command that reads the console
157 If you use ttywatch server, something like the following would work.
158 CONSOLE = nc -d localhost 3001
160 For a virtual machine with guest name "Guest".
161 CONSOLE = virsh console Guest
164 $config_help{"LOCALVERSION"} = << "EOF"
165 Required version ending to differentiate the test
166 from other linux builds on the system.
169 $config_help{"REBOOT_TYPE"} = << "EOF"
170 Way to reboot the box to the test kernel.
171 Only valid options so far are "grub" and "script".
173 If you specify grub, it will assume grub version 1
174 and will search in /boot/grub/menu.lst for the title \$GRUB_MENU
175 and select that target to reboot to the kernel. If this is not
176 your setup, then specify "script" and have a command or script
177 specified in REBOOT_SCRIPT to boot to the target.
179 The entry in /boot/grub/menu.lst must be entered in manually.
180 The test will not modify that file.
183 $config_help{"GRUB_MENU"} = << "EOF"
184 The grub title name for the test kernel to boot
185 (Only mandatory if REBOOT_TYPE = grub)
187 Note, ktest.pl will not update the grub menu.lst, you need to
188 manually add an option for the test. ktest.pl will search
189 the grub menu.lst for this option to find what kernel to
192 For example, if in the /boot/grub/menu.lst the test kernel title has:
195 GRUB_MENU = Test Kernel
198 $config_help{"REBOOT_SCRIPT"} = << "EOF"
199 A script to reboot the target into the test kernel
200 (Only mandatory if REBOOT_TYPE = script)
205 sub get_ktest_config {
208 return if (defined($opt{$config}));
210 if (defined($config_help{$config})) {
212 print $config_help{$config};
217 if (defined($default{$config})) {
218 print "\[$default{$config}\] ";
220 $entered_configs{$config} = <STDIN>;
221 $entered_configs{$config} =~ s/^\s*(.*\S)\s*$/$1/;
222 if ($entered_configs{$config} =~ /^\s*$/) {
223 if ($default{$config}) {
224 $entered_configs{$config} = $default{$config};
226 print "Your answer can not be blank\n";
234 sub get_ktest_configs {
235 get_ktest_config("MACHINE");
236 get_ktest_config("SSH_USER");
237 get_ktest_config("BUILD_DIR");
238 get_ktest_config("OUTPUT_DIR");
239 get_ktest_config("BUILD_TARGET");
240 get_ktest_config("TARGET_IMAGE");
241 get_ktest_config("POWER_CYCLE");
242 get_ktest_config("CONSOLE");
243 get_ktest_config("LOCALVERSION");
245 my $rtype = $opt{"REBOOT_TYPE"};
247 if (!defined($rtype)) {
248 if (!defined($opt{"GRUB_MENU"})) {
249 get_ktest_config("REBOOT_TYPE");
250 $rtype = $entered_configs{"REBOOT_TYPE"};
256 if ($rtype eq "grub") {
257 get_ktest_config("GRUB_MENU");
259 get_ktest_config("REBOOT_SCRIPT");
264 my ($lvalue, $rvalue) = @_;
266 if (defined($opt{$lvalue})) {
267 die "Error: Option $lvalue defined more than once!\n";
269 if ($rvalue =~ /^\s*$/) {
270 delete $opt{$lvalue};
272 $opt{$lvalue} = $rvalue;
279 open(IN, $config) || die "can't read file $config";
282 $name =~ s,.*/(.*),$1,;
287 my $num_tests_set = 0;
293 # ignore blank lines and comments
294 next if (/^\s*$/ || /\s*\#/);
296 if (/^\s*TEST_START(.*)/) {
300 if ($num_tests_set) {
301 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
304 my $old_test_num = $test_num;
305 my $old_repeat = $repeat;
307 $test_num += $repeat;
311 if ($rest =~ /\s+SKIP(.*)/) {
318 if ($rest =~ /\s+ITERATE\s+(\d+)(.*)$/) {
321 $repeat_tests{"$test_num"} = $repeat;
324 if ($rest =~ /\s+SKIP(.*)/) {
329 if ($rest !~ /^\s*$/) {
330 die "$name: $.: Gargbage found after TEST_START\n$_";
334 $test_num = $old_test_num;
335 $repeat = $old_repeat;
338 } elsif (/^\s*DEFAULTS(.*)$/) {
343 if ($rest =~ /\s+SKIP(.*)/) {
350 if ($rest !~ /^\s*$/) {
351 die "$name: $.: Gargbage found after DEFAULTS\n$_";
354 } elsif (/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
362 ($lvalue eq "NUM_TESTS" ||
363 $lvalue eq "LOG_FILE" ||
364 $lvalue eq "CLEAR_LOG")) {
365 die "$name: $.: $lvalue must be set in DEFAULTS section\n";
368 if ($lvalue eq "NUM_TESTS") {
370 die "$name: $.: Can not specify both NUM_TESTS and TEST_START\n";
373 die "$name: $.: NUM_TESTS must be set in default section\n";
378 if ($default || $lvalue =~ /\[\d+\]$/) {
379 set_value($lvalue, $rvalue);
381 my $val = "$lvalue\[$test_num\]";
382 set_value($val, $rvalue);
385 $repeats{$val} = $repeat;
389 die "$name: $.: Garbage found in config\n$_";
396 $test_num += $repeat - 1;
397 $opt{"NUM_TESTS"} = $test_num;
400 # make sure we have all mandatory configs
405 foreach my $default (keys %default) {
406 if (!defined($opt{$default})) {
407 $opt{$default} = $default{$default};
413 if (defined($opt{"LOG_FILE"})) {
414 open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}";
421 if (defined($opt{"LOG_FILE"})) {
436 # try to reboot normally
437 if (run_command $reboot) {
438 if (defined($powercycle_after_reboot)) {
439 sleep $powercycle_after_reboot;
440 run_command "$power_cycle";
443 # nope? power cycle it.
444 run_command "$power_cycle";
451 return $test_type eq "build" ||
452 ($test_type eq "patchcheck" && $opt{"PATCHCHECK_TYPE[$i]"} eq "build") ||
453 ($test_type eq "bisect" && $opt{"BISECT_TYPE[$i]"} eq "build");
457 doprint "CRITICAL FAILURE... ", @_, "\n";
461 if ($reboot_on_error && !do_not_reboot) {
463 doprint "REBOOTING\n";
466 } elsif ($poweroff_on_error && defined($power_off)) {
467 doprint "POWERING OFF\n";
471 if (defined($opt{"LOG_FILE"})) {
472 print " See $opt{LOG_FILE} for more info.\n";
483 my $pid = open($fp, "$console|") or
484 dodie "Can't open console $console";
486 $flags = fcntl($fp, F_GETFL, 0) or
487 dodie "Can't get flags for the socket: $!";
488 $flags = fcntl($fp, F_SETFL, $flags | O_NONBLOCK) or
489 dodie "Can't set flags for the socket: $!";
497 doprint "kill child process $pid\n";
505 if ($monitor_cnt++) {
508 $monitor_fp = \*MONFD;
509 $monitor_pid = open_console $monitor_fp;
513 open(MONFD, "Stop perl from warning about single use of MONFD");
517 if (--$monitor_cnt) {
520 close_console($monitor_fp, $monitor_pid);
523 sub wait_for_monitor {
527 doprint "** Wait for monitor to settle down **\n";
529 # read the monitor and wait for the system to calm down
531 $line = wait_for_input($monitor_fp, $time);
532 print "$line" if (defined($line));
533 } while (defined($line));
534 print "** Monitor flushed **\n";
539 if ($die_on_failure) {
547 # no need to reboot for just building.
548 if (!do_not_reboot) {
549 doprint "REBOOTING\n";
552 wait_for_monitor $sleep_time;
556 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
557 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
558 doprint "KTEST RESULT: TEST $i Failed: ", @_, "\n";
559 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
560 doprint "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
562 return 1 if (!defined($store_failures));
565 my $date = sprintf "%04d%02d%02d%02d%02d%02d",
566 1900+$t[5],$t[4],$t[3],$t[2],$t[1],$t[0];
568 my $type = $build_type;
569 if ($type =~ /useconfig/) {
573 my $dir = "$machine-$test_type-$type-fail-$date";
574 my $faildir = "$store_failures/$dir";
578 die "can't create $faildir";
580 if (-f "$output_config") {
581 cp "$output_config", "$faildir/config" or
582 die "failed to copy .config";
585 cp $buildlog, "$faildir/buildlog" or
586 die "failed to move $buildlog";
589 cp $dmesg, "$faildir/dmesg" or
590 die "failed to move $dmesg";
593 doprint "*** Saved info to $faildir ***\n";
604 $command =~ s/\$SSH_USER/$ssh_user/g;
605 $command =~ s/\$MACHINE/$machine/g;
607 doprint("$command ... ");
609 $pid = open(CMD, "$command 2>&1 |") or
610 (fail "unable to exec $command" and return 0);
612 if (defined($opt{"LOG_FILE"})) {
613 open(LOG, ">>$opt{LOG_FILE}") or
614 dodie "failed to write to log";
618 if (defined($redirect)) {
619 open (RD, ">$redirect") or
620 dodie "failed to write to redirect $redirect";
625 print LOG if ($dolog);
633 close(LOG) if ($dolog);
634 close(RD) if ($dord);
647 my $cp_exec = $ssh_exec;
649 $cp_exec =~ s/\$SSH_COMMAND/$cmd/g;
650 return run_command "$cp_exec";
654 my ($src, $dst) = @_;
655 my $cp_scp = $scp_to_target;
657 $cp_scp =~ s/\$SRC_FILE/$src/g;
658 $cp_scp =~ s/\$DST_FILE/$dst/g;
660 return run_command "$cp_scp";
665 if ($reboot_type ne "grub") {
668 return if (defined($grub_number));
670 doprint "Find grub menu ... ";
673 my $ssh_grub = $ssh_exec;
674 $ssh_grub =~ s,\$SSH_COMMAND,cat /boot/grub/menu.lst,g;
676 open(IN, "$ssh_grub |")
677 or die "unable to get menu.lst";
680 if (/^\s*title\s+$grub_menu\s*$/) {
683 } elsif (/^\s*title\s/) {
689 die "Could not find '$grub_menu' in /boot/grub/menu on $machine"
690 if ($grub_number < 0);
691 doprint "$grub_number\n";
696 my ($fp, $time) = @_;
702 if (!defined($time)) {
707 vec($rin, fileno($fp), 1) = 1;
708 $ready = select($rin, undef, undef, $time);
712 # try to read one char at a time
713 while (sysread $fp, $ch, 1) {
715 last if ($ch eq "\n");
718 if (!length($line)) {
726 if ($reboot_type eq "grub") {
727 run_ssh "'(echo \"savedefault --default=$grub_number --once\" | grub --batch; reboot)'";
731 run_command "$reboot_script";
737 doprint "git rev-list --max-count=1 $commit ... ";
738 my $sha1 = `git rev-list --max-count=1 $commit`;
745 dodie "Failed to get git $commit";
758 my $skip_call_trace = 0;
766 open(DMESG, "> $dmesg") or
767 die "unable to write to $dmesg";
773 my $monitor_start = time;
779 $line = wait_for_input($monitor_fp, $booted_timeout);
781 $line = wait_for_input($monitor_fp);
784 last if (!defined($line));
789 # we are not guaranteed to get a full line
792 if ($full_line =~ /$success_line/) {
794 $success_start = time;
797 if ($booted && defined($stop_after_success) &&
798 $stop_after_success >= 0) {
800 if ($now - $success_start >= $stop_after_success) {
801 doprint "Test forced to stop after $stop_after_success seconds after success\n";
806 if ($full_line =~ /\[ backtrace testing \]/) {
807 $skip_call_trace = 1;
810 if ($full_line =~ /call trace:/i) {
811 if (!$bug && !$skip_call_trace) {
813 $failure_start = time;
817 if ($bug && defined($stop_after_failure) &&
818 $stop_after_failure >= 0) {
820 if ($now - $failure_start >= $stop_after_failure) {
821 doprint "Test forced to stop after $stop_after_failure seconds after failure\n";
826 if ($full_line =~ /\[ end of backtrace testing \]/) {
827 $skip_call_trace = 0;
830 if ($full_line =~ /Kernel panic -/) {
831 $failure_start = time;
839 if ($stop_test_after > 0 && !$booted && !$bug) {
840 if (time - $monitor_start > $stop_test_after) {
849 return 0 if ($in_bisect);
850 fail "failed - got a bug report" and return 0;
854 return 0 if ($in_bisect);
855 fail "failed - never got a boot prompt." and return 0;
863 run_scp "$outputdir/$build_target", "$target_image" or
864 dodie "failed to copy image";
866 my $install_mods = 0;
868 # should we process modules?
870 open(IN, "$output_config") or dodie("Can't read config file");
872 if (/CONFIG_MODULES(=y)?/) {
873 $install_mods = 1 if (defined($1));
879 if (!$install_mods) {
880 doprint "No modules needed\n";
884 run_command "$make INSTALL_MOD_PATH=$tmpdir modules_install" or
885 dodie "Failed to install modules";
887 my $modlib = "/lib/modules/$version";
888 my $modtar = "ktest-mods.tar.bz2";
890 run_ssh "rm -rf $modlib" or
891 dodie "failed to remove old mods: $modlib";
893 # would be nice if scp -r did not follow symbolic links
894 run_command "cd $tmpdir && tar -cjf $modtar lib/modules/$version" or
895 dodie "making tarball";
897 run_scp "$tmpdir/$modtar", "/tmp" or
898 dodie "failed to copy modules";
900 unlink "$tmpdir/$modtar";
902 run_ssh "'(cd / && tar xf /tmp/$modtar)'" or
903 dodie "failed to tar modules";
905 run_ssh "rm -f /tmp/$modtar";
907 return if (!defined($post_install));
909 my $cp_post_install = $post_install;
910 $cp_post_install = s/\$KERNEL_VERSION/$version/g;
911 run_command "$cp_post_install" or
912 dodie "Failed to run post install";
918 my @files = `git show $patch | diffstat -l`;
920 open(IN, "git show $patch |") or
921 dodie "failed to show $patch";
923 if (m,^--- a/(.*),) {
925 $files[$#files] = $1;
930 open(IN, $buildlog) or dodie "Can't open $buildlog";
932 if (/^\s*(.*?):.*(warning|error)/) {
934 foreach my $file (@files) {
935 my $fullpath = "$builddir/$file";
936 if ($file eq $err || $fullpath eq $err) {
937 fail "$file built with warnings" and return 0;
948 my ($defconfig) = @_;
950 if (!run_command "$defconfig $make oldnoconfig") {
951 # Perhaps oldnoconfig doesn't exist in this version of the kernel
952 # try a yes '' | oldconfig
953 doprint "oldnoconfig failed, trying yes '' | make oldconfig\n";
954 run_command "yes '' | $defconfig $make oldconfig" or
955 dodie "failed make config oldconfig";
965 if ($type =~ /^useconfig:(.*)/) {
966 run_command "cp $1 $output_config" or
967 dodie "could not copy $1 to .config";
972 # old config can ask questions
973 if ($type eq "oldconfig") {
974 $type = "oldnoconfig";
976 # allow for empty configs
977 run_command "touch $output_config";
979 run_command "mv $output_config $outputdir/config_temp" or
980 dodie "moving .config";
982 if (!$noclean && !run_command "$make mrproper") {
983 dodie "make mrproper";
986 run_command "mv $outputdir/config_temp $output_config" or
987 dodie "moving config_temp";
989 } elsif (!$noclean) {
990 unlink "$output_config";
991 run_command "$make mrproper" or
992 dodie "make mrproper";
995 # add something to distinguish this build
996 open(OUT, "> $outputdir/localversion") or dodie("Can't make localversion file");
997 print OUT "$localversion\n";
1000 if (defined($minconfig)) {
1001 $defconfig = "KCONFIG_ALLCONFIG=$minconfig";
1004 if ($type eq "oldnoconfig") {
1005 make_oldconfig $defconfig;
1007 run_command "$defconfig $make $type" or
1008 dodie "failed make config";
1011 $redirect = "$buildlog";
1012 if (!run_command "$make $build_options") {
1014 # bisect may need this to pass
1015 return 0 if ($in_bisect);
1016 fail "failed build" and return 0;
1024 if (!run_ssh "halt" or defined($power_off)) {
1025 if (defined($poweroff_after_halt)) {
1026 sleep $poweroff_after_halt;
1027 run_command "$power_off";
1031 run_command "$power_off";
1040 doprint "\n\n*******************************************\n";
1041 doprint "*******************************************\n";
1042 doprint "KTEST RESULT: TEST $i SUCCESS!!!! **\n";
1043 doprint "*******************************************\n";
1044 doprint "*******************************************\n";
1046 if ($i != $opt{"NUM_TESTS"} && !do_not_reboot) {
1047 doprint "Reboot and wait $sleep_time seconds\n";
1050 wait_for_monitor $sleep_time;
1056 # get the release name
1057 doprint "$make kernelrelease ... ";
1058 $version = `$make kernelrelease | tail -1`;
1060 doprint "$version\n";
1065 doprint "Pass or fail? [p/f]";
1068 if ($ans eq "p" || $ans eq "P") {
1070 } elsif ($ans eq "f" || $ans eq "F") {
1073 print "Please answer 'P' or 'F'\n";
1078 sub child_run_test {
1081 # child should have no power
1082 $reboot_on_error = 0;
1083 $poweroff_on_error = 0;
1084 $die_on_failure = 1;
1086 run_command $run_test or $failed = 1;
1092 sub child_finished {
1105 doprint "run test $run_test\n";
1109 $SIG{CHLD} = qw(child_finished);
1113 child_run_test if (!$child_pid);
1118 $line = wait_for_input($monitor_fp, 1);
1119 if (defined($line)) {
1121 # we are not guaranteed to get a full line
1122 $full_line .= $line;
1125 if ($full_line =~ /call trace:/i) {
1129 if ($full_line =~ /Kernel panic -/) {
1133 if ($line =~ /\n/) {
1137 } while (!$child_done && !$bug);
1140 my $failure_start = time;
1143 $line = wait_for_input($monitor_fp, 1);
1144 if (defined($line)) {
1148 if ($now - $failure_start >= $stop_after_failure) {
1151 } while (defined($line));
1153 doprint "Detected kernel crash!\n";
1154 # kill the child with extreme prejudice
1158 waitpid $child_pid, 0;
1161 if ($bug || $child_exit) {
1162 return 0 if $in_bisect;
1163 fail "test failed" and return 0;
1168 sub run_git_bisect {
1171 doprint "$command ... ";
1173 my $output = `$command 2>&1`;
1180 dodie "Failed to git bisect";
1183 doprint "SUCCESS\n";
1184 if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\))\s+\[([[:xdigit:]]+)\]/) {
1185 doprint "$1 [$2]\n";
1186 } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) {
1188 doprint "Found bad commit... $1\n";
1191 # we already logged it, just print it now.
1199 doprint "Reboot and sleep $bisect_sleep_time seconds\n";
1202 wait_for_monitor $bisect_sleep_time;
1206 # returns 1 on success, 0 on failure, -1 on skip
1207 sub run_bisect_test {
1208 my ($type, $buildtype) = @_;
1217 build $buildtype or $failed = 1;
1219 if ($type ne "build") {
1220 if ($failed && $bisect_skip) {
1224 dodie "Failed on build" if $failed;
1232 monitor or $failed = 1;
1234 if ($type ne "boot") {
1235 if ($failed && $bisect_skip) {
1241 dodie "Failed on boot" if $failed;
1243 do_run_test or $failed = 1;
1251 # reboot the box to a good kernel
1252 if ($type ne "build") {
1265 my $buildtype = "oldconfig";
1267 # We should have a minconfig to use?
1268 if (defined($minconfig)) {
1269 $buildtype = "useconfig:$minconfig";
1272 my $ret = run_bisect_test $type, $buildtype;
1274 if ($bisect_manual) {
1275 $ret = answer_bisect;
1278 # Are we looking for where it worked, not failed?
1279 if ($reverse_bisect) {
1285 } elsif ($ret == 0) {
1287 } elsif ($bisect_skip) {
1288 doprint "HIT A BAD COMMIT ... SKIPPING\n";
1298 die "BISECT_GOOD[$i] not defined\n" if (!defined($opt{"BISECT_GOOD[$i]"}));
1299 die "BISECT_BAD[$i] not defined\n" if (!defined($opt{"BISECT_BAD[$i]"}));
1300 die "BISECT_TYPE[$i] not defined\n" if (!defined($opt{"BISECT_TYPE[$i]"}));
1302 my $good = $opt{"BISECT_GOOD[$i]"};
1303 my $bad = $opt{"BISECT_BAD[$i]"};
1304 my $type = $opt{"BISECT_TYPE[$i]"};
1305 my $start = $opt{"BISECT_START[$i]"};
1306 my $replay = $opt{"BISECT_REPLAY[$i]"};
1307 my $start_files = $opt{"BISECT_FILES[$i]"};
1309 if (defined($start_files)) {
1310 $start_files = " -- " . $start_files;
1315 # convert to true sha1's
1316 $good = get_sha1($good);
1317 $bad = get_sha1($bad);
1319 if (defined($opt{"BISECT_REVERSE[$i]"}) &&
1320 $opt{"BISECT_REVERSE[$i]"} == 1) {
1321 doprint "Performing a reverse bisect (bad is good, good is bad!)\n";
1322 $reverse_bisect = 1;
1324 $reverse_bisect = 0;
1327 # Can't have a test without having a test to run
1328 if ($type eq "test" && !defined($run_test)) {
1332 my $check = $opt{"BISECT_CHECK[$i]"};
1333 if (defined($check) && $check ne "0") {
1336 my $head = get_sha1("HEAD");
1338 if ($check ne "good") {
1339 doprint "TESTING BISECT BAD [$bad]\n";
1340 run_command "git checkout $bad" or
1341 die "Failed to checkout $bad";
1343 $result = run_bisect $type;
1345 if ($result ne "bad") {
1346 fail "Tested BISECT_BAD [$bad] and it succeeded" and return 0;
1350 if ($check ne "bad") {
1351 doprint "TESTING BISECT GOOD [$good]\n";
1352 run_command "git checkout $good" or
1353 die "Failed to checkout $good";
1355 $result = run_bisect $type;
1357 if ($result ne "good") {
1358 fail "Tested BISECT_GOOD [$good] and it failed" and return 0;
1362 # checkout where we started
1363 run_command "git checkout $head" or
1364 die "Failed to checkout $head";
1367 run_command "git bisect start$start_files" or
1368 dodie "could not start bisect";
1370 run_command "git bisect good $good" or
1371 dodie "could not set bisect good to $good";
1373 run_git_bisect "git bisect bad $bad" or
1374 dodie "could not set bisect bad to $bad";
1376 if (defined($replay)) {
1377 run_command "git bisect replay $replay" or
1378 dodie "failed to run replay";
1381 if (defined($start)) {
1382 run_command "git checkout $start" or
1383 dodie "failed to checkout $start";
1388 $result = run_bisect $type;
1389 $test = run_git_bisect "git bisect $result";
1392 run_command "git bisect log" or
1393 dodie "could not capture git bisect log";
1395 run_command "git bisect reset" or
1396 dodie "could not reset git bisect";
1398 doprint "Bad commit was [$bisect_bad]\n";
1411 sub process_config_ignore {
1415 or dodie "Failed to read $config";
1418 if (/^(.*?(CONFIG\S*)(=.*| is not set))/) {
1419 $config_ignore{$2} = $1;
1426 sub read_current_config {
1427 my ($config_ref) = @_;
1429 %{$config_ref} = ();
1430 undef %{$config_ref};
1432 my @key = keys %{$config_ref};
1434 print "did not delete!\n";
1437 open (IN, "$output_config");
1440 if (/^(CONFIG\S+)=(.*)/) {
1441 ${$config_ref}{$1} = $2;
1447 sub get_dependencies {
1450 my $arr = $dependency{$config};
1451 if (!defined($arr)) {
1457 foreach my $dep (@{$arr}) {
1458 print "ADD DEP $dep\n";
1459 @deps = (@deps, get_dependencies $dep);
1468 open(OUT, ">$output_config") or dodie "Can not write to $output_config";
1470 foreach my $config (@configs) {
1471 print OUT "$config_set{$config}\n";
1472 my @deps = get_dependencies $config;
1473 foreach my $dep (@deps) {
1474 print OUT "$config_set{$dep}\n";
1478 foreach my $config (keys %config_ignore) {
1479 print OUT "$config_ignore{$config}\n";
1487 sub compare_configs {
1490 foreach my $item (keys %a) {
1491 if (!defined($b{$item})) {
1492 print "diff $item\n";
1500 print "diff2 $keys[0]\n";
1502 return -1 if ($#keys >= 0);
1507 sub run_config_bisect_test {
1510 return run_bisect_test $type, "oldconfig";
1513 sub process_passed {
1516 doprint "These configs had no failure: (Enabling them for further compiles)\n";
1517 # Passed! All these configs are part of a good compile.
1518 # Add them to the min options.
1519 foreach my $config (keys %configs) {
1520 if (defined($config_list{$config})) {
1521 doprint " removing $config\n";
1522 $config_ignore{$config} = $config_list{$config};
1523 delete $config_list{$config};
1526 doprint "config copied to $outputdir/config_good\n";
1527 run_command "cp -f $output_config $outputdir/config_good";
1530 sub process_failed {
1533 doprint "\n\n***************************************\n";
1534 doprint "Found bad config: $config\n";
1535 doprint "***************************************\n\n";
1538 sub run_config_bisect {
1540 my @start_list = keys %config_list;
1542 if ($#start_list < 0) {
1543 doprint "No more configs to test!!!\n";
1547 doprint "***** RUN TEST ***\n";
1548 my $type = $opt{"CONFIG_BISECT_TYPE[$iteration]"};
1552 my $count = $#start_list + 1;
1553 doprint " $count configs to test\n";
1555 my $half = int($#start_list / 2);
1558 my @tophalf = @start_list[0 .. $half];
1560 create_config @tophalf;
1561 read_current_config \%current_config;
1563 $count = $#tophalf + 1;
1564 doprint "Testing $count configs\n";
1566 # make sure we test something
1567 foreach my $config (@tophalf) {
1568 if (defined($current_config{$config})) {
1574 # try the other half
1575 doprint "Top half produced no set configs, trying bottom half\n";
1576 @tophalf = @start_list[$half .. $#start_list];
1577 create_config @tophalf;
1578 read_current_config \%current_config;
1579 foreach my $config (@tophalf) {
1580 if (defined($current_config{$config})) {
1586 doprint "Failed: Can't make new config with current configs\n";
1587 foreach my $config (@start_list) {
1588 doprint " CONFIG: $config\n";
1592 $count = $#tophalf + 1;
1593 doprint "Testing $count configs\n";
1596 $ret = run_config_bisect_test $type;
1597 if ($bisect_manual) {
1598 $ret = answer_bisect;
1601 process_passed %current_config;
1605 doprint "This config had a failure.\n";
1606 doprint "Removing these configs that were not set in this config:\n";
1607 doprint "config copied to $outputdir/config_bad\n";
1608 run_command "cp -f $output_config $outputdir/config_bad";
1610 # A config exists in this group that was bad.
1611 foreach my $config (keys %config_list) {
1612 if (!defined($current_config{$config})) {
1613 doprint " removing $config\n";
1614 delete $config_list{$config};
1618 @start_list = @tophalf;
1620 if ($#start_list == 0) {
1621 process_failed $start_list[0];
1625 # remove half the configs we are looking at and see if
1627 $half = int($#start_list / 2);
1628 } while ($half > 0);
1630 # we found a single config, try it again unless we are running manually
1632 if ($bisect_manual) {
1633 process_failed $start_list[0];
1637 my @tophalf = @start_list[0 .. 0];
1639 $ret = run_config_bisect_test $type;
1641 process_passed %current_config;
1645 process_failed $start_list[0];
1652 my $start_config = $opt{"CONFIG_BISECT[$i]"};
1654 my $tmpconfig = "$tmpdir/use_config";
1656 # Make the file with the bad config and the min config
1657 if (defined($minconfig)) {
1658 # read the min config for things to ignore
1659 run_command "cp $minconfig $tmpconfig" or
1660 dodie "failed to copy $minconfig to $tmpconfig";
1666 if (defined($addconfig)) {
1667 run_command "cat $addconfig >> $tmpconfig" or
1668 dodie "failed to append $addconfig";
1672 if (-f $tmpconfig) {
1673 $defconfig = "KCONFIG_ALLCONFIG=$tmpconfig";
1674 process_config_ignore $tmpconfig;
1677 # now process the start config
1678 run_command "cp $start_config $output_config" or
1679 dodie "failed to copy $start_config to $output_config";
1681 # read directly what we want to check
1683 open (IN, $output_config)
1684 or dodie "faied to open $output_config";
1687 if (/^((CONFIG\S*)=.*)/) {
1688 $config_check{$2} = $1;
1693 # Now run oldconfig with the minconfig (and addconfigs)
1694 make_oldconfig $defconfig;
1696 # check to see what we lost (or gained)
1697 open (IN, $output_config)
1698 or dodie "Failed to read $start_config";
1700 my %removed_configs;
1704 if (/^((CONFIG\S*)=.*)/) {
1705 # save off all options
1706 $config_set{$2} = $1;
1707 if (defined($config_check{$2})) {
1708 if (defined($config_ignore{$2})) {
1709 $removed_configs{$2} = $1;
1711 $config_list{$2} = $1;
1713 } elsif (!defined($config_ignore{$2})) {
1714 $added_configs{$2} = $1;
1715 $config_list{$2} = $1;
1721 my @confs = keys %removed_configs;
1723 doprint "Configs overridden by default configs and removed from check:\n";
1724 foreach my $config (@confs) {
1725 doprint " $config\n";
1728 @confs = keys %added_configs;
1730 doprint "Configs appearing in make oldconfig and added:\n";
1731 foreach my $config (@confs) {
1732 doprint " $config\n";
1739 # Sometimes kconfig does weird things. We must make sure
1740 # that the config we autocreate has everything we need
1741 # to test, otherwise we may miss testing configs, or
1742 # may not be able to create a new config.
1743 # Here we create a config with everything set.
1744 create_config (keys %config_list);
1745 read_current_config \%config_test;
1746 foreach my $config (keys %config_list) {
1747 if (!defined($config_test{$config})) {
1750 doprint "Configs not produced by kconfig (will not be checked):\n";
1752 doprint " $config\n";
1753 delete $config_list{$config};
1758 $ret = run_config_bisect;
1761 return $ret if ($ret < 0);
1769 die "PATCHCHECK_START[$i] not defined\n"
1770 if (!defined($opt{"PATCHCHECK_START[$i]"}));
1771 die "PATCHCHECK_TYPE[$i] not defined\n"
1772 if (!defined($opt{"PATCHCHECK_TYPE[$i]"}));
1774 my $start = $opt{"PATCHCHECK_START[$i]"};
1777 if (defined($opt{"PATCHCHECK_END[$i]"})) {
1778 $end = $opt{"PATCHCHECK_END[$i]"};
1781 # Get the true sha1's since we can use things like HEAD~3
1782 $start = get_sha1($start);
1783 $end = get_sha1($end);
1785 my $type = $opt{"PATCHCHECK_TYPE[$i]"};
1787 # Can't have a test without having a test to run
1788 if ($type eq "test" && !defined($run_test)) {
1792 open (IN, "git log --pretty=oneline $end|") or
1793 dodie "could not get git list";
1799 $list[$#list+1] = $_;
1800 last if (/^$start/);
1804 if ($list[$#list] !~ /^$start/) {
1805 fail "SHA1 $start not found";
1808 # go backwards in the list
1809 @list = reverse @list;
1811 my $save_clean = $noclean;
1814 foreach my $item (@list) {
1816 $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
1818 doprint "\nProcessing commit $item\n\n";
1820 run_command "git checkout $sha1" or
1821 die "Failed to checkout $sha1";
1823 # only clean on the first and last patch
1824 if ($item eq $list[0] ||
1825 $item eq $list[$#list]) {
1826 $noclean = $save_clean;
1831 if (defined($minconfig)) {
1832 build "useconfig:$minconfig" or return 0;
1834 # ?? no config to use?
1835 build "oldconfig" or return 0;
1838 check_buildlog $sha1 or return 0;
1840 next if ($type eq "build");
1849 monitor or $failed = 1;
1851 if (!$failed && $type ne "boot"){
1852 do_run_test or $failed = 1;
1855 return 0 if ($failed);
1864 $#ARGV < 1 or die "ktest.pl version: $VERSION\n usage: ktest.pl config-file\n";
1867 $ktest_config = $ARGV[0];
1868 if (! -f $ktest_config) {
1869 print "$ktest_config does not exist.\n";
1872 print "Create it? [Y/n] ";
1875 if ($ans =~ /^\s*$/) {
1878 last if ($ans =~ /^y$/i || $ans =~ /^n$/i);
1879 print "Please answer either 'y' or 'n'.\n";
1881 if ($ans !~ /^y$/i) {
1886 $ktest_config = "ktest.conf";
1889 if (! -f $ktest_config) {
1890 open(OUT, ">$ktest_config") or die "Can not create $ktest_config";
1892 # Generated by ktest.pl
1894 # Define each test with TEST_START
1895 # The config options below it will override the defaults
1903 read_config $ktest_config;
1905 # Append any configs entered in manually to the config file.
1906 my @new_configs = keys %entered_configs;
1907 if ($#new_configs >= 0) {
1908 print "\nAppending entered in configs to $ktest_config\n";
1909 open(OUT, ">>$ktest_config") or die "Can not append to $ktest_config";
1910 foreach my $config (@new_configs) {
1911 print OUT "$config = $entered_configs{$config}\n";
1912 $opt{$config} = $entered_configs{$config};
1916 if ($opt{"CLEAR_LOG"} && defined($opt{"LOG_FILE"})) {
1917 unlink $opt{"LOG_FILE"};
1920 doprint "\n\nSTARTING AUTOMATED TESTS\n\n";
1922 for (my $i = 0, my $repeat = 1; $i <= $opt{"NUM_TESTS"}; $i += $repeat) {
1925 doprint "DEFAULT OPTIONS:\n";
1927 doprint "\nTEST $i OPTIONS";
1928 if (defined($repeat_tests{$i})) {
1929 $repeat = $repeat_tests{$i};
1930 doprint " ITERATE $repeat";
1935 foreach my $option (sort keys %opt) {
1937 if ($option =~ /\[(\d+)\]$/) {
1943 doprint "$option = $opt{$option}\n";
1947 sub set_test_option {
1948 my ($name, $i) = @_;
1950 my $option = "$name\[$i\]";
1952 if (defined($opt{$option})) {
1953 return $opt{$option};
1956 foreach my $test (keys %repeat_tests) {
1958 $i < $test + $repeat_tests{$test}) {
1959 $option = "$name\[$test\]";
1960 if (defined($opt{$option})) {
1961 return $opt{$option};
1966 if (defined($opt{$name})) {
1973 # First we need to do is the builds
1974 for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {
1978 my $makecmd = set_test_option("MAKE_CMD", $i);
1980 $machine = set_test_option("MACHINE", $i);
1981 $ssh_user = set_test_option("SSH_USER", $i);
1982 $tmpdir = set_test_option("TMP_DIR", $i);
1983 $outputdir = set_test_option("OUTPUT_DIR", $i);
1984 $builddir = set_test_option("BUILD_DIR", $i);
1985 $test_type = set_test_option("TEST_TYPE", $i);
1986 $build_type = set_test_option("BUILD_TYPE", $i);
1987 $build_options = set_test_option("BUILD_OPTIONS", $i);
1988 $power_cycle = set_test_option("POWER_CYCLE", $i);
1989 $reboot = set_test_option("REBOOT", $i);
1990 $noclean = set_test_option("BUILD_NOCLEAN", $i);
1991 $minconfig = set_test_option("MIN_CONFIG", $i);
1992 $run_test = set_test_option("TEST", $i);
1993 $addconfig = set_test_option("ADD_CONFIG", $i);
1994 $reboot_type = set_test_option("REBOOT_TYPE", $i);
1995 $grub_menu = set_test_option("GRUB_MENU", $i);
1996 $post_install = set_test_option("POST_INSTALL", $i);
1997 $reboot_script = set_test_option("REBOOT_SCRIPT", $i);
1998 $reboot_on_error = set_test_option("REBOOT_ON_ERROR", $i);
1999 $poweroff_on_error = set_test_option("POWEROFF_ON_ERROR", $i);
2000 $die_on_failure = set_test_option("DIE_ON_FAILURE", $i);
2001 $power_off = set_test_option("POWER_OFF", $i);
2002 $powercycle_after_reboot = set_test_option("POWERCYCLE_AFTER_REBOOT", $i);
2003 $poweroff_after_halt = set_test_option("POWEROFF_AFTER_HALT", $i);
2004 $sleep_time = set_test_option("SLEEP_TIME", $i);
2005 $bisect_sleep_time = set_test_option("BISECT_SLEEP_TIME", $i);
2006 $bisect_manual = set_test_option("BISECT_MANUAL", $i);
2007 $bisect_skip = set_test_option("BISECT_SKIP", $i);
2008 $store_failures = set_test_option("STORE_FAILURES", $i);
2009 $timeout = set_test_option("TIMEOUT", $i);
2010 $booted_timeout = set_test_option("BOOTED_TIMEOUT", $i);
2011 $console = set_test_option("CONSOLE", $i);
2012 $success_line = set_test_option("SUCCESS_LINE", $i);
2013 $stop_after_success = set_test_option("STOP_AFTER_SUCCESS", $i);
2014 $stop_after_failure = set_test_option("STOP_AFTER_FAILURE", $i);
2015 $stop_test_after = set_test_option("STOP_TEST_AFTER", $i);
2016 $build_target = set_test_option("BUILD_TARGET", $i);
2017 $ssh_exec = set_test_option("SSH_EXEC", $i);
2018 $scp_to_target = set_test_option("SCP_TO_TARGET", $i);
2019 $target_image = set_test_option("TARGET_IMAGE", $i);
2020 $localversion = set_test_option("LOCALVERSION", $i);
2022 chdir $builddir || die "can't change directory to $builddir";
2026 die "can't create $tmpdir";
2029 $ENV{"SSH_USER"} = $ssh_user;
2030 $ENV{"MACHINE"} = $machine;
2032 $target = "$ssh_user\@$machine";
2034 $buildlog = "$tmpdir/buildlog-$machine";
2035 $dmesg = "$tmpdir/dmesg-$machine";
2036 $make = "$makecmd O=$outputdir";
2037 $output_config = "$outputdir/.config";
2039 if ($reboot_type eq "grub") {
2040 dodie "GRUB_MENU not defined" if (!defined($grub_menu));
2041 } elsif (!defined($reboot_script)) {
2042 dodie "REBOOT_SCRIPT not defined"
2045 my $run_type = $build_type;
2046 if ($test_type eq "patchcheck") {
2047 $run_type = $opt{"PATCHCHECK_TYPE[$i]"};
2048 } elsif ($test_type eq "bisect") {
2049 $run_type = $opt{"BISECT_TYPE[$i]"};
2050 } elsif ($test_type eq "config_bisect") {
2051 $run_type = $opt{"CONFIG_BISECT_TYPE[$i]"};
2054 # mistake in config file?
2055 if (!defined($run_type)) {
2056 $run_type = "ERROR";
2060 doprint "RUNNING TEST $i of $opt{NUM_TESTS} with option $test_type $run_type\n\n";
2065 if (!defined($minconfig)) {
2066 $minconfig = $addconfig;
2068 } elsif (defined($addconfig)) {
2069 run_command "cat $addconfig $minconfig > $tmpdir/add_config" or
2070 dodie "Failed to create temp config";
2071 $minconfig = "$tmpdir/add_config";
2074 my $checkout = $opt{"CHECKOUT[$i]"};
2075 if (defined($checkout)) {
2076 run_command "git checkout $checkout" or
2077 die "failed to checkout $checkout";
2080 if ($test_type eq "bisect") {
2083 } elsif ($test_type eq "config_bisect") {
2086 } elsif ($test_type eq "patchcheck") {
2091 if ($build_type ne "nobuild") {
2092 build $build_type or next;
2095 if ($test_type ne "build") {
2102 monitor or $failed = 1;;
2104 if (!$failed && $test_type ne "boot" && defined($run_test)) {
2105 do_run_test or $failed = 1;
2114 if ($opt{"POWEROFF_ON_SUCCESS"}) {
2116 } elsif ($opt{"REBOOT_ON_SUCCESS"} && !do_not_reboot) {
2120 doprint "\n $successes of $opt{NUM_TESTS} tests were successful\n\n";