[PATCH] shdocvw/tests: Add tests for ParseURLFromOutsideSource

Detlef Riekenberg wine.dev at web.de
Tue Dec 23 04:48:12 CST 2008


---
 dlls/shdocvw/tests/shdocvw.c |  187 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 187 insertions(+), 0 deletions(-)

diff --git a/dlls/shdocvw/tests/shdocvw.c b/dlls/shdocvw/tests/shdocvw.c
index a2d9e9e..785cba4 100644
--- a/dlls/shdocvw/tests/shdocvw.c
+++ b/dlls/shdocvw/tests/shdocvw.c
@@ -25,6 +25,7 @@
 #include "winbase.h"
 #include "winreg.h"
 #include "wininet.h"
+#include "winnls.h"
 
 #include "wine/test.h"
 
@@ -32,6 +33,8 @@
 
 static HMODULE hshdocvw;
 static HRESULT (WINAPI *pURLSubRegQueryA)(LPCSTR, LPCSTR, DWORD, LPVOID, DWORD, DWORD);
+static DWORD (WINAPI *pParseURLFromOutsideSourceA)(LPCSTR, LPSTR, LPDWORD, LPDWORD);
+static DWORD (WINAPI *pParseURLFromOutsideSourceW)(LPCWSTR, LPWSTR, LPDWORD, LPDWORD);
 
 static CHAR appdata[] = "AppData";
 static CHAR common_appdata[] = "Common AppData";
@@ -43,10 +46,36 @@ static CHAR start_page[] = "Start Page";
 
 /* ################ */
 
+static const  struct {
+    const char *url;
+    const char *newurl;
+    DWORD len;
+} ParseURL_table[] = {
+    {"http://www.winehq.org", "http://www.winehq.org/", 22},
+    {"www.winehq.org", "http://www.winehq.org/", 22},
+    {"winehq.org", "http://winehq.org/", 18},
+    {"ftp.winehq.org", "ftp://ftp.winehq.org/", 21},
+    {"http://winehq.org", "http://winehq.org/", 18},
+    {"https://winehq.org", "https://winehq.org/", 19},
+    {"https://www.winehq.org", "https://www.winehq.org/", 23},
+    {"ftp://winehq.org", "ftp://winehq.org/", 17},
+    {"ftp://ftp.winehq.org", "ftp://ftp.winehq.org/", 21},
+    {"about:blank", "about:blank", 11},
+    {"about:home", "about:home", 10},
+    {"about:mozilla", "about:mozilla", 13},
+    /* a space at the start is not allowed */
+    {" http://www.winehq.org", "http://%20http://www.winehq.org", 31}
+    
+};
+
+/* ################ */
+
 static void init_functions(void)
 {
     hshdocvw = LoadLibraryA("shdocvw.dll");
     pURLSubRegQueryA = (void *) GetProcAddress(hshdocvw, (LPSTR) 151);
+    pParseURLFromOutsideSourceA = (void *) GetProcAddress(hshdocvw, (LPSTR) 169);
+    pParseURLFromOutsideSourceW = (void *) GetProcAddress(hshdocvw, (LPSTR) 170);
 }
 
 /* ################ */
@@ -164,8 +193,166 @@ static void test_URLSubRegQueryA(void)
 
 /* ################ */
 
+static void test_ParseURLFromOutsideSourceA(void)
+{
+    CHAR buffer[INTERNET_MAX_URL_LENGTH];
+    DWORD dummy;
+    DWORD maxlen;
+    DWORD len;
+    DWORD res;
+    int i;
+
+    if (!pParseURLFromOutsideSourceA) {
+        skip("ParseURLFromOutsideSourceA not found\n");
+        return;
+    }
+
+    for(i = 0; i < sizeof(ParseURL_table)/sizeof(ParseURL_table[0]); i++) {
+        memset(buffer, '#', sizeof(buffer)-1);
+        buffer[sizeof(buffer)-1] = '\0';
+        len = sizeof(buffer);
+        dummy = 0;
+        /* on success, len+1 is returned. No idea, if someone depend on this */
+        res = pParseURLFromOutsideSourceA(ParseURL_table[i].url, buffer, &len, &dummy);
+        /* len does not include the terminating 0, when buffer is large enough */
+        ok( res != 0 && len == ParseURL_table[i].len && 
+            !lstrcmpA(buffer, ParseURL_table[i].newurl),
+            "#%d: got %d and %d with '%s' (expected '!=0' and %d with '%s')\n",
+            i, res, len, buffer, ParseURL_table[i].len, ParseURL_table[i].newurl);
+
+
+        /* use the size test only for the first examples */
+        if (i > 4) continue;
+
+        maxlen = len;
+    
+        memset(buffer, '#', sizeof(buffer)-1);
+        buffer[sizeof(buffer)-1] = '\0';
+        len = maxlen + 1;
+        dummy = 0;
+        res = pParseURLFromOutsideSourceA(ParseURL_table[i].url, buffer, &len, &dummy);
+        ok( res != 0 && len == ParseURL_table[i].len && 
+            !lstrcmpA(buffer, ParseURL_table[i].newurl),
+            "#%d (+1): got %d and %d with '%s' (expected '!=0' and %d with '%s')\n",
+            i, res, len, buffer, ParseURL_table[i].len, ParseURL_table[i].newurl);
+
+        memset(buffer, '#', sizeof(buffer)-1);
+        buffer[sizeof(buffer)-1] = '\0';
+        len = maxlen;
+        dummy = 0;
+        res = pParseURLFromOutsideSourceA(ParseURL_table[i].url, buffer, &len, &dummy);
+        /* len includes the terminating 0, when the buffer is to small */
+        ok( res == 0 && len == ParseURL_table[i].len + 1,
+            "#%d (==): got %d and %d (expected '0' and %d)\n",
+            i, res, len, ParseURL_table[i].len + 1);
+
+        memset(buffer, '#', sizeof(buffer)-1);
+        buffer[sizeof(buffer)-1] = '\0';
+        len = maxlen-1;
+        dummy = 0;
+        res = pParseURLFromOutsideSourceA(ParseURL_table[i].url, buffer, &len, &dummy);
+        ok( res == 0 && len == ParseURL_table[i].len + 1,
+            "#%d (-1): got %d and %d (expected '0' and %d)\n",
+            i, res, len, ParseURL_table[i].len + 1);
+
+        memset(buffer, '#', sizeof(buffer)-1);
+        buffer[sizeof(buffer)-1] = '\0';
+        len = maxlen+1;
+        dummy = 0;
+        res = pParseURLFromOutsideSourceA(ParseURL_table[i].url, NULL, &len, &dummy);
+        /* len does not include the terminating 0, when buffer is NULL */
+        ok( res == 0 && len == ParseURL_table[i].len,
+            "#%d (buffer): got %d and %d (expected '0' and %d)\n",
+            i, res, len, ParseURL_table[i].len);
+
+        if (0) {
+            /* that test crash on native shdocvw */
+            res = pParseURLFromOutsideSourceA(ParseURL_table[i].url, buffer, NULL, &dummy);
+        }
+
+        memset(buffer, '#', sizeof(buffer)-1);
+        buffer[sizeof(buffer)-1] = '\0';
+        len = maxlen+1;
+        dummy = 0;
+        res = pParseURLFromOutsideSourceA(ParseURL_table[i].url, buffer, &len, NULL);
+        ok( res != 0 && len == ParseURL_table[i].len && 
+            !lstrcmpA(buffer, ParseURL_table[i].newurl),
+            "#%d (unknown): got %d and %d with '%s' (expected '!=0' and %d with '%s')\n",
+            i, res, len, buffer, ParseURL_table[i].len, ParseURL_table[i].newurl);
+    }
+}
+
+/* ################ */
+
+static void test_ParseURLFromOutsideSourceW(void)
+{
+    WCHAR urlW[INTERNET_MAX_URL_LENGTH];
+    WCHAR bufferW[INTERNET_MAX_URL_LENGTH];
+    CHAR  bufferA[INTERNET_MAX_URL_LENGTH];
+    DWORD maxlen;
+    DWORD dummy;
+    DWORD len;
+    DWORD res;
+
+    if (!pParseURLFromOutsideSourceW) {
+        skip("ParseURLFromOutsideSourceW not found\n");
+        return;
+    }
+    MultiByteToWideChar(CP_ACP, 0, ParseURL_table[0].url, -1, urlW, INTERNET_MAX_URL_LENGTH);
+
+    memset(bufferA, '#', sizeof(bufferA)-1);
+    bufferA[sizeof(bufferA) - 1] = '\0';
+    MultiByteToWideChar(CP_ACP, 0, bufferA, -1, bufferW, INTERNET_MAX_URL_LENGTH);
+
+    /* len is in characters */
+    len = sizeof(bufferW)/sizeof(bufferW[0]);
+    dummy = 0;
+    res = pParseURLFromOutsideSourceW(urlW, bufferW, &len, &dummy);
+    WideCharToMultiByte(CP_ACP, 0, bufferW, -1, bufferA, sizeof(bufferA), NULL, NULL);
+    ok( res != 0 && len == ParseURL_table[0].len && 
+        !lstrcmpA(bufferA, ParseURL_table[0].newurl),
+        "got %d and %d with '%s' (expected '!=0' and %d with '%s')\n",
+        res, len, bufferA, ParseURL_table[0].len, ParseURL_table[0].newurl);
+
+
+    maxlen = len;
+
+    memset(bufferA, '#', sizeof(bufferA)-1);
+    bufferA[sizeof(bufferA) - 1] = '\0';
+    MultiByteToWideChar(CP_ACP, 0, bufferA, -1, bufferW, INTERNET_MAX_URL_LENGTH);
+    len = maxlen+1;
+    dummy = 0;
+    res = pParseURLFromOutsideSourceW(urlW, bufferW, &len, &dummy);
+    WideCharToMultiByte(CP_ACP, 0, bufferW, -1, bufferA, sizeof(bufferA), NULL, NULL);
+    /* len does not include the terminating 0, when buffer is large enough */
+    ok( res != 0 && len == ParseURL_table[0].len && 
+        !lstrcmpA(bufferA, ParseURL_table[0].newurl),
+        "+1: got %d and %d with '%s' (expected '!=0' and %d with '%s')\n",
+        res, len, bufferA, ParseURL_table[0].len, ParseURL_table[0].newurl);
+
+    len = maxlen;
+    dummy = 0;
+    res = pParseURLFromOutsideSourceW(urlW, bufferW, &len, &dummy);
+    /* len includes the terminating 0, when the buffer is to small */
+    ok( res == 0 && len == ParseURL_table[0].len + 1,
+        "==: got %d and %d (expected '0' and %d)\n",
+        res, len, ParseURL_table[0].len + 1);
+
+    len = maxlen - 1;
+    dummy = 0;
+    res = pParseURLFromOutsideSourceW(urlW, bufferW, &len, &dummy);
+    ok( res == 0 && len == ParseURL_table[0].len + 1,
+        "-1: got %d and %d (expected '0' and %d)\n",
+        res, len, ParseURL_table[0].len + 1);
+
+}
+
+/* ################ */
+
 START_TEST(shdocvw)
 {
     init_functions();
     test_URLSubRegQueryA();
+    test_ParseURLFromOutsideSourceA();
+    test_ParseURLFromOutsideSourceW();
 }
-- 
1.5.4.3


--=-F0iEjSUwGs1ozKaENiLP--




More information about the wine-patches mailing list