From 1d97e7b9d8a8e716cd50bb42065687a65d542b2d Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 5 Nov 2004 02:22:07 +0000 Subject: r3540: added testing of SMBntcancel in the open/open/close mux testing. Interestingly, w2k3 does not allow the cancel of an outstanding async open request, whereas it does allow the cancel of an outstanding async lock request. To support this I have changed the pvfs_wait interface to provide a enum on why the event is happening, so the callback can decide what to do. (This used to be commit f23d6a28008a13588cde24b5012ec21e488ac47a) --- source4/torture/raw/mux.c | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) (limited to 'source4/torture') diff --git a/source4/torture/raw/mux.c b/source4/torture/raw/mux.c index 6f9426490e..39eb5c1d5e 100644 --- a/source4/torture/raw/mux.c +++ b/source4/torture/raw/mux.c @@ -41,15 +41,13 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) NTSTATUS status; int fnum1, fnum2; BOOL ret = True; - struct smbcli_request *req; + struct smbcli_request *req1, *req2; struct timeval tv; double d; printf("testing multiplexed open/open/close\n"); - /* - file open with no share access - */ + printf("send first open\n"); io.generic.level = RAW_OPEN_NTCREATEX; io.ntcreatex.in.root_fid = 0; io.ntcreatex.in.flags = 0; @@ -66,7 +64,7 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) CHECK_STATUS(status, NT_STATUS_OK); fnum1 = io.ntcreatex.out.fnum; - /* and a 2nd open, this will not conflict */ + printf("send 2nd open, non-conflicting\n"); io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN; status = smb_raw_open(cli->tree, mem_ctx, &io); CHECK_STATUS(status, NT_STATUS_OK); @@ -74,7 +72,7 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) tv = timeval_current(); - /* send an open that will conflict */ + printf("send 3rd open, conflicting\n"); io.ntcreatex.in.share_access = 0; status = smb_raw_open(cli->tree, mem_ctx, &io); CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION); @@ -87,20 +85,31 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) printf("open delay %.2f\n", d); } - /* - same request, but async - */ + printf("send async open, conflicting\n"); + tv = timeval_current(); + req1 = smb_raw_open_send(cli->tree, &io); + + printf("send 2nd async open, conflicting\n"); tv = timeval_current(); - req = smb_raw_open_send(cli->tree, &io); + req2 = smb_raw_open_send(cli->tree, &io); - /* and close the first file */ + printf("close first sync open\n"); smbcli_close(cli->tree, fnum1); - /* then the 2nd file */ + printf("cancel 2nd async open (should be ignored)\n"); + smb_raw_ntcancel(req2); + + d = timeval_elapsed(&tv); + if (d > 0.25) { + printf("bad timeout after cancel - %.2f should be <0.25\n", d); + ret = False; + } + + printf("close the 2nd sync open\n"); smbcli_close(cli->tree, fnum2); - /* see if the async open succeeded */ - status = smb_raw_open_recv(req, mem_ctx, &io); + printf("see if the 1st async open now succeeded\n"); + status = smb_raw_open_recv(req1, mem_ctx, &io); CHECK_STATUS(status, NT_STATUS_OK); d = timeval_elapsed(&tv); @@ -111,6 +120,16 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx) printf("async open delay %.2f\n", d); } + printf("2nd async open should have timed out\n"); + status = smb_raw_open_recv(req2, mem_ctx, &io); + CHECK_STATUS(status, NT_STATUS_SHARING_VIOLATION); + d = timeval_elapsed(&tv); + if (d < 0.8) { + printf("bad timeout for async conflict - %.2f should be 1.0\n", d); + ret = False; + } + + printf("close the 1st async open\n"); smbcli_close(cli->tree, io.ntcreatex.out.fnum); done: -- cgit