summaryrefslogtreecommitdiff
path: root/source4/torture
diff options
context:
space:
mode:
authorRalph Boehme <slow@samba.org>2018-10-28 19:29:26 +0100
committerKarolin Seeger <kseeger@samba.org>2018-11-06 09:10:22 +0100
commit86a115caacd63a70bfa9480481a4770d2da20b22 (patch)
tree89bf9bd642a842091e095eed68e0f2e036c03376 /source4/torture
parent27fb50fd22deaabc70e2951574c532fb827e3c02 (diff)
downloadsamba-86a115caacd63a70bfa9480481a4770d2da20b22.tar.gz
s4:torture/smb2/read: add test for cancelling SMB aio
Bug: https://bugzilla.samba.org/show_bug.cgi?id=13667 Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Volker Lendecke <vl@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> (cherry picked from commit e37ff8c5fe18d400e378bf2591e209b30473d9f9)
Diffstat (limited to 'source4/torture')
-rw-r--r--source4/torture/smb2/read.c116
-rw-r--r--source4/torture/smb2/smb2.c1
2 files changed, 117 insertions, 0 deletions
diff --git a/source4/torture/smb2/read.c b/source4/torture/smb2/read.c
index 4bf3bb74be0..b26bc18ddac 100644
--- a/source4/torture/smb2/read.c
+++ b/source4/torture/smb2/read.c
@@ -22,6 +22,7 @@
#include "includes.h"
#include "libcli/smb2/smb2.h"
#include "libcli/smb2/smb2_calls.h"
+#include <tevent.h>
#include "torture/torture.h"
#include "torture/smb2/proto.h"
@@ -317,3 +318,118 @@ struct torture_suite *torture_smb2_read_init(TALLOC_CTX *ctx)
return suite;
}
+static bool test_aio_cancel(struct torture_context *tctx,
+ struct smb2_tree *tree)
+{
+ struct smb2_handle h;
+ uint8_t buf[64 * 1024];
+ struct smb2_read r;
+ struct smb2_request *req = NULL;
+ int rc;
+ NTSTATUS status;
+ bool ret = true;
+
+ ZERO_STRUCT(buf);
+
+ smb2_util_unlink(tree, FNAME);
+
+ status = torture_smb2_testfile(tree, FNAME, &h);
+ torture_assert_ntstatus_ok_goto(
+ tctx,
+ status,
+ ret,
+ done,
+ "torture_smb2_testfile failed\n");
+
+ status = smb2_util_write(tree, h, buf, 0, ARRAY_SIZE(buf));
+ torture_assert_ntstatus_ok_goto(
+ tctx,
+ status,
+ ret,
+ done,
+ "smb2_util_write failed\n");
+
+ status = smb2_util_close(tree, h);
+ torture_assert_ntstatus_ok_goto(
+ tctx,
+ status,
+ ret,
+ done,
+ "smb2_util_close failed\n");
+
+ status = torture_smb2_testfile_access(
+ tree, FNAME, &h, SEC_RIGHTS_FILE_ALL);
+ torture_assert_ntstatus_ok_goto(
+ tctx,
+ status,
+ ret,
+ done,
+ "torture_smb2_testfile_access failed\n");
+
+ r = (struct smb2_read) {
+ .in.file.handle = h,
+ .in.length = 1,
+ .in.offset = 0,
+ .in.min_count = 1,
+ };
+
+ req = smb2_read_send(tree, &r);
+ torture_assert_goto(
+ tctx,
+ req != NULL,
+ ret,
+ done,
+ "smb2_read_send failed\n");
+
+ while (!req->cancel.can_cancel) {
+ rc = tevent_loop_once(tctx->ev);
+ torture_assert_goto(
+ tctx,
+ rc == 0,
+ ret,
+ done,
+ "tevent_loop_once failed\n");
+ }
+
+ status = smb2_cancel(req);
+ torture_assert_ntstatus_ok_goto(
+ tctx,
+ status,
+ ret,
+ done,
+ "smb2_cancel failed\n");
+
+ status = smb2_read_recv(req, tree, &r);
+ torture_assert_ntstatus_ok_goto(
+ tctx,
+ status,
+ ret,
+ done,
+ "smb2_read_recv failed\n");
+
+ status = smb2_util_close(tree, h);
+ torture_assert_ntstatus_ok_goto(
+ tctx,
+ status,
+ ret,
+ done,
+ "smb2_util_close failed\n");
+
+done:
+ smb2_util_unlink(tree, FNAME);
+ return ret;
+}
+
+/*
+ * aio testing against share with VFS module "delay_inject"
+ */
+struct torture_suite *torture_smb2_aio_delay_init(TALLOC_CTX *ctx)
+{
+ struct torture_suite *suite = torture_suite_create(ctx, "aio_delay");
+
+ torture_suite_add_1smb2_test(suite, "aio_cancel", test_aio_cancel);
+
+ suite->description = talloc_strdup(suite, "SMB2 delayed aio tests");
+
+ return suite;
+}
diff --git a/source4/torture/smb2/smb2.c b/source4/torture/smb2/smb2.c
index 12f7edf8f86..6f9884e3c27 100644
--- a/source4/torture/smb2/smb2.c
+++ b/source4/torture/smb2/smb2.c
@@ -152,6 +152,7 @@ NTSTATUS torture_smb2_init(TALLOC_CTX *ctx)
torture_suite_add_simple_test(suite, "setinfo", torture_smb2_setinfo);
torture_suite_add_suite(suite, torture_smb2_lock_init(suite));
torture_suite_add_suite(suite, torture_smb2_read_init(suite));
+ torture_suite_add_suite(suite, torture_smb2_aio_delay_init(suite));
torture_suite_add_suite(suite, torture_smb2_create_init(suite));
torture_suite_add_suite(suite, torture_smb2_acls_init(suite));
torture_suite_add_suite(suite, torture_smb2_notify_init(suite));