summaryrefslogtreecommitdiff
path: root/selftest
diff options
context:
space:
mode:
authorJamie McClymont <jamiemcclymont@catalyst.net.nz>2018-02-21 13:33:49 +1300
committerAndrew Bartlett <abartlet@samba.org>2018-02-21 02:47:15 +0100
commit962e8a0ea7db79b96dddec06a4bde211eea0d1d6 (patch)
tree07ff332e8863f84eedafb8d7f543d41d316b5ad0 /selftest
parent41085ad37de56504467a0014b70f6a708dcde91b (diff)
downloadsamba-962e8a0ea7db79b96dddec06a4bde211eea0d1d6.tar.gz
selftest: move to declaratively specifying environments and their dependencies
This removes the tangle of code for starting up dependencies, and allows selftest.pl to query dependencies (hence it can know when things can be shut down early and how to order environments for optimal memory usage - that patch not yet submitted). It also removes the slightly hacky special-casing of the ad_members, and sets $target->{vars} centrally (so each setup_ function does not need to). Signed-off-by: Jamie McClymont <jamiemcclymont@catalyst.net.nz> Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Diffstat (limited to 'selftest')
-rwxr-xr-xselftest/selftest.pl14
-rw-r--r--selftest/target/Samba.pm72
-rwxr-xr-xselftest/target/Samba3.pm85
-rwxr-xr-xselftest/target/Samba4.pm163
4 files changed, 121 insertions, 213 deletions
diff --git a/selftest/selftest.pl b/selftest/selftest.pl
index 64fb9f85d3a..c48e1926520 100755
--- a/selftest/selftest.pl
+++ b/selftest/selftest.pl
@@ -85,7 +85,12 @@ sub find_in_list($$)
sub skip
{
- my ($name) = @_;
+ my ($name, $envname) = @_;
+ my ($env_basename, $env_localpart) = split(/:/, $envname);
+
+ if ($opt_target eq "samba3" && $Samba::ENV_NEEDS_AD_DC{$env_basename}) {
+ return "environment $envname is disabled as this build does not include an AD DC";
+ }
return find_in_list(\@excludes, $name);
}
@@ -449,15 +454,12 @@ if (defined($ENV{SMBD_MAXTIME}) and $ENV{SMBD_MAXTIME} ne "") {
$server_maxtime = $ENV{SMBD_MAXTIME};
}
+$target = new Samba($bindir, $ldap, $srcdir, $server_maxtime);
unless ($opt_list) {
if ($opt_target eq "samba") {
$testenv_default = "ad_dc";
- require target::Samba;
- $target = new Samba($bindir, $ldap, $srcdir, $server_maxtime);
} elsif ($opt_target eq "samba3") {
$testenv_default = "nt4_member";
- require target::Samba3;
- $target = new Samba3($bindir, $srcdir_abs, $server_maxtime);
}
}
@@ -725,7 +727,7 @@ $individual_tests = {};
foreach my $testsuite (@available) {
my $name = $$testsuite[0];
- my $skipreason = skip($name);
+ my $skipreason = skip(@$testsuite);
if (defined($restricted)) {
# Find the testsuite for this test
my $match = undef;
diff --git a/selftest/target/Samba.pm b/selftest/target/Samba.pm
index ba0cc7d0adb..f25507f7201 100644
--- a/selftest/target/Samba.pm
+++ b/selftest/target/Samba.pm
@@ -22,33 +22,71 @@ sub new($$$$$) {
return $self;
}
+%Samba::ENV_DEPS = (%Samba3::ENV_DEPS, %Samba4::ENV_DEPS);
+our %ENV_DEPS;
+
+%Samba::ENV_TARGETS = (
+ (map { $_ => "Samba3" } keys %Samba3::ENV_DEPS),
+ (map { $_ => "Samba4" } keys %Samba4::ENV_DEPS),
+);
+our %ENV_TARGETS;
+
+%Samba::ENV_NEEDS_AD_DC = (
+ (map { $_ => 1 } keys %Samba4::ENV_DEPS)
+);
+our %ENV_NEEDS_AD_DC;
+foreach my $env (keys %Samba3::ENV_DEPS) {
+ $ENV_NEEDS_AD_DC{$env} = ($env =~ /^ad_/);
+}
+
sub setup_env($$$)
{
my ($self, $envname, $path) = @_;
- $ENV{ENVNAME} = $envname;
-
- my $env = $self->{samba4}->setup_env($envname, $path);
- if (defined($env) and $env ne "UNKNOWN") {
- if (not defined($env->{target})) {
- $env->{target} = $self->{samba4};
- }
- } elsif (defined($env) and $env eq "UNKNOWN") {
- $env = $self->{samba3}->setup_env($envname, $path);
- if (defined($env) and $env ne "UNKNOWN") {
- if (not defined($env->{target})) {
- $env->{target} = $self->{samba3};
- }
- }
- }
- if (defined($env) and ($env eq "UNKNOWN")) {
+ my $targetname = $ENV_TARGETS{$envname};
+ if (not defined($targetname)) {
warn("Samba can't provide environment '$envname'");
return "UNKNOWN";
}
- if (not defined $env) {
+
+ my %targetlookup = (
+ "Samba3" => $self->{samba3},
+ "Samba4" => $self->{samba4}
+ );
+ my $target = $targetlookup{$targetname};
+
+ if (defined($target->{vars}->{$envname})) {
+ return $target->{vars}->{$envname};
+ }
+
+ my @dep_vars;
+ foreach(@{$ENV_DEPS{$envname}}) {
+ my $vars = $self->setup_env($_, $path);
+ if (defined($vars)) {
+ push(@dep_vars, $vars);
+ } else {
+ warn("Failed setting up $_ as a dependency of $envname");
+ return undef;
+ }
+ }
+
+ $ENV{ENVNAME} = $envname;
+ # Avoid hitting system krb5.conf -
+ # An env that needs Kerberos will reset this to the real value.
+ $ENV{KRB5_CONFIG} = "$path/no_krb5.conf";
+
+ my $setup_name = $ENV_TARGETS{$envname}."::setup_".$envname;
+ my $setup_sub = \&$setup_name;
+ my $env = &$setup_sub($target, "$path/$envname", @dep_vars);
+
+ if (not defined($env)) {
warn("failed to start up environment '$envname'");
return undef;
}
+
+ $target->{vars}->{$envname} = $env;
+ $target->{vars}->{$envname}->{target} = $target;
+
return $env;
}
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index fc18954d0fa..e6c95fa991a 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -163,46 +163,26 @@ sub check_env($$)
return 1;
}
-sub setup_env($$$)
-{
- my ($self, $envname, $path) = @_;
-
- $ENV{ENVNAME} = $envname;
-
- if (defined($self->{vars}->{$envname})) {
- return $self->{vars}->{$envname};
- }
-
- #
- # Avoid hitting system krb5.conf -
- # An env that needs Kerberos will reset this to the real
- # value.
- #
- $ENV{KRB5_CONFIG} = "$path/no_krb5.conf";
-
- if ($envname eq "nt4_dc") {
- return $self->setup_nt4_dc("$path/nt4_dc");
- } elsif ($envname eq "nt4_dc_schannel") {
- return $self->setup_nt4_dc_schannel("$path/nt4_dc_schannel");
- } elsif ($envname eq "simpleserver") {
- return $self->setup_simpleserver("$path/simpleserver");
- } elsif ($envname eq "fileserver") {
- return $self->setup_fileserver("$path/fileserver");
- } elsif ($envname eq "maptoguest") {
- return $self->setup_maptoguest("$path/maptoguest");
- } elsif ($envname eq "ktest") {
- return $self->setup_ktest("$path/ktest");
- } elsif ($envname eq "nt4_member") {
- if (not defined($self->{vars}->{nt4_dc})) {
- if (not defined($self->setup_nt4_dc("$path/nt4_dc"))) {
- return undef;
- }
- }
- return $self->setup_nt4_member("$path/nt4_member", $self->{vars}->{nt4_dc});
- } else {
- return "UNKNOWN";
- }
-}
+# Declare the environments Samba3 makes available.
+# To be set up, they will be called as
+# samba3->setup_$envname($self, $path, $dep_1_vars, $dep_2_vars, ...)
+%Samba3::ENV_DEPS = (
+ # name => [dep_1, dep_2, ...],
+ nt4_dc => [],
+ nt4_dc_schannel => [],
+
+ simpleserver => [],
+ fileserver => [],
+ maptoguest => [],
+ ktest => [],
+
+ nt4_member => ["nt4_dc"],
+
+ ad_member => ["ad_dc"],
+ ad_member_rfc2307 => ["ad_dc_ntvfs"],
+ ad_member_idmap_rid => ["ad_dc"],
+ ad_member_idmap_ad => ["ad_dc"],
+);
sub setup_nt4_dc
{
@@ -252,8 +232,6 @@ sub setup_nt4_dc
$vars->{DC_USERNAME} = $vars->{USERNAME};
$vars->{DC_PASSWORD} = $vars->{PASSWORD};
- $self->{vars}->{nt4_dc} = $vars;
-
return $vars;
}
@@ -302,8 +280,6 @@ sub setup_nt4_dc_schannel
$vars->{DC_USERNAME} = $vars->{USERNAME};
$vars->{DC_PASSWORD} = $vars->{PASSWORD};
- $self->{vars}->{nt4_dc_schannel} = $vars;
-
return $vars;
}
@@ -381,7 +357,7 @@ sub setup_nt4_member
return $ret;
}
-sub setup_admember
+sub setup_ad_member
{
my ($self, $prefix, $dcvars) = @_;
@@ -501,13 +477,10 @@ sub setup_admember
$ret->{DC_USERNAME} = $dcvars->{USERNAME};
$ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
- # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env
- $ret->{target} = $self;
-
return $ret;
}
-sub setup_admember_rfc2307
+sub setup_ad_member_rfc2307
{
my ($self, $prefix, $dcvars) = @_;
@@ -597,9 +570,6 @@ sub setup_admember_rfc2307
$ret->{DC_USERNAME} = $dcvars->{USERNAME};
$ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
- # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env
- $ret->{target} = $self;
-
return $ret;
}
@@ -685,9 +655,6 @@ sub setup_ad_member_idmap_rid
$ret->{DC_USERNAME} = $dcvars->{USERNAME};
$ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
- # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env
- $ret->{target} = $self;
-
return $ret;
}
@@ -774,9 +741,6 @@ sub setup_ad_member_idmap_ad
$ret->{DC_USERNAME} = $dcvars->{USERNAME};
$ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
- # Special case, this is called from Samba4.pm but needs to use the Samba3 check_env and get_log_env
- $ret->{target} = $self;
-
return $ret;
}
@@ -829,8 +793,6 @@ sub setup_simpleserver
return undef;
}
- $self->{vars}->{simpleserver} = $vars;
-
return $vars;
}
@@ -961,7 +923,6 @@ sub setup_fileserver
return undef;
}
- $self->{vars}->{fileserver} = $vars;
mkdir($_, 0777) foreach(@dirs);
@@ -1139,8 +1100,6 @@ ntlm auth = yes
return undef;
}
- $self->{vars}->{s3maptoguest} = $vars;
-
return $vars;
}
diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index 0cd2cf84321..fd4e4b61984 100755
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -2063,111 +2063,37 @@ sub check_env($$)
} else {
return 1;
}
-
}
-sub setup_env($$$)
-{
- my ($self, $envname, $path) = @_;
- my $target3 = $self->{target3};
+# Declare the environments Samba4 makes available.
+# To be set up, they will be called as
+# samba4->setup_$envname($self, $path, $dep_1_vars, $dep_2_vars, ...)
+%Samba4::ENV_DEPS = (
+ # name => [dep_1, dep_2, ...],
+ ad_dc_ntvfs => [],
+ ad_dc => [],
+ ad_dc_no_nss => [],
+ ad_dc_no_ntlm => [],
+ ad_dc_ntvfs => [],
- $ENV{ENVNAME} = $envname;
+ fl2008r2dc => ["ad_dc"],
+ fl2003dc => ["ad_dc"],
+ fl2000dc => [],
- if (defined($self->{vars}->{$envname})) {
- return $self->{vars}->{$envname};
- }
+ vampire_2000_dc => ["fl2000dc"],
+ vampire_dc => ["ad_dc_ntvfs"],
+ promoted_dc => ["ad_dc_ntvfs"],
+ subdom_dc => ["ad_dc_ntvfs"],
- if ($envname eq "ad_dc_ntvfs") {
- return $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- } elsif ($envname eq "fl2000dc") {
- return $self->setup_fl2000dc("$path/fl2000dc");
- } elsif ($envname eq "vampire_2000_dc") {
- if (not defined($self->{vars}->{fl2000dc})) {
- $self->setup_fl2000dc("$path/fl2000dc");
- }
- return $self->setup_vampire_dc("$path/vampire_2000_dc", $self->{vars}->{fl2000dc}, "2000");
- } elsif ($envname eq "fl2003dc") {
- if (not defined($self->{vars}->{ad_dc})) {
- $self->setup_ad_dc("$path/ad_dc");
- }
- return $self->setup_fl2003dc("$path/fl2003dc", $self->{vars}->{ad_dc});
- } elsif ($envname eq "fl2008r2dc") {
- if (not defined($self->{vars}->{ad_dc})) {
- $self->setup_ad_dc("$path/ad_dc");
- }
- return $self->setup_fl2008r2dc("$path/fl2008r2dc", $self->{vars}->{ad_dc});
- } elsif ($envname eq "rpc_proxy") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $self->setup_rpc_proxy("$path/rpc_proxy", $self->{vars}->{ad_dc_ntvfs});
- } elsif ($envname eq "vampire_dc") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $self->setup_vampire_dc("$path/vampire_dc", $self->{vars}->{ad_dc_ntvfs}, "2008");
- } elsif ($envname eq "promoted_dc") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $self->setup_promoted_dc("$path/promoted_dc", $self->{vars}->{ad_dc_ntvfs});
- } elsif ($envname eq "subdom_dc") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $self->setup_subdom_dc("$path/subdom_dc", $self->{vars}->{ad_dc_ntvfs});
- } elsif ($envname eq "s4member_dflt_domain") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $self->setup_s4member_dflt_domain("$path/s4member_dflt_domain", $self->{vars}->{ad_dc_ntvfs});
- } elsif ($envname eq "s4member") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $self->setup_s4member("$path/s4member", $self->{vars}->{ad_dc_ntvfs});
- } elsif ($envname eq "rodc") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $self->setup_rodc("$path/rodc", $self->{vars}->{ad_dc_ntvfs});
- } elsif ($envname eq "chgdcpass") {
- return $self->setup_chgdcpass("$path/chgdcpass", $self->{vars}->{chgdcpass});
- } elsif ($envname eq "ad_member") {
- if (not defined($self->{vars}->{ad_dc})) {
- $self->setup_ad_dc("$path/ad_dc");
- }
- return $target3->setup_admember("$path/ad_member", $self->{vars}->{ad_dc}, 29);
- } elsif ($envname eq "ad_dc") {
- return $self->setup_ad_dc("$path/ad_dc");
- } elsif ($envname eq "ad_dc_no_nss") {
- return $self->setup_ad_dc_no_nss("$path/ad_dc_no_nss");
- } elsif ($envname eq "ad_dc_no_ntlm") {
- return $self->setup_ad_dc_no_ntlm("$path/ad_dc_no_ntlm");
- } elsif ($envname eq "ad_member_rfc2307") {
- if (not defined($self->{vars}->{ad_dc_ntvfs})) {
- $self->setup_ad_dc_ntvfs("$path/ad_dc_ntvfs");
- }
- return $target3->setup_admember_rfc2307("$path/ad_member_rfc2307",
- $self->{vars}->{ad_dc_ntvfs}, 34);
- } elsif ($envname eq "ad_member_idmap_rid") {
- if (not defined($self->{vars}->{ad_dc})) {
- $self->setup_ad_dc("$path/ad_dc");
- }
- return $target3->setup_ad_member_idmap_rid("$path/ad_member_idmap_rid",
- $self->{vars}->{ad_dc});
- } elsif ($envname eq "ad_member_idmap_ad") {
- if (not defined($self->{vars}->{ad_dc})) {
- $self->setup_ad_dc("$path/ad_dc");
- }
- return $target3->setup_ad_member_idmap_ad("$path/ad_member_idmap_ad",
- $self->{vars}->{ad_dc});
- } elsif ($envname eq "none") {
- return $self->setup_none("$path/none");
- } else {
- return "UNKNOWN";
- }
-}
+ rodc => ["ad_dc_ntvfs"],
+ rpc_proxy => ["ad_dc_ntvfs"],
+ chgdcpass => [],
+
+ s4member_dflt_domain => ["ad_dc_ntvfs"],
+ s4member => ["ad_dc_ntvfs"],
+
+ none => [],
+);
sub setup_s4member
{
@@ -2179,8 +2105,6 @@ sub setup_s4member
if (not defined($self->check_or_start($env, "standard"))) {
return undef;
}
-
- $self->{vars}->{s4member} = $env;
}
return $env;
@@ -2197,8 +2121,6 @@ sub setup_s4member_dflt_domain
if (not defined($self->check_or_start($env, "standard"))) {
return undef;
}
-
- $self->{vars}->{s4member_dflt_domain} = $env;
}
return $env;
@@ -2214,8 +2136,6 @@ sub setup_rpc_proxy
if (not defined($self->check_or_start($env, "standard"))) {
return undef;
}
-
- $self->{vars}->{rpc_proxy} = $env;
}
return $env;
}
@@ -2230,8 +2150,6 @@ sub setup_ad_dc_ntvfs
warn("Failed to start ad_dc_ntvfs");
return undef;
}
-
- $self->{vars}->{ad_dc_ntvfs} = $env;
}
return $env;
}
@@ -2245,8 +2163,6 @@ sub setup_chgdcpass
if (not defined($self->check_or_start($env, "standard"))) {
return undef;
}
-
- $self->{vars}->{chgdcpass} = $env;
}
return $env;
}
@@ -2260,8 +2176,6 @@ sub setup_fl2000dc
if (not defined($self->check_or_start($env, "standard"))) {
return undef;
}
-
- $self->{vars}->{fl2000dc} = $env;
}
return $env;
@@ -2279,8 +2193,6 @@ sub setup_fl2003dc
}
$env = $self->setup_trust($env, $dc_vars, "external", "--no-aes-keys");
-
- $self->{vars}->{fl2003dc} = $env;
}
return $env;
}
@@ -2302,8 +2214,6 @@ sub setup_fl2008r2dc
$self->setup_namespaces($env, $upn_array, $spn_array);
$env = $self->setup_trust($env, $dc_vars, "forest", "");
-
- $self->{vars}->{fl2008r2dc} = $env;
}
return $env;
@@ -2311,6 +2221,16 @@ sub setup_fl2008r2dc
sub setup_vampire_dc
{
+ return setup_generic_vampire_dc(@_, "2008");
+}
+
+sub setup_vampire_2000_dc
+{
+ return setup_generic_vampire_dc(@_, "2000");
+}
+
+sub setup_generic_vampire_dc
+{
my ($self, $path, $dc_vars, $fl) = @_;
my $env = $self->provision_vampire_dc($path, $dc_vars, $fl);
@@ -2320,8 +2240,6 @@ sub setup_vampire_dc
return undef;
}
- $self->{vars}->{vampire_dc} = $env;
-
# force replicated DC to update repsTo/repsFrom
# for vampired partitions
my $samba_tool = Samba::bindir_path($self, "samba-tool");
@@ -2396,8 +2314,6 @@ sub setup_promoted_dc
return undef;
}
- $self->{vars}->{promoted_dc} = $env;
-
# force source and replicated DC to update repsTo/repsFrom
# for vampired partitions
my $samba_tool = Samba::bindir_path($self, "samba-tool");
@@ -2439,8 +2355,6 @@ sub setup_subdom_dc
return undef;
}
- $self->{vars}->{subdom_dc} = $env;
-
# force replicated DC to update repsTo/repsFrom
# for primary domain partitions
my $samba_tool = Samba::bindir_path($self, "samba-tool");
@@ -2509,8 +2423,6 @@ sub setup_rodc
return undef;
}
- $self->{vars}->{rodc} = $env;
-
return $env;
}
@@ -2538,7 +2450,6 @@ sub setup_ad_dc
$self->setup_namespaces($env, $upn_array, $spn_array);
- $self->{vars}->{ad_dc} = $env;
return $env;
}
@@ -2569,7 +2480,6 @@ sub setup_ad_dc_no_nss
$self->setup_namespaces($env, $upn_array, $spn_array);
- $self->{vars}->{ad_dc_no_nss} = $env;
return $env;
}
@@ -2598,7 +2508,6 @@ sub setup_ad_dc_no_ntlm
$self->setup_namespaces($env, $upn_array, $spn_array);
- $self->{vars}->{ad_dc_no_ntlm} = $env;
return $env;
}