selftest: move to declaratively specifying environments and their dependencies
authorJamie McClymont <jamiemcclymont@catalyst.net.nz>
Wed, 21 Feb 2018 00:33:49 +0000 (13:33 +1300)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 21 Feb 2018 01:47:15 +0000 (02:47 +0100)
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>
selftest/selftest.pl
selftest/target/Samba.pm
selftest/target/Samba3.pm
selftest/target/Samba4.pm

index 64fb9f85d3a5b60f1c3a249e30e4f604a3cdd83d..c48e192652053730336d11e0799c26218ef52ae9 100755 (executable)
@@ -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;
index ba0cc7d0adb023f56863659685f3dd8bdb1ec622..f25507f7201286d3fe663db856d8a9911952e596 100644 (file)
@@ -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;
 }
 
index fc18954d0fa36599c253632890986f1e202068e4..e6c95fa991a5b01b849a240dcae37b4748b56e40 100755 (executable)
@@ -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;
 }
 
index 0cd2cf843219773c4436def1b76d1a240e2f54e3..fd4e4b61984369d3050b6b1458de924d3b4319dc 100755 (executable)
@@ -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,14 +2214,22 @@ 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;
 }
 
 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) = @_;
 
@@ -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;
 }