Module: wine Branch: master Commit: e9e12744b52843c16e3c0d4f5375b0073eda7a8c URL: http://source.winehq.org/git/wine.git/?a=commit;h=e9e12744b52843c16e3c0d4f53...
Author: Detlef Riekenberg wine.dev@web.de Date: Tue Dec 23 11:48:12 2008 +0100
shdocvw/tests: Add tests for ParseURLFromOutsideSource.
---
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..64a4ca7 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(); }