r4164: added a test that simulates a OS/2 file delete. This includes seek by
authorAndrew Tridgell <tridge@samba.org>
Sun, 12 Dec 2004 11:29:35 +0000 (11:29 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:07:21 +0000 (13:07 -0500)
name back into a directory for files that no longer exist.

source/torture/raw/search.c

index bca41e23f55e44ed8f4bc38cb12d8b32a4d99b9a..f159c4e15455d1402666442a54500a8f12d12627 100644 (file)
@@ -1068,6 +1068,110 @@ done:
        return ret;
 }
 
+
+/* 
+   testing of OS/2 style delete
+*/
+static BOOL test_os2_delete(struct smbcli_state *cli, TALLOC_CTX *mem_ctx)
+{
+       const int num_files = 700;
+       const int delete_count = 4;
+       int total_deleted = 0;
+       int i, fnum;
+       char *fname;
+       BOOL ret = True;
+       NTSTATUS status;
+       union smb_search_first io;
+       union smb_search_next io2;
+       struct multiple_result result;
+
+       if (!torture_setup_dir(cli, BASEDIR)) {
+               return False;
+       }
+
+       printf("Testing OS/2 style delete on %d files\n", num_files);
+
+       for (i=0;i<num_files;i++) {
+               asprintf(&fname, BASEDIR "\\file%u.txt", i);
+               fnum = smbcli_open(cli->tree, fname, O_CREAT|O_RDWR, DENY_NONE);
+               if (fnum == -1) {
+                       printf("Failed to create %s - %s\n", fname, smbcli_errstr(cli->tree));
+                       ret = False;
+                       goto done;
+               }
+               free(fname);
+               smbcli_close(cli->tree, fnum);
+       }
+
+
+       ZERO_STRUCT(result);
+       result.mem_ctx = mem_ctx;
+
+       io.t2ffirst.level = RAW_SEARCH_EA_SIZE;
+       io.t2ffirst.in.search_attrib = 0;
+       io.t2ffirst.in.max_count = 100;
+       io.t2ffirst.in.flags = FLAG_TRANS2_FIND_REQUIRE_RESUME;
+       io.t2ffirst.in.storage_type = 0;
+       io.t2ffirst.in.pattern = BASEDIR "\\*";
+
+       status = smb_raw_search_first(cli->tree, mem_ctx,
+                                     &io, &result, multiple_search_callback);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       for (i=0;i<MIN(result.count, delete_count);i++) {
+               asprintf(&fname, BASEDIR "\\%s", result.list[i].ea_size.name.s);
+               status = smbcli_unlink(cli->tree, fname);
+               CHECK_STATUS(status, NT_STATUS_OK);
+               total_deleted++;
+       }
+
+       io2.t2fnext.level = RAW_SEARCH_EA_SIZE;
+       io2.t2fnext.in.handle = io.t2ffirst.out.handle;
+       io2.t2fnext.in.max_count = 100;
+       io2.t2fnext.in.resume_key = result.list[i-1].ea_size.resume_key;
+       io2.t2fnext.in.flags = FLAG_TRANS2_FIND_REQUIRE_RESUME;
+       io2.t2fnext.in.last_name = result.list[i-1].ea_size.name.s;
+
+       do {
+               ZERO_STRUCT(result);
+               result.mem_ctx = mem_ctx;
+
+               status = smb_raw_search_next(cli->tree, mem_ctx,
+                                            &io2, &result, multiple_search_callback);
+               if (!NT_STATUS_IS_OK(status)) {
+                       break;
+               }
+
+               for (i=0;i<MIN(result.count, delete_count);i++) {
+                       asprintf(&fname, BASEDIR "\\%s", result.list[i].ea_size.name.s);
+                       status = smbcli_unlink(cli->tree, fname);
+                       CHECK_STATUS(status, NT_STATUS_OK);
+                       total_deleted++;
+               }
+
+               if (i>0) {
+                       io2.t2fnext.in.resume_key = 0;
+                       io2.t2fnext.in.last_name = result.list[i-1].ea_size.name.s;
+               }
+       } while (NT_STATUS_IS_OK(status) && result.count != 0);
+
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       if (total_deleted != num_files) {
+               printf("error: deleted %d - expected to delete %d\n", 
+                      total_deleted, num_files);
+               ret = False;
+       }
+
+done:
+       smb_raw_exit(cli->session);
+       smbcli_deltree(cli->tree, BASEDIR);
+
+       return ret;
+}
+
+
+
 /* 
    basic testing of all RAW_SEARCH_* calls using a single file
 */
@@ -1088,6 +1192,7 @@ BOOL torture_raw_search(void)
        ret &= test_sorted(cli, mem_ctx);
        ret &= test_modify_search(cli, mem_ctx);
        ret &= test_many_dirs(cli, mem_ctx);
+       ret &= test_os2_delete(cli, mem_ctx);
 
        torture_close_connection(cli);
        talloc_destroy(mem_ctx);