selftest: explicitly set "mangled names = yes"
[samba.git] / selftest / target / Samba3.pm
index 569b5d695173072068f408d397afe65842f879b9..5c327cab5438f980febe7132254b39ef3e19d1f6 100755 (executable)
@@ -3,6 +3,9 @@
 # Copyright (C) 2005-2007 Jelmer Vernooij <jelmer@samba.org>
 # Published under the GNU GPL, v3 or later.
 
+# NOTE: Refer to the README for more details about the various testenvs,
+# and tips about adding new testenvs.
+
 package Samba3;
 
 use strict;
@@ -181,9 +184,11 @@ sub check_env($$)
        ad_member           => ["ad_dc"],
        ad_member_rfc2307   => ["ad_dc_ntvfs"],
        ad_member_idmap_rid => ["ad_dc"],
-       ad_member_idmap_ad  => ["ad_dc"],
+       ad_member_idmap_ad  => ["fl2008r2dc"],
 );
 
+%Samba3::ENV_DEPS_POST = ();
+
 sub setup_nt4_dc
 {
        my ($self, $path) = @_;
@@ -409,6 +414,8 @@ sub setup_ad_member
         realm = $dcvars->{REALM}
         netbios aliases = foo bar
        template homedir = /home/%D/%G/%U
+       auth event notification = true
+       password server = $dcvars->{SERVER}
 
 [sub_dug]
        path = $share_dir/D_%D/U_%U/G_%G
@@ -448,6 +455,7 @@ sub setup_ad_member
        Samba::mk_krb5_conf($ctx, "");
 
        $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
+       $ret->{RESOLV_CONF} = $dcvars->{RESOLV_CONF};
 
        my $net = Samba::bindir_path($self, "net");
        # Add hosts file for name lookups
@@ -480,6 +488,7 @@ sub setup_ad_member
        $ret->{DC_SERVER} = $dcvars->{SERVER};
        $ret->{DC_SERVER_IP} = $dcvars->{SERVER_IP};
        $ret->{DC_SERVER_IPV6} = $dcvars->{SERVER_IPV6};
+       $ret->{DC_SERVERCONFFILE} = $dcvars->{SERVERCONFFILE};
        $ret->{DC_NETBIOSNAME} = $dcvars->{NETBIOSNAME};
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
@@ -543,6 +552,7 @@ sub setup_ad_member_rfc2307
        Samba::mk_krb5_conf($ctx, "");
 
        $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
+       $ret->{RESOLV_CONF} = $dcvars->{RESOLV_CONF};
 
        my $net = Samba::bindir_path($self, "net");
        # Add hosts file for name lookups
@@ -601,6 +611,10 @@ sub setup_ad_member_idmap_rid
        idmap config * : range = 1000000-1999999
        idmap config $dcvars->{DOMAIN} : backend = rid
        idmap config $dcvars->{DOMAIN} : range = 2000000-2999999
+       # Prevent overridding the provisioned lib/krb5.conf which sets certain
+       # values required for tests to succeed
+       create krb5 conf = no
+        map to guest = bad user
 ";
 
        my $ret = $self->provision($prefix, $dcvars->{DOMAIN},
@@ -630,6 +644,7 @@ sub setup_ad_member_idmap_rid
        Samba::mk_krb5_conf($ctx, "");
 
        $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
+       $ret->{RESOLV_CONF} = $dcvars->{RESOLV_CONF};
 
        my $net = Samba::bindir_path($self, "net");
        # Add hosts file for name lookups
@@ -689,6 +704,8 @@ sub setup_ad_member_idmap_ad
        idmap config * : range = 1000000-1999999
        idmap config $dcvars->{DOMAIN} : backend = ad
        idmap config $dcvars->{DOMAIN} : range = 2000000-2999999
+       idmap config $dcvars->{TRUST_DOMAIN} : backend = ad
+       idmap config $dcvars->{TRUST_DOMAIN} : range = 2000000-2999999
 ";
 
        my $ret = $self->provision($prefix, $dcvars->{DOMAIN},
@@ -718,6 +735,7 @@ sub setup_ad_member_idmap_ad
        Samba::mk_krb5_conf($ctx, "");
 
        $ret->{KRB5_CONFIG} = $ctx->{krb5_conf};
+       $ret->{RESOLV_CONF} = $dcvars->{RESOLV_CONF};
 
        my $net = Samba::bindir_path($self, "net");
        # Add hosts file for name lookups
@@ -754,6 +772,13 @@ sub setup_ad_member_idmap_ad
        $ret->{DC_USERNAME} = $dcvars->{USERNAME};
        $ret->{DC_PASSWORD} = $dcvars->{PASSWORD};
 
+       $ret->{TRUST_SERVER} = $dcvars->{TRUST_SERVER};
+       $ret->{TRUST_USERNAME} = $dcvars->{TRUST_USERNAME};
+       $ret->{TRUST_PASSWORD} = $dcvars->{TRUST_PASSWORD};
+       $ret->{TRUST_DOMAIN} = $dcvars->{TRUST_DOMAIN};
+       $ret->{TRUST_REALM} = $dcvars->{TRUST_REALM};
+       $ret->{TRUST_DOMSID} = $dcvars->{TRUST_DOMSID};
+
        return $ret;
 }
 
@@ -974,6 +999,15 @@ sub setup_fileserver
        comment = inherit only unix owner
        inherit owner = unix only
        acl_xattr:ignore system acls = yes
+# BUG: https://bugzilla.samba.org/show_bug.cgi?id=13690
+[force_group_test]
+       path = $share_dir
+       comment = force group test
+#      force group = everyone
+[homes]
+       comment = Home directories
+       browseable = No
+       read only = No
 ";
 
        my $vars = $self->provision($path, "WORKGROUP",
@@ -1201,204 +1235,108 @@ sub read_pid($$)
        return $pid;
 }
 
+# builds up the cmd args to run an s3 binary (i.e. smbd, nmbd, etc)
+sub make_bin_cmd
+{
+       my ($self, $binary, $env_vars, $options, $valgrind, $dont_log_stdout) = @_;
+
+       my @optargs = ("-d0");
+       if (defined($options)) {
+               @optargs = split(/ /, $options);
+       }
+       my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
+
+       if (defined($valgrind)) {
+               @preargs = split(/ /, $valgrind);
+       }
+       my @args = ("-F", "--no-process-group",
+                   "-s", $env_vars->{SERVERCONFFILE},
+                   "-l", $env_vars->{LOGDIR});
+
+       if (not defined($dont_log_stdout)) {
+               push(@args, "--log-stdout");
+       }
+       return (@preargs, $binary, @args, @optargs);
+}
+
 sub check_or_start($$$$$) {
        my ($self, $env_vars, $nmbd, $winbindd, $smbd) = @_;
+       my $STDIN_READER;
 
        # use a pipe for stdin in the child processes. This allows
        # those processes to monitor the pipe for EOF to ensure they
        # exit when the test script exits
-       pipe(STDIN_READER, $env_vars->{STDIN_PIPE});
-
-       unlink($env_vars->{NMBD_TEST_LOG});
-       print "STARTING NMBD...";
-       my $pid = fork();
-       if ($pid == 0) {
-               open STDOUT, ">$env_vars->{NMBD_TEST_LOG}";
-               open STDERR, '>&STDOUT';
-
-               SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
-
-               $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG};
-               $ENV{KRB5CCNAME} = "$env_vars->{KRB5_CCACHE}.nmbd";
-               $ENV{SELFTEST_WINBINDD_SOCKET_DIR} = $env_vars->{SELFTEST_WINBINDD_SOCKET_DIR};
-               $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
-
-               $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
-               $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
-               $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS};
-               $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME};
-               $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH};
-               $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX};
-               $ENV{UID_WRAPPER_ROOT} = "1";
-
-               $ENV{ENVNAME} = "$ENV{ENVNAME}.nmbd";
-
-               if ($nmbd ne "yes") {
-                       $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
-                               my $signame = shift;
-                               print("Skip nmbd received signal $signame");
-                               exit 0;
-                       };
-                       sleep($self->{server_maxtime});
-                       exit 0;
-               }
-
-               $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "nmbd");
-               my @optargs = ("-d0");
-               if (defined($ENV{NMBD_OPTIONS})) {
-                       @optargs = split(/ /, $ENV{NMBD_OPTIONS});
-               }
-               my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
-               if(defined($ENV{NMBD_VALGRIND})) { 
-                       @preargs = split(/ /, $ENV{NMBD_VALGRIND});
-               }
-               my @args = ("-F", "--no-process-group",
-                           "-s", $env_vars->{SERVERCONFFILE},
-                           "-l", $env_vars->{LOGDIR});
-               if (not defined($ENV{NMBD_DONT_LOG_STDOUT})) {
-                       push(@args, "--log-stdout");
-               }
-
-               close($env_vars->{STDIN_PIPE});
-               open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
-
-               exec(@preargs, $ENV{MAKE_TEST_BINARY}, @args, @optargs)
-                       or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
+       pipe($STDIN_READER, $env_vars->{STDIN_PIPE});
+
+       my $binary = Samba::bindir_path($self, "nmbd");
+       my @full_cmd = $self->make_bin_cmd($binary, $env_vars,
+                                          $ENV{NMBD_OPTIONS}, $ENV{NMBD_VALGRIND},
+                                          $ENV{NMBD_DONT_LOG_STDOUT});
+       my $nmbd_envs = Samba::get_env_for_process("nmbd", $env_vars);
+       delete $nmbd_envs->{RESOLV_WRAPPER_CONF};
+       delete $nmbd_envs->{RESOLV_WRAPPER_HOSTS};
+
+       # fork and exec() nmbd in the child process
+       my $daemon_ctx = {
+               NAME => "nmbd",
+               BINARY_PATH => $binary,
+               FULL_CMD => [ @full_cmd ],
+               LOG_FILE => $env_vars->{NMBD_TEST_LOG},
+               ENV_VARS => $nmbd_envs,
+       };
+       if ($nmbd ne "yes") {
+               $daemon_ctx->{SKIP_DAEMON} = 1;
        }
+       my $pid = Samba::fork_and_exec($self, $env_vars, $daemon_ctx, $STDIN_READER);
+
        $env_vars->{NMBD_TL_PID} = $pid;
        write_pid($env_vars, "nmbd", $pid);
-       print "DONE\n";
 
-       unlink($env_vars->{WINBINDD_TEST_LOG});
-       print "STARTING WINBINDD...";
-       $pid = fork();
-       if ($pid == 0) {
-               open STDOUT, ">$env_vars->{WINBINDD_TEST_LOG}";
-               open STDERR, '>&STDOUT';
-
-               SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
-
-               $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG};
-               $ENV{KRB5CCNAME} = "$env_vars->{KRB5_CCACHE}.winbindd";
-               $ENV{SELFTEST_WINBINDD_SOCKET_DIR} = $env_vars->{SELFTEST_WINBINDD_SOCKET_DIR};
-               $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
-
-               $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
-               $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
-               $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS};
-               $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME};
-               $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH};
-               $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX};
-               if (defined($env_vars->{RESOLV_WRAPPER_CONF})) {
-                       $ENV{RESOLV_WRAPPER_CONF} = $env_vars->{RESOLV_WRAPPER_CONF};
-               } else {
-                       $ENV{RESOLV_WRAPPER_HOSTS} = $env_vars->{RESOLV_WRAPPER_HOSTS};
-               }
-               $ENV{UID_WRAPPER_ROOT} = "1";
-
-               $ENV{ENVNAME} = "$ENV{ENVNAME}.winbindd";
-
-               if ($winbindd ne "yes") {
-                       $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
-                               my $signame = shift;
-                               print("Skip winbindd received signal $signame");
-                               exit 0;
-                       };
-                       sleep($self->{server_maxtime});
-                       exit 0;
-               }
-
-               $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "winbindd");
-               my @optargs = ("-d0");
-               if (defined($ENV{WINBINDD_OPTIONS})) {
-                       @optargs = split(/ /, $ENV{WINBINDD_OPTIONS});
-               }
-               my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
-               if(defined($ENV{WINBINDD_VALGRIND})) {
-                       @preargs = split(/ /, $ENV{WINBINDD_VALGRIND});
-               }
-               my @args = ("-F", "--no-process-group",
-                           "-s", $env_vars->{SERVERCONFFILE},
-                           "-l", $env_vars->{LOGDIR});
-               if (not defined($ENV{WINBINDD_DONT_LOG_STDOUT})) {
-                       push(@args, "--stdout");
-               }
+       $binary = Samba::bindir_path($self, "winbindd");
+       @full_cmd = $self->make_bin_cmd($binary, $env_vars,
+                                        $ENV{WINBINDD_OPTIONS}, $ENV{WINBINDD_VALGRIND}, "N/A");
 
-               close($env_vars->{STDIN_PIPE});
-               open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
+       if (not defined($ENV{WINBINDD_DONT_LOG_STDOUT})) {
+               push(@full_cmd, "--stdout");
+       }
 
-               exec(@preargs, $ENV{MAKE_TEST_BINARY}, @args, @optargs)
-                       or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
+       # fork and exec() winbindd in the child process
+       $daemon_ctx = {
+               NAME => "winbindd",
+               BINARY_PATH => $binary,
+               FULL_CMD => [ @full_cmd ],
+               LOG_FILE => $env_vars->{WINBINDD_TEST_LOG},
+       };
+       if ($winbindd ne "yes") {
+               $daemon_ctx->{SKIP_DAEMON} = 1;
        }
+       my $pid = Samba::fork_and_exec($self, $env_vars, $daemon_ctx, $STDIN_READER);
+
        $env_vars->{WINBINDD_TL_PID} = $pid;
        write_pid($env_vars, "winbindd", $pid);
-       print "DONE\n";
-
-       unlink($env_vars->{SMBD_TEST_LOG});
-       print "STARTING SMBD...";
-       $pid = fork();
-       if ($pid == 0) {
-               open STDOUT, ">$env_vars->{SMBD_TEST_LOG}";
-               open STDERR, '>&STDOUT';
-
-               SocketWrapper::set_default_iface($env_vars->{SOCKET_WRAPPER_DEFAULT_IFACE});
-
-               $ENV{KRB5_CONFIG} = $env_vars->{KRB5_CONFIG};
-               $ENV{KRB5CCNAME} = "$env_vars->{KRB5_CCACHE}.smbd";
-               $ENV{SELFTEST_WINBINDD_SOCKET_DIR} = $env_vars->{SELFTEST_WINBINDD_SOCKET_DIR};
-               $ENV{NMBD_SOCKET_DIR} = $env_vars->{NMBD_SOCKET_DIR};
-
-               $ENV{NSS_WRAPPER_PASSWD} = $env_vars->{NSS_WRAPPER_PASSWD};
-               $ENV{NSS_WRAPPER_GROUP} = $env_vars->{NSS_WRAPPER_GROUP};
-               $ENV{NSS_WRAPPER_HOSTS} = $env_vars->{NSS_WRAPPER_HOSTS};
-               $ENV{NSS_WRAPPER_HOSTNAME} = $env_vars->{NSS_WRAPPER_HOSTNAME};
-               $ENV{NSS_WRAPPER_MODULE_SO_PATH} = $env_vars->{NSS_WRAPPER_MODULE_SO_PATH};
-               $ENV{NSS_WRAPPER_MODULE_FN_PREFIX} = $env_vars->{NSS_WRAPPER_MODULE_FN_PREFIX};
-               if (defined($env_vars->{RESOLV_WRAPPER_CONF})) {
-                       $ENV{RESOLV_WRAPPER_CONF} = $env_vars->{RESOLV_WRAPPER_CONF};
-               } else {
-                       $ENV{RESOLV_WRAPPER_HOSTS} = $env_vars->{RESOLV_WRAPPER_HOSTS};
-               }
-               $ENV{UID_WRAPPER_ROOT} = "1";
-
-               $ENV{ENVNAME} = "$ENV{ENVNAME}.smbd";
-
-               if ($smbd ne "yes") {
-                       $SIG{USR1} = $SIG{ALRM} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
-                               my $signame = shift;
-                               print("Skip smbd received signal $signame");
-                               exit 0;
-                       };
-                       sleep($self->{server_maxtime});
-                       exit 0;
-               }
 
-               $ENV{MAKE_TEST_BINARY} = Samba::bindir_path($self, "smbd");
-               my @optargs = ("-d0");
-               if (defined($ENV{SMBD_OPTIONS})) {
-                       @optargs = split(/ /, $ENV{SMBD_OPTIONS});
-               }
-               my @preargs = (Samba::bindir_path($self, "timelimit"), $self->{server_maxtime});
-               if(defined($ENV{SMBD_VALGRIND})) {
-                       @preargs = split(/ /,$ENV{SMBD_VALGRIND});
-               }
-               my @args = ("-F", "--no-process-group",
-                           "-s", $env_vars->{SERVERCONFFILE},
-                           "-l", $env_vars->{LOGDIR});
-               if (not defined($ENV{SMBD_DONT_LOG_STDOUT})) {
-                       push(@args, "--log-stdout");
-               }
+       $binary = Samba::bindir_path($self, "smbd");
+       @full_cmd = $self->make_bin_cmd($binary, $env_vars,
+                                        $ENV{SMBD_OPTIONS}, $ENV{SMBD_VALGRIND},
+                                        $ENV{SMBD_DONT_LOG_STDOUT});
+
+       # fork and exec() smbd in the child process
+       $daemon_ctx = {
+               NAME => "smbd",
+               BINARY_PATH => $binary,
+               FULL_CMD => [ @full_cmd ],
+               LOG_FILE => $env_vars->{SMBD_TEST_LOG},
+       };
+       if ($smbd ne "yes") {
+               $daemon_ctx->{SKIP_DAEMON} = 1;
+       }
 
-               close($env_vars->{STDIN_PIPE});
-               open STDIN, ">&", \*STDIN_READER or die "can't dup STDIN_READER to STDIN: $!";
+       my $pid = Samba::fork_and_exec($self, $env_vars, $daemon_ctx, $STDIN_READER);
 
-               exec(@preargs, $ENV{MAKE_TEST_BINARY}, @args, @optargs)
-                       or die("Unable to start $ENV{MAKE_TEST_BINARY}: $!");
-       }
        $env_vars->{SMBD_TL_PID} = $pid;
        write_pid($env_vars, "smbd", $pid);
-       print "DONE\n";
 
+       # close the parent's read-end of the pipe
        close(STDIN_READER);
 
        return $self->wait_for_start($env_vars, $nmbd, $winbindd, $smbd);
@@ -1437,8 +1375,8 @@ sub provision($$$$$$$$$)
        my $swiface = Samba::get_interface($server);
        my %ret = ();
        my %createuser_env = ();
-       my $server_ip = "127.0.0.$swiface";
-       my $server_ipv6 = sprintf("fd00:0000:0000:0000:0000:0000:5357:5f%02x", $swiface);
+       my $server_ip = Samba::get_ipv4_addr($server);
+       my $server_ipv6 = Samba::get_ipv6_addr($server);
 
        my $unix_name = ($ENV{USER} or $ENV{LOGNAME} or `PATH=/usr/ucb:$ENV{PATH} whoami`);
        chomp $unix_name;
@@ -1635,6 +1573,8 @@ sub provision($$$$$$$$$)
 
        my $conffile="$libdir/server.conf";
        my $dfqconffile="$libdir/dfq.conf";
+       my $errorinjectconf="$libdir/error_inject.conf";
+       my $delayinjectconf="$libdir/delay_inject.conf";
 
        my $nss_wrapper_pl = "$ENV{PERL} $self->{srcdir}/third_party/nss_wrapper/nss_wrapper.pl";
        my $nss_wrapper_passwd = "$privatedir/passwd";
@@ -1663,8 +1603,11 @@ sub provision($$$$$$$$$)
        my ($gid_force_user);
        my ($uid_user1);
        my ($uid_user2);
+       my ($uid_gooduser);
+       my ($uid_eviluser);
+       my ($uid_slashuser);
 
-       if ($unix_uid < 0xffff - 10) {
+       if ($unix_uid < 0xffff - 13) {
                $max_uid = 0xffff;
        } else {
                $max_uid = $unix_uid;
@@ -1680,6 +1623,9 @@ sub provision($$$$$$$$$)
        $uid_smbget = $max_uid - 8;
        $uid_user1 = $max_uid - 9;
        $uid_user2 = $max_uid - 10;
+       $uid_gooduser = $max_uid - 11;
+       $uid_eviluser = $max_uid - 12;
+       $uid_slashuser = $max_uid - 13;
 
        if ($unix_gids[0] < 0xffff - 8) {
                $max_gid = 0xffff;
@@ -1704,14 +1650,20 @@ sub provision($$$$$$$$$)
                warn("Unable to open $conffile");
                return undef;
        }
+
+       my $interfaces = Samba::get_interfaces_config($server);
+
        print CONF "
 [global]
        netbios name = $server
-       interfaces = $server_ip/8 $server_ipv6/64
+       interfaces = $interfaces
        bind interfaces only = yes
        panic action = cd $self->{srcdir} && $self->{srcdir}/selftest/gdb_backtrace %d %\$(MAKE_TEST_BINARY)
        smbd:suicide mode = yes
 
+       client min protocol = CORE
+       server min protocol = LANMAN1
+
        workgroup = $domain
 
        private dir = $privatedir
@@ -1772,6 +1724,7 @@ sub provision($$$$$$$$$)
        dos filemode = yes
        strict rename = yes
        strict sync = yes
+       mangled names = yes
        vfs objects = acl_xattr fake_acls xattr_tdb streams_depot time_audit full_audit
 
        full_audit:syslog = no
@@ -1940,6 +1893,24 @@ sub provision($$$$$$$$$)
        nfs4acl_xattr:encoding = xdr
        nfs4acl_xattr:version = 41
 
+[nfs4acl_nfs_40]
+       path = $shrdir
+       comment = smb username is [%U]
+       vfs objects = nfs4acl_xattr xattr_tdb
+       nfs4:mode = simple
+       nfs4acl_xattr:encoding = nfs
+       nfs4acl_xattr:version = 40
+       nfs4acl_xattr:xattr_name = security.nfs4acl_xdr
+
+[nfs4acl_nfs_41]
+       path = $shrdir
+       comment = smb username is [%U]
+       vfs objects = nfs4acl_xattr xattr_tdb
+       nfs4:mode = simple
+       nfs4acl_xattr:encoding = nfs
+       nfs4acl_xattr:version = 41
+       nfs4acl_xattr:xattr_name = security.nfs4acl_xdr
+
 [xcopy_share]
        path = $shrdir
        comment = smb username is [%U]
@@ -2028,6 +1999,13 @@ sub provision($$$$$$$$$)
        fruit:delete_empty_adfiles = true
        fruit:veto_appledouble = no
 
+[vfs_fruit_zero_fileid]
+       path = $shrdir
+       vfs objects = fruit streams_xattr acl_xattr xattr_tdb
+       fruit:resource = file
+       fruit:metadata = stream
+       fruit:zero_file_id=yes
+
 [badname-tmp]
        path = $badnames_shrdir
        guest ok = yes
@@ -2187,6 +2165,15 @@ sub provision($$$$$$$$$)
        vfs objects = shadow_copy2
        shadow:mountpoint = $shadow_mntdir
        wide links = yes
+
+[shadow_write]
+       path = $shadow_tstdir
+       comment = previous versions snapshots under mount point
+       vfs objects = shadow_copy2 streams_xattr error_inject
+       aio write size = 0
+       error_inject:pwrite = EBADF
+       shadow:mountpoint = $shadow_tstdir
+
 [dfq]
        path = $shrdir/dfree
        vfs objects = acl_xattr fake_acls xattr_tdb fake_dfq
@@ -2245,7 +2232,7 @@ sub provision($$$$$$$$$)
 [error_inject]
        copy = tmp
        vfs objects = error_inject
-       include = $libdir/error_inject.conf
+       include = $errorinjectconf
 
 [delay_inject]
        copy = tmp
@@ -2253,7 +2240,7 @@ sub provision($$$$$$$$$)
        kernel share modes = no
        kernel oplocks = no
        posix locking = no
-       include = $libdir/delay_inject.conf
+       include = $delayinjectconf
 
 [aio_delay_inject]
        copy = tmp
@@ -2277,6 +2264,18 @@ sub provision($$$$$$$$$)
            return undef;
        }
 
+       unless (open(ERRORCONF, ">$errorinjectconf")) {
+               warn("Unable to open $errorinjectconf");
+               return undef;
+       }
+       close(ERRORCONF);
+
+       unless (open(DELAYCONF, ">$delayinjectconf")) {
+               warn("Unable to open $delayinjectconf");
+               return undef;
+       }
+       close(DELAYCONF);
+
        unless (open(DFQCONF, ">$dfqconffile")) {
                warn("Unable to open $dfqconffile");
                return undef;
@@ -2301,6 +2300,9 @@ force_user:x:$uid_force_user:$gid_force_user:force user gecos:$prefix_abs:/bin/f
 smbget_user:x:$uid_smbget:$gid_domusers:smbget_user gecos:$prefix_abs:/bin/false
 user1:x:$uid_user1:$gid_nogroup:user1 gecos:$prefix_abs:/bin/false
 user2:x:$uid_user2:$gid_nogroup:user2 gecos:$prefix_abs:/bin/false
+gooduser:x:$uid_gooduser:$gid_domusers:gooduser gecos:$prefix_abs:/bin/false
+eviluser:x:$uid_eviluser:$gid_domusers:eviluser gecos::/bin/false
+slashuser:x:$uid_slashuser:$gid_domusers:slashuser gecos:/:/bin/false
 ";
        if ($unix_uid != 0) {
                print PASSWD "root:x:$uid_root:$gid_root:root gecos:$prefix_abs:/bin/false
@@ -2377,6 +2379,9 @@ force_user:x:$gid_force_user:
        createuser($self, "smbget_user", $password, $conffile, \%createuser_env) || die("Unable to create smbget_user");
        createuser($self, "user1", $password, $conffile, \%createuser_env) || die("Unable to create user1");
        createuser($self, "user2", $password, $conffile, \%createuser_env) || die("Unable to create user2");
+       createuser($self, "gooduser", $password, $conffile, \%createuser_env) || die("Unable to create gooduser");
+       createuser($self, "eviluser", $password, $conffile, \%createuser_env) || die("Unable to create eviluser");
+       createuser($self, "slashuser", $password, $conffile, \%createuser_env) || die("Unable to create slashuser");
 
        open(DNS_UPDATE_LIST, ">$prefix/dns_update_list") or die("Unable to open $$prefix/dns_update_list");
        print DNS_UPDATE_LIST "A $server. $server_ip\n";
@@ -2394,6 +2399,7 @@ force_user:x:$gid_force_user:
        $ret{SMBD_TEST_LOG} = "$prefix/smbd_test.log";
        $ret{SMBD_TEST_LOG_POS} = 0;
        $ret{SERVERCONFFILE} = $conffile;
+       $ret{TESTENV_DIR} = $prefix_abs;
        $ret{CONFIGURATION} ="-s $conffile";
        $ret{LOCK_DIR} = $lockdir;
        $ret{SERVER} = $server;