Detlef Riekenberg : winspool/tests: Add tests for AddPortEx.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jun 18 08:05:05 CDT 2007


Module: wine
Branch: master
Commit: 4307f6428f1dc8bc579ae39cffc048df5c45dc86
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4307f6428f1dc8bc579ae39cffc048df5c45dc86

Author: Detlef Riekenberg <wine.dev at web.de>
Date:   Mon Jun 18 00:58:49 2007 +0200

winspool/tests: Add tests for AddPortEx.

---

 dlls/winspool.drv/info.c       |   21 +++----
 dlls/winspool.drv/tests/info.c |  117 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 126 insertions(+), 12 deletions(-)

diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c
index d78964b..822fde4 100644
--- a/dlls/winspool.drv/info.c
+++ b/dlls/winspool.drv/info.c
@@ -6144,29 +6144,26 @@ BOOL WINAPI AddPortExW(LPWSTR pName, DWORD level, LPBYTE pBuffer, LPWSTR pMonito
         return FALSE;
     }
 
-    if (!pi2) {
+    if ((!pi2) || (!pMonitorName) || (!pMonitorName[0])) {
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
 
-    /* we need a valid Monitorname */
-    if (!pMonitorName) {
-        SetLastError(RPC_X_NULL_REF_POINTER);
-        return FALSE;
-    }
-    if (!pMonitorName[0]) {
-        SetLastError(ERROR_NOT_SUPPORTED);
-        return FALSE;
-    }
-
     /* load the Monitor */
     pm = monitor_load(pMonitorName, NULL);
-    if (!pm) return FALSE;
+    if (!pm) {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
 
     if (pm->monitor && pm->monitor->pfnAddPortEx) {
         res = pm->monitor->pfnAddPortEx(pName, level, pBuffer, pMonitorName);
         TRACE("got %u with %u\n", res, GetLastError());
     }
+    else
+    {
+        FIXME("not implemented for %s (%p)\n", debugstr_w(pMonitorName), pm->monitor);
+    }
     monitor_unload(pm);
     return res;
 }
diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c
index a1dafe6..c743768 100644
--- a/dlls/winspool.drv/tests/info.c
+++ b/dlls/winspool.drv/tests/info.c
@@ -45,6 +45,7 @@ static CHAR env_x86[]           = "Windows NT x86";
 static CHAR env_win9x_case[]    = "windowS 4.0";
 static CHAR illegal_name[]      = "illegal,name";
 static CHAR invalid_env[]       = "invalid_env";
+static CHAR LocalPortA[]        = "Local Port";
 static CHAR portname_com1[]     = "COM1:";
 static CHAR portname_file[]     = "FILE:";
 static CHAR portname_lpt1[]     = "LPT1:";
@@ -67,6 +68,7 @@ static HANDLE  hwinspool;
 static FARPROC pGetDefaultPrinterA;
 static FARPROC pSetDefaultPrinterA;
 static DWORD (WINAPI * pXcvDataW)(HANDLE, LPCWSTR, PBYTE, DWORD, PBYTE, DWORD, PDWORD, PDWORD);
+static BOOL  (WINAPI * pAddPortExA)(LPSTR, DWORD, LPBYTE, LPSTR);
 
 
 /* ################################ */
@@ -461,6 +463,119 @@ static void test_AddPort(void)
 
 /* ########################### */
 
+static void test_AddPortEx(void)
+{
+    PORT_INFO_2A pi;
+    DWORD   res;
+
+
+    if (!pAddPortExA) {
+        skip("AddPortEx not supported\n");
+        return;
+    }
+
+    /* start test with a clean system */
+    DeletePortA(NULL, 0, tempfileA);
+
+    pi.pPortName = tempfileA;
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 1, (LPBYTE) &pi, LocalPortA);
+    RETURN_ON_DEACTIVATED_SPOOLER(res)
+
+    /* Allowed only for (Printer-)Administrators.
+       W2K+XP: ERROR_INVALID_PARAMETER  */
+    if (!res && (GetLastError() == ERROR_INVALID_PARAMETER)) {
+        skip("ACCESS_DENIED (ERROR_INVALID_PARAMETER)\n");
+        return;
+    }
+    ok( res, "got %u with %u (expected '!= 0')\n", res, GetLastError());
+
+    /* Add a port, that already exist */
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 1, (LPBYTE) &pi, LocalPortA);
+    ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "got %u with %u (expected '0' with ERROR_INVALID_PARAMETER)\n",
+        res, GetLastError());
+    DeletePortA(NULL, 0, tempfileA);
+
+
+    /* the Monitorname must match */
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 1, (LPBYTE) &pi, NULL);
+    ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "got %u with %u (expected '0' with ERROR_INVALID_PARAMETER)\n",
+        res, GetLastError());
+    if (res) DeletePortA(NULL, 0, tempfileA);
+
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 1, (LPBYTE) &pi, empty);
+    ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "got %u with %u (expected '0' with ERROR_INVALID_PARAMETER)\n",
+        res, GetLastError());
+    if (res) DeletePortA(NULL, 0, tempfileA);
+
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 1, (LPBYTE) &pi, does_not_exist);
+    ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "got %u with %u (expected '0' with ERROR_INVALID_PARAMETER)\n",
+        res, GetLastError());
+    if (res) DeletePortA(NULL, 0, tempfileA);
+
+
+    /* We need a Portname */
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 1, NULL, LocalPortA);
+    ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "got %u with %u (expected '0' with ERROR_INVALID_PARAMETER)\n",
+        res, GetLastError());
+
+    pi.pPortName = NULL;
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 1, (LPBYTE) &pi, LocalPortA);
+    ok( !res && (GetLastError() == ERROR_INVALID_PARAMETER),
+        "got %u with %u (expected '0' with ERROR_INVALID_PARAMETER)\n",
+        res, GetLastError());
+    if (res) DeletePortA(NULL, 0, tempfileA);
+
+
+    /*  level 2 is documented as supported for Printmonitors,
+        but that is not supported for "Local Port" (localspl.dll) and
+        AddPortEx fails with ERROR_INVALID_LEVEL */
+
+    pi.pPortName = tempfileA;
+    pi.pMonitorName = LocalPortA;
+    pi.pDescription = winetest;
+    pi.fPortType = PORT_TYPE_WRITE;
+
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 2, (LPBYTE) &pi, LocalPortA);
+    ok( !res && (GetLastError() == ERROR_INVALID_LEVEL),
+        "got %u with %u (expected '0' with ERROR_INVALID_LEVEL)\n",
+        res, GetLastError());
+    if (res) DeletePortA(NULL, 0, tempfileA);
+
+
+    /* invalid levels */
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 0, (LPBYTE) &pi, LocalPortA);
+    ok( !res && (GetLastError() == ERROR_INVALID_LEVEL),
+        "got %u with %u (expected '0' with ERROR_INVALID_LEVEL)\n",
+        res, GetLastError());
+
+    SetLastError(0xdeadbeef);
+    res = pAddPortExA(NULL, 3, (LPBYTE) &pi, LocalPortA);
+    ok( !res && (GetLastError() == ERROR_INVALID_LEVEL),
+        "got %u with %u (expected '0' with ERROR_INVALID_LEVEL)\n",
+        res, GetLastError());
+
+
+    /* cleanup */
+    DeletePortA(NULL, 0, tempfileA);
+
+}
+
+/* ########################### */
+
 static void test_ConfigurePort(void)
 {
     DWORD   res;
@@ -2113,6 +2228,7 @@ START_TEST(info)
     pGetDefaultPrinterA = (void *) GetProcAddress(hwinspool, "GetDefaultPrinterA");
     pSetDefaultPrinterA = (void *) GetProcAddress(hwinspool, "SetDefaultPrinterA");
     pXcvDataW = (void *) GetProcAddress(hwinspool, "XcvDataW");
+    pAddPortExA = (void *) GetProcAddress(hwinspool, "AddPortExA");
 
     find_default_printer();
     find_local_server();
@@ -2120,6 +2236,7 @@ START_TEST(info)
 
     test_AddMonitor();
     test_AddPort();
+    test_AddPortEx();
     test_ConfigurePort();
     test_DeleteMonitor();
     test_DeletePort();




More information about the wine-cvs mailing list