New Testsuite for GetDefaultPrinter and GetPrinterDriverDirectory Added: + Test Printing Environments for GetPrinterDriverDirectory + More intensive Testing. + Verbose Output with "WINETEST_DEBUG" > 1
* More tests will follow. If the Patch is to Large (i already removed the Unicode-Tests) i can split the Testsuite, but this will reduce the amount of testing, compared to the current CVS. Changelog: - New Testsuite for winspool.drv: GetDefaultPrinterA and GetPrinterDriverDirectoryA (with different environments) - Verbose Output with "WINETEST_DEBUG" > 1 -- By By ... ... Detlef
--- /dev/null 2005-09-25 11:44:34.245335448 +0200 +++ dlls/winspool/tests/drivers.c 2005-09-26 01:17:34.315283344 +0200 @@ -0,0 +1,617 @@ +/* + * Copyright 2005 Detlef Riekenberg + * + * some parts based on + * Copyright (C) 2003, 2004 Stefan Leichter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdarg.h> +#include <wine/test.h> +#include <winuser.h> + +#include "winspool_test.h" + + +/* ############################ + * + * PARAMETERS + * LPWSTR servername [I] + * LPWSTR environment [I] + * DWORD level [I] + * LPWSTR buffer [O] + * DWORD buffersize [I] + * LPDWORD needed_size [I] (bytes) + * + */ + +static DWORD (WINAPI *pGetPrinterDriverDirectoryA) \ + (LPSTR, LPSTR, DWORD, LPSTR, DWORD, LPDWORD); + + +/* ##################################################### + * + */ + +VOID test_GetPrinterDriverDirectoryA(DWORD envindex) +{ + LPSTR buffer; + LPSTR bufferoverflow; + LPSTR env; + DWORD exactbytes; + DWORD exactsize; + DWORD result; + DWORD size; + + + pGetPrinterDriverDirectoryA = (void *) GetProcAddress(hwinspool, + "GetPrinterDriverDirectoryA"); + if(opt_verbose) + { + trace("%p: %s,pGetPrinterDriverDirectoryA\n", + pGetPrinterDriverDirectoryA, debugstr_a(winspool_nameA)); + } + + + if(pGetPrinterDriverDirectoryA == NULL) + { + pGetPrinterDriverDirectoryA = (void *) GetProcAddress(hwinspool, + "GetPrinterDriverDirectory"); + if(opt_verbose) + { + trace("%p: %s,pGetPrinterDriverDirectory\n", + pGetPrinterDriverDirectoryA, debugstr_a(winspool_nameA)); + } + } + + ok((pGetPrinterDriverDirectoryA != NULL), + "GetPrinterDriverDirectoryA not exported\n"); + + if(pGetPrinterDriverDirectoryA == NULL) + { + return ; + } + + + env = (LPSTR) environment_tableA[envindex]; + trace("%08lx: Environment is %s\n", envindex, debugstr_a(env)); + + + /* Default Usage */ + size=0; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, NULL, 0, &size); + lasterror = GetLastError(); + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, NULL, 0, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, (DWORD) 0, size); + } + is_result_ok(FALSE); + + if((result == FALSE) && (lasterror == ERROR_INVALID_ENVIRONMENT)) + { + if((envindex > ENVIRONMENT_WIN40) && (sys_isNT == FALSE)) + { + + /* In Win9x, only NULL and "Windows 4.0" are supported */ + if(opt_verbose) + { + trace("%08lx: Environment %s not supported\n", + envindex, debugstr_a(env)); + } + }else + { + + /* "Windows NT IA64" was added in WinXPsp2 and Win2003 */ + if(envindex == ENVIRONMENT_IA64) + { + if(opt_verbose) + { + trace("%08lx: Environment %s not supported\n", + envindex, debugstr_a(env)); + } + }else + { + todo_wine ok(0, "%08lx: Environment %s not supported\n", + envindex, debugstr_a(env)); + } + } + return; + } + + if((result == FALSE) && (lasterror == RPC_S_SERVER_UNAVAILABLE)) + { + trace("The Service 'Print Spooler' is required for this Test\n"); + return; + } + + is_lasterror_ok(ERROR_INSUFFICIENT_BUFFER); + + if(opt_verbose) + { + trace("-----\n"); + } + + + /* remember the required buffersize */ + exactsize = size; + exactbytes = size; + + + /* alloc the buffer */ + size = exactbytes + overflow_reserved; + do_dead(); + buffer = HeapAlloc(GetProcessHeap(), 0, size); + lasterror=GetLastError(); + if(opt_verbose) + { + trace("%p: HeapAlloc(%p, 0, 0x%lx/%ld) => (0x%lx/%ld)\n", buffer, + GetProcessHeap(), size, size, lasterror, lasterror); + + put_lasterror(); + } + ok(buffer != NULL, "allocating 0x%ld/%ld Bytes for Buffer => (0x%lx/%ld)\n", + size, size, lasterror, lasterror); + + if(opt_verbose) + { + trace("-----\n"); + } + if(buffer == NULL) + { + return; + } + + bufferoverflow = (LPSTR)buffer + exactbytes; + + + /* Test for BUG in wine and correct the buggy Value */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, buffer, exactsize-1, &size); + lasterror = GetLastError(); + if((result == FALSE) && + (check_buffer_touched(buffer, exactbytes) == (LPBYTE)buffer) && + (size == (lstrlenA(buffer)+2)) ) + { + todo_wine + { + ok(0, + "BUG in wine: returned 'need_size' (0x%lx/%ld) was 1 Byte to Large\n", + exactsize, exactsize); + + exactsize--; + exactbytes--; + bufferoverflow--; + } + } + + + /* everything NULL/zero */ + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 0, NULL, 0, NULL); + lasterror = GetLastError(); + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 0, NULL, 0, NULL)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + lasterror, lasterror); + put_lasterror(); + } + is_result_ok(FALSE); + is_lasterror_ok2(ERROR_INSUFFICIENT_BUFFER, ERROR_INVALID_LEVEL); + + + /* size ok, but no buffer */ + size = exactsize +1; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, NULL, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, NULL, %ld, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + exactsize + 1, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize +1, size); + } + + if( (result != FALSE) && + (lasterror == ERROR_INVALID_PARAMETER) && + (sys_isNT == FALSE) ) + { + trace("BUG in win9x: Returning 'SUCCESS' with ERROR_INVALID_PARAMETER\n"); + + }else + { + todo_wine is_result_ok(FALSE); + todo_wine is_lasterror_ok(ERROR_INVALID_USER_BUFFER); + + /* This fails before NT4.0 */ + if((size != 0) && (opt_verbose)) + { + trace("returned size 0x%lx/%ld (must be 0x%x/%d)\n", + size, size, 0, 0); + } + } + if(opt_verbose) + { + trace("-----\n"); + } + + + + + /* level, buffer and size ok, but "LPDWORD needed_size" is NULL */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + size = exactsize; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, buffer, size, NULL); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, %p, %ld, NULL)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, size, lasterror, lasterror); + put_lasterror(); + } + + if( (result != FALSE) && + (lasterror == NO_ERROR) && + (sys_isNT == FALSE) ) + { + trace("BUG in win9x: Returning 'SUCCESS' with NO_ERROR," \ + " but LPDWORD is NULL\n"); + + }else + { + is_result_ok(FALSE); + todo_wine is_lasterror_ok(RPC_X_NULL_REF_POINTER); + warn_buffer_touched((LPBYTE) buffer, exactbytes); + is_overflowarea_ok(bufferoverflow); + } + if(opt_verbose) + { + trace("-----\n"); + } + + + + /* with a buffer, but size of buffer = 0 */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + + size = 0; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, buffer, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, %p, 0, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, (DWORD) 0, size); + } + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INSUFFICIENT_BUFFER); + todo_wine + { + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + } + warn_buffer_touched((LPBYTE)buffer, exactbytes); + is_overflowarea_ok(bufferoverflow); + + if(opt_verbose) + { + trace("-----\n"); + } + + + /* with a buffer, but size of buffer 1 Byte to small */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + + size = exactsize-1; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, buffer, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, %p, %ld, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, exactsize-1, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize-1, size); + } + + + + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INSUFFICIENT_BUFFER); + todo_wine + { + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + } + warn_buffer_touched((LPBYTE)buffer, exactbytes); + is_overflowarea_ok(bufferoverflow); + if(opt_verbose) + { + trace("-----\n"); + } + + + + /* with a buffer, but size of buffer 1 Byte to large */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + + size = exactsize+1; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, buffer, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, %p, %ld, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, exactsize+1, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize+1, size); + } + is_result_ok(TRUE); + todo_wine + { + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + } + + /* This fails on win9x */ + if( (memcmp(bufferoverflow, overflow_ok, overflow_reserved) != 0) && + (sys_isNT == FALSE)) + { + if(opt_verbose) + { + trace ("INFO for win9x: the supplied buffer is touched more than needed\n"); + } + }else + { + is_overflowarea_ok(bufferoverflow); + } + + result = (lstrlenA(buffer)+1); + ok((result == exactsize) || ((result+result) == exactsize) , + "returned required size was 0x%lx/%ld (data need 0x%lx /%ld Byte)\n", + exactsize, exactsize, result, result); + if(opt_verbose) + { + trace("-----\n"); + } + + + + /* with a buffer, but level is invalid (to small) */ + if(opt_verbose) + { + trace("test with invalid Levels\n"); + } + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + + size = exactsize+1; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 0, buffer, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 0, %p, %ld, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, exactsize+1, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize+1, size); + } + + + /* Test for BUG in win9x and wine: Level not checked */ + if((result != FALSE) && (lstrlenA(buffer) == (exactsize-1)) ) + { + /* we found the BUG, but display only a message for win9x */ + if(sys_isNT == FALSE) + { + trace("BUG in win9x and wine: Invalid Level '0' is not checked " \ + "(valid Level is '1')\n"); + }else + { + todo_wine + { + ok(0, "BUG in win9x and wine: Invalid Level '0' is not checked " \ + "(valid Level is '1')\n"); + } + } + }else + { + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INVALID_LEVEL); + warn_size_touched((exactsize+1)); + warn_buffer_touched((LPBYTE) buffer, exactbytes); + is_overflowarea_ok(bufferoverflow); + + } + + if(opt_verbose) + { + trace("-----\n"); + } + + + + /* with a buffer, but level is invalid (to large) */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + + size = exactsize+1; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 2, buffer, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 2, %p, %ld, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, exactsize+1, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize+1, size); + } + + + /* Test for BUG in win9x and wine: Level not checked */ + if((result != FALSE) && (lstrlenA(buffer) == (exactsize-1))) + { + /* we found the BUG, but display only a message for win9x */ + if(sys_isNT == FALSE) + { + trace("BUG in win9x and wine: Invalid Level '2' is not checked " \ + "(valid Level is '1')\n"); + }else + { + todo_wine + { + ok(0, "BUG in win9x and wine: Invalid Level '2' is not checked " \ + "(valid Level is '1')\n"); + } + } + }else + { + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INVALID_LEVEL); + warn_size_touched((exactsize+1)); + warn_buffer_touched((LPBYTE) buffer, exactbytes); + is_overflowarea_ok(bufferoverflow); + } + + if(opt_verbose) + { + trace("-----\n"); + } + + + + /* The Environment is case insensitive. */ + env = clone_cstrA(environment_tableA[envindex]); + if(env != NULL) + { + CharLowerA(env); + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + + size = exactsize; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, buffer, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, %p, %ld, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, exactsize, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize, size); + trace("%p: buffer: %s\n", buffer, debugstr_a(buffer)); + } + is_result_ok(TRUE); + + + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + + is_overflowarea_ok(bufferoverflow); + + free_strA(env); + } + env = (LPSTR) environment_tableA[envindex]; + + + + /* test normal use */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + + size = exactsize; + do_dead(); + result = pGetPrinterDriverDirectoryA(NULL, env, 1, buffer, size, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetPrinterDriverDirectoryA(NULL, %s, 1, %p, %ld, %p)" \ + " => (0x%lx/%ld)\n", result, debugstr_a(env), + buffer, exactsize, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize, size); + trace("%p: buffer: %s\n", buffer, debugstr_a(buffer)); + } + todo_wine + { + is_result_ok(TRUE); + + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + } + is_overflowarea_ok(bufferoverflow); + + result = (lstrlenA(buffer)+1) ; + ok((result == exactsize) || ((result+result) == exactsize) , + "returned required size was 0x%lx/%ld (data need 0x%lx /%ld Byte)\n", + exactsize, exactsize, result, result); + + if(opt_verbose) + { + trace("-----\n"); + } + + HeapFree(GetProcessHeap(), 0, buffer); + +} + +/* ############################ + * + */ + +START_TEST(drivers) +{ + DWORD envindex; + if(create_test_environment() == NO_ERROR) + { + for(envindex = 0; envindex <= ENVIRONMENT_MAX; envindex++) + { + test_GetPrinterDriverDirectoryA(envindex); + } + } + shutdown_test_environment(); +} + --- /dev/null 2005-09-25 11:44:34.245335448 +0200 +++ dlls/winspool/tests/printers.c 2005-09-26 01:10:33.990182472 +0200 @@ -0,0 +1,332 @@ +/* + * Copyright 2005 Detlef Riekenberg + * + * some parts based on + * Copyright (C) 2003, 2004 Stefan Leichter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdarg.h> +#include <wine/test.h> +#include "windef.h" +#include "winbase.h" +#include "winerror.h" + +#include "winspool_test.h" + + +/* ############################ + * + * PARAMETERS + * LPWSTR buffer [O] + * LPDWORD buffersize [I/O] (number of CHAR / WCHAR incl. zero) + * + */ + + +static DWORD (WINAPI *pGetDefaultPrinterA)(LPSTR, LPDWORD); + + +/* ############################ + * + */ + +VOID test_GetDefaultPrinterA(VOID) +{ + LPSTR buffer; + LPSTR bufferoverflow; + DWORD exactbytes; + DWORD exactsize; + DWORD result; + DWORD size; + + + pGetDefaultPrinterA = (void *)GetProcAddress(hwinspool, "GetDefaultPrinterA"); + if(opt_verbose) + { + trace("%p: %s,pGetDefaultPrinterA\n", pGetDefaultPrinterA, debugstr_a(winspool_nameA)); + } + if (pGetDefaultPrinterA == NULL) + { + pGetDefaultPrinterA = (void *)GetProcAddress(hwinspool, "GetDefaultPrinter"); + if(opt_verbose) + { + trace("%p: %s,pGetDefaultPrinter\n", pGetDefaultPrinterA, debugstr_a(winspool_nameA)); + } + } + + /* This Fuction is not present before win98 and before w2k */ + if(pGetDefaultPrinterA == NULL) + { + return ; + } + + + /* everything NULL/zero */ + do_dead(); + result = pGetDefaultPrinterA(NULL, NULL); + lasterror = GetLastError(); + if(opt_verbose) + { + trace("%08lx: GetDefaultPrinterA(NULL, NULL) => (0x%lx/%ld)\n", + result, lasterror, lasterror); + put_lasterror(); + + } + + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INVALID_PARAMETER); + if(opt_verbose) + { + trace("-----\n"); + } + + + /* Default Usage */ + size = 0; + do_dead(); + result = pGetDefaultPrinterA(NULL, &size); + lasterror = GetLastError(); + if(opt_verbose) + { + trace("%08lx: GetDefaultPrinterA(NULL, %p) => (0x%lx/%ld)\n", + result, &size, lasterror, lasterror); + + put_lasterror(); + trace("%p: old=%ld, new = %ld\n", &size, (DWORD) 0, size); + } + is_result_ok(FALSE); + + ok(((lasterror == ERROR_FILE_NOT_FOUND) || + (lasterror == ERROR_INVALID_NAME) || + (lasterror == ERROR_INSUFFICIENT_BUFFER)), + "GetLastError() returned 0x%lx/%ld "\ + "(must be 0x%x/%d, 0x%x/%d or 0x%x/%d)\n", lasterror, lasterror, + ERROR_FILE_NOT_FOUND, ERROR_FILE_NOT_FOUND, ERROR_INVALID_NAME, + ERROR_INVALID_NAME, ERROR_INSUFFICIENT_BUFFER, ERROR_INSUFFICIENT_BUFFER); + + + if((lasterror == ERROR_FILE_NOT_FOUND) || (lasterror == ERROR_INVALID_NAME)) + { + trace("FIXME: Verify (with EnumPrinters), that we have no Printers\n"); + trace("For this tests, a default printer must be set\n"); + return ; + } + if(opt_verbose) + { + trace("-----\n"); + } + + /* remember the required buffersize */ + exactbytes = size; + exactsize = size; + + /* alloc the buffer */ + size += overflow_reserved; + do_dead(); + buffer = HeapAlloc(GetProcessHeap(), 0, size); + lasterror=GetLastError(); + if(opt_verbose) + { + trace("%p: HeapAlloc(%p, 0, 0x%lx/%ld) => (0x%lx/%ld)\n", buffer, + GetProcessHeap(), size, size, lasterror, lasterror); + + put_lasterror(); + } + ok(buffer != NULL, "allocating 0x%ld/%ld Bytes for Buffer => (0x%lx/%ld)\n", + size, size, lasterror, lasterror); + + if(opt_verbose) + { + trace("-----\n"); + } + if(buffer == NULL) + { + return; + } + + bufferoverflow = (LPBYTE)buffer + exactbytes; + + + /* size ok, but no buffer */ + size=exactsize+1; + do_dead(); + result = pGetDefaultPrinterA(NULL, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetDefaultPrinterA(NULL, %p) => (0x%lx/%ld)\n", result, + &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, (DWORD) exactsize+1, size); + } + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INSUFFICIENT_BUFFER); + if(opt_verbose) + { + trace("-----\n"); + } + + + /* with a buffer, but size of buffer = 0 */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + size = 0; + do_dead(); + result = pGetDefaultPrinterA(buffer, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetDefaultPrinterA(%p, %p) => (0x%lx/%ld)\n", result, + buffer, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, (DWORD) 0, size); + } + + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INSUFFICIENT_BUFFER); + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + + warn_buffer_touched((LPBYTE)buffer, exactbytes); + is_overflowarea_ok(bufferoverflow); + + if(opt_verbose) + { + trace("-----\n"); + } + + + /* with a buffer, but size of buffer 1 Byte to small */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + size = exactsize-1; + do_dead(); + result = pGetDefaultPrinterA(buffer, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetDefaultPrinterA(%p, %p) => (0x%lx/%ld)\n", result, + buffer, &size, lasterror, lasterror); + put_lasterror(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize-1, size); + } + + is_result_ok(FALSE); + is_lasterror_ok(ERROR_INSUFFICIENT_BUFFER); + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + + is_overflowarea_ok(bufferoverflow); + warn_buffer_touched((LPBYTE)buffer, exactbytes); + if(opt_verbose) + { + trace("-----\n"); + } + + + /* with a buffer, but size of buffer 1 Byte to large */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + size = exactsize+1; + do_dead(); + result = pGetDefaultPrinterA(buffer, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetDefaultPrinterA(%p, %p) => (0x%lx/%ld)\n", result, + buffer, &size, lasterror, lasterror); + put_error(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize+1, size); + trace("%p: buffer: %s\n", buffer, debugstr_a(buffer)); + } + + is_result_ok(TRUE); + warn_lasterror_touched(MAGIC_DEAD); + + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + is_overflowarea_ok(bufferoverflow); + + result = strlen(buffer)+1; + ok(result == exactsize, + "returned required size was 0x%lx/%ld (data need 0x%lx /%ld Byte)\n", + exactsize, exactsize, result, result); + + if(opt_verbose) + { + trace("-----\n"); + } + + + /* test normal use */ + FillMemory(buffer, exactbytes, MAGIC_FILL); + CopyMemory(bufferoverflow, overflow_ok, overflow_reserved); + size = exactsize; + do_dead(); + result = pGetDefaultPrinterA(buffer, &size); + lasterror = GetLastError(); + + if(opt_verbose) + { + trace("%08lx: GetDefaultPrinterA(%p, %p) => (0x%lx/%ld)\n", result, + buffer, &size, lasterror, lasterror); + put_error(); + trace("%p: oldsize=%ld, newsize=%ld\n", &size, exactsize, size); + trace("%p: buffer: %s\n", buffer, debugstr_a(buffer)); + } + + is_result_ok(TRUE); + warn_lasterror_touched(MAGIC_DEAD); + + ok(size == exactsize, "returned size 0x%lx/%ld (must be 0x%lx /%ld)\n", + size, size, exactsize, exactsize); + + is_overflowarea_ok(bufferoverflow); + + if(opt_verbose) + { + trace("-----\n"); + } + + + trace("FIXME: Verify (with EnumPrinters), that the Printer %s is valid\n", + debugstr_a(buffer)); + + + HeapFree(GetProcessHeap(), 0, buffer); +} + + +/* ############################ + * + */ + + +START_TEST(printers) +{ + if(create_test_environment() == NO_ERROR) + { + test_GetDefaultPrinterA(); + + } + shutdown_test_environment(); +} + --- /dev/null 2005-09-25 11:44:34.245335448 +0200 +++ dlls/winspool/tests/winspool_test.h 2005-09-26 01:10:28.407031240 +0200 @@ -0,0 +1,238 @@ +/* + * Copyright 2005 Detlef Riekenberg + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <stdarg.h> + +#include <wine/test.h> +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "wingdi.h" +#include "winnls.h" +#include "winreg.h" + +#include "winspool.h" + + +/* ################################################### */ +/* Setting up the Environment for testing winspool.drv */ +/* ################################################### */ + +/* was SetLastError() used by the tested function? */ +#define MAGIC_DEAD 0x00dead00 + +/* was the contents of the output-buffer modified? */ +#define MAGIC_FILL '#' + + +#define DEBUGSTR_MAXLEN 1024 +#define LASTERROR_MAXLEN 1024 + +extern CHAR lasterror_buffer[]; +extern CHAR pathname_buffer[]; +extern LPSTR winspool_nameA; + + +/* valid printing environments */ +extern LPCSTR environment_tableA[]; + + +#define ENVIRONMENT_NULL 0 +#define ENVIRONMENT_WIN40 1 +#define ENVIRONMENT_W32X86 2 +#define ENVIRONMENT_IA64 3 +#define ENVIRONMENT_W32ALPHA 4 +#define ENVIRONMENT_W32PPC 5 +#define ENVIRONMENT_W32MIPS 6 +#define ENVIRONMENT_MAX ENVIRONMENT_W32MIPS + + +/* definitions for Buffer-overflow check */ +extern LPSTR overflow_ok; +extern LPSTR overflow_bad; +extern DWORD overflow_reserved; + + +/* was the contents of the output-buffer modified ? */ +extern LPBYTE firsttouchedptr; +extern DWORD firsttouchedoffset; +extern LPBYTE firstuntouchedptr; +extern DWORD firstuntouchedoffset; + + +/* ############################ + * + */ + +extern DWORD lasterror; +extern DWORD opt_verbose; + + +extern BOOL sys_isNT; + +/* ############################ + * + */ + +extern HMODULE hwinspool; + + +/* ############################ + * + */ + +LPBYTE check_buffer_touched(LPBYTE buffer, SIZE_T len); + + +LPSTR clone_strA(LPSTR what); +#define clone_cstrA(what) clone_strA((LPSTR) what) + + + +LPSTR debugstr_a(LPSTR what); +#define debugstr_ca(what) debugstr_a((LPSTR) what) + + + +static inline VOID do_dead() + { + SetLastError(MAGIC_DEAD); + } + + +static inline VOID free_strW(LPWSTR what) +{ + if(what) + { + HeapFree(GetProcessHeap(), 0, what); + } +} + +static inline VOID free_strA(LPSTR what) +{ + if(what) + { + HeapFree(GetProcessHeap(), 0, what); + } +} + + + +BOOL is_error(DWORD ignorethis); + + +#define is_lasterror_ok(value) \ + ok(lasterror == value , \ + "GetLastError() returned 0x%lx/%ld (must return 0x%x/%d %s)\n", \ + lasterror, lasterror, value , value, debugstr_a( #value )) + +#define is_lasterror_ok2(value1, value2) \ + ok((lasterror == value1) || (lasterror == value2) , \ + "GetLastError() returned 0x%lx/%ld (must return " \ + "0x%x/%d %s or 0x%x/%d %s)\n", lasterror, lasterror, \ + value1 , value1, debugstr_a( #value1 ), \ + value2 , value2, debugstr_a( #value2 ) ) + + + +#define is_overflowarea_ok(overflowarea) \ + ok(memcmp(overflowarea, overflow_ok, overflow_reserved) == 0 , \ + "buffer overflow error at %p: %s\n", \ + overflowarea, debugstr_a(overflowarea )) + + +#define is_result_ok(value) \ + ok(result == value , \ + "function returned 0x%lx/%ld (must return 0x%x: %s), " \ + "GetLastError() is 0x%lx,%ld\n", result, result, \ + value, debugstr_a( #value ), lasterror, lasterror) + + +/* ############################ + * + */ + +HMODULE loaddll(LPSTR dllname); + + +VOID put_error_(const char * file, int line); +#define put_error() put_error_(__FILE__, __LINE__) + + +#define put_exclude(ignorethis) \ + if(is_error(ignorethis)) \ + { \ + put_error_(__FILE__, __LINE__); \ + } + + +#define put_lasterror() put_exclude(NO_ERROR) + + + +VOID unloaddll(HMODULE * target); + +/* ############################ + * + * Downgraded some tests ("ok" => "trace") of undocumented behaviours + * to show the Implementation-specific difference. + * + * + */ + +#define warn_buffer_touched(buffer, bufferlen) \ + { \ + check_buffer_touched((LPBYTE)buffer, bufferlen); \ + if((firsttouchedptr != NULL) && (opt_verbose))\ + { \ + trace("Undocumented: buffer touched at %p" \ + " (%p + 0x%lx/%ld): %s\n", firsttouchedptr, \ + buffer, firsttouchedoffset, firsttouchedoffset, \ + debugstr_ca(firsttouchedptr) ); \ + } \ + } + + +#define warn_lasterror_touched(value) \ + if((lasterror != value) && (opt_verbose)) \ + { \ + trace("Undocumented: GetLastError() returned 0x%lx/%ld (touched 0x%08x %s)\n", \ + lasterror, lasterror, value , debugstr_a( #value )); \ + } + + +#define warn_size_touched(value) \ + if((size != value) && (opt_verbose)) \ + { \ + trace("Undocumented: returned size: 0x%lx/%ld (touched 0x%lx/%ld)\n", \ + size, size, value , value); \ + } + + +/* ############################ + * + */ + +DWORD create_test_environment(VOID); +VOID shutdown_test_environment(VOID); + + +/* ############################ + * + */ + ? dlls/winspool/tests/drivers.c ? dlls/winspool/tests/printers.c ? dlls/winspool/tests/winspool_test.h Index: dlls/winspool/tests/.cvsignore =================================================================== RCS file: /home/wine/wine/dlls/winspool/tests/.cvsignore,v retrieving revision 1.2 diff -u -r1.2 .cvsignore --- dlls/winspool/tests/.cvsignore 2 Mar 2004 21:16:38 -0000 1.2 +++ dlls/winspool/tests/.cvsignore 25 Sep 2005 23:28:39 -0000 @@ -1,3 +1,5 @@ Makefile +drivers.ok info.ok +printers.ok testlist.c Index: dlls/winspool/tests/Makefile.in =================================================================== RCS file: /home/wine/wine/dlls/winspool/tests/Makefile.in,v retrieving revision 1.1 diff -u -r1.1 Makefile.in --- dlls/winspool/tests/Makefile.in 15 Jan 2003 00:50:48 -0000 1.1 +++ dlls/winspool/tests/Makefile.in 25 Sep 2005 23:28:39 -0000 @@ -3,10 +3,17 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = winspool.drv -IMPORTS = winspool kernel32 +IMPORTS = kernel32 user32 +EXTRALIBS = CTESTS = \ - info.c + drivers.c \ + info.c \ + printers.c + + +EXTRA_SRCS = winspool_test.h + @MAKE_TEST_RULES@ Index: dlls/winspool/tests/info.c =================================================================== RCS file: /home/wine/wine/dlls/winspool/tests/info.c,v retrieving revision 1.9 diff -u -r1.9 info.c --- dlls/winspool/tests/info.c 16 Jun 2004 20:07:02 -0000 1.9 +++ dlls/winspool/tests/info.c 25 Sep 2005 23:28:39 -0000 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2004 Stefan Leichter + * Copyright 2005 Detlef Riekenberg * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,158 +17,364 @@ */ #include <stdarg.h> +#include <wine/test.h> +#include <winbase.h> +#include <winuser.h> -#include "wine/test.h" -#include "windef.h" -#include "winbase.h" -#include "winerror.h" -#include "wingdi.h" -#include "winspool.h" - -static void test_default_printer(void) -{ -#define DEFAULT_PRINTER_SIZE 1000 - BOOL retval; - DWORD exact = DEFAULT_PRINTER_SIZE; - DWORD size; - FARPROC func = NULL; - HMODULE lib = NULL; - char buffer[DEFAULT_PRINTER_SIZE]; - - lib = GetModuleHandleA("winspool.drv"); - if (!lib) { - ok( 0, "GetModuleHandleA(\"winspool.drv\") failed\n"); - return; - } - - func = GetProcAddress( lib, "GetDefaultPrinterA"); - if (!func) - /* only supported on NT like OSes starting with win2k */ - return; - - SetLastError(ERROR_SUCCESS); - retval = func( buffer, &exact); - if (!retval || !exact || !strlen(buffer) || - (ERROR_SUCCESS != GetLastError())) { - if ((ERROR_FILE_NOT_FOUND == GetLastError()) || - (ERROR_INVALID_NAME == GetLastError())) - trace("this test requires a default printer to be set\n"); - else { - ok( 0, "function call GetDefaultPrinterA failed unexpected!\n" - "function returned %s\n" - "last error 0x%08lx\n" - "returned buffer size 0x%08lx\n" - "returned buffer content %s\n", - retval ? "true" : "false", GetLastError(), exact, buffer); - } - return; - } - SetLastError(ERROR_SUCCESS); - retval = func( NULL, NULL); - ok( !retval, "function result wrong! False expected\n"); - ok( ERROR_INVALID_PARAMETER == GetLastError(), - "Last error wrong! ERROR_INVALID_PARAMETER expected, got 0x%08lx\n", - GetLastError()); - - SetLastError(ERROR_SUCCESS); - retval = func( buffer, NULL); - ok( !retval, "function result wrong! False expected\n"); - ok( ERROR_INVALID_PARAMETER == GetLastError(), - "Last error wrong! ERROR_INVALID_PARAMETER expected, got 0x%08lx\n", - GetLastError()); - - SetLastError(ERROR_SUCCESS); - size = 0; - retval = func( NULL, &size); - ok( !retval, "function result wrong! False expected\n"); - ok( ERROR_INSUFFICIENT_BUFFER == GetLastError(), - "Last error wrong! ERROR_INSUFFICIENT_BUFFER expected, got 0x%08lx\n", - GetLastError()); - ok( size == exact, "Parameter size wrong! %ld expected got %ld\n", - exact, size); - - SetLastError(ERROR_SUCCESS); - size = DEFAULT_PRINTER_SIZE; - retval = func( NULL, &size); - ok( !retval, "function result wrong! False expected\n"); - ok( ERROR_INSUFFICIENT_BUFFER == GetLastError(), - "Last error wrong! ERROR_INSUFFICIENT_BUFFER expected, got 0x%08lx\n", - GetLastError()); - ok( size == exact, "Parameter size wrong! %ld expected got %ld\n", - exact, size); - - size = 0; - retval = func( buffer, &size); - ok( !retval, "function result wrong! False expected\n"); - ok( ERROR_INSUFFICIENT_BUFFER == GetLastError(), - "Last error wrong! ERROR_INSUFFICIENT_BUFFER expected, got 0x%08lx\n", - GetLastError()); - ok( size == exact, "Parameter size wrong! %ld expected got %ld\n", - exact, size); - - size = exact; - retval = func( buffer, &size); - ok( retval, "function result wrong! True expected\n"); - ok( size == exact, "Parameter size wrong! %ld expected got %ld\n", - exact, size); -} - -static void test_printer_directory(void) -{ LPBYTE buffer = NULL; - DWORD cbBuf = 0, pcbNeeded = 0; - BOOL res; - - res = GetPrinterDriverDirectoryA( NULL, NULL, 1, NULL, 0, &cbBuf); - trace("GetPrinterDriverDirectoryA: first call returned 0x%04x, " - "buffer size 0x%08lx\n", res, cbBuf); - - buffer = HeapAlloc( GetProcessHeap(), 0, cbBuf*2); - - res = GetPrinterDriverDirectoryA(NULL, NULL, 1, buffer, cbBuf, &pcbNeeded); - ok( res, "expected result != 0, got %d\n", res); - ok( cbBuf == pcbNeeded, "pcbNeeded set to %ld instead of %ld\n", - pcbNeeded, cbBuf); - - res = GetPrinterDriverDirectoryA(NULL, NULL, 1, buffer, cbBuf*2, &pcbNeeded); - ok( res, "expected result != 0, got %d\n", res); - ok( cbBuf == pcbNeeded, "pcbNeeded set to %ld instead of %ld\n", - pcbNeeded, cbBuf); - - res = GetPrinterDriverDirectoryA( NULL, NULL, 1, buffer, cbBuf-1, &pcbNeeded); - ok( !res , "expected result == 0, got %d\n", res); - ok( cbBuf == pcbNeeded, "pcbNeeded set to %ld instead of %ld\n", - pcbNeeded, cbBuf); - ok( ERROR_INSUFFICIENT_BUFFER == GetLastError(), - "last error set to %ld instead of ERROR_INSUFFICIENT_BUFFER\n", - GetLastError()); - - res = GetPrinterDriverDirectoryA( NULL, NULL, 1, NULL, cbBuf, &pcbNeeded); - ok( (!res && ERROR_INVALID_USER_BUFFER == GetLastError()) || - ( res && ERROR_INVALID_PARAMETER == GetLastError()) , - "expected either result == 0 and " - "last error == ERROR_INVALID_USER_BUFFER " - "or result != 0 and last error == ERROR_INVALID_PARAMETER " - "got result %d and last error == %ld\n", res, GetLastError()); - - res = GetPrinterDriverDirectoryA( NULL, NULL, 1, buffer, cbBuf, NULL); - ok( (!res && RPC_X_NULL_REF_POINTER == GetLastError()) || res, - "expected either result == 0 and " - "last error == RPC_X_NULL_REF_POINTER or result != 0 " - "got result %d and last error == %ld\n", res, GetLastError()); - - res = GetPrinterDriverDirectoryA( NULL, NULL, 1, NULL, cbBuf, NULL); - ok( (!res && RPC_X_NULL_REF_POINTER == GetLastError()) || - ( res && ERROR_INVALID_PARAMETER == GetLastError()) , - "expected either result == 0 and " - "last error == RPC_X_NULL_REF_POINTER " - "or result != 0 and last error == ERROR_INVALID_PARAMETER " - "got result %d and last error == %ld\n", res, GetLastError()); +#include "winspool_test.h" - HeapFree( GetProcessHeap(), 0, buffer); + +/* ################################################### */ +/* Setting up the Environment for testing winspool.drv */ + +CHAR lasterror_buffer[LASTERROR_MAXLEN]; +CHAR pathname_buffer[MAX_PATH+MAX_PATH]; + +LPSTR winspool_nameA = "winspool.drv"; + + +/* valid printing environments */ + +LPCSTR environment_tableA[] = {NULL, + "Windows 4.0", + "Windows NT x86", + "Windows NT IA64", + "Windows NT Alpha_AXP", + "Windows NT PowerPC", + "Windows NT R4000", NULL}; + + + +/* definitions for Buffer-overflow check */ +LPSTR overflow_ok = "ok\0\0\0\0"; +DWORD overflow_reserved = 6; + +/* was the contents of the output-buffer modified ? */ +LPBYTE firsttouchedptr=NULL; +DWORD firsttouchedoffset=0; +LPBYTE firstuntouchedptr=NULL; +DWORD firstuntouchedoffset=0; + +/* ############################ + * + */ + +BOOL sys_isNT; + +DWORD lasterror = 0; +DWORD opt_verbose = 0; + + +/* ############################ + * + */ + + +HMODULE hwinspool = NULL; + +/* ############################ + * + */ + +static CHAR debug_buffer[DEBUGSTR_MAXLEN + DEBUGSTR_MAXLEN]; +static CHAR * debug_data[] = {debug_buffer, &(debug_buffer[DEBUGSTR_MAXLEN]) }; + + +/* ############################ + * + */ + +LPBYTE check_buffer_touched(LPBYTE buffer, DWORD len) +{ + + firsttouchedptr = NULL; + firsttouchedoffset = len; + firstuntouchedptr = buffer; + firstuntouchedoffset = 0; + CHAR * ptr = (CHAR *) buffer; + + if(ptr != NULL) + { + while((len > 0) && (*ptr == MAGIC_FILL)) + { + ptr++; + len--; + } + + if(len > 0) + { + /* buffer is touched */ + firsttouchedptr = ptr; + firsttouchedoffset -= len; + + while((len > 0) && (*(ptr + len-1) == MAGIC_FILL)) + { + len--; + } + firstuntouchedptr = & ptr[len]; + firstuntouchedoffset = firsttouchedoffset + len; + } + } + return firsttouchedptr; +} + +/* ############################ + * + */ + +LPSTR clone_strA(LPSTR what) +{ + LPSTR rc; + DWORD len; + + if(what == NULL) + { + return NULL; + } + + len = lstrlenA(what); + rc = HeapAlloc(GetProcessHeap(), 0, (len + 1)); + if(rc) + { + CopyMemory(rc, what, len); + rc[len] = (CHAR) '\0' ; + } + return rc; +} + +/* ############################ + * + */ + +LPSTR debugstr_a(LPSTR what) +{ + char * ptr; + INT len=0; + BOOL do_space = TRUE; + + ptr=debug_data[0]; + + if (what != NULL) + { + if(HIWORD(what) != 0) + { + *ptr='"'; + ptr++; + len = DEBUGSTR_MAXLEN - 9; + while((len > 0) && (*what)) + { + if ((*what) == '\012' || (*what) == '\015') + { + if(do_space) + { + *ptr = ' '; + len--; + do_space = FALSE; + } + }else + { + if(((*what) < 127) && ((*what) > 31)) + { + *ptr++ = (CHAR) *what; + len--; + do_space = TRUE; + + }else + { + wsprintfA(ptr,"\\0x%02x", *what); + ptr +=5; + len -=5; + do_space = TRUE; + } + } + what++; + } + *ptr='"'; + ptr++; + *ptr='\0'; + }else + { + wsprintfA(ptr,"#%ld", (DWORD) what); + + } + ptr=debug_data[0]; + debug_data[0] = debug_data[1]; + debug_data[1] = ptr; + return ptr; + }else + { + return "--NULL--"; + } +} + + +/* ############################ + * + */ + +BOOL is_error(DWORD ignorethis) +{ + if((lasterror == MAGIC_DEAD) || (lasterror == ignorethis)) + { + return FALSE; + } + return (lasterror != NO_ERROR); +} + + +/* ############################ + * + */ + +HMODULE loaddll(LPSTR dllname) +{ + HMODULE rc = NULL; + + + do_dead(); + rc = LoadLibraryA(dllname); + lasterror = GetLastError(); + + if ((opt_verbose) || (rc == NULL)) + { + trace("%p: LoadLibraryA(%s) => (0x%lx/%ld)\n", rc, + debugstr_a(dllname), lasterror, lasterror); + put_lasterror(); + } + if(rc != NULL) + { + lasterror = NO_ERROR; + } + return rc; + +} + + +/* ############################ + * + * Use "trace_" to print the Result from GetLastError() + * + */ + +VOID put_error_(const char * file, int line) +{ + INT status; + + status = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, + lasterror, 0, lasterror_buffer, LASTERROR_MAXLEN, NULL); + if(status) + { + trace_(file, line)("%08lx: (%ld) GetLastError() %s\n", lasterror, lasterror, + debugstr_a(lasterror_buffer)); + }else + { + trace_(file, line)("0x%08lx: (%ld) GetLastError()\n", lasterror, lasterror); + } +} + + + + +/* ############################ + * + */ + +VOID unloaddll(HMODULE * target) +{ + HMODULE hdll; + + hdll = *target; + + if(hdll) + { + FreeLibrary(hdll); + + } + *target = NULL; +} + + + +/* ############################ + * + */ + +DWORD create_test_environment(VOID) +{ + DWORD result = NO_ERROR; + + if (hwinspool == NULL) + { + HMODULE hntdll; + if(winetest_debug > 1) + { + opt_verbose = winetest_debug - 1; + } + + hwinspool = loaddll(winspool_nameA); + + ok(hwinspool != NULL, "LoadLibrary(%s) => 0x%lx/%ld\n", + debugstr_a(winspool_nameA), lasterror, lasterror); + + + /* some functions/options are not implemented in win9x */ + sys_isNT = (GetVersion() < 0x80000000); + + hntdll = LoadLibraryA("ntdll.dll"); + if (hntdll != NULL) + { + static DWORD (WINAPI *pwine_server_call)(LPBYTE); + + pwine_server_call = (VOID *) GetProcAddress(hntdll, + "wine_server_call"); + if(pwine_server_call != NULL) + { + trace("#### Welcome to WINE ####\n"); + sys_isNT = TRUE; + } + FreeLibrary(hntdll); + } + + + } + + return result; } + +/* ############################ + * + */ + +VOID shutdown_test_environment(VOID) +{ + + unloaddll(&hwinspool); + +} + + + +/* ############################ + * + */ + +static void show_winetest_info(void) +{ + + trace("%p: WINTEST_PLATFORM = %s\n", winetest_platform, debugstr_ca(winetest_platform)); + trace("%08x: WINTEST_DEBUG = %d\n", winetest_debug, winetest_debug); + trace("%08x: WINTEST_INTERACTIVE = %d\n", winetest_interactive, winetest_interactive); + trace("%p: %s loaded\n", hwinspool, debugstr_a(winspool_nameA)); +} + + START_TEST(info) { - test_default_printer(); - test_printer_directory(); + if(create_test_environment() == NO_ERROR) + { + show_winetest_info(); + } + shutdown_test_environment(); + }