From cb1cff90f165d82cbbf1dd87e475a1b13984d45e Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 30 Oct 2004 04:59:52 +0000 Subject: r3386: - fixed --seed option in smbtorture - added new tests BASE-NTDENY1 and BASE-NTDENY2. These are the ntcreatex equivalents of the BASE-DENY1 and BASE-DENY2 tests. Unfortunately, with ntcreatex there are 4 million combination and trying each one takes 1 second, so randomised testing is the only choice. The BASE-DENY1 test can operate in parallel with hundreds of connections, speeding things up a bit (as most time is spent waiting 1 second for a sharing violation to come back) (This used to be commit b95493d3d16581b8dd8f4727cd10631c18e16748) --- source4/torture/basic/denytest.c | 273 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 272 insertions(+), 1 deletion(-) (limited to 'source4/torture/basic/denytest.c') diff --git a/source4/torture/basic/denytest.c b/source4/torture/basic/denytest.c index 6dd38e8e79..32f44044cc 100644 --- a/source4/torture/basic/denytest.c +++ b/source4/torture/basic/denytest.c @@ -1398,7 +1398,6 @@ static const struct { static void progress_bar(uint_t i, uint_t total) { - if (i % 10 != 0) return; printf("%5d/%5d\r", i, total); fflush(stdout); } @@ -1651,3 +1650,275 @@ BOOL torture_denytest3(void) return True; } +struct bit_value { + uint32_t value; + const char *name; +}; + +static uint32_t map_bits(const struct bit_value *bv, int b, int nbits) +{ + int i; + uint32_t ret = 0; + for (i=0;itree, fname); + fnum1 = smbcli_open(cli1->tree, fname, O_RDWR|O_CREAT, DENY_NONE); + smbcli_write(cli1->tree, fnum1, 0, fname, 0, strlen(fname)); + smbcli_close(cli1->tree, fnum1); + + GetTimeOfDay(&tv_start); + + io1.ntcreatex.level = RAW_OPEN_NTCREATEX; + io1.ntcreatex.in.root_fid = 0; + io1.ntcreatex.in.flags = 0; + io1.ntcreatex.in.create_options = 0; + io1.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; + io1.ntcreatex.in.alloc_size = 0; + io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN; + io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; + io1.ntcreatex.in.security_flags = 0; + io1.ntcreatex.in.fname = fname; + io2 = io1; + + printf("testing %d entries on %s\n", torture_numops, fname); + + for (i=0;itree, mem_ctx, &io1); + status2 = smb_raw_open(cli2->tree, mem_ctx, &io2); + + if (!NT_STATUS_IS_OK(status1)) { + res = A_X; + } else if (!NT_STATUS_IS_OK(status2)) { + res = A_0; + } else { + char x = 1; + res = A_0; + if (smbcli_read(cli2->tree, + io2.ntcreatex.out.fnum, (void *)&x, 0, 1) == 1) { + res += A_R; + } + if (smbcli_write(cli2->tree, + io2.ntcreatex.out.fnum, 0, (void *)&x, 0, 1) == 1) { + res += A_W; + } + } + + if (NT_STATUS_IS_OK(status1)) { + smbcli_close(cli1->tree, io1.ntcreatex.out.fnum); + } + if (NT_STATUS_IS_OK(status2)) { + smbcli_close(cli2->tree, io2.ntcreatex.out.fnum); + } + + status2_p = predict_share_conflict(io1.ntcreatex.in.share_access, + io1.ntcreatex.in.access_mask, + io2.ntcreatex.in.share_access, + io2.ntcreatex.in.access_mask, &res2); + + GetTimeOfDay(&tv); + tdif = usec_time_diff(&tv, &tv_start); + tdif /= 1000; + if (torture_showall || + !NT_STATUS_EQUAL(status2, status2_p) || + res != res2) { + printf("\n%-20s %-70s\n%-20s %-70s %4s %4s %s/%s\n", + bit_string(mem_ctx, share_access_bits, b_sa1, nbits1), + bit_string(mem_ctx, access_mask_bits, b_am1, nbits2), + bit_string(mem_ctx, share_access_bits, b_sa2, nbits1), + bit_string(mem_ctx, access_mask_bits, b_am2, nbits2), + resultstr(res), + resultstr(res2), + nt_errstr(status2), + nt_errstr(status2_p)); + fflush(stdout); + } + + if (res != res2 || + !NT_STATUS_EQUAL(status2, status2_p)) { + CHECK_MAX_FAILURES(failed); + correct = False; + } + + talloc_free(mem_ctx); + } + +failed: + smbcli_unlink(cli1->tree, fname); + + printf("finshed ntdenytest (%d failures)\n", failures); + return correct; +} + + + +/* + a denytest for ntcreatex + */ +BOOL torture_ntdenytest1(struct smbcli_state *cli, int client) +{ + extern int torture_seed; + + srandom(torture_seed + client); + + printf("starting ntdenytest1 client %d\n", client); + + return torture_ntdenytest(cli, cli, client); +} + +/* + a denytest for ntcreatex + */ +BOOL torture_ntdenytest2(void) +{ + struct smbcli_state *cli1, *cli2; + BOOL ret; + + if (!torture_open_connection(&cli1)) { + return False; + } + + if (!torture_open_connection(&cli2)) { + return False; + } + + printf("starting ntdenytest2\n"); + + ret = torture_ntdenytest(cli1, cli2, 0); + + torture_close_connection(cli1); + torture_close_connection(cli2); + + return ret; +} -- cgit