diff options
author | Jeremy Allison <jra@samba.org> | 2022-02-02 10:49:17 -0800 |
---|---|---|
committer | Jule Anger <janger@samba.org> | 2022-02-04 07:46:50 +0000 |
commit | 5c55418c25eb18d44416f486d1468ca6ccce0ab7 (patch) | |
tree | 5d6efd5c838bc268b929e4df5d0ded962d96a823 | |
parent | 29355d0a2d4e2b64a0cd1b8d16067f94f1594114 (diff) | |
download | samba-5c55418c25eb18d44416f486d1468ca6ccce0ab7.tar.gz |
s4: test: Add samba4.libsmbclient.rename test. Currently fails for SMB3.
Add knownfail.d/libsmbclient_rename
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14938
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Boehme <slow@samba.org>
(cherry picked from commit 0ecc58858360bcc0181a02e52ada3e8327f97c5b)
-rw-r--r-- | selftest/knownfail.d/libsmbclient_rename | 1 | ||||
-rw-r--r-- | source4/torture/libsmbclient/libsmbclient.c | 112 |
2 files changed, 113 insertions, 0 deletions
diff --git a/selftest/knownfail.d/libsmbclient_rename b/selftest/knownfail.d/libsmbclient_rename new file mode 100644 index 00000000000..88343b7d5ef --- /dev/null +++ b/selftest/knownfail.d/libsmbclient_rename @@ -0,0 +1 @@ +^samba4.libsmbclient.rename.SMB3.rename\(nt4_dc\) diff --git a/source4/torture/libsmbclient/libsmbclient.c b/source4/torture/libsmbclient/libsmbclient.c index fd770e5002f..b04dbde04ac 100644 --- a/source4/torture/libsmbclient/libsmbclient.c +++ b/source4/torture/libsmbclient/libsmbclient.c @@ -1303,6 +1303,115 @@ out: return ok; } +static bool torture_libsmbclient_rename(struct torture_context *tctx) +{ + SMBCCTX *ctx = NULL; + int fhandle = -1; + bool success = false; + const char *filename_src = NULL; + const char *filename_dst = NULL; + int ret; + const char *smburl = torture_setting_string(tctx, "smburl", NULL); + + if (smburl == NULL) { + torture_fail(tctx, + "option --option=torture:smburl=" + "smb://user:password@server/share missing\n"); + } + + torture_assert_goto(tctx, + torture_libsmbclient_init_context(tctx, &ctx), + success, + done, + ""); + + smbc_set_context(ctx); + + filename_src = talloc_asprintf(tctx, + "%s/src", + smburl); + if (filename_src == NULL) { + torture_fail_goto(tctx, done, "talloc fail\n"); + } + + filename_dst = talloc_asprintf(tctx, + "%s/dst", + smburl); + if (filename_dst == NULL) { + torture_fail_goto(tctx, done, "talloc fail\n"); + } + + /* Ensure the files don't exist. */ + smbc_unlink(filename_src); + smbc_unlink(filename_dst); + + /* Create them. */ + fhandle = smbc_creat(filename_src, 0666); + if (fhandle < 0) { + torture_fail_goto(tctx, + done, + talloc_asprintf(tctx, + "failed to create file '%s': %s", + filename_src, + strerror(errno))); + } + ret = smbc_close(fhandle); + torture_assert_int_equal_goto(tctx, + ret, + 0, + success, + done, + talloc_asprintf(tctx, + "failed to close handle for '%s'", + filename_src)); + + fhandle = smbc_creat(filename_dst, 0666); + if (fhandle < 0) { + torture_fail_goto(tctx, + done, + talloc_asprintf(tctx, + "failed to create file '%s': %s", + filename_dst, + strerror(errno))); + } + ret = smbc_close(fhandle); + torture_assert_int_equal_goto(tctx, + ret, + 0, + success, + done, + talloc_asprintf(tctx, + "failed to close handle for '%s'", + filename_dst)); + + ret = smbc_rename(filename_src, filename_dst); + + /* + * BUG: https://bugzilla.samba.org/show_bug.cgi?id=14938 + * gives ret == -1, but errno = 0 for overwrite renames + * over SMB2. + */ + torture_assert_int_equal_goto(tctx, + ret, + 0, + success, + done, + talloc_asprintf(tctx, + "smbc_rename '%s' -> '%s' failed with %s\n", + filename_src, + filename_dst, + strerror(errno))); + + /* Remove them again. */ + smbc_unlink(filename_src); + smbc_unlink(filename_dst); + success = true; + + done: + smbc_free_context(ctx, 1); + return success; +} + NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx) { struct torture_suite *suite; @@ -1326,6 +1435,9 @@ NTSTATUS torture_libsmbclient_init(TALLOC_CTX *ctx) suite, "utimes", torture_libsmbclient_utimes); torture_suite_add_simple_test( suite, "noanon_list", torture_libsmbclient_noanon_list); + torture_suite_add_simple_test(suite, + "rename", + torture_libsmbclient_rename); suite->description = talloc_strdup(suite, "libsmbclient interface tests"); |