localspl/tests: [2/2] Tests for OpenPort and ClosePort

Detlef Riekenberg wine.dev at web.de
Mon Sep 10 08:13:29 CDT 2007


Changelog:
- localspl/tests: Tests for OpenPort and ClosePort


-- 
 
By by ... Detlef

-------------- next part --------------
>From a8e968dd7d93d7e0040a5ac0239ddf6d98a73a29 Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Mon, 10 Sep 2007 15:03:27 +0200
Subject: [PATCH] localspl/tests: Tests for OpenPort and ClosePort
---
 dlls/localspl/tests/localmon.c |  278 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 277 insertions(+), 1 deletions(-)

diff --git a/dlls/localspl/tests/localmon.c b/dlls/localspl/tests/localmon.c
index 535a76b..cb167b7 100644
--- a/dlls/localspl/tests/localmon.c
+++ b/dlls/localspl/tests/localmon.c
@@ -1,7 +1,7 @@
 /* 
  * Unit test suite for localspl API functions: local print monitor
  *
- * Copyright 2006 Detlef Riekenberg
+ * Copyright 2006-2007 Detlef Riekenberg
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -96,9 +96,11 @@ static WCHAR num_999999W[] = {'9','9','9
 static CHAR  num_1000000A[] = "1000000";
 static WCHAR num_1000000W[] = {'1','0','0','0','0','0','0',0};
 
+static WCHAR portname_comW[]  = {'C','O','M',0};
 static WCHAR portname_com1W[] = {'C','O','M','1',':',0};
 static WCHAR portname_com2W[] = {'C','O','M','2',':',0};
 static WCHAR portname_fileW[] = {'F','I','L','E',':',0};
+static WCHAR portname_lptW[]  = {'L','P','T',0};
 static WCHAR portname_lpt1W[] = {'L','P','T','1',':',0};
 static WCHAR portname_lpt2W[] = {'L','P','T','2',':',0};
 static WCHAR server_does_not_existW[] = {'\\','\\','d','o','e','s','_','n','o','t','_','e','x','i','s','t',0};
@@ -116,6 +118,12 @@ static WCHAR wineW[] = {'W','i','n','e',
 static WCHAR tempdirW[MAX_PATH];
 static WCHAR tempfileW[MAX_PATH];
 
+#define PORTNAME_PREFIX  3
+#define PORTNAME_MINSIZE 5
+#define PORTNAME_MAXSIZE 10
+static WCHAR have_com[PORTNAME_MAXSIZE];
+static WCHAR have_lpt[PORTNAME_MAXSIZE];
+static WCHAR have_file[PORTNAME_MAXSIZE];
 
 /* ########################### */
 
@@ -135,6 +143,61 @@ static DWORD delete_port(LPWSTR portname
 
 /* ########################### */
 
+static void find_installed_ports(void)
+{
+    PORT_INFO_1W * pi = NULL;
+    WCHAR   nameW[PORTNAME_MAXSIZE];
+    DWORD   needed;
+    DWORD   returned;
+    DWORD   res;
+    DWORD   id;
+
+    have_com[0] = '\0';
+    have_lpt[0] = '\0';
+    have_file[0] = '\0';
+
+    if (!pEnumPorts) return;
+
+    res = pEnumPorts(NULL, 1, NULL, 0, &needed, &returned);
+    if (!res && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
+        pi = HeapAlloc(GetProcessHeap(), 0, needed);
+    }
+    res = pEnumPorts(NULL, 1, (LPBYTE) pi, needed, &needed, &returned);
+
+    if (!res) {
+        skip("no ports found\n");
+        return;
+    }
+
+    id = 0;
+    while (id < returned) {
+        res = lstrlenW(pi[id].pName);
+        if ((res >= PORTNAME_MINSIZE) && (res < PORTNAME_MAXSIZE) && 
+            (pi[id].pName[res-1] == ':')) {
+            /* copy only the prefix ("LPT" or "COM") */
+            memcpy(&nameW, pi[id].pName, PORTNAME_PREFIX * sizeof(WCHAR));
+            nameW[PORTNAME_PREFIX] = '\0';
+
+            if (!have_com[0] && (lstrcmpiW(nameW, portname_comW) == 0)) {
+                memcpy(&have_com, pi[id].pName, (res+1) * sizeof(WCHAR));
+            }
+
+            if (!have_lpt[0] && (lstrcmpiW(nameW, portname_lptW) == 0)) {
+                memcpy(&have_lpt, pi[id].pName, (res+1) * sizeof(WCHAR));
+            }
+
+            if (!have_file[0] && (lstrcmpiW(pi[id].pName, portname_fileW) == 0)) {
+                memcpy(&have_file, pi[id].pName, (res+1) * sizeof(WCHAR));
+            }
+        }
+        id++;
+    }
+
+    HeapFree(GetProcessHeap(), 0, pi);
+}
+
+/* ########################### */
+
 static void test_AddPort(void)
 {
     DWORD   res;
@@ -274,6 +337,103 @@ static void test_AddPortEx(void)
 }
 
 /* ########################### */
+
+static void test_ClosePort()
+{
+    HANDLE  hPort;
+    HANDLE  hPort2;
+    LPWSTR  nameW = NULL;
+    DWORD   res;
+    DWORD   res2;
+
+
+    if (!pOpenPort || !pClosePort) return;
+
+    if (have_com[0]) {
+        nameW = have_com;
+
+        hPort = (HANDLE) 0xdeadbeef;
+        res = pOpenPort(nameW, &hPort);
+        hPort2 = (HANDLE) 0xdeadbeef;
+        res2 = pOpenPort(nameW, &hPort2);
+
+        if (res2 && (hPort2 != hPort)) {
+            SetLastError(0xdeadbeef);
+            res2 = pClosePort(hPort2);
+            ok(res2, "got %u with %u (expected '!= 0')\n", res2, GetLastError());
+        }
+
+        if (res) {
+            SetLastError(0xdeadbeef);
+            res = pClosePort(hPort);
+            ok(res, "got %u with %u (expected '!= 0')\n", res, GetLastError());
+        }
+    }
+
+
+    if (have_lpt[0]) {
+        nameW = have_lpt;
+
+        hPort = (HANDLE) 0xdeadbeef;
+        res = pOpenPort(nameW, &hPort);
+        hPort2 = (HANDLE) 0xdeadbeef;
+        res2 = pOpenPort(nameW, &hPort2);
+
+        if (res2 && (hPort2 != hPort)) {
+            SetLastError(0xdeadbeef);
+            res2 = pClosePort(hPort2);
+            ok(res2, "got %u with %u (expected '!= 0')\n", res2, GetLastError());
+        }
+
+        if (res) {
+            SetLastError(0xdeadbeef);
+            res = pClosePort(hPort);
+            ok(res, "got %u with %u (expected '!= 0')\n", res, GetLastError());
+        }
+    }
+
+
+    if (have_file[0]) {
+        nameW = have_file;
+
+        hPort = (HANDLE) 0xdeadbeef;
+        res = pOpenPort(nameW, &hPort);
+        hPort2 = (HANDLE) 0xdeadbeef;
+        res2 = pOpenPort(nameW, &hPort2);
+
+        if (res2 && (hPort2 != hPort)) {
+            SetLastError(0xdeadbeef);
+            res2 = pClosePort(hPort2);
+            ok(res2, "got %u with %u (expected '!= 0')\n", res2, GetLastError());
+        }
+
+        if (res) {
+            SetLastError(0xdeadbeef);
+            res = pClosePort(hPort);
+            ok(res, "got %u with %u (expected '!= 0')\n", res, GetLastError());
+        }
+
+    }
+
+    if (0) {
+        /* an invalid HANDLE crash native localspl.dll */
+
+        SetLastError(0xdeadbeef);
+        res = pClosePort(NULL);
+        trace("got %u with %u\n", res, GetLastError());
+
+        SetLastError(0xdeadbeef);
+        res = pClosePort( (HANDLE) 0xdeadbeef);
+        trace("got %u with %u\n", res, GetLastError());
+
+        SetLastError(0xdeadbeef);
+        res = pClosePort(INVALID_HANDLE_VALUE);
+        trace("got %u with %u\n", res, GetLastError());
+    }
+
+}
+
+/* ########################### */
                                        
 static void test_ConfigurePort(void)
 {
@@ -465,6 +625,117 @@ static void test_InitializePrintMonitor(
         "returned %p with %u (expected %p)\n", res, GetLastError(), pm);
 }
 
+
+/* ########################### */
+
+static void test_OpenPort()
+{
+    HANDLE  hPort;
+    HANDLE  hPort2;
+    LPWSTR  nameW = NULL;
+    DWORD   res;
+    DWORD   res2;
+
+    if (!pOpenPort || !pClosePort) return;
+
+    if (have_com[0]) {
+        nameW = have_com;
+
+        hPort = (HANDLE) 0xdeadbeef;
+        SetLastError(0xdeadbeef);
+        res = pOpenPort(nameW, &hPort);
+        ok( res, "got %u with %u and %p (expected '!= 0')\n",
+            res, GetLastError(), hPort);
+
+        /* the same HANDLE is returned for a second OpenPort in native localspl */
+        hPort2 = (HANDLE) 0xdeadbeef;
+        SetLastError(0xdeadbeef);
+        res2 = pOpenPort(nameW, &hPort2);
+        ok( res2, "got %u with %u and %p (expected '!= 0')\n",
+            res2, GetLastError(), hPort2);
+
+        if (res) pClosePort(hPort);
+        if (res2 && (hPort2 != hPort)) pClosePort(hPort2);
+    }
+
+    if (have_lpt[0]) {
+        nameW = have_lpt;
+
+        hPort = (HANDLE) 0xdeadbeef;
+        SetLastError(0xdeadbeef);
+        res = pOpenPort(nameW, &hPort);
+        ok( res || (GetLastError() == ERROR_ACCESS_DENIED), 
+            "got %u with %u and %p (expected '!= 0' or '0' with ERROR_ACCESS_DENIED)\n",
+            res, GetLastError(), hPort);
+
+        /* the same HANDLE is returned for a second OpenPort in native localspl */
+        hPort2 = (HANDLE) 0xdeadbeef;
+        SetLastError(0xdeadbeef);
+        res2 = pOpenPort(nameW, &hPort2);
+        ok( res2 || (GetLastError() == ERROR_ACCESS_DENIED), 
+            "got %u with %u and %p (expected '!= 0' or '0' with ERROR_ACCESS_DENIED)\n",
+            res2, GetLastError(), hPort2);
+
+        if (res) pClosePort(hPort);
+        if (res2 && (hPort2 != hPort)) pClosePort(hPort2);
+    }
+
+    if (have_file[0]) {
+        nameW = have_file;
+
+        hPort = (HANDLE) 0xdeadbeef;
+        SetLastError(0xdeadbeef);
+        res = pOpenPort(nameW, &hPort);
+        ok( res, "got %u with %u and %p (expected '!= 0')\n",
+            res, GetLastError(), hPort);
+
+        /* a different HANDLE is returned for a second OpenPort */
+        hPort2 = (HANDLE) 0xdeadbeef;
+        SetLastError(0xdeadbeef);
+        res2 = pOpenPort(nameW, &hPort2);
+        ok( res2 && (hPort2 != hPort),
+            "got %u with %u and %p (expected '!= 0' and '!= %p')\n",
+            res2, GetLastError(), hPort2, hPort);
+
+        if (res) pClosePort(hPort);
+        if (res2 && (hPort2 != hPort)) pClosePort(hPort2);
+    }
+
+    if (0) {
+        /* this test crash native localspl (w2k+xp) */
+        if (nameW) {
+            hPort = (HANDLE) 0xdeadbeef;
+            SetLastError(0xdeadbeef);
+            res = pOpenPort(nameW, NULL);
+            trace("got %u with %u and %p\n", res, GetLastError(), hPort);
+        }
+    }
+
+    hPort = (HANDLE) 0xdeadbeef;
+    SetLastError(0xdeadbeef);
+    res = pOpenPort(does_not_existW, &hPort);
+    ok (!res && (hPort == (HANDLE) 0xdeadbeef),
+        "got %u with 0x%x and %p (expectet '0' and 0xdeadbeef)\n", res, GetLastError(), hPort);
+    if (res) pClosePort(hPort);
+
+    hPort = (HANDLE) 0xdeadbeef;
+    SetLastError(0xdeadbeef);
+    res = pOpenPort(emptyW, &hPort);
+    ok (!res && (hPort == (HANDLE) 0xdeadbeef),
+        "got %u with 0x%x and %p (expectet '0' and 0xdeadbeef)\n", res, GetLastError(), hPort);
+    if (res) pClosePort(hPort);
+
+
+    /* NULL as name crash native localspl (w2k+xp) */
+    if (0) {
+        hPort = (HANDLE) 0xdeadbeef;
+        SetLastError(0xdeadbeef);
+        res = pOpenPort(NULL, &hPort);
+        trace("got %u with %u and %p\n", res, GetLastError(), hPort);
+    }
+
+}
+
 /* ########################### */
 
 static void test_XcvClosePort(void)
@@ -1151,11 +1422,16 @@ START_TEST(localmon)
 
     test_InitializePrintMonitor();
 
+    find_installed_ports();
+
     test_AddPort();
     test_AddPortEx();
+    test_ClosePort();
     test_ConfigurePort();
     test_DeletePort();
     test_EnumPorts();
+    test_OpenPort();
+
     if ( !hXcv ) {
         skip("Xcv not supported\n");
     }
-- 
1.4.1



More information about the wine-patches mailing list