summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2012-04-25 16:26:50 +1000
committerAndrew Bartlett <abartlet@samba.org>2012-04-25 17:43:23 +1000
commite346bba1fc369cc13438cf3882961ef7b11ccc3a (patch)
treeb46e48b57095e76ff9ea614f23c9c2bad2d045cc /source4
parent594e3161810ba5a57ce5a3c88a8cd89b11d04650 (diff)
downloadsamba-e346bba1fc369cc13438cf3882961ef7b11ccc3a.tar.gz
s4-torture: enable raw.composite test again, and convert to new style test
This test has been skipped for some time, but is an important test for parallel operation. Andrew Bartlett
Diffstat (limited to 'source4')
-rw-r--r--source4/libcli/smb_composite/fsinfo.c13
-rw-r--r--source4/libcli/smb_composite/smb_composite.h6
-rw-r--r--source4/torture/raw/composite.c233
-rw-r--r--source4/torture/raw/raw.c2
4 files changed, 140 insertions, 114 deletions
diff --git a/source4/libcli/smb_composite/fsinfo.c b/source4/libcli/smb_composite/fsinfo.c
index 6537ef8c924..242e2cc4456 100644
--- a/source4/libcli/smb_composite/fsinfo.c
+++ b/source4/libcli/smb_composite/fsinfo.c
@@ -127,7 +127,8 @@ static void fsinfo_composite_handler(struct composite_context *creq)
*/
struct composite_context *smb_composite_fsinfo_send(struct smbcli_tree *tree,
struct smb_composite_fsinfo *io,
- struct resolve_context *resolve_ctx)
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *event_ctx)
{
struct composite_context *c;
struct fsinfo_state *state;
@@ -135,12 +136,15 @@ struct composite_context *smb_composite_fsinfo_send(struct smbcli_tree *tree,
c = talloc_zero(tree, struct composite_context);
if (c == NULL) goto failed;
+ c->event_ctx = event_ctx;
+ if (c->event_ctx == NULL) goto failed;
+
state = talloc(c, struct fsinfo_state);
if (state == NULL) goto failed;
state->io = io;
- state->connect = talloc(state, struct smb_composite_connect);
+ state->connect = talloc_zero(state, struct smb_composite_connect);
if (state->connect == NULL) goto failed;
@@ -201,9 +205,10 @@ NTSTATUS smb_composite_fsinfo_recv(struct composite_context *c, TALLOC_CTX *mem_
NTSTATUS smb_composite_fsinfo(struct smbcli_tree *tree,
TALLOC_CTX *mem_ctx,
struct smb_composite_fsinfo *io,
- struct resolve_context *resolve_ctx)
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *ev)
{
- struct composite_context *c = smb_composite_fsinfo_send(tree, io, resolve_ctx);
+ struct composite_context *c = smb_composite_fsinfo_send(tree, io, resolve_ctx, ev);
return smb_composite_fsinfo_recv(c, mem_ctx);
}
diff --git a/source4/libcli/smb_composite/smb_composite.h b/source4/libcli/smb_composite/smb_composite.h
index 54ee1ca8362..a92c9612c6a 100644
--- a/source4/libcli/smb_composite/smb_composite.h
+++ b/source4/libcli/smb_composite/smb_composite.h
@@ -187,12 +187,14 @@ struct smb_composite_fsinfo {
struct composite_context *smb_composite_fsinfo_send(struct smbcli_tree *tree,
struct smb_composite_fsinfo *io,
- struct resolve_context *resolve_ctx);
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *event_ctx);
NTSTATUS smb_composite_fsinfo_recv(struct composite_context *c, TALLOC_CTX *mem_ctx);
NTSTATUS smb_composite_fsinfo(struct smbcli_tree *tree,
TALLOC_CTX *mem_ctx,
struct smb_composite_fsinfo *io,
- struct resolve_context *resolve_ctx);
+ struct resolve_context *resolve_ctx,
+ struct tevent_context *ev);
/*
composite call for appending new acl to the file's security descriptor and get
diff --git a/source4/torture/raw/composite.c b/source4/torture/raw/composite.c
index 2a28b9d50e7..bb028b8d602 100644
--- a/source4/torture/raw/composite.c
+++ b/source4/torture/raw/composite.c
@@ -45,12 +45,12 @@ static void loadfile_complete(struct composite_context *c)
/*
test a simple savefile/loadfile combination
*/
-static bool test_loadfile(struct smbcli_state *cli, struct torture_context *tctx)
+static bool test_loadfile(struct torture_context *tctx, struct smbcli_state *cli)
{
const char *fname = BASEDIR "\\test.txt";
NTSTATUS status;
struct smb_composite_savefile io1;
- struct smb_composite_loadfile io2;
+ struct smb_composite_loadfile *io2;
struct composite_context **c;
uint8_t *data;
size_t len = random() % 100000;
@@ -58,6 +58,10 @@ static bool test_loadfile(struct smbcli_state *cli, struct torture_context *tctx
int i;
int *count = talloc_zero(tctx, int);
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return false;
+ }
+
data = talloc_array(tctx, uint8_t, len);
generate_random_buffer(data, len);
@@ -66,53 +70,39 @@ static bool test_loadfile(struct smbcli_state *cli, struct torture_context *tctx
io1.in.data = data;
io1.in.size = len;
- printf("Testing savefile\n");
+ torture_comment(tctx, "Testing savefile\n");
status = smb_composite_savefile(cli->tree, &io1);
- if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) savefile failed: %s\n", __location__,nt_errstr(status));
- return false;
- }
-
- io2.in.fname = fname;
+ torture_assert_ntstatus_equal(tctx, status, NT_STATUS_OK, "savefile failed");
- printf("Testing parallel loadfile with %d ops\n", num_ops);
+ torture_comment(tctx, "Testing parallel loadfile with %d ops\n", num_ops);
c = talloc_array(tctx, struct composite_context *, num_ops);
+ io2 = talloc_zero_array(tctx, struct smb_composite_loadfile, num_ops);
for (i=0;i<num_ops;i++) {
- c[i] = smb_composite_loadfile_send(cli->tree, &io2);
+ io2[i].in.fname = fname;
+ c[i] = smb_composite_loadfile_send(cli->tree, &io2[i]);
c[i]->async.fn = loadfile_complete;
c[i]->async.private_data = count;
}
- printf("waiting for completion\n");
+ torture_comment(tctx, "waiting for completion\n");
while (*count != num_ops) {
tevent_loop_once(tctx->ev);
if (torture_setting_bool(tctx, "progress", true)) {
- printf("(%s) count=%d\r", __location__, *count);
+ torture_comment(tctx, "(%s) count=%d\r", __location__, *count);
fflush(stdout);
}
}
- printf("count=%d\n", *count);
+ torture_comment(tctx, "count=%d\n", *count);
for (i=0;i<num_ops;i++) {
status = smb_composite_loadfile_recv(c[i], tctx);
- if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) loadfile[%d] failed - %s\n", __location__, i, nt_errstr(status));
- return false;
- }
+ torture_assert_ntstatus_equal(tctx, status, NT_STATUS_OK, "loadfile failed");
- if (io2.out.size != len) {
- printf("(%s) wrong length in returned data - %d should be %d\n",__location__,
- io2.out.size, (int)len);
- return false;
- }
-
- if (memcmp(io2.out.data, data, len) != 0) {
- printf("(%s) wrong data in loadfile!\n",__location__);
- return false;
- }
+ torture_assert_int_equal(tctx, io2[i].out.size, len, "wrong length in returned data");
+ torture_assert_mem_equal(tctx, io2[i].out.data, data, len, "wrong data in loadfile");
}
talloc_free(data);
@@ -120,10 +110,24 @@ static bool test_loadfile(struct smbcli_state *cli, struct torture_context *tctx
return true;
}
+static bool test_loadfile_t(struct torture_context *tctx, struct smbcli_state *cli)
+{
+ int ret;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return false;
+ }
+
+ ret = test_loadfile(tctx, cli);
+ smb_raw_exit(cli->session);
+ smbcli_deltree(cli->tree, BASEDIR);
+
+ return ret;
+}
+
/*
test a simple savefile/loadfile combination
*/
-static bool test_fetchfile(struct smbcli_state *cli, struct torture_context *tctx)
+static bool test_fetchfile(struct torture_context *tctx, struct smbcli_state *cli)
{
const char *fname = BASEDIR "\\test.txt";
NTSTATUS status;
@@ -138,37 +142,42 @@ static bool test_fetchfile(struct smbcli_state *cli, struct torture_context *tct
int *count = talloc_zero(tctx, int);
bool ret = true;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return false;
+ }
+
data = talloc_array(tctx, uint8_t, len);
generate_random_buffer(data, len);
+ ZERO_STRUCT(io1);
io1.in.fname = fname;
io1.in.data = data;
io1.in.size = len;
- printf("Testing savefile\n");
+ torture_comment(tctx, "Testing savefile\n");
status = smb_composite_savefile(cli->tree, &io1);
- if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) savefile failed: %s\n",__location__, nt_errstr(status));
- return false;
- }
+ torture_assert_ntstatus_equal(tctx, status, NT_STATUS_OK, "savefile failed");
+
+ ZERO_STRUCT(io2);
io2.in.dest_host = torture_setting_string(tctx, "host", NULL);
io2.in.ports = lpcfg_smb_ports(tctx->lp_ctx);
io2.in.called_name = torture_setting_string(tctx, "host", NULL);
io2.in.service = torture_setting_string(tctx, "share", NULL);
io2.in.service_type = "A:";
+ io2.in.socket_options = lpcfg_socket_options(tctx->lp_ctx);
io2.in.credentials = cmdline_credentials;
io2.in.workgroup = lpcfg_workgroup(tctx->lp_ctx);
io2.in.filename = fname;
- io2.in.resolve_ctx = lpcfg_resolve_context(tctx->lp_ctx);
- io2.in.gensec_settings = lpcfg_gensec_settings(tctx, tctx->lp_ctx);
lpcfg_smbcli_options(tctx->lp_ctx, &io2.in.options);
lpcfg_smbcli_session_options(tctx->lp_ctx, &io2.in.session_options);
+ io2.in.resolve_ctx = lpcfg_resolve_context(tctx->lp_ctx);
+ io2.in.gensec_settings = lpcfg_gensec_settings(tctx, tctx->lp_ctx);
- printf("Testing parallel fetchfile with %d ops\n", torture_numops);
+ torture_comment(tctx, "Testing parallel fetchfile with %d ops\n", torture_numops);
event_ctx = tctx->ev;
c = talloc_array(tctx, struct composite_context *, torture_numops);
@@ -179,48 +188,46 @@ static bool test_fetchfile(struct smbcli_state *cli, struct torture_context *tct
c[i]->async.private_data = count;
}
- printf("waiting for completion\n");
+ torture_comment(tctx, "waiting for completion\n");
while (*count != torture_numops) {
tevent_loop_once(event_ctx);
if (torture_setting_bool(tctx, "progress", true)) {
- printf("(%s) count=%d\r", __location__, *count);
+ torture_comment(tctx, "(%s) count=%d\r", __location__, *count);
fflush(stdout);
}
}
- printf("count=%d\n", *count);
+ torture_comment(tctx, "count=%d\n", *count);
for (i=0;i<torture_numops;i++) {
status = smb_composite_fetchfile_recv(c[i], tctx);
- if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) loadfile[%d] failed - %s\n", __location__, i,
- nt_errstr(status));
- ret = false;
- continue;
- }
+ torture_assert_ntstatus_equal(tctx, status, NT_STATUS_OK, "loadfile failed");
- if (io2.out.size != len) {
- printf("(%s) wrong length in returned data - %d "
- "should be %d\n", __location__,
- io2.out.size, (int)len);
- ret = false;
- continue;
- }
-
- if (memcmp(io2.out.data, data, len) != 0) {
- printf("(%s) wrong data in loadfile!\n", __location__);
- ret = false;
- continue;
- }
+ torture_assert_int_equal(tctx, io2.out.size, len, "wrong length in returned data");
+ torture_assert_mem_equal(tctx, io2.out.data, data, len, "wrong data in loadfile");
+ }
+
+ return ret;
+}
+
+static bool test_fetchfile_t(struct torture_context *tctx, struct smbcli_state *cli)
+{
+ int ret;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return false;
}
+ ret = test_fetchfile(tctx, cli);
+ smb_raw_exit(cli->session);
+ smbcli_deltree(cli->tree, BASEDIR);
+
return ret;
}
/*
test setfileacl
*/
-static bool test_appendacl(struct smbcli_state *cli, struct torture_context *tctx)
+static bool test_appendacl(struct torture_context *tctx, struct smbcli_state *cli)
{
struct smb_composite_appendacl **io;
struct smb_composite_appendacl **io_orig;
@@ -238,6 +245,10 @@ static bool test_appendacl(struct smbcli_state *cli, struct torture_context *tct
NTSTATUS status;
int i;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return false;
+ }
+
io_orig = talloc_array(tctx, struct smb_composite_appendacl *, num_ops);
printf ("creating %d empty files and getting their acls with appendacl\n", num_ops);
@@ -249,7 +260,7 @@ static bool test_appendacl(struct smbcli_state *cli, struct torture_context *tct
status = smb_composite_savefile(cli->tree, &io1);
if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) savefile failed: %s\n", __location__, nt_errstr(status));
+ torture_comment(tctx, "(%s) savefile failed: %s\n", __location__, nt_errstr(status));
return false;
}
@@ -258,7 +269,7 @@ static bool test_appendacl(struct smbcli_state *cli, struct torture_context *tct
io_orig[i]->in.sd = security_descriptor_initialise(io_orig[i]);
status = smb_composite_appendacl(cli->tree, io_orig[i], io_orig[i]);
if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) appendacl failed: %s\n", __location__, nt_errstr(status));
+ torture_comment(tctx, "(%s) appendacl failed: %s\n", __location__, nt_errstr(status));
return false;
}
}
@@ -278,13 +289,13 @@ static bool test_appendacl(struct smbcli_state *cli, struct torture_context *tct
status = security_descriptor_dacl_add(test_sd, ace);
if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) appendacl failed: %s\n", __location__, nt_errstr(status));
+ torture_comment(tctx, "(%s) appendacl failed: %s\n", __location__, nt_errstr(status));
return false;
}
/* set parameters for appendacl async call */
- printf("Testing parallel appendacl with %d ops\n", num_ops);
+ torture_comment(tctx, "Testing parallel appendacl with %d ops\n", num_ops);
c = talloc_array(tctx, struct composite_context *, num_ops);
io = talloc_array(tctx, struct smb_composite_appendacl *, num_ops);
@@ -300,28 +311,28 @@ static bool test_appendacl(struct smbcli_state *cli, struct torture_context *tct
}
event_ctx = tctx->ev;
- printf("waiting for completion\n");
+ torture_comment(tctx, "waiting for completion\n");
while (*count != num_ops) {
tevent_loop_once(event_ctx);
if (torture_setting_bool(tctx, "progress", true)) {
- printf("(%s) count=%d\r", __location__, *count);
+ torture_comment(tctx, "(%s) count=%d\r", __location__, *count);
fflush(stdout);
}
}
- printf("count=%d\n", *count);
+ torture_comment(tctx, "count=%d\n", *count);
for (i=0; i < num_ops; i++) {
status = smb_composite_appendacl_recv(c[i], io[i]);
if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) appendacl[%d] failed - %s\n", __location__, i, nt_errstr(status));
+ torture_comment(tctx, "(%s) appendacl[%d] failed - %s\n", __location__, i, nt_errstr(status));
return false;
}
security_descriptor_dacl_add(io_orig[i]->out.sd, ace);
- if (!security_acl_equal(io_orig[i]->out.sd->dacl, io[i]->out.sd->dacl)) {
- printf("(%s) appendacl[%d] failed - needed acl isn't set\n", __location__, i);
- return false;
- }
+ torture_assert(tctx,
+ security_acl_equal(io_orig[i]->out.sd->dacl,
+ io[i]->out.sd->dacl),
+ "appendacl failed - needed acl isn't set");
}
@@ -332,8 +343,22 @@ static bool test_appendacl(struct smbcli_state *cli, struct torture_context *tct
return true;
}
+static bool test_appendacl_t(struct torture_context *tctx, struct smbcli_state *cli)
+{
+ int ret;
+ if (!torture_setup_dir(cli, BASEDIR)) {
+ return false;
+ }
+
+ ret = test_appendacl(tctx, cli);
+ smb_raw_exit(cli->session);
+ smbcli_deltree(cli->tree, BASEDIR);
+
+ return ret;
+}
+
/* test a query FS info by asking for share's GUID */
-static bool test_fsinfo(struct smbcli_state *cli, struct torture_context *tctx)
+static bool test_fsinfo(struct torture_context *tctx, struct smbcli_state *cli)
{
char *guid = NULL;
NTSTATUS status;
@@ -357,74 +382,68 @@ static bool test_fsinfo(struct smbcli_state *cli, struct torture_context *tctx)
io1.in.level = RAW_QFS_OBJECTID_INFORMATION;
io1.in.gensec_settings = lpcfg_gensec_settings(tctx, tctx->lp_ctx);
- printf("Testing parallel queryfsinfo [Object ID] with %d ops\n",
- torture_numops);
+ torture_comment(tctx, "Testing parallel queryfsinfo [Object ID] with %d ops\n",
+ torture_numops);
event_ctx = tctx->ev;
c = talloc_array(tctx, struct composite_context *, torture_numops);
for (i=0; i<torture_numops; i++) {
- c[i] = smb_composite_fsinfo_send(cli->tree, &io1, lpcfg_resolve_context(tctx->lp_ctx));
+ c[i] = smb_composite_fsinfo_send(cli->tree, &io1, lpcfg_resolve_context(tctx->lp_ctx), event_ctx);
+ torture_assert(tctx, c[i], "smb_composite_fsinfo_send failed!");
c[i]->async.fn = loadfile_complete;
c[i]->async.private_data = count;
}
- printf("waiting for completion\n");
+ torture_comment(tctx, "waiting for completion\n");
while (*count < torture_numops) {
tevent_loop_once(event_ctx);
if (torture_setting_bool(tctx, "progress", true)) {
- printf("(%s) count=%d\r", __location__, *count);
+ torture_comment(tctx, "(%s) count=%d\r", __location__, *count);
fflush(stdout);
}
}
- printf("count=%d\n", *count);
+ torture_comment(tctx, "count=%d\n", *count);
for (i=0;i<torture_numops;i++) {
status = smb_composite_fsinfo_recv(c[i], tctx);
- if (!NT_STATUS_IS_OK(status)) {
- printf("(%s) fsinfo[%d] failed - %s\n", __location__, i, nt_errstr(status));
- ret = false;
- continue;
- }
+ torture_assert_ntstatus_equal(tctx, status, NT_STATUS_OK, "smb_composite_fsinfo_recv failed");
- if (io1.out.fsinfo->generic.level != RAW_QFS_OBJECTID_INFORMATION) {
- printf("(%s) wrong level in returned info - %d "
- "should be %d\n", __location__,
- io1.out.fsinfo->generic.level, RAW_QFS_OBJECTID_INFORMATION);
- ret = false;
- continue;
- }
+ torture_assert_int_equal(tctx, io1.out.fsinfo->generic.level, RAW_QFS_OBJECTID_INFORMATION, "wrong level in returned info");
guid=GUID_string(tctx, &io1.out.fsinfo->objectid_information.out.guid);
- printf("[%d] GUID: %s\n", i, guid);
-
-
+ torture_comment(tctx, "[%d] GUID: %s\n", i, guid);
}
return ret;
}
-
-/*
- basic testing of libcli composite calls
-*/
-bool torture_raw_composite(struct torture_context *tctx,
- struct smbcli_state *cli)
+static bool test_fsinfo_t(struct torture_context *tctx, struct smbcli_state *cli)
{
- bool ret = true;
-
+ int ret;
if (!torture_setup_dir(cli, BASEDIR)) {
return false;
}
- ret &= test_fetchfile(cli, tctx);
- ret &= test_loadfile(cli, tctx);
- ret &= test_appendacl(cli, tctx);
- ret &= test_fsinfo(cli, tctx);
-
+ ret = test_fsinfo(tctx, cli);
smb_raw_exit(cli->session);
smbcli_deltree(cli->tree, BASEDIR);
return ret;
}
+
+/*
+ basic testing of all RAW_SEARCH_* calls using a single file
+*/
+struct torture_suite *torture_raw_composite(TALLOC_CTX *mem_ctx)
+{
+ struct torture_suite *suite = torture_suite_create(mem_ctx, "composite");
+
+ torture_suite_add_1smb_test(suite, "fetchfile", test_fetchfile_t);
+ torture_suite_add_1smb_test(suite, "loadfile", test_loadfile_t);
+ torture_suite_add_1smb_test(suite, "appendacl", test_appendacl_t);
+ torture_suite_add_1smb_test(suite, "fsinfo", test_fsinfo_t);
+
+ return suite;
+}
diff --git a/source4/torture/raw/raw.c b/source4/torture/raw/raw.c
index 39698dc15ea..d75488bfa04 100644
--- a/source4/torture/raw/raw.c
+++ b/source4/torture/raw/raw.c
@@ -61,7 +61,7 @@ NTSTATUS torture_raw_init(void)
torture_suite_add_1smb_test(suite, "eas", torture_raw_eas);
torture_suite_add_suite(suite, torture_raw_streams(suite));
torture_suite_add_suite(suite, torture_raw_acls(suite));
- torture_suite_add_1smb_test(suite, "composite", torture_raw_composite);
+ torture_suite_add_suite(suite, torture_raw_composite(suite));
torture_suite_add_simple_test(suite, "samba3hide", torture_samba3_hide);
torture_suite_add_simple_test(suite, "samba3closeerr", torture_samba3_closeerr);
torture_suite_add_simple_test(suite, "samba3rootdirfid",