Detlef Riekenberg : winspool: Basic tests for AddMonitor.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Apr 12 04:52:12 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: f0a95868798b826023168a42cd49a6eadb1295ff
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=f0a95868798b826023168a42cd49a6eadb1295ff
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Mon Apr 10 00:29:22 2006 +0200
winspool: Basic tests for AddMonitor.
---
dlls/winspool/tests/info.c | 225 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 224 insertions(+), 1 deletions(-)
diff --git a/dlls/winspool/tests/info.c b/dlls/winspool/tests/info.c
index 74ab592..3574003 100644
--- a/dlls/winspool/tests/info.c
+++ b/dlls/winspool/tests/info.c
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2003, 2004 Stefan Leichter
- * Copyright (C) 2005 Detlef Riekenberg
+ * Copyright (C) 2005, 2006 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -32,11 +32,17 @@
static char env_x86[] = "Windows NT x86";
static char env_win9x_case[] = "windowS 4.0";
+static char winetest_monitor[] = "winetest";
static HANDLE hwinspool;
static FARPROC pGetDefaultPrinterA;
static FARPROC pSetDefaultPrinterA;
+struct monitor_entry {
+ LPSTR env;
+ LPSTR dllname;
+};
+
/* report common behavior only once */
static DWORD report_deactivated_spooler = 1;
#define RETURN_ON_DEACTIVATED_SPOOLER(res) \
@@ -106,6 +112,222 @@ static LPSTR find_default_printer(VOID)
return default_printer;
}
+
+static struct monitor_entry * find_installed_monitor(void)
+{
+ MONITOR_INFO_2A mi2a;
+ static struct monitor_entry * entry = NULL;
+ DWORD res;
+ DWORD num_tests;
+ DWORD i = 0;
+
+ static struct monitor_entry monitor_table[] = {
+ {env_win9x_case, "localspl.dll"},
+ {env_x86, "localspl.dll"},
+ {env_win9x_case, "localmon.dll"},
+ {env_x86, "localmon.dll"},
+ {env_win9x_case, "tcpmon.dll"},
+ {env_x86, "tcpmon.dll"},
+ {env_win9x_case, "usbmon.dll"},
+ {env_x86, "usbmon.dll"},
+ {env_win9x_case, "mspp32.dll"},
+ {env_x86, "win32spl.dll"},
+ {env_x86, "redmonnt.dll"},
+ {env_x86, "redmon35.dll"},
+ {env_win9x_case, "redmon95.dll"},
+ {env_x86, "pdfcmnnt.dll"},
+ {env_win9x_case, "pdfcmn95.dll"},
+ };
+
+ if (entry) return entry;
+
+ num_tests = (sizeof(monitor_table)/sizeof(struct monitor_entry));
+
+ SetLastError(MAGIC_DEAD);
+ res = DeleteMonitorA(NULL, NULL, NULL);
+ if (!res && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) {
+ trace("DeleteMonitorA() not implemented yet\n");
+ return NULL;
+ }
+
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 0, NULL);
+ if (!res && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) {
+ trace("AddMonitorA() not implemented yet\n");
+ return NULL;
+ }
+
+ /* cleanup */
+ DeleteMonitorA(NULL, env_x86, winetest_monitor);
+ DeleteMonitorA(NULL, env_win9x_case, winetest_monitor);
+
+ /* find a usable monitor from the table */
+ mi2a.pName = winetest_monitor;
+ while ((entry == NULL) && (i < num_tests)) {
+ entry = &monitor_table[i];
+ i++;
+ mi2a.pEnvironment = entry->env;
+ mi2a.pDLLName = entry->dllname;
+
+ if (AddMonitorA(NULL, 2, (LPBYTE) &mi2a)) {
+ /* we got one */
+ trace("using '%s', '%s'\n", entry->env, entry->dllname);
+ DeleteMonitorA(NULL, entry->env, winetest_monitor);
+ }
+ else
+ {
+ entry = NULL;
+ }
+ }
+ return entry;
+}
+
+/* ########################### */
+
+
+static void test_AddMonitor(void)
+{
+ MONITOR_INFO_2A mi2a;
+ struct monitor_entry * entry = NULL;
+ DWORD res;
+
+ entry = find_installed_monitor();
+
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 1, NULL);
+ ok(!res && (GetLastError() == ERROR_INVALID_LEVEL),
+ "returned %ld with %ld (expected '0' with ERROR_INVALID_LEVEL)\n",
+ res, GetLastError());
+
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 3, NULL);
+ ok(!res && (GetLastError() == ERROR_INVALID_LEVEL),
+ "returned %ld with %ld (expected '0' with ERROR_INVALID_LEVEL)\n",
+ res, GetLastError());
+
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, NULL);
+ /* NT: unchanged, 9x: ERROR_PRIVILEGE_NOT_HELD */
+ ok(!res &&
+ ((GetLastError() == MAGIC_DEAD) ||
+ (GetLastError() == ERROR_PRIVILEGE_NOT_HELD)),
+ "returned %ld with %ld (expected '0' with: MAGIC_DEAD or " \
+ "ERROR_PRIVILEGE_NOT_HELD)\n", res, GetLastError());
+
+ ZeroMemory(&mi2a, sizeof(MONITOR_INFO_2A));
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ RETURN_ON_DEACTIVATED_SPOOLER(res)
+
+ if (!res && (GetLastError() == ERROR_ACCESS_DENIED)) {
+ trace("skip tests (ACCESS_DENIED)\n");
+ return;
+ }
+
+ /* NT: ERROR_INVALID_PARAMETER, 9x: ERROR_INVALID_ENVIRONMENT */
+ ok(!res && ((GetLastError() == ERROR_INVALID_PARAMETER) ||
+ (GetLastError() == ERROR_INVALID_ENVIRONMENT)),
+ "returned %ld with %ld (expected '0' with: ERROR_INVALID_PARAMETER or " \
+ "ERROR_INVALID_ENVIRONMENT)\n", res, GetLastError());
+
+ if (!entry) {
+ trace("No usable Monitor found: Skip tests\n");
+ return;
+ }
+
+#if 0
+ /* The Test is deactivated, because when mi2a.pName is NULL, the subkey
+ HKLM\System\CurrentControlSet\Control\Print\Monitors\C:\WINDOWS\SYSTEM
+ or HKLM\System\CurrentControlSet\Control\Print\Monitors\ì
+ is created on win9x and we do not want to hit this bug here. */
+
+ mi2a.pEnvironment = entry->env;
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ /* NT: ERROR_INVALID_PARAMETER, 9x: ERROR_PRIVILEGE_NOT_HELD */
+#endif
+
+ mi2a.pEnvironment = entry->env;
+ mi2a.pName = "";
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ /* NT: ERROR_INVALID_PARAMETER, 9x: ERROR_PRIVILEGE_NOT_HELD */
+ ok( !res &&
+ ((GetLastError() == ERROR_INVALID_PARAMETER) ||
+ (GetLastError() == ERROR_PRIVILEGE_NOT_HELD)),
+ "returned %ld with %ld (expected '0' with: ERROR_INVALID_PARAMETER or " \
+ "ERROR_PRIVILEGE_NOT_HELD)\n",
+ res, GetLastError());
+
+ mi2a.pName = winetest_monitor;
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ /* NT: ERROR_INVALID_PARAMETER, 9x: ERROR_PRIVILEGE_NOT_HELD */
+ ok( !res &&
+ ((GetLastError() == ERROR_INVALID_PARAMETER) ||
+ (GetLastError() == ERROR_PRIVILEGE_NOT_HELD)),
+ "returned %ld with %ld (expected '0' with: ERROR_INVALID_PARAMETER or " \
+ "ERROR_PRIVILEGE_NOT_HELD)\n",
+ res, GetLastError());
+
+ mi2a.pDLLName = "";
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
+ "returned %ld with %ld (expected '0' with ERROR_INVALID_PARAMETER)\n",
+ res, GetLastError());
+
+
+ mi2a.pDLLName = "does_not_exists.dll";
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ /* NT: ERROR_MOD_NOT_FOUND, 9x: ERROR_INVALID_PARAMETER */
+ ok( !res &&
+ ((GetLastError() == ERROR_MOD_NOT_FOUND) ||
+ (GetLastError() == ERROR_INVALID_PARAMETER)),
+ "returned %ld with %ld (expected '0' with: ERROR_MOD_NOT_FOUND or " \
+ "ERROR_INVALID_PARAMETER)\n", res, GetLastError());
+
+ mi2a.pDLLName = "version.dll";
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ /* NT: ERROR_PROC_NOT_FOUND, 9x: ERROR_INVALID_PARAMETER */
+ todo_wine {
+ ok( !res &&
+ ((GetLastError() == ERROR_PROC_NOT_FOUND) ||
+ (GetLastError() == ERROR_INVALID_PARAMETER)),
+ "returned %ld with %ld (expected '0' with: ERROR_PROC_NOT_FOUND or " \
+ "ERROR_INVALID_PARAMETER)\n", res, GetLastError());
+ if (res) DeleteMonitorA(NULL, entry->env, winetest_monitor);
+ }
+
+ /* Test AddMonitor with real options */
+ mi2a.pDLLName = entry->dllname;
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ ok(res, "returned %ld with %ld (expected '!= 0')\n", res, GetLastError());
+
+ /* add a monitor twice */
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA(NULL, 2, (LPBYTE) &mi2a);
+ /* NT: ERROR_PRINT_MONITOR_ALREADY_INSTALLED (3006), 9x: ERROR_ALREADY_EXISTS (183) */
+ ok( !res &&
+ ((GetLastError() == ERROR_PRINT_MONITOR_ALREADY_INSTALLED) ||
+ (GetLastError() == ERROR_ALREADY_EXISTS)),
+ "returned %ld with %ld (expected '0' with: " \
+ "ERROR_PRINT_MONITOR_ALREADY_INSTALLED or ERROR_ALREADY_EXISTS)\n",
+ res, GetLastError());
+
+ DeleteMonitorA(NULL, entry->env, winetest_monitor);
+ SetLastError(MAGIC_DEAD);
+ res = AddMonitorA("", 2, (LPBYTE) &mi2a);
+ ok(res, "returned %ld with %ld (expected '!= 0')\n", res, GetLastError());
+
+ /* cleanup */
+ DeleteMonitorA(NULL, entry->env, winetest_monitor);
+
+}
+
/* ########################### */
static void test_EnumMonitors(void)
@@ -698,6 +920,7 @@ START_TEST(info)
find_default_printer();
+ test_AddMonitor();
test_EnumMonitors();
test_GetDefaultPrinter();
test_GetPrinterDriverDirectory();
More information about the wine-cvs
mailing list