selftest: Test hide new files timeout
authorVolker Lendecke <vl@samba.org>
Thu, 8 Nov 2018 12:27:58 +0000 (13:27 +0100)
committerJeremy Allison <jra@samba.org>
Fri, 9 Nov 2018 02:49:55 +0000 (03:49 +0100)
Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Fri Nov  9 03:49:55 CET 2018 on sn-devel-144

selftest/target/Samba3.pm
source3/selftest/tests.py
source3/torture/proto.h
source3/torture/test_hidenewfiles.c [new file with mode: 0644]
source3/torture/torture.c
source3/wscript_build

index 916651146613dd9c2503b9c8c2405b3c9cc32aa8..569b5d695173072068f408d397afe65842f879b9 100755 (executable)
@@ -838,6 +838,10 @@ sub setup_simpleserver
        path = $prefix_abs/share
        vfs objects =
        smb encrypt = desired
        path = $prefix_abs/share
        vfs objects =
        smb encrypt = desired
+
+[hidenewfiles]
+       path = $prefix_abs/share
+       hide new files timeout = 5
 ";
 
        my $vars = $self->provision($path, "WORKGROUP",
 ";
 
        my $vars = $self->provision($path, "WORKGROUP",
index 720485db7dbbc0e7aea4890cfbf9a92fd13134e6..98d13d3c4f7e0b02492551a9e2e42429d807f7a4 100755 (executable)
@@ -128,6 +128,18 @@ for t in tests:
     plantestsuite("samba3.smbtorture_s3.vfs_aio_pthread(simpleserver).%s" % t, "simpleserver", [os.path.join(samba3srcdir, "script/tests/test_smbtorture_s3.sh"), t, '//$SERVER_IP/vfs_aio_pthread', '$USERNAME', '$PASSWORD', smbtorture3, "", "-l $LOCAL_PATH"])
     plantestsuite("samba3.smbtorture_s3.vfs_aio_fork(simpleserver).%s" % t, "simpleserver", [os.path.join(samba3srcdir, "script/tests/test_smbtorture_s3.sh"), t, '//$SERVER_IP/vfs_aio_fork', '$USERNAME', '$PASSWORD', smbtorture3, "", "-l $LOCAL_PATH"])
 
     plantestsuite("samba3.smbtorture_s3.vfs_aio_pthread(simpleserver).%s" % t, "simpleserver", [os.path.join(samba3srcdir, "script/tests/test_smbtorture_s3.sh"), t, '//$SERVER_IP/vfs_aio_pthread', '$USERNAME', '$PASSWORD', smbtorture3, "", "-l $LOCAL_PATH"])
     plantestsuite("samba3.smbtorture_s3.vfs_aio_fork(simpleserver).%s" % t, "simpleserver", [os.path.join(samba3srcdir, "script/tests/test_smbtorture_s3.sh"), t, '//$SERVER_IP/vfs_aio_fork', '$USERNAME', '$PASSWORD', smbtorture3, "", "-l $LOCAL_PATH"])
 
+plantestsuite("samba3.smbtorture_s3.hidenewfiles(simpleserver)",
+              "simpleserver",
+              [os.path.join(samba3srcdir,
+                            "script/tests/test_smbtorture_s3.sh"),
+               'hide-new-files-timeout',
+               '//$SERVER_IP/hidenewfiles',
+               '$USERNAME',
+               '$PASSWORD',
+               smbtorture3,
+               "",
+               "-l $LOCAL_PATH"])
+
 shares = [
     "vfs_aio_pthread_async_dosmode_default1",
     "vfs_aio_pthread_async_dosmode_default2",
 shares = [
     "vfs_aio_pthread_async_dosmode_default1",
     "vfs_aio_pthread_async_dosmode_default2",
index 1634da493150eec4daa7d8e863de1f47cedace70..669e077051e57a662ea601f89b7c638c535d484c 100644 (file)
@@ -137,5 +137,6 @@ bool run_g_lock5(int dummy);
 bool run_g_lock6(int dummy);
 bool run_g_lock_ping_pong(int dummy);
 bool run_local_namemap_cache1(int dummy);
 bool run_g_lock6(int dummy);
 bool run_g_lock_ping_pong(int dummy);
 bool run_local_namemap_cache1(int dummy);
+bool run_hidenewfiles(int dummy);
 
 #endif /* __TORTURE_H__ */
 
 #endif /* __TORTURE_H__ */
diff --git a/source3/torture/test_hidenewfiles.c b/source3/torture/test_hidenewfiles.c
new file mode 100644 (file)
index 0000000..2f1638a
--- /dev/null
@@ -0,0 +1,173 @@
+/*
+ * Unix SMB/CIFS implementation.
+ * Test pthreadpool_tevent
+ * Copyright (C) Volker Lendecke 2018
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+#include "torture/proto.h"
+#include "libsmb/libsmb.h"
+#include "libcli/security/security.h"
+
+static NTSTATUS servertime(
+       struct cli_state *cli, const char *fname, struct timeval *tv)
+{
+       struct smb_create_returns cr;
+       NTSTATUS status;
+       uint16_t fnum;
+
+       status = cli_ntcreate(
+               cli,
+               fname,
+               0,
+               FILE_GENERIC_WRITE|DELETE_ACCESS,
+               FILE_ATTRIBUTE_NORMAL,
+               0,
+               FILE_CREATE,
+               FILE_DELETE_ON_CLOSE,
+               0,
+               &fnum,
+               &cr);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("cli_ntcreate failed: %s\n", nt_errstr(status));
+               return status;
+       }
+
+       status = cli_close(cli, fnum);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("cli_close failed: %s\n", nt_errstr(status));
+               return status;
+       }
+
+       nttime_to_timeval(tv, cr.creation_time);
+
+       return NT_STATUS_OK;
+}
+
+struct have_file_state {
+       bool found;
+       const char *fname;
+};
+
+static NTSTATUS have_file_fn(const char *mntpoint,
+                            struct file_info *f,
+                            const char *mask,
+                            void *private_data)
+{
+       struct have_file_state *state = private_data;
+       state->found |= strequal(f->name, state->fname);
+       return NT_STATUS_OK;
+}
+
+static bool have_file(struct cli_state *cli, const char *fname)
+{
+       struct have_file_state state = { .fname = fname };
+       NTSTATUS status;
+
+       status = cli_list(
+               cli,
+               "*.*",
+               FILE_ATTRIBUTE_DIRECTORY|
+               FILE_ATTRIBUTE_SYSTEM|
+               FILE_ATTRIBUTE_HIDDEN,
+               have_file_fn,
+               &state);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("cli_list failed: %s\n", nt_errstr(status));
+               return false;
+       }
+
+       return state.found;
+}
+
+bool run_hidenewfiles(int dummy)
+{
+       const char *tsname = "timestamp.txt";
+       const char *fname = "new_hidden.txt";
+       struct cli_state *cli;
+       struct smb_create_returns cr;
+       struct timeval create_time;
+       uint16_t fnum;
+       NTSTATUS status;
+       bool ret = false;
+       bool gotit = false;
+       bool ok;
+
+       /* what is configure in smb.conf */
+       unsigned hideunreadable_seconds = 5;
+
+       ok = torture_open_connection(&cli, 0);
+       if (!ok) {
+               return false;
+       }
+
+       cli_unlink(cli, tsname, FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);
+       cli_unlink(cli, fname, FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN);
+
+       status = cli_ntcreate(
+               cli,
+               fname,
+               0,
+               FILE_GENERIC_WRITE|DELETE_ACCESS,
+               FILE_ATTRIBUTE_NORMAL,
+               0,
+               FILE_CREATE,
+               0,
+               0,
+               &fnum,
+               &cr);
+       if (!NT_STATUS_IS_OK(status)) {
+               d_printf("cli_ntcreate failed: %s\n", nt_errstr(status));
+               return false;
+       }
+       nttime_to_timeval(&create_time, cr.last_write_time);
+
+       while (!gotit) {
+               struct timeval now;
+               double age;
+
+               gotit = have_file(cli, fname);
+
+               status = servertime(cli, tsname, &now);
+               if (!NT_STATUS_IS_OK(status)) {
+                       d_printf("servertime failed: %s\n",
+                                nt_errstr(status));
+                       goto fail;
+               }
+               age = timeval_elapsed2(&create_time, &now);
+
+               if ((age < hideunreadable_seconds) && gotit) {
+                       d_printf("Found file at age of %f\n", age);
+                       goto fail;
+               }
+               if ((age > (hideunreadable_seconds*10)) && !gotit) {
+                       d_printf("Did not find file after %f seconds\n", age);
+                       goto fail;
+               }
+               if (gotit) {
+                       break;
+               }
+
+               smb_msleep(1000);
+       }
+
+       ret = true;
+fail:
+       cli_nt_delete_on_close(cli, fnum, true);
+       cli_close(cli, fnum);
+
+       return ret;
+}
index 333b1f1c26afaf9d1f09eff6b496476fc08a8bf6..22810f081b843a10089053459245f6b0c52bed88 100644 (file)
@@ -11878,6 +11878,7 @@ static struct {
        { "LOCAL-CANONICALIZE-PATH", run_local_canonicalize_path, 0 },
        { "LOCAL-NAMEMAP-CACHE1", run_local_namemap_cache1, 0 },
        { "qpathinfo-bufsize", run_qpathinfo_bufsize, 0 },
        { "LOCAL-CANONICALIZE-PATH", run_local_canonicalize_path, 0 },
        { "LOCAL-NAMEMAP-CACHE1", run_local_namemap_cache1, 0 },
        { "qpathinfo-bufsize", run_qpathinfo_bufsize, 0 },
+       { "hide-new-files-timeout", run_hidenewfiles, 0 },
        {NULL, NULL, 0}};
 
 /****************************************************************************
        {NULL, NULL, 0}};
 
 /****************************************************************************
index 50d675cf3fc7a6e4673df2d95e66024e16b63752..a8ea8e581df24e9eddb52a02d798657747ea9434 100644 (file)
@@ -1196,6 +1196,7 @@ bld.SAMBA3_BINARY('smbtorture' + bld.env.suffix3,
                         torture/wbc_async.c
                         torture/test_g_lock.c
                         torture/test_namemap_cache.c
                         torture/wbc_async.c
                         torture/test_g_lock.c
                         torture/test_namemap_cache.c
+                        torture/test_hidenewfiles.c
                         ''',
                  deps='''
                       talloc
                         ''',
                  deps='''
                       talloc