[SCM] Samba Shared Repository - branch master updated

Günther Deschner gd at samba.org
Mon Jan 18 05:41:19 MST 2010


The branch, master has been updated
       via  f299915... testprogs: add tests for GetPrinterData{Ex} and EnumPrinterDataEx.
       via  ecd35d7... testprogs: add tests for GetForm.
       via  ca646a8... testprogs: pass down LPPRINTER_DEFAULTS in spoolss test.
      from  286a27b... Merge branch 'master' of git://git.samba.org/samba

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


- Log -----------------------------------------------------------------
commit f2999157f9f7aad84c2030fb84875d616d5c6ec2
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jan 15 16:36:25 2010 +0100

    testprogs: add tests for GetPrinterData{Ex} and EnumPrinterDataEx.
    
    Guenther

commit ecd35d7ea6ca1e22cfffd9fc7f7e24ab4aad5cff
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jan 15 16:25:20 2010 +0100

    testprogs: add tests for GetForm.
    
    Guenther

commit ca646a82f872a9e65fe4d5bdc60125e39b49319f
Author: Günther Deschner <gd at samba.org>
Date:   Fri Jan 15 16:24:40 2010 +0100

    testprogs: pass down LPPRINTER_DEFAULTS in spoolss test.
    
    Guenther

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

Summary of changes:
 testprogs/win32/spoolss/error.c          |    2 +
 testprogs/win32/spoolss/printlib.c       |   83 +++++++--
 testprogs/win32/spoolss/printlib_proto.h |    1 +
 testprogs/win32/spoolss/spoolss.c        |  269 +++++++++++++++++++++++++++++-
 4 files changed, 329 insertions(+), 26 deletions(-)


Changeset truncated at 500 lines:

diff --git a/testprogs/win32/spoolss/error.c b/testprogs/win32/spoolss/error.c
index 6296f07..837cce9 100644
--- a/testprogs/win32/spoolss/error.c
+++ b/testprogs/win32/spoolss/error.c
@@ -113,6 +113,8 @@ const char *errstr(DWORD error)
 		return "ERROR_CANCELLED";
 	case RPC_S_SERVER_UNAVAILABLE:
 		return "RPC_S_SERVER_UNAVAILABLE";
+	case RPC_S_INVALID_NET_ADDR:
+		return "RPC_S_INVALID_NET_ADDR";
 	default:
 		break;
 	}
diff --git a/testprogs/win32/spoolss/printlib.c b/testprogs/win32/spoolss/printlib.c
index 9fc9d04..e458e14 100644
--- a/testprogs/win32/spoolss/printlib.c
+++ b/testprogs/win32/spoolss/printlib.c
@@ -21,6 +21,7 @@
 
 #include <windows.h>
 #include <stdio.h>
+#include <assert.h>
 
 void print_devmode(DEVMODE *pDevModeIn)
 {
@@ -588,35 +589,81 @@ void print_doc_info_1(PDOC_INFO_1 info)
 	return;
 }
 
-void print_printer_enum_values(PRINTER_ENUM_VALUES *info)
+void print_printer_keys(LPSTR buffer)
 {
-	DWORD i = 0;
+	LPSTR p = NULL;
 
-	printf("\tValue Name\t= %s [0x%x]\n",	info->pValueName, info->cbValueName);
-	printf("\tType\t\t= 0x%x\n",		info->dwType);
-	printf("\tSize\t\t= 0x%x\n",		info->cbData);
+	p = buffer;
 
-	while (i < info->cbData) {
-		printf("\t0x%x", *(info->pData++));
-		if (i%4 == 3)
-			printf("\n");
-		i++;
+	while (p && *p) {
+		printf("%s\n", p);
+		for (; *p; p = CharNext(p)) {
+			p = CharNext(p);
+		}
 	}
-	printf("\n");
+}
 
-	return;
+static LPSTR reg_type_str(DWORD type)
+{
+	switch (type) {
+	case REG_DWORD:
+		return "REG_DWORD";
+	case REG_SZ:
+		return "REG_SZ";
+	case REG_MULTI_SZ:
+		return "REG_MULTI_SZ";
+	case REG_BINARY:
+		return "REG_BINARY";
+	default:
+		return NULL;
+	}
 }
 
-void print_printer_keys(LPSTR buffer)
+void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffer, DWORD type)
 {
+	DWORD i = 0;
 	LPSTR p = NULL;
 
-	p = buffer;
+	if (keyname) {
+		printf("\tKey Name:\t%s\n", keyname);
+	}
 
-	while (p && *p) {
-		printf("%s\n", p);
-		for (; *p; p = CharNext(p)) {
-			p = CharNext(p);
+	printf("\tValue Name:\t%s\n", valuename);
+	printf("\tSize: 0x%x (%d)\n", size, size);
+	printf("\tType:\t\t%s\n", reg_type_str(type));
+
+	switch (type) {
+	case REG_SZ:
+		printf("\t\t%s\n", (LPSTR)buffer);
+		break;
+	case REG_MULTI_SZ:
+		p = (LPSTR)buffer;
+		while (p && *p) {
+			printf("%s\n", p);
+			for (; *p; p = CharNext(p)) {
+				p = CharNext(p);
+			}
 		}
+		break;
+	case REG_DWORD:
+		assert(size == 4);
+		printf("\t\t0x%08x\n", (DWORD)*buffer);
+		break;
+	case REG_BINARY:
+		for (i=0; i < size; i++) {
+			printf("\t0x%x", buffer[i]);
+			if (i%4 == 3) {
+				printf("\n");
+			}
+		}
+		break;
+	default:
+		break;
 	}
 }
+
+void print_printer_enum_values(PRINTER_ENUM_VALUES *info)
+{
+	print_printer_data(NULL, info->pValueName, info->cbData, info->pData, info->dwType);
+}
+
diff --git a/testprogs/win32/spoolss/printlib_proto.h b/testprogs/win32/spoolss/printlib_proto.h
index d408523..44cadbc 100644
--- a/testprogs/win32/spoolss/printlib_proto.h
+++ b/testprogs/win32/spoolss/printlib_proto.h
@@ -40,6 +40,7 @@ void print_driver_info_6 (PDRIVER_INFO_6 info);
 void print_doc_info_1 (PDOC_INFO_1 info);
 void print_printer_enum_values (PRINTER_ENUM_VALUES *info);
 void print_printer_keys(LPSTR buffer);
+void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffer, DWORD type);
 #undef _PRINTF_ATTRIBUTE
 #define _PRINTF_ATTRIBUTE(a1, a2)
 
diff --git a/testprogs/win32/spoolss/spoolss.c b/testprogs/win32/spoolss/spoolss.c
index d68ca89..73713c6 100644
--- a/testprogs/win32/spoolss/spoolss.c
+++ b/testprogs/win32/spoolss/spoolss.c
@@ -30,11 +30,12 @@
 
 static BOOL test_OpenPrinter(struct torture_context *tctx,
 			     LPSTR printername,
-			     HANDLE handle)
+			     LPPRINTER_DEFAULTS defaults,
+			     LPHANDLE handle)
 {
 	torture_comment(tctx, "Testing OpenPrinter(%s)", printername);
 
-	if (!OpenPrinter(printername, handle, NULL)) {
+	if (!OpenPrinter(printername, handle, defaults)) {
 		char tmp[1024];
 		sprintf(tmp, "failed to open printer %s, error was: 0x%08x\n",
 			printername, GetLastError());
@@ -166,6 +167,54 @@ static BOOL test_EnumDrivers(struct torture_context *tctx,
 /****************************************************************************
 ****************************************************************************/
 
+static BOOL test_GetForm(struct torture_context *tctx,
+			 LPSTR servername,
+			 HANDLE handle,
+			 LPSTR formname)
+{
+	DWORD levels[]  = { 1, 2 };
+	DWORD success[] = { 1, 0 };
+	DWORD i;
+	LPBYTE buffer = NULL;
+
+	for (i=0; i < ARRAY_SIZE(levels); i++) {
+
+		DWORD needed = 0;
+		DWORD err = 0;
+		char tmp[1024];
+
+		torture_comment(tctx, "Testing GetForm(%s) level %d", formname, levels[i]);
+
+		GetForm(handle, formname, levels[i], NULL, 0, &needed);
+		err = GetLastError();
+		if (err == ERROR_INSUFFICIENT_BUFFER) {
+			err = 0;
+			buffer = malloc(needed);
+			torture_assert(tctx, buffer, "malloc failed");
+			if (!GetForm(handle, formname, levels[i], buffer, needed, &needed)) {
+				err = GetLastError();
+			}
+		}
+		if (err) {
+			sprintf(tmp, "GetForm failed level %d on [%s] (buffer size = %d), error: %s\n",
+				levels[i], servername, needed, errstr(err));
+			if (success[i]) {
+				torture_fail(tctx, tmp);
+			} else {
+				torture_warning(tctx, tmp);
+			}
+		}
+
+		free(buffer);
+		buffer = NULL;
+	}
+
+	return TRUE;
+}
+
+/****************************************************************************
+****************************************************************************/
+
 static BOOL test_EnumForms(struct torture_context *tctx,
 			   LPSTR servername,
 			   HANDLE handle)
@@ -583,22 +632,76 @@ static BOOL test_EnumJobs(struct torture_context *tctx,
 /****************************************************************************
 ****************************************************************************/
 
+static BOOL test_EnumPrinterDataEx(struct torture_context *tctx,
+				   LPSTR servername,
+				   LPSTR keyname,
+				   HANDLE handle,
+				   LPBYTE *buffer_p,
+				   DWORD *returned_p)
+{
+	LPBYTE buffer = NULL;
+	DWORD needed = 0;
+	DWORD returned = 0;
+	DWORD err = 0;
+	char tmp[1024];
+
+	torture_comment(tctx, "Testing EnumPrinterDataEx(%s)", keyname);
+
+	err = EnumPrinterDataEx(handle, keyname, NULL, 0, &needed, &returned);
+	if (err == ERROR_MORE_DATA) {
+		buffer = malloc(needed);
+		torture_assert(tctx, buffer, "malloc failed");
+		err = EnumPrinterDataEx(handle, keyname, buffer, needed, &needed, &returned);
+	}
+	if (err) {
+		sprintf(tmp, "EnumPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
+			keyname, servername, needed, errstr(err));
+		torture_fail(tctx, tmp);
+	}
+
+	if (tctx->print) {
+		DWORD i;
+		LPPRINTER_ENUM_VALUES v = (LPPRINTER_ENUM_VALUES)buffer;
+		for (i=0; i < returned; i++) {
+			print_printer_enum_values(&v[i]);
+		}
+	}
+
+	if (returned_p) {
+		*returned_p = returned;
+	}
+
+	if (buffer_p) {
+		*buffer_p = buffer;
+	} else {
+		free(buffer);
+	}
+
+	return TRUE;
+}
+
+
+/****************************************************************************
+****************************************************************************/
+
 static BOOL test_OnePrinter(struct torture_context *tctx,
 			    LPSTR printername,
-			    LPSTR architecture)
+			    LPSTR architecture,
+			    LPPRINTER_DEFAULTS defaults)
 {
 	HANDLE handle;
 	BOOL ret = TRUE;
 
 	torture_comment(tctx, "Testing Printer %s", printername);
 
-	ret &= test_OpenPrinter(tctx, printername, &handle);
+	ret &= test_OpenPrinter(tctx, printername, defaults, &handle);
 	ret &= test_GetPrinter(tctx, printername, handle);
 	ret &= test_GetPrinterDriver(tctx, printername, architecture, handle);
 	ret &= test_EnumForms(tctx, printername, handle);
 	ret &= test_EnumJobs(tctx, printername, handle);
 	ret &= test_EnumPrinterKey(tctx, printername, handle, "");
 	ret &= test_EnumPrinterKey(tctx, printername, handle, "PrinterDriverData");
+	ret &= test_EnumPrinterDataEx(tctx, printername, "PrinterDriverData", handle, NULL, NULL);
 	ret &= test_ClosePrinter(tctx, handle);
 
 	return ret;
@@ -609,7 +712,8 @@ static BOOL test_OnePrinter(struct torture_context *tctx,
 
 static BOOL test_EachPrinter(struct torture_context *tctx,
 			     LPSTR servername,
-			     LPSTR architecture)
+			     LPSTR architecture,
+			     LPPRINTER_DEFAULTS defaults)
 {
 	DWORD needed = 0;
 	DWORD returned = 0;
@@ -639,7 +743,7 @@ static BOOL test_EachPrinter(struct torture_context *tctx,
 	}
 
 	for (i=0; i < returned; i++) {
-		ret &= test_OnePrinter(tctx, buffer[i].pName, architecture);
+		ret &= test_OnePrinter(tctx, buffer[i].pName, architecture, defaults);
 	}
 
 	free(buffer);
@@ -741,6 +845,145 @@ static BOOL test_GetPrinterDriverDirectory(struct torture_context *tctx,
 	return TRUE;
 }
 
+/****************************************************************************
+****************************************************************************/
+
+static BOOL test_GetPrinterData(struct torture_context *tctx,
+				LPSTR servername,
+				LPSTR valuename,
+				HANDLE handle,
+				DWORD *type_p,
+				LPBYTE *buffer_p,
+				DWORD *size_p)
+{
+	LPBYTE buffer = NULL;
+	DWORD needed = 0;
+	DWORD type;
+	DWORD err = 0;
+	char tmp[1024];
+
+	torture_comment(tctx, "Testing GetPrinterData(%s)", valuename);
+
+	err = GetPrinterData(handle, valuename, &type, NULL, 0, &needed);
+	if (err == ERROR_MORE_DATA) {
+		buffer = (LPBYTE)malloc(needed);
+		torture_assert(tctx, buffer, "malloc failed");
+		err = GetPrinterData(handle, valuename, &type, buffer, needed, &needed);
+	}
+	if (err) {
+		sprintf(tmp, "GetPrinterData(%s) failed on [%s] (buffer size = %d), error: %s\n",
+			valuename, servername, needed, errstr(err));
+		torture_fail(tctx, tmp);
+	}
+
+	if (tctx->print) {
+		print_printer_data("PrinterDriverData", valuename, needed, buffer, type);
+	}
+
+	if (type_p) {
+		*type_p = type;
+	}
+
+	if (size_p) {
+		*size_p = needed;
+	}
+
+	if (buffer_p) {
+		*buffer_p = buffer;
+	} else {
+		free(buffer);
+	}
+
+	return TRUE;
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static BOOL test_GetPrinterDataEx(struct torture_context *tctx,
+				  LPSTR servername,
+				  LPSTR keyname,
+				  LPSTR valuename,
+				  HANDLE handle,
+				  DWORD *type_p,
+				  LPBYTE *buffer_p,
+				  DWORD *size_p)
+{
+	LPBYTE buffer = NULL;
+	DWORD needed = 0;
+	DWORD type;
+	DWORD err = 0;
+	char tmp[1024];
+
+	torture_comment(tctx, "Testing GetPrinterDataEx(%s - %s)", keyname, valuename);
+
+	err = GetPrinterDataEx(handle, keyname, valuename, &type, NULL, 0, &needed);
+	if (err == ERROR_MORE_DATA) {
+		buffer = (LPBYTE)malloc(needed);
+		torture_assert(tctx, buffer, "malloc failed");
+		err = GetPrinterDataEx(handle, keyname, valuename, &type, buffer, needed, &needed);
+	}
+	if (err) {
+		sprintf(tmp, "GetPrinterDataEx(%s) failed on [%s] (buffer size = %d), error: %s\n",
+			valuename, servername, needed, errstr(err));
+		torture_fail(tctx, tmp);
+	}
+
+	if (tctx->print) {
+		print_printer_data(keyname, valuename, needed, buffer, type);
+	}
+
+	if (type_p) {
+		*type_p = type;
+	}
+
+	if (size_p) {
+		*size_p = needed;
+	}
+
+	if (buffer_p) {
+		*buffer_p = buffer;
+	} else {
+		free(buffer);
+	}
+
+	return TRUE;
+}
+
+/****************************************************************************
+****************************************************************************/
+
+static BOOL test_PrinterData(struct torture_context *tctx,
+			     LPSTR servername,
+			     HANDLE handle)
+{
+	BOOL ret = TRUE;
+	DWORD i;
+	DWORD type, type_ex;
+	LPBYTE buffer, buffer_ex;
+	DWORD size, size_ex;
+	LPSTR valuenames[] = {
+		SPLREG_DEFAULT_SPOOL_DIRECTORY,
+		SPLREG_MAJOR_VERSION,
+		SPLREG_MINOR_VERSION,
+		SPLREG_DS_PRESENT,
+		SPLREG_DNS_MACHINE_NAME,
+		SPLREG_ARCHITECTURE,
+		SPLREG_OS_VERSION
+	};
+
+	for (i=0; i < ARRAY_SIZE(valuenames); i++) {
+		ret &= test_GetPrinterData(tctx, servername, valuenames[i], handle, &type, &buffer, &size);
+		ret &= test_GetPrinterDataEx(tctx, servername, "random", valuenames[i], handle, &type_ex, &buffer_ex, &size_ex);
+		torture_assert_int_equal(tctx, type, type_ex, "type mismatch");
+		torture_assert_int_equal(tctx, size, size_ex, "size mismatch");
+		torture_assert_mem_equal(tctx, buffer, buffer_ex, size, "buffer mismatch");
+		free(buffer);
+		free(buffer_ex);
+	}
+
+	return ret;
+}
 
 /****************************************************************************
 ****************************************************************************/
@@ -751,6 +994,7 @@ int main(int argc, char *argv[])
 	LPSTR servername;
 	LPSTR architecture = "Windows NT x86";
 	HANDLE server_handle;
+	PRINTER_DEFAULTS defaults_admin, defaults_use;
 	struct torture_context *tctx;
 
 	if (argc < 2) {
@@ -773,10 +1017,19 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	defaults_admin.pDatatype = NULL;
+	defaults_admin.pDevMode = NULL;
+	defaults_admin.DesiredAccess = PRINTER_ACCESS_ADMINISTER;
+
+	defaults_use.pDatatype = NULL;
+	defaults_use.pDevMode = NULL;
+	defaults_use.DesiredAccess = PRINTER_ACCESS_USE;
+
 	ret &= test_EnumPrinters(tctx, servername);
 	ret &= test_EnumDrivers(tctx, servername, architecture);
-	ret &= test_OpenPrinter(tctx, servername, &server_handle);
+	ret &= test_OpenPrinter(tctx, servername, NULL, &server_handle);
 /*	ret &= test_EnumPrinterKey(tctx, servername, server_handle, ""); */
+	ret &= test_PrinterData(tctx, servername, server_handle);
 	ret &= test_EnumForms(tctx, servername, server_handle);
 	ret &= test_ClosePrinter(tctx, server_handle);
 	ret &= test_EnumPorts(tctx, servername);
@@ -785,7 +1038,7 @@ int main(int argc, char *argv[])
 	ret &= test_EnumPrintProcessorDatatypes(tctx, servername);
 	ret &= test_GetPrintProcessorDirectory(tctx, servername, architecture);
 	ret &= test_GetPrinterDriverDirectory(tctx, servername, architecture);
-	ret &= test_EachPrinter(tctx, servername, architecture);
+	ret &= test_EachPrinter(tctx, servername, architecture, NULL);
 
 	if (!ret) {
 		if (tctx->last_reason) {


-- 
Samba Shared Repository


More information about the samba-cvs mailing list