Changeset 740 for vendor/current/selftest/selftest.pl
- Timestamp:
- Nov 14, 2012, 12:59:34 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/selftest/selftest.pl
r414 r740 1 1 #!/usr/bin/perl 2 2 # Bootstrap Samba and run a number of tests against it. 3 # Copyright (C) 2005-20 09Jelmer Vernooij <jelmer@samba.org>3 # Copyright (C) 2005-2010 Jelmer Vernooij <jelmer@samba.org> 4 4 # Copyright (C) 2007-2009 Stefan Metzmacher <metze@samba.org> 5 5 … … 126 126 use FindBin qw($RealBin $Script); 127 127 use File::Spec; 128 use File::Temp qw(tempfile); 128 129 use Getopt::Long; 129 130 use POSIX; 130 131 use Cwd qw(abs_path); 131 132 use lib "$RealBin"; 132 use Subunit qw(parse_results); 133 use Subunit::Filter; 133 use Subunit; 134 134 use SocketWrapper; 135 136 eval { 137 require Time::HiRes; 138 Time::HiRes->import("time"); 139 }; 140 if ($@) { 141 print "You don't have Time::Hires installed !\n"; 142 } 135 143 136 144 my $opt_help = 0; … … 146 154 my $opt_image = undef; 147 155 my $opt_testenv = 0; 156 my $opt_list = 0; 148 157 my $ldap = undef; 149 my $opt_analyse_cmd = undef;150 158 my $opt_resetup_env = undef; 151 159 my $opt_bindir = undef; 152 my $opt_ no_lazy_setup= undef;160 my $opt_load_list = undef; 153 161 my @testlists = (); 154 162 … … 161 169 my @excludes = (); 162 170 171 sub pipe_handler { 172 my $sig = shift @_; 173 print STDERR "Exiting early because of SIGPIPE.\n"; 174 exit(1); 175 } 176 177 $SIG{PIPE} = \&pipe_handler; 178 163 179 sub find_in_list($$) 164 180 { … … 213 229 } 214 230 231 # expand strings from %ENV 232 sub expand_environment_strings($) 233 { 234 my $s = shift; 235 # we use a reverse sort so we do the longer ones first 236 foreach my $k (sort { $b cmp $a } keys %ENV) { 237 $s =~ s/\$$k/$ENV{$k}/g; 238 } 239 return $s; 240 } 241 215 242 sub run_testsuite($$$$$) 216 243 { … … 219 246 220 247 Subunit::start_testsuite($name); 248 Subunit::progress_push(); 221 249 Subunit::report_time(time()); 222 223 open(RESULTS, "$cmd 2>&1|"); 224 my $statistics = { 225 TESTS_UNEXPECTED_OK => 0, 226 TESTS_EXPECTED_OK => 0, 227 TESTS_UNEXPECTED_FAIL => 0, 228 TESTS_EXPECTED_FAIL => 0, 229 TESTS_ERROR => 0, 230 TESTS_SKIP => 0, 231 }; 232 233 my $msg_ops = new Subunit::Filter("$name\.", []); 234 235 parse_results($msg_ops, $statistics, *RESULTS); 236 237 my $ret = 0; 238 239 unless (close(RESULTS)) { 240 if ($!) { 241 Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!"); 242 return 0; 243 } else { 244 $ret = $?; 245 } 246 } 247 248 if ($ret & 127) { 249 Subunit::end_testsuite($name, "error", sprintf("Testsuite died with signal %d, %s coredump", ($ret & 127), ($ret & 128) ? "with": "without")); 250 return 0; 251 } 250 system($cmd); 251 Subunit::report_time(time()); 252 Subunit::progress_pop(); 253 254 if ($? == -1) { 255 Subunit::progress_pop(); 256 Subunit::end_testsuite($name, "error", "Unable to run $cmd: $!"); 257 exit(1); 258 } elsif ($? & 127) { 259 Subunit::end_testsuite($name, "error", 260 sprintf("%s died with signal %d, %s coredump\n", $cmd, ($? & 127), ($? & 128) ? 'with' : 'without')); 261 exit(1); 262 } 263 264 my $exitcode = $? >> 8; 265 252 266 my $envlog = getlog_env($envname); 253 267 if ($envlog ne "") { … … 256 270 257 271 print "command: $cmd\n"; 258 259 my $exitcode = $ret >> 8; 260 261 Subunit::report_time(time()); 272 printf "expanded command: %s\n", expand_environment_strings($cmd); 273 262 274 if ($exitcode == 0) { 263 275 Subunit::end_testsuite($name, "success"); … … 315 327 --one abort when the first test fails 316 328 --verbose be verbose 317 --analyse-cmd CMD command to run after each test 329 --testenv run a shell in the requested test environment 330 --list list available tests 318 331 "; 319 332 exit(0); … … 336 349 'verbose' => \$opt_verbose, 337 350 'testenv' => \$opt_testenv, 351 'list' => \$opt_list, 338 352 'ldap:s' => \$ldap, 339 'analyse-cmd=s' => \$opt_analyse_cmd,340 'no-lazy-setup' => \$opt_no_lazy_setup,341 353 'resetup-environment' => \$opt_resetup_env, 342 354 'bindir:s' => \$opt_bindir, 343 355 'image=s' => \$opt_image, 344 'testlist=s' => \@testlists 356 'testlist=s' => \@testlists, 357 'load-list=s' => \$opt_load_list, 345 358 ); 346 359 … … 348 361 349 362 ShowHelp() if ($opt_help); 363 364 die("--list and --testenv are mutually exclusive") if ($opt_list and $opt_testenv); 365 366 # we want unbuffered output 367 $| = 1; 350 368 351 369 my @tests = @ARGV; … … 356 374 $ENV{MALLOC_CHECK_} = 2; 357 375 } 376 377 # make all our python scripts unbuffered 378 $ENV{PYTHONUNBUFFERED} = 1; 358 379 359 380 my $bindir = ($opt_bindir or "$builddir/bin"); … … 385 406 386 407 my $prefix_abs = abs_path($prefix); 408 my $tmpdir_abs = abs_path("$prefix/tmp"); 409 mkdir($tmpdir_abs, 0777) unless -d $tmpdir_abs; 410 387 411 my $srcdir_abs = abs_path($srcdir); 388 412 my $builddir_abs = abs_path($builddir); … … 398 422 $ENV{BUILDDIR} = $builddir; 399 423 $ENV{BUILDDIR_ABS} = $builddir_abs; 424 $ENV{BINDIR} = $bindir_abs; 400 425 $ENV{EXEEXT} = $exeext; 401 426 402 427 my $tls_enabled = not $opt_quick; 403 428 $ENV{TLS_ENABLED} = ($tls_enabled?"yes":"no"); 404 $ENV{LDB_MODULES_PATH} = "$bindir_abs/modules/ldb"; 405 $ENV{LD_SAMBA_MODULE_PATH} = "$bindir_abs/modules"; 429 406 430 sub prefix_pathvar($$) 407 431 { … … 428 452 my $socket_wrapper_dir; 429 453 if ($opt_socket_wrapper) { 430 $socket_wrapper_dir = SocketWrapper::setup_dir("$prefix /w", $opt_socket_wrapper_pcap);454 $socket_wrapper_dir = SocketWrapper::setup_dir("$prefix_abs/w", $opt_socket_wrapper_pcap); 431 455 print "SOCKET_WRAPPER_DIR=$socket_wrapper_dir\n"; 432 456 } else { … … 440 464 441 465 if ($opt_target eq "samba4") { 442 $testenv_default = " member";466 $testenv_default = "all"; 443 467 require target::Samba4; 444 $target = new Samba4($bindir, $ldap, "$srcdir/setup", $exeext);468 $target = new Samba4($bindir, $ldap, $srcdir, $exeext); 445 469 } elsif ($opt_target eq "samba3") { 446 470 if ($opt_socket_wrapper and `$bindir/smbd -b | grep SOCKET_WRAPPER` eq "") { … … 449 473 $testenv_default = "member"; 450 474 require target::Samba3; 451 $target = new Samba3($bindir );475 $target = new Samba3($bindir, $srcdir_abs); 452 476 } elsif ($opt_target eq "win") { 453 477 die("Windows tests will not run with socket wrapper enabled.") … … 516 540 } 517 541 518 my $interfaces = join(',', ("127.0.0.6/8", 519 "127.0.0.7/8", 520 "127.0.0.8/8", 521 "127.0.0.9/8", 522 "127.0.0.10/8", 523 "127.0.0.11/8")); 524 525 my $conffile = "$prefix_abs/client/client.conf"; 542 my $interfaces = join(',', ("127.0.0.11/8", 543 "127.0.0.12/8", 544 "127.0.0.13/8", 545 "127.0.0.14/8", 546 "127.0.0.15/8", 547 "127.0.0.16/8")); 548 549 my $clientdir = "$prefix_abs/client"; 550 551 my $conffile = "$clientdir/client.conf"; 526 552 $ENV{SMB_CONF_PATH} = $conffile; 527 553 528 sub write_clientconf($$ )529 { 530 my ($conffile, $ vars) = @_;531 532 mkdir("$ prefix/client", 0777) unless -d "$prefix/client";533 534 if ( -d "$ prefix/client/private" ) {535 unlink <$ prefix/client/private/*>;554 sub write_clientconf($$$) 555 { 556 my ($conffile, $clientdir, $vars) = @_; 557 558 mkdir("$clientdir", 0777) unless -d "$clientdir"; 559 560 if ( -d "$clientdir/private" ) { 561 unlink <$clientdir/private/*>; 536 562 } else { 537 mkdir("$ prefix/client/private", 0777);538 } 539 540 if ( -d "$ prefix/client/lockdir" ) {541 unlink <$ prefix/client/lockdir/*>;563 mkdir("$clientdir/private", 0777); 564 } 565 566 if ( -d "$clientdir/lockdir" ) { 567 unlink <$clientdir/lockdir/*>; 542 568 } else { 543 mkdir("$ prefix/client/lockdir", 0777);544 } 545 546 if ( -d "$ prefix_abs/client/ncalrpcdir" ) {547 unlink <$ prefix/client/ncalrpcdir/*>;569 mkdir("$clientdir/lockdir", 0777); 570 } 571 572 if ( -d "$clientdir/ncalrpcdir" ) { 573 unlink <$clientdir/ncalrpcdir/*>; 548 574 } else { 549 mkdir("$ prefix/client/ncalrpcdir", 0777);575 mkdir("$clientdir/ncalrpcdir", 0777); 550 576 } 551 577 … … 568 594 } 569 595 print CF " 570 private dir = $ prefix_abs/client/private571 lock dir = $ prefix_abs/client/lockdir572 ncalrpc dir = $ prefix_abs/client/ncalrpcdir573 name resolve order = bcast 596 private dir = $clientdir/private 597 lock dir = $clientdir/lockdir 598 ncalrpc dir = $clientdir/ncalrpcdir 599 name resolve order = bcast file 574 600 panic action = $RealBin/gdb_backtrace \%PID\% \%PROG\% 575 601 max xmit = 32K … … 578 604 system:anonymous = true 579 605 client lanman auth = Yes 580 torture:basedir = $prefix_abs/client 606 log level = 1 607 torture:basedir = $clientdir 581 608 #We don't want to pass our self-tests if the PAC code is wrong 582 609 gensec:require_pac = true 583 modules dir = $ENV{LD_SAMBA_MODULE_PATH} 610 resolv:host file = $prefix_abs/dns_host_file 611 #We don't want to run 'speed' tests for very long 612 torture:timelimit = 1 584 613 "; 585 614 close(CF); … … 587 616 588 617 my @todo = (); 589 590 my $testsdir = "$srcdir/selftest";591 592 my %required_envs = ();593 618 594 619 sub should_run_test($) … … 614 639 615 640 while (<IN>) { 616 if ($_ eq "-- TEST --\n") { 641 if (/-- TEST(-LOADLIST|-IDLIST|) --\n/) { 642 my $supports_loadlist = (defined($1) and $1 eq "-LOADLIST"); 643 my $supports_idlist = (defined($1) and $1 eq "-IDLIST"); 617 644 my $name = <IN>; 618 645 $name =~ s/\n//g; … … 622 649 $cmdline =~ s/\n//g; 623 650 if (should_run_test($name) == 1) { 624 $required_envs{$env} = 1; 625 push (@ret, [$name, $env, $cmdline]); 651 push (@ret, [$name, $env, $cmdline, $supports_loadlist, $supports_idlist]); 626 652 } 627 653 } else { … … 638 664 639 665 $ENV{SELFTEST_PREFIX} = "$prefix_abs"; 666 $ENV{SELFTEST_TMPDIR} = "$tmpdir_abs"; 667 $ENV{TEST_DATA_PREFIX} = "$tmpdir_abs"; 640 668 if ($opt_socket_wrapper) { 641 669 $ENV{SELFTEST_INTERFACES} = $interfaces; … … 665 693 } 666 694 667 Subunit::testsuite_count($#available+1); 668 Subunit::report_time(time()); 669 670 foreach (@available) { 671 my $name = $$_[0]; 695 my $restricted = undef; 696 my $restricted_used = {}; 697 698 if ($opt_load_list) { 699 $restricted = []; 700 open(LOAD_LIST, "<$opt_load_list") or die("Unable to open $opt_load_list"); 701 while (<LOAD_LIST>) { 702 chomp; 703 push (@$restricted, $_); 704 } 705 close(LOAD_LIST); 706 } 707 708 my $individual_tests = undef; 709 $individual_tests = {}; 710 711 foreach my $testsuite (@available) { 712 my $name = $$testsuite[0]; 672 713 my $skipreason = skip($name); 673 if (defined($skipreason)) { 714 if (defined($restricted)) { 715 # Find the testsuite for this test 716 my $match = undef; 717 foreach my $r (@$restricted) { 718 if ($r eq $name) { 719 $individual_tests->{$name} = []; 720 $match = $r; 721 $restricted_used->{$r} = 1; 722 } elsif (substr($r, 0, length($name)+1) eq "$name.") { 723 push(@{$individual_tests->{$name}}, $r); 724 $match = $r; 725 $restricted_used->{$r} = 1; 726 } 727 } 728 if ($match) { 729 if (defined($skipreason)) { 730 Subunit::skip_testsuite($name, $skipreason); 731 } else { 732 push(@todo, $testsuite); 733 } 734 } 735 } elsif (defined($skipreason)) { 674 736 Subunit::skip_testsuite($name, $skipreason); 675 737 } else { 676 push(@todo, $_); 677 } 678 } 679 680 if ($#todo == -1) { 738 push(@todo, $testsuite); 739 } 740 } 741 742 if (defined($restricted)) { 743 foreach (@$restricted) { 744 unless (defined($restricted_used->{$_})) { 745 print "No test or testsuite found matching $_\n"; 746 } 747 } 748 } elsif ($#todo == -1) { 681 749 print STDERR "No tests to run\n"; 682 750 exit(1); 683 751 } 684 752 685 753 my $suitestotal = $#todo + 1; 754 755 Subunit::progress($suitestotal); 756 Subunit::report_time(time()); 757 686 758 my $i = 0; 687 759 $| = 1; … … 711 783 "DC_NETBIOSALIAS", 712 784 785 # domain member 786 "MEMBER_SERVER", 787 "MEMBER_SERVER_IP", 788 "MEMBER_NETBIOSNAME", 789 "MEMBER_NETBIOSALIAS", 790 791 # rpc proxy controller stuff 792 "RPC_PROXY_SERVER", 793 "RPC_PROXY_SERVER_IP", 794 "RPC_PROXY_NETBIOSNAME", 795 "RPC_PROXY_NETBIOSALIAS", 796 797 # domain controller stuff for Vampired DC 798 "VAMPIRE_DC_SERVER", 799 "VAMPIRE_DC_SERVER_IP", 800 "VAMPIRE_DC_NETBIOSNAME", 801 "VAMPIRE_DC_NETBIOSALIAS", 802 713 803 # server stuff 714 804 "SERVER", … … 719 809 # user stuff 720 810 "USERNAME", 811 "USERID", 721 812 "PASSWORD", 722 813 "DC_USERNAME", … … 726 817 "KRB5_CONFIG", 727 818 "WINBINDD_SOCKET_DIR", 728 "WINBINDD_PRIV_PIPE_DIR" 819 "WINBINDD_PRIV_PIPE_DIR", 820 "NMBD_SOCKET_DIR", 821 "LOCAL_PATH" 729 822 ); 730 823 … … 735 828 }; 736 829 737 sub setup_env($ )738 { 739 my ($name ) = @_;830 sub setup_env($$) 831 { 832 my ($name, $prefix) = @_; 740 833 741 834 my $testenv_vars = undef; … … 754 847 } elsif (defined(get_running_env($envname))) { 755 848 $testenv_vars = get_running_env($envname); 756 if (not $target->check_env($testenv_vars)) { 849 if (not $testenv_vars->{target}->check_env($testenv_vars)) { 850 print $testenv_vars->{target}->getlog_env($testenv_vars); 757 851 $testenv_vars = undef; 758 852 } 759 853 } else { 760 854 $testenv_vars = $target->setup_env($envname, $prefix); 855 if (defined($testenv_vars) && not defined($testenv_vars->{target})) { 856 $testenv_vars->{target} = $target; 857 } 761 858 } 762 859 … … 769 866 $ENV{SMB_CONF_PATH} = $testenv_vars->{SERVERCONFFILE}; 770 867 } elsif ($option eq "client") { 771 SocketWrapper::set_default_iface( 6);772 write_clientconf($conffile, $ testenv_vars);868 SocketWrapper::set_default_iface(11); 869 write_clientconf($conffile, $clientdir, $testenv_vars); 773 870 $ENV{SMB_CONF_PATH} = $conffile; 774 871 } else { … … 804 901 my ($envname) = @_; 805 902 return "" if ($envname eq "none"); 806 return $target->getlog_env(get_running_env($envname)); 903 my $env = get_running_env($envname); 904 return $env->{target}->getlog_env($env); 807 905 } 808 906 … … 811 909 my ($envname) = @_; 812 910 return 1 if ($envname eq "none"); 813 return $target->check_env(get_running_env($envname)); 911 my $env = get_running_env($envname); 912 return $env->{target}->check_env($env); 814 913 } 815 914 … … 818 917 my ($envname) = @_; 819 918 return if ($envname eq "none"); 820 $target->teardown_env(get_running_env($envname)); 919 my $env = get_running_env($envname); 920 $env->{target}->teardown_env($env); 821 921 delete $running_envs{$envname}; 822 922 } 823 923 824 if ($opt_no_lazy_setup) { 825 setup_env($_) foreach (keys %required_envs); 826 } 924 # This 'global' file needs to be empty when we start 925 unlink("$prefix_abs/dns_host_file"); 827 926 828 927 if ($opt_testenv) { … … 830 929 $testenv_name = $testenv_default unless defined($testenv_name); 831 930 832 my $testenv_vars = setup_env($testenv_name); 931 my $testenv_vars = setup_env($testenv_name, $prefix); 932 933 die("Unable to setup environment $testenv_name") unless ($testenv_vars); 833 934 834 935 $ENV{PIDDIR} = $testenv_vars->{PIDDIR}; 936 $ENV{ENVNAME} = $testenv_name; 835 937 836 938 my $envvarstr = exported_envvars_str($testenv_vars); 837 939 838 my $term = ($ENV{TERM } or "xterm");839 system("$term -e'echo -e \"940 my $term = ($ENV{TERMINAL} or "xterm -e"); 941 system("$term 'echo -e \" 840 942 Welcome to the Samba4 Test environment '$testenv_name' 841 943 … … 850 952 \" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'"); 851 953 teardown_env($testenv_name); 954 } elsif ($opt_list) { 955 foreach (@todo) { 956 my $cmd = $$_[2]; 957 my $name = $$_[0]; 958 my $envname = $$_[1]; 959 960 unless($cmd =~ /\$LISTOPT/) { 961 warn("Unable to list tests in $name"); 962 next; 963 } 964 965 $cmd =~ s/\$LISTOPT/--list/g; 966 967 system($cmd); 968 969 if ($? == -1) { 970 die("Unable to run $cmd: $!"); 971 } elsif ($? & 127) { 972 die(snprintf("%s died with signal %d, %s coredump\n", $cmd, ($? & 127), ($? & 128) ? 'with' : 'without')); 973 } 974 975 my $exitcode = $? >> 8; 976 if ($exitcode != 0) { 977 die("$cmd exited with exit code $exitcode"); 978 } 979 } 852 980 } else { 853 981 foreach (@todo) { 854 982 $i++; 855 983 my $cmd = $$_[2]; 856 $cmd =~ s/([\(\)])/\\$1/g;857 984 my $name = $$_[0]; 858 985 my $envname = $$_[1]; 859 860 my $envvars = setup_env($envname );986 987 my $envvars = setup_env($envname, $prefix); 861 988 if (not defined($envvars)) { 862 Subunit::skip_testsuite($name, 863 "unable to set up environment $envname"); 989 Subunit::start_testsuite($name); 990 Subunit::end_testsuite($name, "error", 991 "unable to set up environment $envname - exiting"); 864 992 next; 865 993 } 866 994 995 # Generate a file with the individual tests to run, if the 996 # test runner for this test suite supports it. 997 if ($individual_tests and $individual_tests->{$name}) { 998 if ($$_[3]) { 999 my ($fh, $listid_file) = tempfile(UNLINK => 0); 1000 foreach my $test (@{$individual_tests->{$name}}) { 1001 print $fh substr($test, length($name)+1) . "\n"; 1002 } 1003 $cmd =~ s/\$LOADLIST/--load-list=$listid_file/g; 1004 } elsif ($$_[4]) { 1005 $cmd =~ s/\s+[^\s]+\s*$//; 1006 $cmd .= " " . join(' ', @{$individual_tests->{$name}}); 1007 } 1008 } 1009 867 1010 run_testsuite($envname, $name, $cmd, $i, $suitestotal); 868 1011 869 if (defined($opt_analyse_cmd)) {870 system("$opt_analyse_cmd \"$name\"");871 }872 873 1012 teardown_env($envname) if ($opt_resetup_env); 874 1013 } … … 878 1017 879 1018 teardown_env($_) foreach (keys %running_envs); 880 881 $target->stop();882 1019 883 1020 my $failed = 0; … … 886 1023 foreach (<$prefix/valgrind.log*>) { 887 1024 next unless (-s $_); 888 system("grep DWARF2.CFI.reader $_ > /dev/null"); 889 if ($? >> 8 == 0) { 890 print "VALGRIND FAILURE\n"; 891 $failed++; 892 system("cat $_"); 893 } 1025 print "VALGRIND FAILURE\n"; 1026 $failed++; 1027 system("cat $_"); 894 1028 } 895 1029 exit 0;
Note:
See TracChangeset
for help on using the changeset viewer.