r14173: change smb interface structures to always use
[jelmer/samba4-debian.git] / source / torture / raw / mux.c
index 6f9426490eb8c9ba9cc871071142e37f3370ddf0..6cf3634f11d197d4cf792685be8bf75204942b75 100644 (file)
 */
 
 #include "includes.h"
+#include "torture/torture.h"
+#include "system/filesys.h"
 #include "libcli/raw/libcliraw.h"
+#include "libcli/libcli.h"
 
 #define BASEDIR "\\test_mux"
 
 #define CHECK_STATUS(status, correct) do { \
        if (!NT_STATUS_EQUAL(status, correct)) { \
-               printf("(%d) Incorrect status %s - should be %s\n", \
-                      __LINE__, nt_errstr(status), nt_errstr(correct)); \
+               printf("(%s) Incorrect status %s - should be %s\n", \
+                      __location__, nt_errstr(status), nt_errstr(correct)); \
                ret = False; \
                goto done; \
        }} while (0)
@@ -41,19 +44,17 @@ 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;
-       io.ntcreatex.in.access_mask = SA_RIGHT_FILE_READ_DATA;
+       io.ntcreatex.in.access_mask = SEC_FILE_READ_DATA;
        io.ntcreatex.in.create_options = 0;
        io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
        io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ;
@@ -64,17 +65,17 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        io.ntcreatex.in.fname = BASEDIR "\\open.dat";
        status = smb_raw_open(cli->tree, mem_ctx, &io);
        CHECK_STATUS(status, NT_STATUS_OK);
-       fnum1 = io.ntcreatex.out.fnum;
+       fnum1 = io.ntcreatex.file.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);
-       fnum2 = io.ntcreatex.out.fnum;
+       fnum2 = io.ntcreatex.file.fnum;
 
        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);
@@ -82,25 +83,35 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        d = timeval_elapsed(&tv);
        if (d < 0.5 || d > 1.5) {
                printf("bad timeout for conflict - %.2f should be 1.0\n", d);
-               ret = False;
        } else {
                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,7 +122,16 @@ static BOOL test_mux_open(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
                printf("async open delay %.2f\n", d);
        }
 
-       smbcli_close(cli->tree, io.ntcreatex.out.fnum);
+       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);
+       }
+
+       printf("close the 1st async open\n");
+       smbcli_close(cli->tree, io.ntcreatex.file.fnum);
 
 done:
        return ret;
@@ -151,7 +171,7 @@ static BOOL test_mux_write(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
 
        /* send an async write */
        io.generic.level = RAW_WRITE_WRITEX;
-       io.writex.in.fnum = fnum;
+       io.writex.file.fnum = fnum;
        io.writex.in.offset = 0;
        io.writex.in.wmode = 0;
        io.writex.in.remaining = 0;
@@ -197,7 +217,7 @@ static BOOL test_mux_lock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
 
        printf("establishing a lock\n");
        io.lockx.level = RAW_LOCK_LOCKX;
-       io.lockx.in.fnum = fnum;
+       io.lockx.file.fnum = fnum;
        io.lockx.in.mode = 0;
        io.lockx.in.timeout = 0;
        io.lockx.in.lock_cnt = 1;
@@ -238,7 +258,7 @@ static BOOL test_mux_lock(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
        printf("Now trying with a cancel\n");
 
        io.lockx.level = RAW_LOCK_LOCKX;
-       io.lockx.in.fnum = fnum;
+       io.lockx.file.fnum = fnum;
        io.lockx.in.mode = 0;
        io.lockx.in.timeout = 0;
        io.lockx.in.lock_cnt = 1;
@@ -298,18 +318,8 @@ BOOL torture_raw_mux(void)
 
        mem_ctx = talloc_init("torture_raw_mux");
 
-       /* cleanup */
-       if (smbcli_deltree(cli->tree, BASEDIR) == -1) {
-               printf("Failed to cleanup " BASEDIR "\n");
-               ret = False;
-               goto done;
-       }
-
-
-       if (NT_STATUS_IS_ERR(smbcli_mkdir(cli->tree, BASEDIR))) {
-               printf("Failed to create %s\n", BASEDIR);
-               ret = False;
-               goto done;
+       if (!torture_setup_dir(cli, BASEDIR)) {
+               return False;
        }
 
        if (!test_mux_open(cli, mem_ctx)) {
@@ -324,10 +334,9 @@ BOOL torture_raw_mux(void)
                ret = False;
        }
 
-done:
        smb_raw_exit(cli->session);
        smbcli_deltree(cli->tree, BASEDIR);
        torture_close_connection(cli);
-       talloc_destroy(mem_ctx);
+       talloc_free(mem_ctx);
        return ret;
 }