]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
torture: Test smbc_utimes()
authorVolker Lendecke <vl@samba.org>
Mon, 30 Mar 2020 20:08:40 +0000 (22:08 +0200)
committerRalph Boehme <slow@samba.org>
Wed, 8 Apr 2020 14:46:40 +0000 (14:46 +0000)
Prove that smbc_utimes throws away the tv_nsec field

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
selftest/knownfail.d/libsmbclient.utimes [new file with mode: 0644]
source4/selftest/tests.py
source4/torture/libsmbclient/libsmbclient.c

diff --git a/selftest/knownfail.d/libsmbclient.utimes b/selftest/knownfail.d/libsmbclient.utimes
new file mode 100644 (file)
index 0000000..4b7db2e
--- /dev/null
@@ -0,0 +1 @@
+samba4.libsmbclient.utimes.*
index 04712ce402569418c0d0735f754b6d255ceb0eb7..8162f5e1fbc19a979133f325b56a5167c635cddf 100755 (executable)
@@ -382,6 +382,8 @@ for t in libsmbclient:
     url = "smb://$USERNAME:$PASSWORD@$SERVER/tmp"
     if t == "libsmbclient.list_shares":
         url = "smb://$USERNAME:$PASSWORD@$SERVER"
+    if t == "libsmbclient.utimes":
+        url += "/utimes.txt"
 
     libsmbclient_testargs = [
         '//$SERVER/tmp',
index 6e64a783d58dc8fe8fb2bf92cf4f7595c9106603..b09dde23c327bdb17522ee9af4d2b8533d09e581 100644 (file)
@@ -1206,6 +1206,53 @@ out:
        return ok;
 }
 
+static bool torture_libsmbclient_utimes(struct torture_context *tctx)
+{
+       const char *smburl = torture_setting_string(tctx, "smburl", NULL);
+       SMBCCTX *ctx = NULL;
+       struct stat st;
+       int fhandle, ret;
+       struct timeval tbuf[2];
+       bool ok;
+
+       if (smburl == NULL) {
+               torture_fail(tctx,
+                            "option --option=torture:smburl="
+                            "smb://user:password@server missing\n");
+       }
+
+       ok = torture_libsmbclient_init_context(tctx, &ctx);
+       torture_assert(tctx, ok, "Failed to init context");
+       smbc_set_context(ctx);
+
+       fhandle = smbc_open(smburl, O_RDWR|O_CREAT, 0644);
+       torture_assert_int_not_equal(tctx, fhandle, -1, "smbc_open failed");
+
+       ret = smbc_fstat(fhandle, &st);
+       torture_assert_int_not_equal(tctx, ret, -1, "smbc_fstat failed");
+
+       tbuf[0] = convert_timespec_to_timeval(st.st_atim);
+       tbuf[1] = convert_timespec_to_timeval(st.st_mtim);
+
+       tbuf[1].tv_usec += 100000; /* 100 msec */
+
+       ret = smbc_utimes(smburl, tbuf);
+       torture_assert_int_not_equal(tctx, ret, -1, "smbc_utimes failed");
+
+       ret = smbc_fstat(fhandle, &st);
+       torture_assert_int_not_equal(tctx, ret, -1, "smbc_fstat failed");
+
+       torture_assert_int_equal(
+               tctx,
+               st.st_mtim.tv_nsec / 1000,
+               tbuf[1].tv_usec,
+               "smbc_utimes did not update msec");
+
+       smbc_close(fhandle);
+       smbc_unlink(smburl);
+       return true;
+}
+
 NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
 {
        struct torture_suite *suite;
@@ -1225,6 +1272,8 @@ NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx)
                torture_libsmbclient_readdirplus_seek);
        torture_suite_add_simple_test(suite, "readdirplus2",
                torture_libsmbclient_readdirplus2);
+       torture_suite_add_simple_test(
+               suite, "utimes", torture_libsmbclient_utimes);
 
        suite->description = talloc_strdup(suite, "libsmbclient interface tests");