From: Volker Lendecke Date: Mon, 30 Mar 2020 20:08:40 +0000 (+0200) Subject: torture: Test smbc_utimes() X-Git-Tag: ldb-2.2.0~944 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=833303b8bd38f20e835533a48a913122bbca245e;p=thirdparty%2Fsamba.git torture: Test smbc_utimes() Prove that smbc_utimes throws away the tv_nsec field Signed-off-by: Volker Lendecke Reviewed-by: Ralph Boehme --- diff --git a/selftest/knownfail.d/libsmbclient.utimes b/selftest/knownfail.d/libsmbclient.utimes new file mode 100644 index 00000000000..4b7db2eb5a0 --- /dev/null +++ b/selftest/knownfail.d/libsmbclient.utimes @@ -0,0 +1 @@ +samba4.libsmbclient.utimes.* diff --git a/source4/selftest/tests.py b/source4/selftest/tests.py index 04712ce4025..8162f5e1fbc 100755 --- a/source4/selftest/tests.py +++ b/source4/selftest/tests.py @@ -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', diff --git a/source4/torture/libsmbclient/libsmbclient.c b/source4/torture/libsmbclient/libsmbclient.c index 6e64a783d58..b09dde23c32 100644 --- a/source4/torture/libsmbclient/libsmbclient.c +++ b/source4/torture/libsmbclient/libsmbclient.c @@ -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");