[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Thu Apr 22 18:15:56 MDT 2010


The branch, master has been updated
       via  431faed... s4-smbtorture: rework EnumPrinterDrivers tests a bit.
      from  93c86fe... build: give a more useful error when the source dir has moved

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 431faed5f4b2a21d05ca023ae5c56b1c6d741f44
Author: Günther Deschner <gd at samba.org>
Date:   Wed Apr 21 15:08:40 2010 +0200

    s4-smbtorture: rework EnumPrinterDrivers tests a bit.
    
    Guenther

-----------------------------------------------------------------------

Summary of changes:
 source4/torture/rpc/spoolss.c |  187 ++++++++++++++++++++++++++---------------
 1 files changed, 119 insertions(+), 68 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/torture/rpc/spoolss.c b/source4/torture/rpc/spoolss.c
index d67d2e9..4ded877 100644
--- a/source4/torture/rpc/spoolss.c
+++ b/source4/torture/rpc/spoolss.c
@@ -439,58 +439,135 @@ static bool test_GetPrinterDriverDirectory(struct torture_context *tctx,
 	return true;
 }
 
+static bool test_EnumPrinterDrivers_args(struct torture_context *tctx,
+					 struct dcerpc_binding_handle *b,
+					 const char *server_name,
+					 const char *environment,
+					 uint32_t level,
+					 uint32_t *count_p,
+					 union spoolss_DriverInfo **info_p)
+{
+	struct spoolss_EnumPrinterDrivers r;
+	uint32_t needed;
+	uint32_t count;
+	union spoolss_DriverInfo *info;
+
+	r.in.server		= server_name;
+	r.in.environment	= environment;
+	r.in.level		= level;
+	r.in.buffer		= NULL;
+	r.in.offered		= 0;
+	r.out.needed		= &needed;
+	r.out.count		= &count;
+	r.out.info		= &info;
+
+	torture_comment(tctx, "Testing EnumPrinterDrivers(%s) level %u\n",
+		r.in.environment, r.in.level);
+
+	torture_assert_ntstatus_ok(tctx,
+		dcerpc_spoolss_EnumPrinterDrivers_r(b, tctx, &r),
+		"EnumPrinterDrivers failed");
+	if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
+		DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
+		r.in.buffer = &blob;
+		r.in.offered = needed;
+
+		torture_assert_ntstatus_ok(tctx,
+			dcerpc_spoolss_EnumPrinterDrivers_r(b, tctx, &r),
+			"EnumPrinterDrivers failed");
+	}
+
+	torture_assert_werr_ok(tctx, r.out.result,
+		"EnumPrinterDrivers failed");
+
+	if (count_p) {
+		*count_p = count;
+	}
+	if (info_p) {
+		*info_p = info;
+	}
+
+	CHECK_NEEDED_SIZE_ENUM_LEVEL(spoolss_EnumPrinterDrivers, info, r.in.level, count, lp_iconv_convenience(tctx->lp_ctx), needed, 4);
+
+	return true;
+
+}
+
+static bool test_EnumPrinterDrivers_findone(struct torture_context *tctx,
+					    struct dcerpc_binding_handle *b,
+					    const char *server_name,
+					    const char *environment,
+					    uint32_t level,
+					    const char *driver_name)
+{
+	uint32_t count;
+	union spoolss_DriverInfo *info;
+	int i;
+
+	torture_assert(tctx,
+		test_EnumPrinterDrivers_args(tctx, b, server_name, environment, level, &count, &info),
+		"failed to enumerate printer drivers");
+
+	for (i=0; i < count; i++) {
+		const char *driver_name_ret;
+		switch (level) {
+		case 1:
+			driver_name_ret = info->info1.driver_name;
+			break;
+		case 2:
+			driver_name_ret = info->info2.driver_name;
+			break;
+		case 3:
+			driver_name_ret = info->info3.driver_name;
+			break;
+		case 4:
+			driver_name_ret = info->info4.driver_name;
+			break;
+		case 5:
+			driver_name_ret = info->info5.driver_name;
+			break;
+		case 6:
+			driver_name_ret = info->info6.driver_name;
+			break;
+		case 7:
+			driver_name_ret = info->info7.driver_name;
+			break;
+		case 8:
+			driver_name_ret = info->info8.driver_name;
+			break;
+		default:
+			break;
+		}
+		if (strequal(driver_name, driver_name_ret)) {
+			return true;
+		}
+	}
+
+	return false;
+}
+
 static bool test_EnumPrinterDrivers(struct torture_context *tctx,
 				    struct dcerpc_pipe *p,
 				    struct test_spoolss_context *ctx,
 				    const char *architecture)
 {
-	NTSTATUS status;
 	struct dcerpc_binding_handle *b = p->binding_handle;
-	struct spoolss_EnumPrinterDrivers r;
 	uint16_t levels[] = { 1, 2, 3, 4, 5, 6, 8 };
 	int i, j;
 
+	/* FIXME: gd, come back and fix "" as server, and handle
+	 * priority of returned error codes in torture test and samba 3
+	 * server */
+	const char *server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
+
 	for (i=0;i<ARRAY_SIZE(levels);i++) {
 		int level = levels[i];
-		DATA_BLOB blob;
-		uint32_t needed;
 		uint32_t count;
 		union spoolss_DriverInfo *info;
 
-		/* FIXME: gd, come back and fix "" as server, and handle
-		 * priority of returned error codes in torture test and samba 3
-		 * server */
-
-		r.in.server		= talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
-		r.in.environment	= architecture;
-		r.in.level		= level;
-		r.in.buffer		= NULL;
-		r.in.offered		= 0;
-		r.out.needed		= &needed;
-		r.out.count		= &count;
-		r.out.info		= &info;
-
-		torture_comment(tctx, "Testing EnumPrinterDrivers level %u (%s)\n", r.in.level, r.in.environment);
-
-		status = dcerpc_spoolss_EnumPrinterDrivers_r(b, ctx, &r);
-		torture_assert_ntstatus_ok(tctx, status,
-					   "dcerpc_spoolss_EnumPrinterDrivers failed");
-		if (W_ERROR_IS_OK(r.out.result)) {
-			/* TODO: do some more checks here */
-			continue;
-		}
-		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-			blob = data_blob_talloc_zero(ctx, needed);
-			r.in.buffer = &blob;
-			r.in.offered = needed;
-
-			status = dcerpc_spoolss_EnumPrinterDrivers_r(b, ctx, &r);
-			torture_assert_ntstatus_ok(tctx, status, "dcerpc_spoolss_EnumPrinterDrivers failed");
-		}
-
-		torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed");
-
-		CHECK_NEEDED_SIZE_ENUM_LEVEL(spoolss_EnumPrinterDrivers, info, r.in.level, count, lp_iconv_convenience(tctx->lp_ctx), needed, 4);
+		torture_assert(tctx,
+			test_EnumPrinterDrivers_args(tctx, b, server_name, architecture, level, &count, &info),
+			"failed to enumerate drivers");
 
 		ctx->driver_count[level]	= count;
 		ctx->drivers[level]		= info;
@@ -5484,50 +5561,24 @@ static bool test_EnumPrinterDrivers_old(struct torture_context *tctx,
 					struct dcerpc_pipe *p,
 					const char *environment)
 {
-	struct spoolss_EnumPrinterDrivers r;
-	NTSTATUS status;
 	uint16_t levels[] = {1, 2, 3, 4, 5, 6};
 	int i;
 	struct dcerpc_binding_handle *b = p->binding_handle;
+	const char *server_name = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
 
 	for (i=0;i<ARRAY_SIZE(levels);i++) {
 
-		uint32_t needed;
 		uint32_t count;
 		union spoolss_DriverInfo *info;
 
-		r.in.server = talloc_asprintf(tctx, "\\\\%s", dcerpc_server_name(p));
-		r.in.environment = environment;
-		r.in.level = levels[i];
-		r.in.buffer = NULL;
-		r.in.offered = 0;
-		r.out.needed = &needed;
-		r.out.count = &count;
-		r.out.info = &info;
-
-		torture_comment(tctx, "Testing EnumPrinterDrivers level %u\n", r.in.level);
-
-		status = dcerpc_spoolss_EnumPrinterDrivers_r(b, tctx, &r);
-
-		torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDrivers failed");
-
-		if (W_ERROR_EQUAL(r.out.result, WERR_INSUFFICIENT_BUFFER)) {
-			DATA_BLOB blob = data_blob_talloc_zero(tctx, needed);
-			r.in.buffer = &blob;
-			r.in.offered = needed;
-			status = dcerpc_spoolss_EnumPrinterDrivers_r(b, tctx, &r);
-		}
-
-		torture_assert_ntstatus_ok(tctx, status, "EnumPrinterDrivers failed");
-
-		torture_assert_werr_ok(tctx, r.out.result, "EnumPrinterDrivers failed");
+		torture_assert(tctx,
+			test_EnumPrinterDrivers_args(tctx, b, server_name, environment, levels[i], &count, &info),
+			"failed to enumerate drivers");
 
 		if (!info) {
 			torture_comment(tctx, "No printer drivers returned\n");
 			break;
 		}
-
-		CHECK_NEEDED_SIZE_ENUM_LEVEL(spoolss_EnumPrinterDrivers, info, r.in.level, count, lp_iconv_convenience(tctx->lp_ctx), needed, 4);
 	}
 
 	return true;


-- 
Samba Shared Repository


More information about the samba-cvs mailing list