winspool/tests: Add test for XcvDataW,MonitorUI.

This commit is contained in:
Detlef Riekenberg 2007-02-02 00:46:03 +01:00 committed by Alexandre Julliard
parent e463110e22
commit db9d152e42
1 changed files with 134 additions and 4 deletions

View File

@ -45,10 +45,19 @@ static CHAR portname_lpt1[] = "LPT1:";
static CHAR server_does_not_exist[] = "\\does_not_exist";
static CHAR version_dll[] = "version.dll";
static CHAR winetest[] = "winetest";
static CHAR xcv_localport[] = ",XcvMonitor Local Port";
static WCHAR cmd_MonitorUIW[] = {'M','o','n','i','t','o','r','U','I',0};
static WCHAR emptyW[] = {0};
static HANDLE hwinspool;
static FARPROC pGetDefaultPrinterA;
static FARPROC pSetDefaultPrinterA;
static DWORD (WINAPI * pXcvDataW)(HANDLE, LPCWSTR, PBYTE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
/* ################################ */
struct monitor_entry {
LPSTR env;
@ -1496,6 +1505,126 @@ static void test_SetDefaultPrinter(void)
}
/* ########################### */
static void test_XcvDataW_MonitorUI(void)
{
DWORD res;
HANDLE hXcv;
BYTE buffer[MAX_PATH + 4];
DWORD needed;
DWORD status;
DWORD len;
PRINTER_DEFAULTSA pd;
/* api is not present before w2k */
if (pXcvDataW == NULL) return;
pd.pDatatype = NULL;
pd.pDevMode = NULL;
pd.DesiredAccess = SERVER_ACCESS_ADMINISTER;
hXcv = NULL;
SetLastError(0xdeadbeef);
res = OpenPrinter(xcv_localport, &hXcv, &pd);
RETURN_ON_DEACTIVATED_SPOOLER(res)
ok(res, "returned %d with %u and handle %p (expected '!= 0')\n", res, GetLastError(), hXcv);
if (!res) return;
/* ask for needed size */
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, cmd_MonitorUIW, NULL, 0, NULL, 0, &needed, &status);
ok( res && (status == ERROR_INSUFFICIENT_BUFFER) && (needed <= MAX_PATH),
"returned %d with %u and %u for status %u (expected '!= 0' and "
"'<= MAX_PATH' for status ERROR_INSUFFICIENT_BUFFER)\n",
res, GetLastError(), needed, status);
if (needed > MAX_PATH) {
ClosePrinter(hXcv);
skip("buffer overflow (%u)\n", needed);
return;
}
len = needed; /* Size is in bytes */
/* the command is required */
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, emptyW, NULL, 0, NULL, 0, &needed, &status);
ok( res && (status == ERROR_INVALID_PARAMETER),
"returned %d with %u and %u for status %u (expected '!= 0' with "
"ERROR_INVALID_PARAMETER)\n", res, GetLastError(), needed, status);
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, NULL, NULL, 0, buffer, MAX_PATH, &needed, &status);
ok( !res && (GetLastError() == RPC_X_NULL_REF_POINTER),
"returned %d with %u and %u for status %u (expected '0' with "
"RPC_X_NULL_REF_POINTER)\n", res, GetLastError(), needed, status);
/* "PDWORD needed" is checked before RPC-Errors */
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, cmd_MonitorUIW, NULL, 0, buffer, len, NULL, &status);
ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
"returned %d with %u and %u for status %u (expected '0' with "
"ERROR_INVALID_PARAMETER)\n", res, GetLastError(), needed, status);
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, cmd_MonitorUIW, NULL, 0, NULL, len, &needed, &status);
ok( !res && (GetLastError() == RPC_X_NULL_REF_POINTER),
"returned %d with %u and %u for status %u (expected '0' with "
"RPC_X_NULL_REF_POINTER)\n", res, GetLastError(), needed, status);
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, cmd_MonitorUIW, NULL, 0, buffer, len, &needed, NULL);
ok( !res && (GetLastError() == RPC_X_NULL_REF_POINTER),
"returned %d with %u and %u for status %u (expected '0' with "
"RPC_X_NULL_REF_POINTER)\n", res, GetLastError(), needed, status);
/* off by one: larger */
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, cmd_MonitorUIW, NULL, 0, buffer, len+1, &needed, &status);
ok( res && (status == ERROR_SUCCESS),
"returned %d with %u and %u for status %u (expected '!= 0' for status "
"ERROR_SUCCESS)\n", res, GetLastError(), needed, status);
/* off by one: smaller */
/* the buffer is not modified for NT4, w2k, XP */
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, cmd_MonitorUIW, NULL, 0, buffer, len-1, &needed, &status);
ok( res && (status == ERROR_INSUFFICIENT_BUFFER),
"returned %d with %u and %u for status %u (expected '!= 0' for status "
"ERROR_INSUFFICIENT_BUFFER)\n", res, GetLastError(), needed, status);
/* Normal use. The DLL-Name without a Path is returned */
memset(buffer, 0, len);
needed = (DWORD) 0xdeadbeef;
status = (DWORD) 0xdeadbeef;
SetLastError(0xdeadbeef);
res = pXcvDataW(hXcv, cmd_MonitorUIW, NULL, 0, buffer, len, &needed, &status);
ok( res && (status == ERROR_SUCCESS),
"returned %d with %u and %u for status %u (expected '!= 0' for status "
"ERROR_SUCCESS)\n", res, GetLastError(), needed, status);
ClosePrinter(hXcv);
}
/* ########################### */
static void test_GetPrinterDriver(void)
{
HANDLE hprn;
@ -1703,6 +1832,7 @@ START_TEST(info)
hwinspool = GetModuleHandleA("winspool.drv");
pGetDefaultPrinterA = (void *) GetProcAddress(hwinspool, "GetDefaultPrinterA");
pSetDefaultPrinterA = (void *) GetProcAddress(hwinspool, "SetDefaultPrinterA");
pXcvDataW = (void *) GetProcAddress(hwinspool, "XcvDataW");
find_default_printer();
find_local_server();
@ -1717,12 +1847,12 @@ START_TEST(info)
if (default_printer) test_EnumForms(default_printer);
test_EnumMonitors();
test_EnumPorts();
test_EnumPrinters();
test_GetDefaultPrinter();
test_GetPrinterDriverDirectory();
test_GetPrintProcessorDirectory();
test_OpenPrinter();
test_GetPrinterDriver();
test_SetDefaultPrinter();
test_EnumPrinters();
test_XcvDataW_MonitorUI();
}