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 <g...@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 <g...@samba.org> Date: Fri Jan 15 16:25:20 2010 +0100 testprogs: add tests for GetForm. Guenther commit ca646a82f872a9e65fe4d5bdc60125e39b49319f Author: Günther Deschner <g...@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