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