mirror of
https://github.com/samba-team/samba.git
synced 2025-03-09 08:58:35 +03:00
selftest: add a durable handle test with delayed disconnect
Bug: https://bugzilla.samba.org/show_bug.cgi?id=13549 Signed-off-by: Ralph Boehme <slow@samba.org> Reviewed-by: Jeremy Allison <jra@samba.org> (cherry picked from commit 5508024a861e7c85e6c837552ad142aa1d5e8eca)
This commit is contained in:
parent
99ef099d0d
commit
c77edea016
1
selftest/knownfail.d/samba3.blackbox
Normal file
1
selftest/knownfail.d/samba3.blackbox
Normal file
@ -0,0 +1 @@
|
||||
^samba3.blackbox.durable_v2_delay.durable_v2_delay\(simpleserver:local\)
|
@ -2175,6 +2175,14 @@ sub provision($$$$$$$$$)
|
||||
copy = tmp
|
||||
vfs objects = error_inject
|
||||
include = $libdir/error_inject.conf
|
||||
|
||||
[delay_inject]
|
||||
copy = tmp
|
||||
vfs objects = delay_inject
|
||||
kernel share modes = no
|
||||
kernel oplocks = no
|
||||
posix locking = no
|
||||
include = $libdir/delay_inject.conf
|
||||
";
|
||||
close(CONF);
|
||||
|
||||
|
21
source3/script/tests/test_durable_handle_reconnect.sh
Executable file
21
source3/script/tests/test_durable_handle_reconnect.sh
Executable file
@ -0,0 +1,21 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Test Durable Handle reconnect with injected delay in the disconnect.
|
||||
#
|
||||
# Copyright (C) 2018 Ralph Boehme
|
||||
|
||||
. $(dirname $0)/../../../testprogs/blackbox/subunit.sh
|
||||
failed=0
|
||||
|
||||
delay_inject_conf=$(dirname $SMB_CONF_PATH)/delay_inject.conf
|
||||
|
||||
echo 'delay_inject:ntimes = 5000' > $delay_inject_conf
|
||||
|
||||
testit "durable_v2_delay" $VALGRIND \
|
||||
$BINDIR/smbtorture //$SERVER_IP/delay_inject \
|
||||
-U$USERNAME%$PASSWORD smb2.durable-v2-delay ||
|
||||
failed=$(expr $failed + 1)
|
||||
|
||||
rm $delay_inject_conf
|
||||
|
||||
testok $0 $failed
|
@ -464,7 +464,7 @@ for t in tests:
|
||||
elif t == "rpc.samr.passwords.validate":
|
||||
plansmbtorture4testsuite(t, "nt4_dc", 'ncacn_ip_tcp:$SERVER_IP[seal] -U$USERNAME%$PASSWORD', 'over ncacn_ip_tcp ')
|
||||
plansmbtorture4testsuite(t, "ad_dc", 'ncacn_ip_tcp:$SERVER_IP[seal] -U$USERNAME%$PASSWORD', 'over ncacn_ip_tcp ')
|
||||
elif t == "smb2.durable-open" or t == "smb2.durable-v2-open" or t == "smb2.replay":
|
||||
elif t == "smb2.durable-open" or t == "smb2.durable-v2-open" or t == "smb2.replay" or t == "smb2.durable-v2-delay":
|
||||
plansmbtorture4testsuite(t, "nt4_dc", '//$SERVER_IP/durable -U$USERNAME%$PASSWORD')
|
||||
plansmbtorture4testsuite(t, "ad_dc", '//$SERVER_IP/durable -U$USERNAME%$PASSWORD')
|
||||
elif t == "base.rw1":
|
||||
@ -627,6 +627,9 @@ plantestsuite("samba3.blackbox.net_tdb", "simpleserver:local",
|
||||
plantestsuite("samba3.blackbox.smbd_error", "simpleserver:local",
|
||||
[ os.path.join(samba3srcdir, "script/tests/test_smbd_error.sh") ])
|
||||
|
||||
plantestsuite("samba3.blackbox.durable_v2_delay", "simpleserver:local",
|
||||
[os.path.join(samba3srcdir, "script/tests/test_durable_handle_reconnect.sh")])
|
||||
|
||||
plantestsuite("samba3.blackbox.net_cache_samlogon", "ad_member:local",
|
||||
[ os.path.join(samba3srcdir, "script/tests/test_net_cache_samlogon.sh"),
|
||||
'$SERVER', 'tmp', '$DC_USERNAME', '$DC_PASSWORD'])
|
||||
|
@ -315,6 +315,7 @@ smb2_s3only = [
|
||||
"smb2.dosmode",
|
||||
"smb2.credits",
|
||||
"smb2.kernel-oplocks",
|
||||
"smb2.durable-v2-delay",
|
||||
]
|
||||
smb2 = [x for x in smbtorture4_testsuites("smb2.") if x not in smb2_s3only]
|
||||
|
||||
|
@ -2035,3 +2035,98 @@ struct torture_suite *torture_smb2_durable_v2_open_init(TALLOC_CTX *ctx)
|
||||
|
||||
return suite;
|
||||
}
|
||||
|
||||
/**
|
||||
* basic test for doing a durable open
|
||||
* tcp disconnect, reconnect, do a durable reopen (succeeds)
|
||||
*/
|
||||
static bool test_durable_v2_reconnect_delay(struct torture_context *tctx,
|
||||
struct smb2_tree *tree)
|
||||
{
|
||||
NTSTATUS status;
|
||||
TALLOC_CTX *mem_ctx = talloc_new(tctx);
|
||||
char fname[256];
|
||||
struct smb2_handle _h;
|
||||
struct smb2_handle *h = NULL;
|
||||
struct smb2_create io;
|
||||
struct GUID create_guid = GUID_random();
|
||||
struct smbcli_options options;
|
||||
uint64_t previous_session_id;
|
||||
uint8_t b = 0;
|
||||
bool ret = true;
|
||||
|
||||
options = tree->session->transport->options;
|
||||
previous_session_id = smb2cli_session_current_id(tree->session->smbXcli);
|
||||
|
||||
/* Choose a random name in case the state is left a little funky. */
|
||||
snprintf(fname, 256, "durable_v2_reconnect_delay_%s.dat",
|
||||
generate_random_str(tctx, 8));
|
||||
|
||||
smb2_util_unlink(tree, fname);
|
||||
|
||||
smb2_oplock_create_share(&io, fname,
|
||||
smb2_util_share_access(""),
|
||||
smb2_util_oplock_level("b"));
|
||||
io.in.durable_open = false;
|
||||
io.in.durable_open_v2 = true;
|
||||
io.in.persistent_open = false;
|
||||
io.in.create_guid = create_guid;
|
||||
io.in.timeout = 0;
|
||||
|
||||
status = smb2_create(tree, mem_ctx, &io);
|
||||
CHECK_STATUS(status, NT_STATUS_OK);
|
||||
|
||||
_h = io.out.file.handle;
|
||||
h = &_h;
|
||||
CHECK_VAL(io.out.oplock_level, smb2_util_oplock_level("b"));
|
||||
CHECK_VAL(io.out.durable_open_v2, true);
|
||||
|
||||
status = smb2_util_write(tree, *h, &b, 0, 1);
|
||||
CHECK_STATUS(status, NT_STATUS_OK);
|
||||
|
||||
/* disconnect, leaving the durable open */
|
||||
TALLOC_FREE(tree);
|
||||
|
||||
if (!torture_smb2_connection_ext(tctx, previous_session_id,
|
||||
&options, &tree)) {
|
||||
torture_warning(tctx, "couldn't reconnect, bailing\n");
|
||||
ret = false;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ZERO_STRUCT(io);
|
||||
io.in.fname = fname;
|
||||
io.in.durable_open_v2 = false;
|
||||
io.in.durable_handle_v2 = h;
|
||||
io.in.create_guid = create_guid;
|
||||
h = NULL;
|
||||
|
||||
status = smb2_create(tree, mem_ctx, &io);
|
||||
CHECK_STATUS(status, NT_STATUS_OK);
|
||||
CHECK_VAL(io.out.oplock_level, smb2_util_oplock_level("b"));
|
||||
_h = io.out.file.handle;
|
||||
h = &_h;
|
||||
|
||||
done:
|
||||
if (h != NULL) {
|
||||
smb2_util_close(tree, *h);
|
||||
}
|
||||
|
||||
smb2_util_unlink(tree, fname);
|
||||
|
||||
talloc_free(tree);
|
||||
|
||||
talloc_free(mem_ctx);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct torture_suite *torture_smb2_durable_v2_delay_init(TALLOC_CTX *ctx)
|
||||
{
|
||||
struct torture_suite *suite =
|
||||
torture_suite_create(ctx, "durable-v2-delay");
|
||||
|
||||
torture_suite_add_1smb2_test(suite, "durable_v2_reconnect_delay", test_durable_v2_reconnect_delay);
|
||||
|
||||
return suite;
|
||||
}
|
||||
|
@ -163,6 +163,8 @@ NTSTATUS torture_smb2_init(TALLOC_CTX *ctx)
|
||||
torture_smb2_durable_open_disconnect_init(suite));
|
||||
torture_suite_add_suite(suite,
|
||||
torture_smb2_durable_v2_open_init(suite));
|
||||
torture_suite_add_suite(suite,
|
||||
torture_smb2_durable_v2_delay_init(suite));
|
||||
torture_suite_add_suite(suite, torture_smb2_dir_init(suite));
|
||||
torture_suite_add_suite(suite, torture_smb2_lease_init(suite));
|
||||
torture_suite_add_suite(suite, torture_smb2_compound_init(suite));
|
||||
|
Loading…
x
Reference in New Issue
Block a user