Author: akhaldi Date: Sat Sep 28 15:27:08 2013 New Revision: 60429
URL: http://svn.reactos.org/svn/reactos?rev=60429&view=rev Log: [WININET_WINETEST] * Sync with Wine 1.7.1. CORE-7469
Modified: trunk/rostests/winetests/wininet/CMakeLists.txt trunk/rostests/winetests/wininet/generated.c trunk/rostests/winetests/wininet/http.c trunk/rostests/winetests/wininet/testlist.c trunk/rostests/winetests/wininet/url.c trunk/rostests/winetests/wininet/urlcache.c
Modified: trunk/rostests/winetests/wininet/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wininet/CMakeLis... ============================================================================== --- trunk/rostests/winetests/wininet/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/winetests/wininet/CMakeLists.txt [iso-8859-1] Sat Sep 28 15:27:08 2013 @@ -1,7 +1,3 @@ - -remove_definitions(-DWINVER=0x502 -D_WIN32_IE=0x600 -D_WIN32_WINNT=0x502) - -add_definitions(-D__ROS_LONG64__)
list(APPEND SOURCE ftp.c @@ -13,7 +9,6 @@ testlist.c)
add_executable(wininet_winetest ${SOURCE}) -target_link_libraries(wininet_winetest wine) set_module_type(wininet_winetest win32cui) -add_importlibs(wininet_winetest wininet crypt32 ws2_32 user32 advapi32 msvcrt kernel32 ntdll) +add_importlibs(wininet_winetest wininet crypt32 ws2_32 user32 advapi32 msvcrt kernel32) add_cd_file(TARGET wininet_winetest DESTINATION reactos/bin FOR all)
Modified: trunk/rostests/winetests/wininet/generated.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wininet/generate... ============================================================================== --- trunk/rostests/winetests/wininet/generated.c [iso-8859-1] (original) +++ trunk/rostests/winetests/wininet/generated.c [iso-8859-1] Sat Sep 28 15:27:08 2013 @@ -5,9 +5,11 @@ * Unit tests for data structure packing */
+#ifndef __REACTOS__ #define WINVER 0x0501 #define _WIN32_IE 0x0501 #define _WIN32_WINNT 0x0501 +#endif
#define WINE_NOWINSOCK
Modified: trunk/rostests/winetests/wininet/http.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wininet/http.c?r... ============================================================================== --- trunk/rostests/winetests/wininet/http.c [iso-8859-1] (original) +++ trunk/rostests/winetests/wininet/http.c [iso-8859-1] Sat Sep 28 15:27:08 2013 @@ -193,8 +193,9 @@ return proxy_enable != 0; }
-#define test_status_code(a,b) _test_status_code(__LINE__,a,b) -static void _test_status_code(unsigned line, HINTERNET req, DWORD excode) +#define test_status_code(a,b) _test_status_code(__LINE__,a,b, FALSE) +#define test_status_code_todo(a,b) _test_status_code(__LINE__,a,b, TRUE) +static void _test_status_code(unsigned line, HINTERNET req, DWORD excode, BOOL is_todo) { DWORD code, size, index; char exbuf[10], bufa[10]; @@ -205,7 +206,10 @@ size = sizeof(code); res = HttpQueryInfoA(req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &code, &size, NULL); ok_(__FILE__,line)(res, "[1] HttpQueryInfoA(HTTP_QUERY_STATUS_CODE|number) failed: %u\n", GetLastError()); - ok_(__FILE__,line)(code == excode, "code = %d, expected %d\n", code, excode); + if (is_todo) + todo_wine ok_(__FILE__,line)(code == excode, "code = %d, expected %d\n", code, excode); + else + ok_(__FILE__,line)(code == excode, "code = %d, expected %d\n", code, excode); ok_(__FILE__,line)(size == sizeof(code), "size = %u\n", size);
code = 0xdeadbeef; @@ -213,8 +217,10 @@ size = sizeof(code); res = HttpQueryInfoA(req, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &code, &size, &index); ok_(__FILE__,line)(res, "[2] HttpQueryInfoA(HTTP_QUERY_STATUS_CODE|number index) failed: %u\n", GetLastError()); - ok_(__FILE__,line)(code == excode, "code = %d, expected %d\n", code, excode); - ok_(__FILE__,line)(!index, "index = %d, expected 0\n", code); + if (is_todo) + todo_wine ok_(__FILE__,line)(code == excode, "code = %d, expected %d\n", code, excode); + else + ok_(__FILE__,line)(!index, "index = %d, expected 0\n", code); ok_(__FILE__,line)(size == sizeof(code), "size = %u\n", size);
sprintf(exbuf, "%u", excode); @@ -222,7 +228,10 @@ size = sizeof(bufa); res = HttpQueryInfoA(req, HTTP_QUERY_STATUS_CODE, bufa, &size, NULL); ok_(__FILE__,line)(res, "[3] HttpQueryInfoA(HTTP_QUERY_STATUS_CODE) failed: %u\n", GetLastError()); - ok_(__FILE__,line)(!strcmp(bufa, exbuf), "unexpected status code %s, expected %s\n", bufa, exbuf); + if (is_todo) + todo_wine ok_(__FILE__,line)(!strcmp(bufa, exbuf), "unexpected status code %s, expected %s\n", bufa, exbuf); + else + ok_(__FILE__,line)(!strcmp(bufa, exbuf), "unexpected status code %s, expected %s\n", bufa, exbuf); ok_(__FILE__,line)(size == strlen(exbuf), "unexpected size %d for "%s"\n", size, exbuf);
size = 0; @@ -234,7 +243,10 @@ size = sizeof(bufw); res = HttpQueryInfoW(req, HTTP_QUERY_STATUS_CODE, bufw, &size, NULL); ok_(__FILE__,line)(res, "[5] HttpQueryInfoW(HTTP_QUERY_STATUS_CODE) failed: %u\n", GetLastError()); - ok_(__FILE__,line)(!strcmp_wa(bufw, exbuf), "unexpected status code %s, expected %s\n", bufa, exbuf); + if (is_todo) + todo_wine ok_(__FILE__,line)(!strcmp_wa(bufw, exbuf), "unexpected status code %s, expected %s\n", bufa, exbuf); + else + ok_(__FILE__,line)(!strcmp_wa(bufw, exbuf), "unexpected status code %s, expected %s\n", bufa, exbuf); ok_(__FILE__,line)(size == strlen(exbuf)*sizeof(WCHAR), "unexpected size %d for "%s"\n", size, exbuf);
size = 0; @@ -618,7 +630,7 @@ res = InternetQueryOptionA(hor,INTERNET_OPTION_URL,buffer,&length); ok(res, "InternetQueryOptionA(INTERNET_OPTION_URL) failed with error %d\n", GetLastError());
- length = sizeof(buffer); + length = sizeof(buffer)-1; res = HttpQueryInfoA(hor,HTTP_QUERY_RAW_HEADERS,buffer,&length,0x0); ok(res, "HttpQueryInfoA(HTTP_QUERY_RAW_HEADERS) failed with error %d\n", GetLastError()); buffer[length]=0; @@ -1752,6 +1764,27 @@ ok(index == 1, "Index was not incremented\n"); ok(strcmp(buffer,"value3")==0, "incorrect string was returned(%s)\n",buffer);
+ ok(HttpAddRequestHeaders(hRequest, "Authorization: Basic\r\n", -1, HTTP_ADDREQ_FLAG_ADD), + "unable to add header %u\n", GetLastError()); + + index = 0; + buffer[0] = 0; + len = sizeof(buffer); + ok(HttpQueryInfo(hRequest, HTTP_QUERY_AUTHORIZATION|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &len, &index), + "unable to query header %u\n", GetLastError()); + ok(index == 1, "index was not incremented\n"); + ok(!strcmp(buffer, "Basic"), "incorrect string was returned (%s)\n", buffer); + + ok(HttpAddRequestHeaders(hRequest, "Authorization:\r\n", -1, HTTP_ADDREQ_FLAG_REPLACE), + "unable to remove header %u\n", GetLastError()); + + index = 0; + len = sizeof(buffer); + SetLastError(0xdeadbeef); + ok(!HttpQueryInfo(hRequest, HTTP_QUERY_AUTHORIZATION|HTTP_QUERY_FLAG_REQUEST_HEADERS, buffer, &len, &index), + "header still present\n"); + ok(GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "got %u\n", GetLastError()); + ok(InternetCloseHandle(hRequest), "Close request handle failed\n"); done: ok(InternetCloseHandle(hConnect), "Close connect handle failed\n"); @@ -1815,15 +1848,30 @@ "<BODY>The quick brown fox jumped over the lazy dog<P></BODY>\r\n" "</HTML>\r\n\r\n";
+static const char ok_with_length[] = +"HTTP/1.1 200 OK\r\n" +"Connection: Keep-Alive\r\n" +"Content-Length: 23\r\n\r\n" +"abc\r\nHTTP/1.1 211 OK\r\n\r\n"; + +static const char ok_with_length2[] = +"HTTP/1.1 210 OK\r\n" +"Connection: Keep-Alive\r\n" +"Content-Length: 24\r\n\r\n" +"abc\r\nHTTP/1.1 211 OK\r\n\r\n"; + struct server_info { HANDLE hEvent; int port; };
+static int test_cache_gzip; +static const char *send_buffer; + static DWORD CALLBACK server_thread(LPVOID param) { struct server_info *si = param; - int r, c, i, on; + int r, c, i, on, count = 0; SOCKET s; struct sockaddr_in sa; char buffer[0x100]; @@ -1831,6 +1879,7 @@ int last_request = 0; char host_header[22]; static int test_b = 0; + static int test_no_cache = 0;
WSAStartup(MAKEWORD(1,1), &wsaData);
@@ -2008,6 +2057,21 @@ { send(c, page1, sizeof page1-1, 0); } + + if (strstr(buffer, "GET /testJ")) + { + if (count == 0) + { + count++; + send(c, ok_with_length, sizeof(ok_with_length)-1, 0); + } + else + { + send(c, ok_with_length2, sizeof(ok_with_length2)-1, 0); + count = 0; + } + } + if (strstr(buffer, "GET /test_no_content")) { static const char nocontentmsg[] = "HTTP/1.1 204 No Content\r\nConnection: close\r\n\r\n"; @@ -2023,13 +2087,37 @@ if (strstr(buffer, "GET /test_cache_control_no_cache")) { static const char no_cache_response[] = "HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\n\r\nsome content"; - send(c, no_cache_response, sizeof(no_cache_response)-1, 0); + if(!test_no_cache++) + send(c, no_cache_response, sizeof(no_cache_response)-1, 0); + else + send(c, okmsg, sizeof(okmsg)-1, 0); } if (strstr(buffer, "GET /test_cache_control_no_store")) { - static const char no_cache_response[] = "HTTP/1.1 200 OK\r\nCache-Control: No-StOrE\r\n\r\nsome content"; + static const char no_cache_response[] = "HTTP/1.1 200 OK\r\nCache-Control: junk, \t No-StOrE\r\n\r\nsome content"; send(c, no_cache_response, sizeof(no_cache_response)-1, 0); } + if (strstr(buffer, "GET /test_cache_gzip")) + { + static const char gzip_response[] = "HTTP/1.1 200 OK\r\nContent-Encoding: gzip\r\nContent-Type: text/html\r\n\r\n" + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x4b\xaf\xca\x2c\x50\x28" + "\x49\x2d\x2e\xe1\x02\x00\x62\x92\xc7\x6c\x0a\x00\x00\x00"; + if(!test_cache_gzip++) + send(c, gzip_response, sizeof(gzip_response), 0); + else + send(c, notokmsg, sizeof(notokmsg)-1, 0); + } + if (strstr(buffer, "GET /send_from_buffer")) + send(c, send_buffer, strlen(send_buffer), 0); + if (strstr(buffer, "/test_cache_control_verb")) + { + if (!memcmp(buffer, "GET ", sizeof("GET ")-1) && + !strstr(buffer, "Cache-Control: no-cache\r\n")) send(c, okmsg, sizeof(okmsg)-1, 0); + else if (strstr(buffer, "Cache-Control: no-cache\r\n")) send(c, okmsg, sizeof(okmsg)-1, 0); + send(c, notokmsg, sizeof(notokmsg)-1, 0); + } + if (strstr(buffer, "GET /test_premature_disconnect")) + trace("closing connection\n");
shutdown(c, 2); closesocket(c); @@ -2113,7 +2201,7 @@ ok(hr != NULL, "HttpOpenRequest failed\n");
r = HttpSendRequest(hr, NULL, 0, NULL, 0); - ok(r, "HttpSendRequest failed\n"); + ok(r, "HttpSendRequest failed %u\n", GetLastError());
sz = sizeof buffer; r = HttpQueryInfo(hr, HTTP_QUERY_PROXY_AUTHENTICATE, buffer, &sz, NULL); @@ -2157,46 +2245,347 @@ static void test_proxy_direct(int port) { HINTERNET hi, hc, hr; - DWORD r, sz; - char buffer[0x40]; + DWORD r, sz, error; + char buffer[0x40], *url; + WCHAR bufferW[0x40]; static CHAR username[] = "mike", - password[] = "1101"; + password[] = "1101", + useragent[] = "winetest", + url_fmt[] = "http://test.winehq.org:%u/test2"; + static WCHAR usernameW[] = {'m','i','k','e',0}, + passwordW[] = {'1','1','0','1',0}, + useragentW[] = {'w','i','n','e','t','e','s','t',0}; + + /* specify proxy type without the proxy and bypass */ + SetLastError(0xdeadbeef); + hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_PROXY, NULL, NULL, 0); + error = GetLastError(); + ok(error == ERROR_INVALID_PARAMETER || + broken(error == ERROR_SUCCESS) /* WinXPProSP2 */, "got %u\n", error); + ok(hi == NULL || broken(!!hi) /* WinXPProSP2 */, "open should have failed\n");
sprintf(buffer, "localhost:%d\n", port); hi = InternetOpen(NULL, INTERNET_OPEN_TYPE_PROXY, buffer, NULL, 0); ok(hi != NULL, "open failed\n");
/* try connect without authorization */ - hc = InternetConnect(hi, "test.winehq.org/", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + hc = InternetConnect(hi, "test.winehq.org", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); ok(hc != NULL, "connect failed\n");
hr = HttpOpenRequest(hc, NULL, "/test2", NULL, NULL, NULL, 0, 0); ok(hr != NULL, "HttpOpenRequest failed\n");
+ sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_PASSWORD, NULL, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == 1, "got %u\n", sz); + + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, NULL, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == 1, "got %u\n", sz); + + sz = sizeof(buffer); + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_PASSWORD, buffer, &sz); + ok(r, "unexpected failure %u\n", GetLastError()); + ok(!sz, "got %u\n", sz); + + sz = sizeof(buffer); + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz); + ok(r, "unexpected failure %u\n", GetLastError()); + ok(!sz, "got %u\n", sz); + + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PASSWORD, NULL, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == 1, "got %u\n", sz); + + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_USERNAME, NULL, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == 1, "got %u\n", sz); + + sz = sizeof(buffer); + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PASSWORD, buffer, &sz); + ok(r, "unexpected failure %u\n", GetLastError()); + ok(!sz, "got %u\n", sz); + + sz = sizeof(buffer); + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_USERNAME, buffer, &sz); + ok(r, "unexpected failure %u\n", GetLastError()); + ok(!sz, "got %u\n", sz); + + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_URL, NULL, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == 34, "got %u\n", sz); + + sz = sizeof(buffer); + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_URL, buffer, &sz); + ok(r, "unexpected failure %u\n", GetLastError()); + ok(sz == 33, "got %u\n", sz); + r = HttpSendRequest(hr, NULL, 0, NULL, 0); - ok(r, "HttpSendRequest failed\n"); + ok(r || broken(!r), "HttpSendRequest failed %u\n", GetLastError()); + if (!r) + { + win_skip("skipping proxy tests on broken wininet\n"); + goto done; + }
test_status_code(hr, 407);
/* set the user + password then try again */ - todo_wine { + r = InternetSetOption(hi, INTERNET_OPTION_PROXY_USERNAME, username, 4); + ok(!r, "unexpected success\n"); + + r = InternetSetOption(hc, INTERNET_OPTION_PROXY_USERNAME, username, 4); + ok(r, "failed to set user\n"); + r = InternetSetOption(hr, INTERNET_OPTION_PROXY_USERNAME, username, 4); ok(r, "failed to set user\n");
+ buffer[0] = 0; + sz = 3; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz); + ok(!r, "unexpected failure %u\n", GetLastError()); + ok(!buffer[0], "got %s\n", buffer); + ok(sz == strlen(username) + 1, "got %u\n", sz); + + buffer[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == strlen(username) + 1, "got %u\n", sz); + + bufferW[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOptionW(hr, INTERNET_OPTION_PROXY_USERNAME, bufferW, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == (lstrlenW(usernameW) + 1) * sizeof(WCHAR), "got %u\n", sz); + + buffer[0] = 0; + sz = sizeof(buffer); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz); + ok(r, "failed to get username\n"); + ok(!strcmp(buffer, username), "got %s\n", buffer); + ok(sz == strlen(username), "got %u\n", sz); + + buffer[0] = 0; + sz = sizeof(bufferW); + r = InternetQueryOptionW(hr, INTERNET_OPTION_PROXY_USERNAME, bufferW, &sz); + ok(r, "failed to get username\n"); + ok(!lstrcmpW(bufferW, usernameW), "wrong username\n"); + ok(sz == lstrlenW(usernameW), "got %u\n", sz); + + r = InternetSetOption(hr, INTERNET_OPTION_PROXY_USERNAME, username, 1); + ok(r, "failed to set user\n"); + + buffer[0] = 0; + sz = sizeof(buffer); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_USERNAME, buffer, &sz); + ok(r, "failed to get username\n"); + ok(!strcmp(buffer, username), "got %s\n", buffer); + ok(sz == strlen(username), "got %u\n", sz); + + r = InternetSetOption(hi, INTERNET_OPTION_USER_AGENT, useragent, 1); + ok(r, "failed to set useragent\n"); + + buffer[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hi, INTERNET_OPTION_USER_AGENT, buffer, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == strlen(useragent) + 1, "got %u\n", sz); + + buffer[0] = 0; + sz = sizeof(buffer); + r = InternetQueryOption(hi, INTERNET_OPTION_USER_AGENT, buffer, &sz); + ok(r, "failed to get user agent\n"); + ok(!strcmp(buffer, useragent), "got %s\n", buffer); + ok(sz == strlen(useragent), "got %u\n", sz); + + bufferW[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOptionW(hi, INTERNET_OPTION_USER_AGENT, bufferW, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == (lstrlenW(useragentW) + 1) * sizeof(WCHAR), "got %u\n", sz); + + bufferW[0] = 0; + sz = sizeof(bufferW); + r = InternetQueryOptionW(hi, INTERNET_OPTION_USER_AGENT, bufferW, &sz); + ok(r, "failed to get user agent\n"); + ok(!lstrcmpW(bufferW, useragentW), "wrong user agent\n"); + ok(sz == lstrlenW(useragentW), "got %u\n", sz); + + r = InternetSetOption(hr, INTERNET_OPTION_USERNAME, username, 1); + ok(r, "failed to set user\n"); + + buffer[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_USERNAME, buffer, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == strlen(username) + 1, "got %u\n", sz); + + buffer[0] = 0; + sz = sizeof(buffer); + r = InternetQueryOption(hr, INTERNET_OPTION_USERNAME, buffer, &sz); + ok(r, "failed to get user\n"); + ok(!strcmp(buffer, username), "got %s\n", buffer); + ok(sz == strlen(username), "got %u\n", sz); + + bufferW[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOptionW(hr, INTERNET_OPTION_USERNAME, bufferW, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == (lstrlenW(usernameW) + 1) * sizeof(WCHAR), "got %u\n", sz); + + bufferW[0] = 0; + sz = sizeof(bufferW); + r = InternetQueryOptionW(hr, INTERNET_OPTION_USERNAME, bufferW, &sz); + ok(r, "failed to get user\n"); + ok(!lstrcmpW(bufferW, usernameW), "wrong user\n"); + ok(sz == lstrlenW(usernameW), "got %u\n", sz); + + r = InternetSetOption(hr, INTERNET_OPTION_PASSWORD, password, 1); + ok(r, "failed to set password\n"); + + buffer[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PASSWORD, buffer, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == strlen(password) + 1, "got %u\n", sz); + + buffer[0] = 0; + sz = sizeof(buffer); + r = InternetQueryOption(hr, INTERNET_OPTION_PASSWORD, buffer, &sz); + ok(r, "failed to get password\n"); + ok(!strcmp(buffer, password), "got %s\n", buffer); + ok(sz == strlen(password), "got %u\n", sz); + + bufferW[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOptionW(hr, INTERNET_OPTION_PASSWORD, bufferW, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == (lstrlenW(passwordW) + 1) * sizeof(WCHAR), "got %u\n", sz); + + bufferW[0] = 0; + sz = sizeof(bufferW); + r = InternetQueryOptionW(hr, INTERNET_OPTION_PASSWORD, bufferW, &sz); + ok(r, "failed to get password\n"); + ok(!lstrcmpW(bufferW, passwordW), "wrong password\n"); + ok(sz == lstrlenW(passwordW), "got %u\n", sz); + + url = HeapAlloc(GetProcessHeap(), 0, strlen(url_fmt) + 11); + sprintf(url, url_fmt, port); + buffer[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_URL, buffer, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == strlen(url) + 1, "got %u\n", sz); + + buffer[0] = 0; + sz = sizeof(buffer); + r = InternetQueryOption(hr, INTERNET_OPTION_URL, buffer, &sz); + ok(r, "failed to get url\n"); + ok(!strcmp(buffer, url), "got %s\n", buffer); + ok(sz == strlen(url), "got %u\n", sz); + + bufferW[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOptionW(hr, INTERNET_OPTION_URL, bufferW, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == (strlen(url) + 1) * sizeof(WCHAR), "got %u\n", sz); + + bufferW[0] = 0; + sz = sizeof(bufferW); + r = InternetQueryOptionW(hr, INTERNET_OPTION_URL, bufferW, &sz); + ok(r, "failed to get url\n"); + ok(!strcmp_wa(bufferW, url), "wrong url\n"); + ok(sz == strlen(url), "got %u\n", sz); + HeapFree(GetProcessHeap(), 0, url); + r = InternetSetOption(hr, INTERNET_OPTION_PROXY_PASSWORD, password, 4); ok(r, "failed to set password\n"); - } + + buffer[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_PASSWORD, buffer, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == strlen(password) + 1, "got %u\n", sz); + + buffer[0] = 0; + sz = sizeof(buffer); + r = InternetQueryOption(hr, INTERNET_OPTION_PROXY_PASSWORD, buffer, &sz); + ok(r, "failed to get password\n"); + ok(!strcmp(buffer, password), "got %s\n", buffer); + ok(sz == strlen(password), "got %u\n", sz); + + bufferW[0] = 0; + sz = 0; + SetLastError(0xdeadbeef); + r = InternetQueryOptionW(hr, INTERNET_OPTION_PROXY_PASSWORD, bufferW, &sz); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got %u\n", GetLastError()); + ok(!r, "unexpected success\n"); + ok(sz == (lstrlenW(passwordW) + 1) * sizeof(WCHAR), "got %u\n", sz); + + bufferW[0] = 0; + sz = sizeof(bufferW); + r = InternetQueryOptionW(hr, INTERNET_OPTION_PROXY_PASSWORD, bufferW, &sz); + ok(r, "failed to get password\n"); + ok(!lstrcmpW(bufferW, passwordW), "wrong password\n"); + ok(sz == lstrlenW(passwordW), "got %u\n", sz);
r = HttpSendRequest(hr, NULL, 0, NULL, 0); - ok(r, "HttpSendRequest failed\n"); + if (!r) + { + win_skip("skipping proxy tests on broken wininet\n"); + goto done; + } + ok(r, "HttpSendRequest failed %u\n", GetLastError()); sz = sizeof buffer; r = HttpQueryInfo(hr, HTTP_QUERY_STATUS_CODE, buffer, &sz, NULL); ok(r, "HttpQueryInfo failed\n"); - todo_wine { ok(!strcmp(buffer, "200"), "proxy code wrong\n"); - } - - + +done: InternetCloseHandle(hr); InternetCloseHandle(hc); InternetCloseHandle(hi); @@ -2350,6 +2739,129 @@ InternetCloseHandle(con); InternetCloseHandle(ses); } + +static void test_connection_closing(int port) +{ + HINTERNET session, connection, req; + DWORD res; + + hCompleteEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + + session = InternetOpenA("", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, INTERNET_FLAG_ASYNC); + ok(session != NULL,"InternetOpen failed with error %u\n", GetLastError()); + + pInternetSetStatusCallbackA(session, callback); + + SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); + connection = InternetConnectA(session, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0x0, 0xdeadbeef); + ok(connection != NULL,"InternetConnect failed with error %u\n", GetLastError()); + CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); + + SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); + req = HttpOpenRequestA(connection, "GET", "/testJ", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0xdeadbeaf); + ok(req != NULL, "HttpOpenRequest failed: %u\n", GetLastError()); + CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); + + SET_OPTIONAL(INTERNET_STATUS_COOKIE_SENT); + SET_OPTIONAL(INTERNET_STATUS_DETECTING_PROXY); + SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER); + SET_EXPECT(INTERNET_STATUS_CONNECTED_TO_SERVER); + SET_EXPECT(INTERNET_STATUS_SENDING_REQUEST); + SET_EXPECT(INTERNET_STATUS_REQUEST_SENT); + SET_EXPECT(INTERNET_STATUS_RECEIVING_RESPONSE); + SET_EXPECT(INTERNET_STATUS_RESPONSE_RECEIVED); + SET_OPTIONAL(INTERNET_STATUS_CLOSING_CONNECTION); + SET_OPTIONAL(INTERNET_STATUS_CONNECTION_CLOSED); + SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); + + res = HttpSendRequestA(req, NULL, 0, NULL, 0); + ok(!res && (GetLastError() == ERROR_IO_PENDING), + "Asynchronous HttpSendRequest NOT returning 0 with error ERROR_IO_PENDING\n"); + WaitForSingleObject(hCompleteEvent, INFINITE); + ok(req_error == ERROR_SUCCESS, "req_error = %u\n", req_error); + + CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_SENT); + CLEAR_NOTIFIED(INTERNET_STATUS_DETECTING_PROXY); + CHECK_NOTIFIED(INTERNET_STATUS_CONNECTING_TO_SERVER); + CHECK_NOTIFIED(INTERNET_STATUS_CONNECTED_TO_SERVER); + CHECK_NOTIFIED(INTERNET_STATUS_SENDING_REQUEST); + CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_SENT); + CHECK_NOTIFIED(INTERNET_STATUS_RECEIVING_RESPONSE); + CHECK_NOTIFIED(INTERNET_STATUS_RESPONSE_RECEIVED); + CLEAR_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); + CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); + CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); + + test_status_code(req, 200); + + SET_OPTIONAL(INTERNET_STATUS_COOKIE_SENT); + SET_OPTIONAL(INTERNET_STATUS_DETECTING_PROXY); + SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER); + SET_EXPECT(INTERNET_STATUS_CONNECTED_TO_SERVER); + SET_EXPECT(INTERNET_STATUS_SENDING_REQUEST); + SET_EXPECT(INTERNET_STATUS_REQUEST_SENT); + SET_EXPECT(INTERNET_STATUS_RECEIVING_RESPONSE); + SET_EXPECT(INTERNET_STATUS_RESPONSE_RECEIVED); + SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); + + res = HttpSendRequestA(req, NULL, 0, NULL, 0); + ok(!res && (GetLastError() == ERROR_IO_PENDING), + "Asynchronous HttpSendRequest NOT returning 0 with error ERROR_IO_PENDING\n"); + WaitForSingleObject(hCompleteEvent, INFINITE); + ok(req_error == ERROR_SUCCESS, "req_error = %u\n", req_error); + + CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_SENT); + CLEAR_NOTIFIED(INTERNET_STATUS_DETECTING_PROXY); + todo_wine CHECK_NOTIFIED(INTERNET_STATUS_CONNECTING_TO_SERVER); + todo_wine CHECK_NOTIFIED(INTERNET_STATUS_CONNECTED_TO_SERVER); + CHECK_NOTIFIED(INTERNET_STATUS_SENDING_REQUEST); + CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_SENT); + CHECK_NOTIFIED(INTERNET_STATUS_RECEIVING_RESPONSE); + CHECK_NOTIFIED(INTERNET_STATUS_RESPONSE_RECEIVED); + CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); + + test_status_code_todo(req, 210); + + SET_OPTIONAL(INTERNET_STATUS_COOKIE_SENT); + SET_OPTIONAL(INTERNET_STATUS_DETECTING_PROXY); + SET_EXPECT(INTERNET_STATUS_CONNECTING_TO_SERVER); + SET_EXPECT(INTERNET_STATUS_CONNECTED_TO_SERVER); + SET_EXPECT(INTERNET_STATUS_SENDING_REQUEST); + SET_WINE_ALLOW(INTERNET_STATUS_SENDING_REQUEST); + SET_EXPECT(INTERNET_STATUS_REQUEST_SENT); + SET_EXPECT(INTERNET_STATUS_RECEIVING_RESPONSE); + SET_EXPECT(INTERNET_STATUS_RESPONSE_RECEIVED); + SET_OPTIONAL(INTERNET_STATUS_CLOSING_CONNECTION); + SET_OPTIONAL(INTERNET_STATUS_CONNECTION_CLOSED); + SET_EXPECT(INTERNET_STATUS_REQUEST_COMPLETE); + + res = HttpSendRequestA(req, NULL, 0, NULL, 0); + ok(!res && (GetLastError() == ERROR_IO_PENDING), + "Asynchronous HttpSendRequest NOT returning 0 with error ERROR_IO_PENDING\n"); + WaitForSingleObject(hCompleteEvent, INFINITE); + ok(req_error == ERROR_SUCCESS, "req_error = %u\n", req_error); + + CLEAR_NOTIFIED(INTERNET_STATUS_COOKIE_SENT); + CLEAR_NOTIFIED(INTERNET_STATUS_DETECTING_PROXY); + CHECK_NOTIFIED(INTERNET_STATUS_CONNECTING_TO_SERVER); + CHECK_NOTIFIED(INTERNET_STATUS_CONNECTED_TO_SERVER); + todo_wine CHECK_NOTIFIED(INTERNET_STATUS_SENDING_REQUEST); + CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_SENT); + CHECK_NOTIFIED(INTERNET_STATUS_RECEIVING_RESPONSE); + CHECK_NOTIFIED(INTERNET_STATUS_RESPONSE_RECEIVED); + CLEAR_NOTIFIED(INTERNET_STATUS_CLOSING_CONNECTION); + CLEAR_NOTIFIED(INTERNET_STATUS_CONNECTION_CLOSED); + CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); + + test_status_code_todo(req, 200); + + SET_WINE_ALLOW(INTERNET_STATUS_CLOSING_CONNECTION); + SET_WINE_ALLOW(INTERNET_STATUS_CONNECTION_CLOSED); + + close_async_handle(session, hCompleteEvent, 2); + CloseHandle(hCompleteEvent); +} +
static void test_no_content(int port) { @@ -2526,8 +3038,17 @@ ok(size == 12, "read %d bytes of data\n", size); InternetCloseHandle(req);
- ret = DeleteUrlCacheEntry(cache_url); - ok(!ret && GetLastError()==ERROR_FILE_NOT_FOUND, "cache entry should not exist\n"); + req = HttpOpenRequest(con, NULL, cache_control_no_cache, NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed with error %u\n", GetLastError()); + size = 0; + while(InternetReadFile(req, buf, sizeof(buf), &read) && read) + size += read; + ok(size == 0, "read %d bytes of data\n", size); + InternetCloseHandle(req); + DeleteUrlCacheEntry(cache_url);
req = HttpOpenRequest(con, NULL, cache_control_no_store, NULL, NULL, NULL, 0, 0); ok(req != NULL, "HttpOpenRequest failed\n"); @@ -2550,6 +3071,133 @@ InternetCloseHandle(ses); }
+static void test_cache_read_gzipped(int port) +{ + static const char cache_url_fmt[] = "http://localhost:%d%s"; + static const char get_gzip[] = "/test_cache_gzip"; + static const char content[] = "gzip test\n"; + static const char text_html[] = "text/html"; + static const char raw_header[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n"; + + HINTERNET ses, con, req; + DWORD read, size; + char cache_url[256], buf[256]; + BOOL ret; + + trace("Testing reading compressed content from cache\n"); + + ses = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(ses != NULL,"InternetOpen failed with error %u\n", GetLastError()); + + con = InternetConnect(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed with error %u\n", GetLastError()); + + req = HttpOpenRequest(con, NULL, get_gzip, NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = TRUE; + ret = InternetSetOption(req, INTERNET_OPTION_HTTP_DECODING, &ret, sizeof(ret)); + if(!ret && GetLastError()==ERROR_INTERNET_INVALID_OPTION) { + win_skip("INTERNET_OPTION_HTTP_DECODING not supported\n"); + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); + return; + } + ok(ret, "InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %d\n", GetLastError()); + + ret = HttpSendRequest(req, "Accept-Encoding: gzip", -1, NULL, 0); + ok(ret, "HttpSendRequest failed with error %u\n", GetLastError()); + size = 0; + while(InternetReadFile(req, buf+size, sizeof(buf)-size, &read) && read) + size += read; + ok(size == 10, "read %d bytes of data\n", size); + buf[size] = 0; + ok(!strncmp(buf, content, size), "incorrect page content: %s\n", buf); + + size = sizeof(buf)-1; + ret = HttpQueryInfoA(req, HTTP_QUERY_CONTENT_TYPE, buf, &size, 0); + ok(ret, "HttpQueryInfo(HTTP_QUERY_CONTENT_TYPE) failed: %d\n", GetLastError()); + buf[size] = 0; + ok(!strncmp(text_html, buf, size), "buf = %s\n", buf); + + size = sizeof(buf)-1; + ret = HttpQueryInfoA(req, HTTP_QUERY_RAW_HEADERS_CRLF, buf, &size, 0); + ok(ret, "HttpQueryInfo(HTTP_QUERY_CONTENT_TYPE) failed: %d\n", GetLastError()); + buf[size] = 0; + ok(!strncmp(raw_header, buf, size), "buf = %s\n", buf); + InternetCloseHandle(req); + + req = HttpOpenRequest(con, NULL, get_gzip, NULL, NULL, NULL, INTERNET_FLAG_FROM_CACHE, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = TRUE; + ret = InternetSetOption(req, INTERNET_OPTION_HTTP_DECODING, &ret, sizeof(ret)); + ok(ret, "InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %d\n", GetLastError()); + + ret = HttpSendRequest(req, "Accept-Encoding: gzip", -1, NULL, 0); + ok(ret, "HttpSendRequest failed with error %u\n", GetLastError()); + size = 0; + while(InternetReadFile(req, buf+size, sizeof(buf)-1-size, &read) && read) + size += read; + todo_wine ok(size == 10, "read %d bytes of data\n", size); + buf[size] = 0; + ok(!strncmp(buf, content, size), "incorrect page content: %s\n", buf); + + size = sizeof(buf); + ret = HttpQueryInfoA(req, HTTP_QUERY_CONTENT_ENCODING, buf, &size, 0); + ok(!ret && GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND, + "HttpQueryInfo(HTTP_QUERY_CONTENT_ENCODING) returned %d, %d\n", + ret, GetLastError()); + + size = sizeof(buf)-1; + ret = HttpQueryInfoA(req, HTTP_QUERY_CONTENT_TYPE, buf, &size, 0); + todo_wine ok(ret, "HttpQueryInfo(HTTP_QUERY_CONTENT_TYPE) failed: %d\n", GetLastError()); + buf[size] = 0; + todo_wine ok(!strncmp(text_html, buf, size), "buf = %s\n", buf); + InternetCloseHandle(req); + + /* Decompression doesn't work while reading from cache */ + test_cache_gzip = 0; + sprintf(cache_url, cache_url_fmt, port, get_gzip); + DeleteUrlCacheEntry(cache_url); + + req = HttpOpenRequest(con, NULL, get_gzip, NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = HttpSendRequest(req, "Accept-Encoding: gzip", -1, NULL, 0); + ok(ret, "HttpSendRequest failed with error %u\n", GetLastError()); + size = 0; + while(InternetReadFile(req, buf+size, sizeof(buf)-1-size, &read) && read) + size += read; + ok(size == 31, "read %d bytes of data\n", size); + InternetCloseHandle(req); + + req = HttpOpenRequest(con, NULL, get_gzip, NULL, NULL, NULL, INTERNET_FLAG_FROM_CACHE, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + ret = TRUE; + ret = InternetSetOption(req, INTERNET_OPTION_HTTP_DECODING, &ret, sizeof(ret)); + ok(ret, "InternetSetOption(INTERNET_OPTION_HTTP_DECODING) failed: %d\n", GetLastError()); + + ret = HttpSendRequest(req, "Accept-Encoding: gzip", -1, NULL, 0); + ok(ret, "HttpSendRequest failed with error %u\n", GetLastError()); + size = 0; + while(InternetReadFile(req, buf+size, sizeof(buf)-1-size, &read) && read) + size += read; + todo_wine ok(size == 31, "read %d bytes of data\n", size); + + size = sizeof(buf); + ret = HttpQueryInfoA(req, HTTP_QUERY_CONTENT_ENCODING, buf, &size, 0); + todo_wine ok(ret, "HttpQueryInfo(HTTP_QUERY_CONTENT_ENCODING) failed: %d\n", GetLastError()); + InternetCloseHandle(req); + + InternetCloseHandle(con); + InternetCloseHandle(ses); + + DeleteUrlCacheEntry(cache_url); +} + static void test_HttpSendRequestW(int port) { static const WCHAR header[] = {'U','A','-','C','P','U',':',' ','x','8','6',0}; @@ -2656,6 +3304,32 @@ InternetCloseHandle(session); }
+static void test_premature_disconnect(int port) +{ + HINTERNET session, connect, request; + DWORD err; + BOOL ret; + + session = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(session != NULL, "InternetOpen failed\n"); + + connect = InternetConnect(session, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(connect != NULL, "InternetConnect failed\n"); + + request = HttpOpenRequest(connect, NULL, "/premature_disconnect", NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + + SetLastError(0xdeadbeef); + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + err = GetLastError(); + todo_wine ok(!ret, "HttpSendRequest succeeded\n"); + todo_wine ok(err == ERROR_HTTP_INVALID_SERVER_RESPONSE, "got %u\n", err); + + InternetCloseHandle(request); + InternetCloseHandle(connect); + InternetCloseHandle(session); +} + static void test_invalid_response_headers(int port) { HINTERNET session, connect, request; @@ -2775,6 +3449,10 @@ hr = HttpOpenRequest(hc, NULL, "/testD", NULL, NULL, NULL, 0, 0); ok(hr != NULL, "HttpOpenRequest failed\n");
+ size = sizeof(buffer); + ret = HttpQueryInfo(hr, HTTP_QUERY_STATUS_TEXT, buffer, &size, &index); + ok(!ret && GetLastError() == ERROR_HTTP_HEADER_NOT_FOUND, "HttpQueryInfo failed %u\n", GetLastError()); + ret = HttpSendRequest(hr, NULL, 0, NULL, 0); ok(ret, "HttpSendRequest failed\n");
@@ -2863,6 +3541,7 @@
static void test_options(int port) { + INTERNET_DIAGNOSTIC_SOCKET_INFO idsi; HINTERNET ses, con, req; DWORD size, error; DWORD_PTR ctx; @@ -2963,6 +3642,17 @@ ok(ret, "InternetQueryOption failed %u\n", GetLastError()); ok(ctx == 3, "expected 3 got %lu\n", ctx);
+ size = sizeof(idsi); + ret = InternetQueryOption(req, INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO, &idsi, &size); + ok(ret, "InternetQueryOption failed %u\n", GetLastError()); + + size = 0; + SetLastError(0xdeadbeef); + ret = InternetQueryOption(req, INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT, NULL, &size); + error = GetLastError(); + ok(!ret, "InternetQueryOption succeeded\n"); + ok(error == ERROR_INTERNET_INVALID_OPERATION, "expected ERROR_INTERNET_INVALID_OPERATION, got %u\n", error); + /* INTERNET_OPTION_PROXY */ SetLastError(0xdeadbeef); ret = InternetQueryOptionA(ses, INTERNET_OPTION_PROXY, NULL, NULL); @@ -2987,6 +3677,124 @@ InternetCloseHandle(req); InternetCloseHandle(con); InternetCloseHandle(ses); +} + +typedef struct { + const char *response_text; + int status_code; + const char *status_text; + const char *raw_headers; +} http_status_test_t; + +static const http_status_test_t http_status_tests[] = { + { + "HTTP/1.1 200 OK\r\n" + "Content-Length: 1\r\n" + "\r\nx", + 200, + "OK" + }, + { + "HTTP/1.1 404 Fail\r\n" + "Content-Length: 1\r\n" + "\r\nx", + 404, + "Fail" + }, + { + "HTTP/1.1 200\r\n" + "Content-Length: 1\r\n" + "\r\nx", + 200, + "" + }, + { + "HTTP/1.1 410 \r\n" + "Content-Length: 1\r\n" + "\r\nx", + 410, + "" + } +}; + +static void test_http_status(int port) +{ + HINTERNET ses, con, req; + char buf[1000]; + DWORD i, size; + BOOL res; + + for(i=0; i < sizeof(http_status_tests)/sizeof(*http_status_tests); i++) { + send_buffer = http_status_tests[i].response_text; + + ses = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(ses != NULL, "InternetOpen failed\n"); + + con = InternetConnect(ses, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(con != NULL, "InternetConnect failed\n"); + + req = HttpOpenRequest(con, NULL, "/send_from_buffer", NULL, NULL, NULL, 0, 0); + ok(req != NULL, "HttpOpenRequest failed\n"); + + res = HttpSendRequest(req, NULL, 0, NULL, 0); + ok(res, "HttpSendRequest failed\n"); + + test_status_code(req, http_status_tests[i].status_code); + + size = sizeof(buf); + res = HttpQueryInfo(req, HTTP_QUERY_STATUS_TEXT, buf, &size, NULL); + ok(res, "HttpQueryInfo failed: %u\n", GetLastError()); + ok(!strcmp(buf, http_status_tests[i].status_text), "[%u] Unexpected status text "%s", expected "%s"\n", + i, buf, http_status_tests[i].status_text); + + InternetCloseHandle(req); + InternetCloseHandle(con); + InternetCloseHandle(ses); + } +} + +static void test_cache_control_verb(int port) +{ + HINTERNET session, connect, request; + BOOL ret; + + session = InternetOpen("winetest", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); + ok(session != NULL, "InternetOpen failed\n"); + + connect = InternetConnect(session, "localhost", port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); + ok(connect != NULL, "InternetConnect failed\n"); + + request = HttpOpenRequest(connect, "RPC_OUT_DATA", "/test_cache_control_verb", NULL, NULL, NULL, + INTERNET_FLAG_NO_CACHE_WRITE, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed %u\n", GetLastError()); + test_status_code(request, 200); + + request = HttpOpenRequest(connect, "POST", "/test_cache_control_verb", NULL, NULL, NULL, + INTERNET_FLAG_NO_CACHE_WRITE, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed %u\n", GetLastError()); + test_status_code(request, 200); + + request = HttpOpenRequest(connect, "HEAD", "/test_cache_control_verb", NULL, NULL, NULL, + INTERNET_FLAG_NO_CACHE_WRITE, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed %u\n", GetLastError()); + test_status_code(request, 200); + + request = HttpOpenRequest(connect, "GET", "/test_cache_control_verb", NULL, NULL, NULL, + INTERNET_FLAG_NO_CACHE_WRITE, 0); + ok(request != NULL, "HttpOpenRequest failed\n"); + ret = HttpSendRequest(request, NULL, 0, NULL, 0); + ok(ret, "HttpSendRequest failed %u\n", GetLastError()); + test_status_code(request, 200); + + InternetCloseHandle(request); + InternetCloseHandle(connect); + InternetCloseHandle(session); }
static void test_http_connection(void) @@ -3028,6 +3836,11 @@ test_no_content(si.port); test_conn_close(si.port); test_no_cache(si.port); + test_cache_read_gzipped(si.port); + test_http_status(si.port); + test_premature_disconnect(si.port); + test_connection_closing(si.port); + test_cache_control_verb(si.port);
/* send the basic request again to shutdown the server thread */ test_basic_request(si.port, "GET", "/quit"); @@ -3046,26 +3859,43 @@ LocalFree(info->lpszEncryptionAlgName); }
-static void test_cert_struct(HINTERNET req) +typedef struct { + const char *ex_subject; + const char *ex_issuer; +} cert_struct_test_t; + +static const cert_struct_test_t test_winehq_org_cert = { + "0mJuv1t-1CFypQkyTZwfvjHHBAbnUndG\r\n" + "GT98380011\r\n" + "See www.rapidssl.com/resources/cps (c)13\r\n" + "Domain Control Validated - RapidSSL(R)\r\n" + "*.winehq.org", + + "US\r\n" + ""GeoTrust, Inc."\r\n" + "RapidSSL CA" +}; + +static const cert_struct_test_t test_winehq_com_cert = { + "US\r\n" + "Minnesota\r\n" + "Saint Paul\r\n" + "WineHQ\r\n" + "test.winehq.com\r\n" + "webmaster@winehq.org", + + "US\r\n" + "Minnesota\r\n" + "WineHQ\r\n" + "test.winehq.com\r\n" + "webmaster@winehq.org" +}; + +static void test_cert_struct(HINTERNET req, const cert_struct_test_t *test) { INTERNET_CERTIFICATE_INFOA info; DWORD size; BOOL res; - - static const char ex_subject[] = - "US\r\n" - "Minnesota\r\n" - "Saint Paul\r\n" - "WineHQ\r\n" - "test.winehq.org\r\n" - "webmaster@winehq.org"; - - static const char ex_issuer[] = - "US\r\n" - "Minnesota\r\n" - "WineHQ\r\n" - "test.winehq.org\r\n" - "webmaster@winehq.org";
memset(&info, 0x5, sizeof(info));
@@ -3074,12 +3904,11 @@ ok(res, "InternetQueryOption failed: %u\n", GetLastError()); ok(size == sizeof(info), "size = %u\n", size);
- ok(!strcmp(info.lpszSubjectInfo, ex_subject), "lpszSubjectInfo = %s\n", info.lpszSubjectInfo); - ok(!strcmp(info.lpszIssuerInfo, ex_issuer), "lpszIssuerInfo = %s\n", info.lpszIssuerInfo); + ok(!strcmp(info.lpszSubjectInfo, test->ex_subject), "lpszSubjectInfo = %s\n", info.lpszSubjectInfo); + ok(!strcmp(info.lpszIssuerInfo, test->ex_issuer), "lpszIssuerInfo = %s\n", info.lpszIssuerInfo); ok(!info.lpszSignatureAlgName, "lpszSignatureAlgName = %s\n", info.lpszSignatureAlgName); ok(!info.lpszEncryptionAlgName, "lpszEncryptionAlgName = %s\n", info.lpszEncryptionAlgName); ok(!info.lpszProtocolName, "lpszProtocolName = %s\n", info.lpszProtocolName); - todo_wine ok(info.dwKeySize == 128, "dwKeySize = %u\n", info.dwKeySize);
release_cert_info(&info); @@ -3159,7 +3988,7 @@ pInternetSetStatusCallbackA(ses, &callback);
SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); - conn = InternetConnectA(ses, "test.winehq.org", INTERNET_DEFAULT_HTTPS_PORT, + conn = InternetConnectA(ses, "test.winehq.com", INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 0xdeadbeef); ok(conn != NULL, "InternetConnect failed with error %u\n", GetLastError()); CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); @@ -3183,7 +4012,7 @@ }
test_secflags_option(req, 0); - test_security_info("https://test.winehq.org/data/some_file.html?q", ERROR_INTERNET_ITEM_NOT_FOUND, 0); + test_security_info("https://test.winehq.com/data/some_file.html?q", ERROR_INTERNET_ITEM_NOT_FOUND, 0);
set_secflags(req, TRUE, SECURITY_FLAG_IGNORE_REVOCATION); test_secflags_option(req, SECURITY_FLAG_IGNORE_REVOCATION); @@ -3216,8 +4045,8 @@ WaitForSingleObject(hCompleteEvent, INFINITE); ok(req_error == ERROR_SUCCESS, "req_error = %d\n", req_error);
- todo_wine CHECK_NOT_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); - todo_wine CHECK_NOT_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); + CHECK_NOTIFIED(INTERNET_STATUS_RESOLVING_NAME); + CHECK_NOTIFIED(INTERNET_STATUS_NAME_RESOLVED); CHECK_NOTIFIED(INTERNET_STATUS_CONNECTING_TO_SERVER); CHECK_NOTIFIED(INTERNET_STATUS_CONNECTED_TO_SERVER); CHECK_NOTIFIED(INTERNET_STATUS_SENDING_REQUEST); @@ -3275,7 +4104,7 @@ CLEAR_NOTIFIED(INTERNET_STATUS_DETECTING_PROXY);
if(req_error != ERROR_INTERNET_SEC_CERT_REV_FAILED) { - win_skip("Unexpected cert errors, skipping security flags tests\n"); + win_skip("Unexpected cert errors %u, skipping security flags tests\n", req_error);
close_async_handle(ses, hCompleteEvent, 3); CloseHandle(hCompleteEvent); @@ -3316,7 +4145,7 @@
test_request_flags(req, INTERNET_REQFLAG_NO_HEADERS); test_secflags_option(req, SECURITY_FLAG_IGNORE_REVOCATION|0x1800000); - test_security_info("https://test.winehq.org/data/some_file.html?q", ERROR_INTERNET_ITEM_NOT_FOUND, 0); + test_security_info("https://test.winehq.com/data/some_file.html?q", ERROR_INTERNET_ITEM_NOT_FOUND, 0);
set_secflags(req, FALSE, SECURITY_FLAG_IGNORE_UNKNOWN_CA); test_secflags_option(req, 0x1800000|SECURITY_FLAG_IGNORE_REVOCATION|SECURITY_FLAG_IGNORE_UNKNOWN_CA @@ -3353,8 +4182,8 @@ test_secflags_option(req, SECURITY_FLAG_SECURE|SECURITY_FLAG_IGNORE_UNKNOWN_CA|SECURITY_FLAG_IGNORE_REVOCATION |SECURITY_FLAG_STRENGTH_STRONG|0x1800000);
- test_cert_struct(req); - test_security_info("https://test.winehq.org/data/some_file.html?q", 0, 0x1800000); + test_cert_struct(req, &test_winehq_com_cert); + test_security_info("https://test.winehq.com/data/some_file.html?q", 0, 0x1800000);
res = InternetReadFile(req, buf, sizeof(buf), &size); ok(res, "InternetReadFile failed: %u\n", GetLastError()); @@ -3374,7 +4203,7 @@ pInternetSetStatusCallbackA(ses, &callback);
SET_EXPECT(INTERNET_STATUS_HANDLE_CREATED); - conn = InternetConnectA(ses, "test.winehq.org", INTERNET_DEFAULT_HTTPS_PORT, + conn = InternetConnectA(ses, "test.winehq.com", INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, INTERNET_FLAG_SECURE, 0xdeadbeef); ok(conn != NULL, "InternetConnect failed with error %u\n", GetLastError()); CHECK_NOTIFIED(INTERNET_STATUS_HANDLE_CREATED); @@ -3426,7 +4255,7 @@
CloseHandle(hCompleteEvent);
- test_security_info("http://test.winehq.org/data/some_file.html?q", ERROR_INTERNET_ITEM_NOT_FOUND, 0); + test_security_info("http://test.winehq.com/data/some_file.html?q", ERROR_INTERNET_ITEM_NOT_FOUND, 0); test_security_info("file:///c:/dir/file.txt", ERROR_INTERNET_ITEM_NOT_FOUND, 0); test_security_info("xxx:///c:/dir/file.txt", ERROR_INTERNET_ITEM_NOT_FOUND, 0); } @@ -3434,9 +4263,9 @@ static void test_secure_connection(void) { static const WCHAR gizmo5[] = {'G','i','z','m','o','5',0}; - static const WCHAR testbot[] = {'t','e','s','t','b','o','t','.','w','i','n','e','h','q','.','o','r','g',0}; + static const WCHAR testsite[] = {'t','e','s','t','.','w','i','n','e','h','q','.','o','r','g',0}; static const WCHAR get[] = {'G','E','T',0}; - static const WCHAR slash[] = {'/',0}; + static const WCHAR testpage[] = {'/','t','e','s','t','s','/','h','e','l','l','o','.','h','t','m','l',0}; HINTERNET ses, con, req; DWORD size, flags; INTERNET_CERTIFICATE_INFOA *certificate_structA = NULL; @@ -3446,12 +4275,12 @@ ses = InternetOpen("Gizmo5", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); ok(ses != NULL, "InternetOpen failed\n");
- con = InternetConnect(ses, "testbot.winehq.org", + con = InternetConnect(ses, "test.winehq.org", INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); ok(con != NULL, "InternetConnect failed\n");
- req = HttpOpenRequest(con, "GET", "/", NULL, NULL, NULL, + req = HttpOpenRequest(con, "GET", "/tests/hello.html", NULL, NULL, NULL, INTERNET_FLAG_SECURE, 0); ok(req != NULL, "HttpOpenRequest failed\n");
@@ -3463,32 +4292,14 @@ ok(ret, "InternetQueryOption failed: %d\n", GetLastError()); ok(flags & SECURITY_FLAG_SECURE, "expected secure flag to be set\n");
- ret = InternetQueryOptionA(req, INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT, - NULL, &size); - ok(ret || GetLastError() == ERROR_INSUFFICIENT_BUFFER, "InternetQueryOption failed: %d\n", GetLastError()); - ok(size == sizeof(INTERNET_CERTIFICATE_INFOA), "size = %d\n", size); - certificate_structA = HeapAlloc(GetProcessHeap(), 0, size); - ret = InternetQueryOption(req, INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT, - certificate_structA, &size); - ok(ret, "InternetQueryOption failed: %d\n", GetLastError()); - if (ret) + if (!winetest_interactive) { - ok(certificate_structA->lpszSubjectInfo && - strlen(certificate_structA->lpszSubjectInfo) > 1, - "expected a non-empty subject name\n"); - ok(certificate_structA->lpszIssuerInfo && - strlen(certificate_structA->lpszIssuerInfo) > 1, - "expected a non-empty issuer name\n"); - ok(!certificate_structA->lpszSignatureAlgName, - "unexpected signature algorithm name\n"); - ok(!certificate_structA->lpszEncryptionAlgName, - "unexpected encryption algorithm name\n"); - ok(!certificate_structA->lpszProtocolName, - "unexpected protocol name\n"); - ok(certificate_structA->dwKeySize, "expected a non-zero key size\n"); - release_cert_info(certificate_structA); - } - HeapFree(GetProcessHeap(), 0, certificate_structA); + skip("test_cert_struct(req, &test_winehq_org_cert), ROSTESTS-121\n"); + } + else + { + test_cert_struct(req, &test_winehq_org_cert); + }
/* Querying the same option through InternetQueryOptionW still results in * ASCII strings being returned. @@ -3530,13 +4341,13 @@ ses = InternetOpenW(gizmo5, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); ok(ses != NULL, "InternetOpen failed\n");
- con = InternetConnectW(ses, testbot, + con = InternetConnectW(ses, testsite, INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); ok(con != NULL, "InternetConnect failed\n");
- req = HttpOpenRequestW(con, get, slash, NULL, NULL, NULL, - INTERNET_FLAG_SECURE, 0); + req = HttpOpenRequestW(con, get, testpage, NULL, NULL, NULL, + INTERNET_FLAG_SECURE|INTERNET_FLAG_RELOAD, 0); ok(req != NULL, "HttpOpenRequest failed\n");
ret = HttpSendRequest(req, NULL, 0, NULL, 0); @@ -3545,7 +4356,7 @@ size = sizeof(flags); ret = InternetQueryOption(req, INTERNET_OPTION_SECURITY_FLAGS, &flags, &size); ok(ret, "InternetQueryOption failed: %d\n", GetLastError()); - ok(flags & SECURITY_FLAG_SECURE, "expected secure flag to be set\n"); + ok(flags & SECURITY_FLAG_SECURE, "expected secure flag to be set, got %x\n", flags);
ret = InternetQueryOptionA(req, INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT, NULL, &size);
Modified: trunk/rostests/winetests/wininet/testlist.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wininet/testlist... ============================================================================== --- trunk/rostests/winetests/wininet/testlist.c [iso-8859-1] (original) +++ trunk/rostests/winetests/wininet/testlist.c [iso-8859-1] Sat Sep 28 15:27:08 2013 @@ -1,7 +1,7 @@ /* Automatically generated file; DO NOT EDIT!! */
#define STANDALONE -#include "wine/test.h" +#include <wine/test.h>
extern void func_ftp(void); extern void func_generated(void);
Modified: trunk/rostests/winetests/wininet/url.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wininet/url.c?re... ============================================================================== --- trunk/rostests/winetests/wininet/url.c [iso-8859-1] (original) +++ trunk/rostests/winetests/wininet/url.c [iso-8859-1] Sat Sep 28 15:27:08 2013 @@ -127,6 +127,9 @@ {"http://www.winehq.org/myscript.php;test=123", 0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 22, -1, 0, "http", "www.winehq.org", "", "", "/myscript.php;test=123", ""}, + {"HtTp://www.winehq.org/scheme", + 0, 4, INTERNET_SCHEME_HTTP, 7, 14, 23, 80, -1, 0, -1, 0, 21, 7, -1, 0, + "HtTp", "www.winehq.org", "", "", "/scheme", ""}, {"file:///C:/Program%20Files/Atmel/AVR%20Tools/STK500/STK500.xml", 0, 4, INTERNET_SCHEME_FILE, -1, 0, -1, 0, -1, 0, -1, 0, 7, 55, -1, 0, "file", "", "", "", "C:\Program Files\Atmel\AVR Tools\STK500\STK500.xml", ""},
Modified: trunk/rostests/winetests/wininet/urlcache.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wininet/urlcache... ============================================================================== --- trunk/rostests/winetests/wininet/urlcache.c [iso-8859-1] (original) +++ trunk/rostests/winetests/wininet/urlcache.c [iso-8859-1] Sat Sep 28 15:27:08 2013 @@ -28,6 +28,7 @@
#include <windef.h> #include <winbase.h> +#include <winnls.h> #include <wininet.h> #include <winineti.h>
@@ -811,6 +812,164 @@ } }
+static void test_urlcacheW(void) +{ + static struct test_data + { + DWORD err; + WCHAR url[128]; + char encoded_url[128]; + WCHAR extension[32]; + WCHAR header_info[128]; + }urls[] = { + { + 0, {'h','t','t','p',':','/','/','T','.','p','l','/','t',0}, + "http://T.pl/t", {0}, {0} + }, + { + 0, {'w','w','w','.','T','.','p','l','/','t',0}, + "www.T.pl/t", {0}, {0} + }, + { + 0, {'h','t','t','p',':','/','/','w','w','w','.','t','e','s','t',0x15b,0x107, + '.','o','r','g','/','t','e','s','t','.','h','t','m','l',0}, + "http://www.xn--test-ota71c.org/test.html", {'t','x','t',0}, {0} + }, + { + 0, {'w','w','w','.','T','e','s','t',0x15b,0x107,'.','o','r','g', + '/','t','e','s','t','.','h','t','m','l',0}, + "www.Test\xc5\x9b\xc4\x87.org/test.html", {'a',0x106,'a',0}, {'b',0x106,'b',0} + }, + { + 0, {'H','t','t','p','s',':','/','/',0x15b,0x15b,0x107,'/','t',0x107,'/', + 't','e','s','t','?','a','=','%','2','0',0x106,0}, + "Https://xn--4da1oa/t\xc4\x87/test?a=%20\xc4\x86", {'a',0x15b,'a',0}, {'b',0x15b,'b',0} + }, + { + 12005, {'h','t','t','p','s',':','/','/','/','/',0x107,'.','o','r','g','/','t','e','s','t',0}, + "", {0}, {0} + }, + { + 0, {'C','o','o','k','i','e',':',' ','u','s','e','r','@','h','t','t','p', + ':','/','/','t',0x15b,0x107,'.','o','r','g','/',0}, + "Cookie: user@http://t%5Cxc5%5Cx9b%5Cxc4%5Cx87.org/", {0}, {0} + } + }; + static const FILETIME filetime_zero; + + WCHAR bufW[MAX_PATH]; + DWORD i; + BOOL ret; + + if(old_ie) { + win_skip("urlcache unicode functions\n"); + return; + } + + for(i=0; i<sizeof(urls)/sizeof(*urls); i++) { + INTERNET_CACHE_ENTRY_INFOA *entry_infoA; + INTERNET_CACHE_ENTRY_INFOW *entry_infoW; + DWORD size; + + SetLastError(0xdeadbeef); + ret = CreateUrlCacheEntryW(urls[i].url, 0, NULL, bufW, 0); + if(urls[i].err != 0) { + ok(!ret, "%d) CreateUrlCacheEntryW succeeded\n", i); + ok(urls[i].err == GetLastError(), "%d) GetLastError() = %d\n", i, GetLastError()); + continue; + } + ok(ret, "%d) CreateUrlCacheEntryW failed: %d\n", i, GetLastError()); + + /* dwHeaderSize is ignored, pass 0 to prove it */ + ret = CommitUrlCacheEntryW(urls[i].url, bufW, filetime_zero, filetime_zero, + NORMAL_CACHE_ENTRY, urls[i].header_info, 0, urls[i].extension, NULL); + ok(ret, "%d) CommitUrlCacheEntryW failed: %d\n", i, GetLastError()); + + SetLastError(0xdeadbeef); + size = 0; + ret = GetUrlCacheEntryInfoW(urls[i].url, NULL, &size); + ok(!ret && GetLastError()==ERROR_INSUFFICIENT_BUFFER, + "%d) GetLastError() = %d\n", i, GetLastError()); + entry_infoW = HeapAlloc(GetProcessHeap(), 0, size); + ret = GetUrlCacheEntryInfoW(urls[i].url, entry_infoW, &size); + ok(ret, "%d) GetUrlCacheEntryInfoW failed: %d\n", i, GetLastError()); + + ret = GetUrlCacheEntryInfoA(urls[i].encoded_url, NULL, &size); + ok(!ret && GetLastError()==ERROR_INSUFFICIENT_BUFFER, + "%d) GetLastError() = %d\n", i, GetLastError()); + if(!ret && GetLastError()!=ERROR_INSUFFICIENT_BUFFER) { + win_skip("ANSI version of url is incorrect\n"); + continue; + } + entry_infoA = HeapAlloc(GetProcessHeap(), 0, size); + ret = GetUrlCacheEntryInfoA(urls[i].encoded_url, entry_infoA, &size); + ok(ret, "%d) GetUrlCacheEntryInfoA failed: %d\n", i, GetLastError()); + + ok(entry_infoW->dwStructSize == entry_infoA->dwStructSize, + "%d) entry_infoW->dwStructSize = %d, expected %d\n", + i, entry_infoW->dwStructSize, entry_infoA->dwStructSize); + ok(!lstrcmpW(urls[i].url, entry_infoW->lpszSourceUrlName), + "%d) entry_infoW->lpszSourceUrlName = %s\n", + i, wine_dbgstr_w(entry_infoW->lpszSourceUrlName)); + ok(!lstrcmpA(urls[i].encoded_url, entry_infoA->lpszSourceUrlName), + "%d) entry_infoA->lpszSourceUrlName = %s\n", + i, entry_infoA->lpszSourceUrlName); + ok(entry_infoW->CacheEntryType == entry_infoA->CacheEntryType, + "%d) entry_infoW->CacheEntryType = %x, expected %x\n", + i, entry_infoW->CacheEntryType, entry_infoA->CacheEntryType); + ok(entry_infoW->dwUseCount == entry_infoA->dwUseCount, + "%d) entry_infoW->dwUseCount = %d, expected %d\n", + i, entry_infoW->dwUseCount, entry_infoA->dwUseCount); + ok(entry_infoW->dwHitRate == entry_infoA->dwHitRate, + "%d) entry_infoW->dwHitRate = %d, expected %d\n", + i, entry_infoW->dwHitRate, entry_infoA->dwHitRate); + ok(entry_infoW->dwSizeLow == entry_infoA->dwSizeLow, + "%d) entry_infoW->dwSizeLow = %d, expected %d\n", + i, entry_infoW->dwSizeLow, entry_infoA->dwSizeLow); + ok(entry_infoW->dwSizeHigh == entry_infoA->dwSizeHigh, + "%d) entry_infoW->dwSizeHigh = %d, expected %d\n", + i, entry_infoW->dwSizeHigh, entry_infoA->dwSizeHigh); + ok(!memcmp(&entry_infoW->LastModifiedTime, &entry_infoA->LastModifiedTime, sizeof(FILETIME)), + "%d) entry_infoW->LastModifiedTime is incorrect\n", i); + ok(!memcmp(&entry_infoW->ExpireTime, &entry_infoA->ExpireTime, sizeof(FILETIME)), + "%d) entry_infoW->ExpireTime is incorrect\n", i); + ok(!memcmp(&entry_infoW->LastAccessTime, &entry_infoA->LastAccessTime, sizeof(FILETIME)), + "%d) entry_infoW->LastAccessTime is incorrect\n", i); + ok(!memcmp(&entry_infoW->LastSyncTime, &entry_infoA->LastSyncTime, sizeof(FILETIME)), + "%d) entry_infoW->LastSyncTime is incorrect\n", i); + + MultiByteToWideChar(CP_ACP, 0, entry_infoA->lpszLocalFileName, -1, bufW, MAX_PATH); + ok(!lstrcmpW(entry_infoW->lpszLocalFileName, bufW), + "%d) entry_infoW->lpszLocalFileName = %s, expected %s\n", + i, wine_dbgstr_w(entry_infoW->lpszLocalFileName), wine_dbgstr_w(bufW)); + + if(!urls[i].header_info[0]) { + ok(!entry_infoW->lpHeaderInfo, "entry_infoW->lpHeaderInfo != NULL\n"); + }else { + ok(!lstrcmpW((WCHAR*)entry_infoW->lpHeaderInfo, urls[i].header_info), + "%d) entry_infoW->lpHeaderInfo = %s\n", + i, wine_dbgstr_w((WCHAR*)entry_infoW->lpHeaderInfo)); + } + + if(!urls[i].extension[0]) { + ok(!entry_infoW->lpszFileExtension, "entry_infoW->lpszFileExtension != NULL\n"); + }else { + MultiByteToWideChar(CP_ACP, 0, entry_infoA->lpszFileExtension, -1, bufW, MAX_PATH); + ok(!lstrcmpW(entry_infoW->lpszFileExtension, bufW), + "%d) entry_infoW->lpszFileExtension = %s, expected %s\n", + i, wine_dbgstr_w(entry_infoW->lpszFileExtension), wine_dbgstr_w(bufW)); + } + + HeapFree(GetProcessHeap(), 0, entry_infoW); + HeapFree(GetProcessHeap(), 0, entry_infoA); + + if(pDeleteUrlCacheEntryA) { + ret = pDeleteUrlCacheEntryA(urls[i].encoded_url); + ok(ret, "%d) DeleteUrlCacheEntryW failed: %d\n", i, GetLastError()); + } + } +} + static void test_FindCloseUrlCache(void) { BOOL r; @@ -878,6 +1037,7 @@ pDeleteUrlCacheEntryA = (void*)GetProcAddress(hdll, "DeleteUrlCacheEntryA"); pUnlockUrlCacheEntryFileA = (void*)GetProcAddress(hdll, "UnlockUrlCacheEntryFileA"); test_urlcacheA(); + test_urlcacheW(); test_FindCloseUrlCache(); test_GetDiskInfoA(); }