📄 selftest.pl
字号:
warn("Not using socket wrapper, but also not running as root. Will not be able to listen on proper ports") unless $< == 0;}my $target;my $testenv_default = "none";if ($opt_target eq "samba4") { $testenv_default = "member"; require target::Samba4; $target = new Samba4($opt_bindir or "$srcdir/bin", $ldap, "$srcdir/setup");} elsif ($opt_target eq "samba3") { if ($opt_socket_wrapper and `$opt_bindir/smbd -b | grep SOCKET_WRAPPER` eq "") { die("You must include --enable-socket-wrapper when compiling Samba in order to execute 'make test'. Exiting...."); } $testenv_default = "dc"; require target::Samba3; $target = new Samba3($opt_bindir);} elsif ($opt_target eq "win") { die("Windows tests will not run with socket wrapper enabled.") if ($opt_socket_wrapper); $testenv_default = "dc"; require target::Windows; $target = new Windows();} elsif ($opt_target eq "kvm") { die("Kvm tests will not run with socket wrapper enabled.") if ($opt_socket_wrapper); require target::Kvm; die("No image specified") unless ($opt_image); $target = new Kvm($opt_image, undef);}## Start a Virtual Distributed Ethernet Switch# Returns the pid of the switch.#sub start_vde_switch($){ my ($path) = @_; system("vde_switch --pidfile $path/vde.pid --sock $path/vde.sock --daemon"); open(PID, "$path/vde.pid"); <PID> =~ /([0-9]+)/; my $pid = $1; close(PID); return $pid;}# Stop a Virtual Distributed Ethernet Switchsub stop_vde_switch($){ my ($pid) = @_; kill 9, $pid;}sub read_test_regexes($){ my ($name) = @_; my @ret = (); open(LF, "<$name") or die("unable to read $name: $!"); while (<LF>) { chomp; next if (/^#/); if (/^(.*?)([ \t]+)\#([\t ]*)(.*?)$/) { push (@ret, [$1, $4]); } else { s/^(.*?)([ \t]+)\#([\t ]*)(.*?)$//; push (@ret, [$_, undef]); } } close(LF); return @ret;}if (defined($opt_expected_failures)) { @expected_failures = read_test_regexes($opt_expected_failures);}foreach (@opt_exclude) { push (@excludes, read_test_regexes($_));}if ($opt_quick) { push (@includes, read_test_regexes("samba4-quick"));}foreach (@opt_include) { push (@includes, read_test_regexes($_));}my $interfaces = join(',', ("127.0.0.6/8", "127.0.0.7/8", "127.0.0.8/8", "127.0.0.9/8", "127.0.0.10/8", "127.0.0.11/8"));my $conffile = "$prefix_abs/client/client.conf";sub write_clientconf($$){ my ($conffile, $vars) = @_; mkdir("$prefix/client", 0777) unless -d "$prefix/client"; if ( -d "$prefix/client/private" ) { unlink <$prefix/client/private/*>; } else { mkdir("$prefix/client/private", 0777); } open(CF, ">$conffile"); print CF "[global]\n"; if (defined($ENV{VALGRIND})) { print CF "\ticonv:native = true\n"; } else { print CF "\ticonv:native = false\n"; } print CF "\tnetbios name = client\n"; if (defined($vars->{DOMAIN})) { print CF "\tworkgroup = $vars->{DOMAIN}\n"; } if (defined($vars->{REALM})) { print CF "\trealm = $vars->{REALM}\n"; } if (defined($vars->{NCALRPCDIR})) { print CF "\tncalrpc dir = $vars->{NCALRPCDIR}\n"; } if (defined($vars->{PIDDIR})) { print CF "\tpid directory = $vars->{PIDDIR}\n"; } if (defined($vars->{WINBINDD_SOCKET_DIR})) { print CF "\twinbindd socket directory = $vars->{WINBINDD_SOCKET_DIR}\n"; } if ($opt_socket_wrapper) { print CF "\tinterfaces = $interfaces\n"; } print CF " private dir = $prefix_abs/client/private js include = $srcdir_abs/scripting/libjs name resolve order = bcast panic action = $srcdir_abs/script/gdb_backtrace \%PID\% \%PROG\% max xmit = 32K notify:inotify = false ldb:nosync = true system:anonymous = true torture:basedir = $prefix_abs/client#We don't want to pass our self-tests if the PAC code is wrong gensec:require_pac = true modules dir = $ENV{LD_SAMBA_MODULE_PATH}"; close(CF);}my @torture_options = ();push (@torture_options, "--configfile=$conffile");# ensure any one smbtorture call doesn't run too longpush (@torture_options, "--maximum-runtime=$torture_maxtime");push (@torture_options, "--target=$opt_target");push (@torture_options, "--basedir=$prefix_abs");push (@torture_options, "--option=torture:progress=no") unless ($opt_verbose);push (@torture_options, "--format=subunit");push (@torture_options, "--option=torture:quick=yes") if ($opt_quick);$ENV{TORTURE_OPTIONS} = join(' ', @torture_options);print "OPTIONS $ENV{TORTURE_OPTIONS}\n";my @todo = ();my $testsdir = "$srcdir/selftest";$ENV{SMB_CONF_PATH} = "$conffile";$ENV{CONFIGURATION} = "--configfile=$conffile";my %required_envs = ();sub read_testlist($){ my ($filename) = @_; my @ret = (); open(IN, $filename) or die("Unable to open $filename: $!"); while (<IN>) { if ($_ eq "-- TEST --\n") { my $name = <IN>; $name =~ s/\n//g; my $env = <IN>; $env =~ s/\n//g; my $cmdline = <IN>; $cmdline =~ s/\n//g; if (not defined($tests) or $name =~ /$tests/) { $required_envs{$env} = 1; push (@ret, [$name, $env, $cmdline]); } } else { print; } } close(IN) or die("Error creating recipe"); return @ret;}if ($#testlists == -1) { die("No testlists specified");}my @available = ();foreach my $fn (@testlists) { foreach (read_testlist($fn)) { my $name = $$_[0]; next if (@includes and not find_in_list(\@includes, $name)); push (@available, $_); }}my $msg_ops;if ($opt_format eq "buildfarm") { require output::buildfarm; $msg_ops = new output::buildfarm($statistics);} elsif ($opt_format eq "plain") { require output::plain; $msg_ops = new output::plain("$prefix/summary", $opt_verbose, $opt_immediate, $statistics, $#available+1);} elsif ($opt_format eq "html") { require output::html; mkdir("test-results", 0777); $msg_ops = new output::html("test-results", $statistics);} else { die("Invalid output format '$opt_format'");}foreach (@available) { my $name = $$_[0]; my $skipreason = skip($name); if ($skipreason) { $msg_ops->skip_testsuite($name, $skipreason); } else { push(@todo, $_); }}if ($#todo == -1) { print STDERR "No tests to run\n"; exit(1); }my $suitestotal = $#todo + 1;my $i = 0;$| = 1;my %running_envs = ();my @exported_envvars = ( # domain stuff "DOMAIN", "REALM", # domain controller stuff "DC_SERVER", "DC_SERVER_IP", "DC_NETBIOSNAME", "DC_NETBIOSALIAS", # server stuff "SERVER", "SERVER_IP", "NETBIOSNAME", "NETBIOSALIAS", # user stuff "USERNAME", "PASSWORD", "DC_USERNAME", "DC_PASSWORD", # misc stuff "KRB5_CONFIG", "WINBINDD_SOCKET_DIR", "WINBINDD_PRIV_PIPE_DIR");$SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub { my $signame = shift; teardown_env($_) foreach(keys %running_envs); die("Received signal $signame");};sub setup_env($){ my ($envname) = @_; my $testenv_vars; if ($envname eq "none") { $testenv_vars = {}; } elsif (defined($running_envs{$envname})) { $testenv_vars = $running_envs{$envname}; if (not $target->check_env($testenv_vars)) { $testenv_vars = undef; } } else { $testenv_vars = $target->setup_env($envname, $prefix); } return undef unless defined($testenv_vars); $running_envs{$envname} = $testenv_vars; SocketWrapper::set_default_iface(6); write_clientconf($conffile, $testenv_vars); foreach (@exported_envvars) { if (defined($testenv_vars->{$_})) { $ENV{$_} = $testenv_vars->{$_}; } else { delete $ENV{$_}; } } return $testenv_vars;}sub exported_envvars_str($){ my ($testenv_vars) = @_; my $out = ""; foreach (@exported_envvars) { next unless defined($testenv_vars->{$_}); $out .= $_."=".$testenv_vars->{$_}."\n"; } return $out;}sub getlog_env($){ my ($envname) = @_; return "" if ($envname eq "none"); return $target->getlog_env($running_envs{$envname});}sub check_env($){ my ($envname) = @_; return 1 if ($envname eq "none"); return $target->check_env($running_envs{$envname});}sub teardown_env($){ my ($envname) = @_; return if ($envname eq "none"); $target->teardown_env($running_envs{$envname}); delete $running_envs{$envname};}if ($opt_no_lazy_setup) { setup_env($_) foreach (keys %required_envs);}if ($opt_testenv) { my $testenv_name = $ENV{SELFTEST_TESTENV}; $testenv_name = $testenv_default unless defined($testenv_name); my $testenv_vars = setup_env($testenv_name); $ENV{PIDDIR} = $testenv_vars->{PIDDIR}; my $envvarstr = exported_envvars_str($testenv_vars); my $term = ($ENV{TERM} or "xterm"); system("$term -e 'echo -e \"Welcome to the Samba4 Test environment '$testenv_name'This matches the client environment used in make testsmbd is pid `cat \$PIDDIR/smbd.pid`Some useful environment variables:TORTURE_OPTIONS=\$TORTURE_OPTIONSCONFIGURATION=\$CONFIGURATION$envvarstr\" && LD_LIBRARY_PATH=$ENV{LD_LIBRARY_PATH} bash'"); teardown_env($testenv_name);} else { foreach (@todo) { $i++; my $cmd = $$_[2]; $cmd =~ s/([\(\)])/\\$1/g; my $name = $$_[0]; my $envname = $$_[1]; my $envvars = setup_env($envname); if (not defined($envvars)) { $msg_ops->skip_testsuite($name, "unable to set up environment $envname"); next; } run_testsuite($envname, $name, $cmd, $i, $suitestotal, $msg_ops); if (defined($opt_analyse_cmd)) { system("$opt_analyse_cmd \"$name\""); } teardown_env($envname) if ($opt_resetup_env); }}print "\n";teardown_env($_) foreach (keys %running_envs);$target->stop();$msg_ops->summary();my $failed = 0;# if there were any valgrind failures, show themforeach (<$prefix/valgrind.log*>) { next unless (-s $_); system("grep DWARF2.CFI.reader $_ > /dev/null"); if ($? >> 8 == 0) { print "VALGRIND FAILURE\n"; $failed++; system("cat $_"); }}if ($opt_format eq "buildfarm") { print "TEST STATUS: $statistics->{SUITES_FAIL}\n";}exit $statistics->{SUITES_FAIL};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -