RAW-OPLOCK: add BATCH19 test renaming via setpathinfo
authorStefan Metzmacher <metze@samba.org>
Wed, 27 Feb 2008 14:43:04 +0000 (15:43 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 27 Feb 2008 15:33:30 +0000 (16:33 +0100)
This is really strange as, it seems to complete ignore
oplocks and share modes and doesn't match the behavior
of RENAME and NTRENAME.

metze
(This used to be commit 7bac95db5edcc7432aea067e0a9ba9230c7dc1b0)

source4/torture/raw/oplock.c

index 6e904c100bed90f5f75527d2f446e6f53e48ce00..344345750aab14ec384e2a793b0ef13796173a64 100644 (file)
                ret = false; \
        }} while (0)
 
+#define CHECK_STRMATCH(v, correct) do { \
+       if (!v || strstr((v),(correct)) == NULL) { \
+               torture_comment(tctx, "(%s): wrong value for %s got '%s' - should be '%s'\n", \
+                               __location__, #v, v?v:"NULL", correct); \
+               ret = false; \
+       } \
+} while (0)
+
 #define CHECK_STATUS(tctx, status, correct) do { \
        if (!NT_STATUS_EQUAL(status, correct)) { \
                torture_result(tctx, TORTURE_FAIL, __location__": Incorrect status %s - should be %s", \
@@ -1946,6 +1954,109 @@ done:
        return ret;
 }
 
+static bool test_raw_oplock_batch19(struct torture_context *tctx, struct smbcli_state *cli1, struct smbcli_state *cli2)
+{
+       const char *fname1 = BASEDIR "\\test_batch19_1.dat";
+       const char *fname2 = BASEDIR "\\test_batch19_2.dat";
+       const char *fname3 = BASEDIR "\\test_batch19_3.dat";
+       NTSTATUS status;
+       bool ret = true;
+       union smb_open io;
+       union smb_fileinfo qfi;
+       union smb_setfileinfo sfi;
+       uint16_t fnum=0;
+
+       if (torture_setting_bool(tctx, "samba3", false)) {
+               torture_skip(tctx, "BACHT19 disabled against samba3\n");
+       }
+
+       if (!torture_setup_dir(cli1, BASEDIR)) {
+               return false;
+       }
+
+       /* cleanup */
+       smbcli_unlink(cli1->tree, fname1);
+       smbcli_unlink(cli1->tree, fname2);
+       smbcli_unlink(cli1->tree, fname3);
+
+       smbcli_oplock_handler(cli1->transport, oplock_handler_ack_to_levelII, cli1->tree);
+
+       /*
+         base ntcreatex parms
+       */
+       io.generic.level = RAW_OPEN_NTCREATEX;
+       io.ntcreatex.in.root_fid = 0;
+       io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL;
+       io.ntcreatex.in.alloc_size = 0;
+       io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL;
+       io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE;
+       io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+       io.ntcreatex.in.create_options = 0;
+       io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS;
+       io.ntcreatex.in.security_flags = 0;
+       io.ntcreatex.in.fname = fname1;
+
+       /* we should use no share mode, when samba3 passes this */
+       torture_comment(tctx, "open a file with an batch oplock (share mode: none)\n");
+       ZERO_STRUCT(break_info);
+       io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED |
+               NTCREATEX_FLAGS_REQUEST_OPLOCK |
+               NTCREATEX_FLAGS_REQUEST_BATCH_OPLOCK;
+       status = smb_raw_open(cli1->tree, tctx, &io);
+       CHECK_STATUS(tctx, status, NT_STATUS_OK);
+       fnum = io.ntcreatex.out.file.fnum;
+       CHECK_VAL(io.ntcreatex.out.oplock_level, BATCH_OPLOCK_RETURN);
+
+       torture_comment(tctx, "setpathinfo rename info should not trigger a break nor a violation\n");
+       ZERO_STRUCT(sfi);
+       sfi.generic.level = RAW_SFILEINFO_RENAME_INFORMATION;
+       sfi.generic.in.file.path = fname1;
+       sfi.rename_information.in.overwrite     = 0;
+       sfi.rename_information.in.root_fid      = 0;
+       sfi.rename_information.in.new_name      = fname2+strlen(BASEDIR)+1;
+
+        status = smb_raw_setpathinfo(cli2->tree, &sfi);
+
+       CHECK_STATUS(tctx, status, NT_STATUS_OK);
+       CHECK_VAL(break_info.count, 0);
+
+       ZERO_STRUCT(qfi);
+       qfi.generic.level = RAW_FILEINFO_ALL_INFORMATION;
+       qfi.generic.in.file.fnum = fnum;
+
+       status = smb_raw_fileinfo(cli1->tree, tctx, &qfi);
+       CHECK_STATUS(tctx, status, NT_STATUS_OK);
+       CHECK_STRMATCH(qfi.all_info.out.fname.s, fname2);
+
+       torture_comment(tctx, "setfileinfo rename info should not trigger a break nor a violation\n");
+       ZERO_STRUCT(sfi);
+       sfi.generic.level = RAW_SFILEINFO_RENAME_INFORMATION;
+       sfi.generic.in.file.fnum = fnum;
+       sfi.rename_information.in.overwrite     = 0;
+       sfi.rename_information.in.root_fid      = 0;
+       sfi.rename_information.in.new_name      = fname3+strlen(BASEDIR)+1;
+
+       status = smb_raw_setfileinfo(cli1->tree, &sfi);
+       CHECK_STATUS(tctx, status, NT_STATUS_OK);
+       CHECK_VAL(break_info.count, 0);
+
+       ZERO_STRUCT(qfi);
+       qfi.generic.level = RAW_FILEINFO_ALL_INFORMATION;
+       qfi.generic.in.file.fnum = fnum;
+
+       status = smb_raw_fileinfo(cli1->tree, tctx, &qfi);
+       CHECK_STATUS(tctx, status, NT_STATUS_OK);
+       CHECK_STRMATCH(qfi.all_info.out.fname.s, fname3);
+
+       smbcli_close(cli1->tree, fnum);
+
+done:
+       smb_raw_exit(cli1->session);
+       smb_raw_exit(cli2->session);
+       smbcli_deltree(cli1->tree, BASEDIR);
+       return ret;
+}
+
 /* 
    basic testing of oplocks
 */
@@ -1977,6 +2088,7 @@ struct torture_suite *torture_raw_oplock(TALLOC_CTX *mem_ctx)
        torture_suite_add_2smb_test(suite, "BATCH16", test_raw_oplock_batch16);
        torture_suite_add_2smb_test(suite, "BATCH17", test_raw_oplock_batch17);
        torture_suite_add_2smb_test(suite, "BATCH18", test_raw_oplock_batch18);
+       torture_suite_add_2smb_test(suite, "BATCH19", test_raw_oplock_batch19);
 
        return suite;
 }