Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
January 2020
- 75 participants
- 595 discussions
10 Jan '20
When a rectangle side has zero length, the miter join generator is
confused because it cannot recover the join angle. This patch avoids
that by using artificially non-degenerate previous and next vertices.
Signed-off-by: Giovanni Mascellani <gio(a)debian.org>
---
dlls/d2d1/geometry.c | 19 ++++++++++++++-----
dlls/d2d1/tests/d2d1.c | 6 +++---
2 files changed, 17 insertions(+), 8 deletions(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 6f4f4e5188..59f4e77d90 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -3789,7 +3789,7 @@ static const struct ID2D1RectangleGeometryVtbl d2d_rectangle_geometry_vtbl =
HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory *factory, const D2D1_RECT_F *rect)
{
struct d2d_face *f;
- D2D1_POINT_2F *v;
+ D2D1_POINT_2F *v, v0p, v0n, v1p, v1n, v2p, v2n, v3p, v3n;
float l, r, t, b;
d2d_geometry_init(geometry, factory, &identity, (ID2D1GeometryVtbl *)&d2d_rectangle_geometry_vtbl);
@@ -3818,6 +3818,15 @@ HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory
d2d_face_set(&f[1], 0, 2, 3);
geometry->fill.face_count = 2;
+ d2d_point_set(&v0p, l+1.0f, t);
+ d2d_point_set(&v0n, l, t+1.0f);
+ d2d_point_set(&v1p, l, b-1.0f);
+ d2d_point_set(&v1n, l+1.0f, b);
+ d2d_point_set(&v2p, r-1.0f, b);
+ d2d_point_set(&v2n, r, b-1.0f);
+ d2d_point_set(&v3p, r, t+1.0f);
+ d2d_point_set(&v3n, r-1.0f, t);
+
if (!d2d_geometry_outline_add_line_segment(geometry, &v[0], &v[1]))
goto fail;
if (!d2d_geometry_outline_add_line_segment(geometry, &v[1], &v[2]))
@@ -3827,13 +3836,13 @@ HRESULT d2d_rectangle_geometry_init(struct d2d_geometry *geometry, ID2D1Factory
if (!d2d_geometry_outline_add_line_segment(geometry, &v[3], &v[0]))
goto fail;
- if (!d2d_geometry_outline_add_join(geometry, &v[3], &v[0], &v[1]))
+ if (!d2d_geometry_outline_add_join(geometry, &v0p, &v[0], &v0n))
goto fail;
- if (!d2d_geometry_outline_add_join(geometry, &v[0], &v[1], &v[2]))
+ if (!d2d_geometry_outline_add_join(geometry, &v1p, &v[1], &v1n))
goto fail;
- if (!d2d_geometry_outline_add_join(geometry, &v[1], &v[2], &v[3]))
+ if (!d2d_geometry_outline_add_join(geometry, &v2p, &v[2], &v2n))
goto fail;
- if (!d2d_geometry_outline_add_join(geometry, &v[2], &v[3], &v[0]))
+ if (!d2d_geometry_outline_add_join(geometry, &v3p, &v[3], &v3n))
goto fail;
return S_OK;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 60dfb924cb..42cf524deb 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -5889,16 +5889,16 @@ static void test_draw_geometry(void)
ok(match, "Figure does not match.\n");
match = compare_figure(surface, 0, 160, 160, 160, 0xff652e89, 0, "5mAUjAEUjAEUjAEUjAEUhmIA");
- todo_wine ok(match, "Figure does not match.\n");
+ ok(match, "Figure does not match.\n");
match = compare_figure(surface, 160, 160, 160, 160, 0xff652e89, 0, "vmBkPGQ8ZDxkPGTeYQAA");
- todo_wine ok(match, "Figure does not match.\n");
+ ok(match, "Figure does not match.\n");
match = compare_figure(surface, 320, 160, 160, 160, 0xff652e89, 0,
"5i4UjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
"jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
"jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
"jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEU"
"jAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUjAEUhjAA");
- todo_wine ok(match, "Figure does not match.\n");
+ ok(match, "Figure does not match.\n");
match = compare_figure(surface, 480, 160, 160, 160, 0xff652e89, 0,
"vi5kPGQ8ZDxkPGQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwU"
"PBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8FDwUPBQ8"
--
2.25.0.rc2
2
1
[PATCH v2] httpapi/tests: Avoid depending on the availability of specific ports.
by Zebediah Figura 10 Jan '20
by Zebediah Figura 10 Jan '20
10 Jan '20
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/httpapi/tests/httpapi.c | 339 +++++++++++++++++++++--------------
1 file changed, 202 insertions(+), 137 deletions(-)
diff --git a/dlls/httpapi/tests/httpapi.c b/dlls/httpapi/tests/httpapi.c
index c506023ee7..ee585948ab 100644
--- a/dlls/httpapi/tests/httpapi.c
+++ b/dlls/httpapi/tests/httpapi.c
@@ -20,6 +20,8 @@
*/
#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@@ -31,8 +33,6 @@
#include "wine/test.h"
-static const WCHAR localhost_urlW[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/',0};
-static const WCHAR localhost_url2W[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','5','0','0','0','1','/',0};
static const WCHAR invalid_url1[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','5','0','0','0','0',0};
static const WCHAR invalid_url2[] = {'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0',0};
static const WCHAR invalid_url3[] = {'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/',0};
@@ -69,17 +69,17 @@ static void init(void)
static const char simple_req[] =
"GET /foobar HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"User-Agent: WINE\r\n"
"\r\n";
-static SOCKET create_client_socket(void)
+static SOCKET create_client_socket(unsigned short port)
{
struct sockaddr_in sockaddr =
{
.sin_family = AF_INET,
- .sin_port = htons(50000),
+ .sin_port = htons(port),
.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"),
};
SOCKET s = socket(AF_INET, SOCK_STREAM, 0), ret;
@@ -104,19 +104,65 @@ static void send_response_v1(HANDLE queue, HTTP_REQUEST_ID id, int s)
ok(ret > 0, "recv() failed.\n");
}
-static void test_v1_server(void)
+static unsigned short add_url_v1(HANDLE queue)
+{
+ unsigned short port;
+ WCHAR url[50];
+ ULONG ret;
+
+ for (port = 50000; port < 51000; ++port)
+ {
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ if ((ret = HttpAddUrl(queue, url, NULL)) != ERROR_SHARING_VIOLATION)
+ return port;
+ }
+ ok(0, "Failed to add url %s, error %u.\n", debugstr_w(url), ret);
+ return 0;
+}
+
+static ULONG add_url_v2(HTTP_URL_GROUP_ID group)
+{
+ unsigned short port;
+ WCHAR url[50];
+ ULONG ret;
+
+ for (port = 50010; port < 51000; ++port)
+ {
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ if ((ret = pHttpAddUrlToUrlGroup(group, url, 0xdeadbeef, 0)) != ERROR_SHARING_VIOLATION)
+ return port;
+ }
+ ok(0, "Failed to add url %s, error %u.\n", debugstr_w(url), ret);
+ return 0;
+}
+
+static ULONG remove_url_v1(HANDLE queue, unsigned short port)
+{
+ WCHAR url[50];
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ return HttpRemoveUrl(queue, url);
+}
+
+static ULONG remove_url_v2(HTTP_URL_GROUP_ID group, unsigned short port)
{
- static const WCHAR cooked_urlW[] = {'h','t','t','p',':','/','/',
- 'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/','f','o','o','b','a','r',0};
+ WCHAR url[50];
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ return pHttpRemoveUrlFromUrlGroup(group, url, 0);
+}
+static void test_v1_server(void)
+{
char DECLSPEC_ALIGN(8) req_buffer[2048], response_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
struct sockaddr_in sockaddr, *sin;
HTTP_RESPONSE_V1 response = {};
HANDLE queue, queue2;
+ unsigned short port;
+ char req_text[200];
unsigned int i;
OVERLAPPED ovl;
DWORD ret_size;
+ WCHAR url[50];
ULONG ret;
SOCKET s;
int len;
@@ -152,7 +198,7 @@ static void test_v1_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = HttpAddUrl(NULL, localhost_urlW, NULL);
+ ret = HttpAddUrl(NULL, L"http://localhost:50000/", NULL);
ok(ret == ERROR_INVALID_HANDLE || ret == ERROR_INVALID_PARAMETER /* < Vista */, "Got error %u.\n", ret);
ret = HttpAddUrl(queue, invalid_url1, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
@@ -166,14 +212,12 @@ static void test_v1_server(void)
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
ret = HttpAddUrl(queue, invalid_url6, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ port = add_url_v1(queue);
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ ret = HttpAddUrl(queue, url, NULL);
ok(ret == ERROR_ALREADY_EXISTS, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_url2W, NULL);
- todo_wine ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
+ s = create_client_socket(port);
len = sizeof(sockaddr);
ret = getsockname(s, (struct sockaddr *)&sockaddr, &len);
ok(ret == 0, "getsockname() failed, error %u.\n", WSAGetLastError());
@@ -183,8 +227,9 @@ static void test_v1_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = GetOverlappedResult(queue, &ovl, &ret_size, TRUE);
ok(ret, "Got error %u.\n", GetLastError());
@@ -210,7 +255,8 @@ static void test_v1_server(void)
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 14, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(!req->CookedUrl.QueryStringLength, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, cooked_urlW), "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/foobar", port);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, url), "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -218,7 +264,7 @@ static void test_v1_server(void)
ok(!memcmp(req->Address.pRemoteAddress, &sockaddr, len), "Client addresses didn't match.\n");
sin = (SOCKADDR_IN *)req->Address.pLocalAddress;
ok(sin->sin_family == AF_INET, "Got family %u.\n", sin->sin_family);
- ok(ntohs(sin->sin_port) == 50000, "Got wrong port %u.\n", ntohs(sin->sin_port));
+ ok(ntohs(sin->sin_port) == port, "Got wrong port %u.\n", ntohs(sin->sin_port));
ok(sin->sin_addr.S_un.S_addr == inet_addr("127.0.0.1"), "Got address %08x.\n", sin->sin_addr.S_un.S_addr);
ok(!req->Headers.UnknownHeaderCount, "Got %u unknown headers.\n", req->Headers.UnknownHeaderCount);
ok(!req->Headers.pUnknownHeaders, "Got unknown headers %p.\n", req->Headers.pUnknownHeaders);
@@ -233,9 +279,11 @@ static void test_v1_server(void)
}
else if (i == HttpHeaderHost)
{
- ok(req->Headers.KnownHeaders[i].RawValueLength == 15, "Got length %u.\n",
+ char expect[16];
+ sprintf(expect, "localhost:%u", port);
+ ok(req->Headers.KnownHeaders[i].RawValueLength == strlen(expect), "Got length %u.\n",
req->Headers.KnownHeaders[i].RawValueLength);
- ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, "localhost:50000"),
+ ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, expect),
"Got connection '%s'.\n", req->Headers.KnownHeaders[i].pRawValue);
}
else if (i == HttpHeaderUserAgent)
@@ -253,7 +301,7 @@ static void test_v1_server(void)
i, req->Headers.KnownHeaders[i].pRawValue);
}
}
- ok(req->BytesReceived == strlen(simple_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(!req->EntityChunkCount, "Got %u entity chunks.\n", req->EntityChunkCount);
ok(!req->pEntityChunks, "Got entity chunks %p.\n", req->pEntityChunks);
ok(!req->RawConnectionId, "Got SSL connection ID %s.\n", wine_dbgstr_longlong(req->RawConnectionId));
@@ -288,21 +336,19 @@ static void test_v1_server(void)
* reliably tested. Introducing a delay after send() and before
* HttpReceiveHttpRequest() confirms this. */
- ret = HttpRemoveUrl(NULL, localhost_urlW);
+ ret = remove_url_v1(NULL, port);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(ret == ERROR_FILE_NOT_FOUND, "Got error %u.\n", ret);
- ret = HttpRemoveUrl(queue, localhost_url2W);
- todo_wine ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(ovl.hEvent);
ret = CloseHandle(queue);
ok(ret, "Failed to close queue handle, error %u.\n", GetLastError());
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = HttpAddUrl(queue, L"http://localhost:50000/", NULL);
ok(ret == ERROR_INVALID_HANDLE, "Got error %u.\n", ret);
}
@@ -311,8 +357,10 @@ static void test_v1_completion_port(void)
char DECLSPEC_ALIGN(8) req_buffer[2048], response_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
HTTP_RESPONSE_V1 response = {};
+ unsigned short tcp_port;
OVERLAPPED ovl, *povl;
HANDLE queue, port;
+ char req_text[200];
DWORD ret_size;
ULONG_PTR key;
ULONG ret;
@@ -333,17 +381,16 @@ static void test_v1_completion_port(void)
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), NULL, &ovl);
ok(ret == ERROR_IO_PENDING, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
-
- s = create_client_socket();
+ tcp_port = add_url_v1(queue);
+ s = create_client_socket(tcp_port);
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 0);
ok(!ret, "Expected failure.\n");
ok(GetLastError() == WAIT_TIMEOUT, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, tcp_port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret_size = key = 0xdeadbeef;
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 1000);
@@ -371,7 +418,7 @@ static void test_v1_completion_port(void)
ret = recv(s, response_buffer, sizeof(response_buffer), 0);
ok(ret == ret_size, "Expected size %u, got %u.\n", ret_size, ret);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, tcp_port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(port);
@@ -387,6 +434,8 @@ static void test_v1_multiple_requests(void)
HTTP_RESPONSE_V1 response = {};
struct sockaddr_in sockaddr;
OVERLAPPED ovl1, ovl2;
+ unsigned short port;
+ char req_text[200];
DWORD ret_size;
SOCKET s1, s2;
HANDLE queue;
@@ -398,8 +447,7 @@ static void test_v1_multiple_requests(void)
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
+ port = add_url_v1(queue);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req1, sizeof(req_buffer1), NULL, &ovl1);
ok(ret == ERROR_IO_PENDING, "Got error %u.\n", ret);
@@ -411,18 +459,19 @@ static void test_v1_multiple_requests(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- s1 = create_client_socket();
- ret = send(s1, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ s1 = create_client_socket(port);
+ sprintf(req_text, simple_req, port);
+ ret = send(s1, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = WaitForSingleObject(ovl1.hEvent, 100);
ok(!ret, "Got %u.\n", ret);
ret = WaitForSingleObject(ovl2.hEvent, 100);
ok(ret == WAIT_TIMEOUT, "Got %u.\n", ret);
- s2 = create_client_socket();
- ret = send(s2, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ s2 = create_client_socket(port);
+ ret = send(s2, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = WaitForSingleObject(ovl1.hEvent, 0);
ok(!ret, "Got %u.\n", ret);
@@ -455,10 +504,10 @@ static void test_v1_multiple_requests(void)
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req2, sizeof(req_buffer2), NULL, &ovl2);
ok(ret == ERROR_IO_PENDING, "Got error %u.\n", ret);
- ret = send(s1, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
- ret = send(s1, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ ret = send(s1, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
+ ret = send(s1, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = WaitForSingleObject(ovl1.hEvent, 100);
ok(!ret, "Got %u.\n", ret);
@@ -474,7 +523,7 @@ static void test_v1_multiple_requests(void)
ok(req1->RequestId != req2->RequestId,
"Expected different request IDs, but got %s.\n", wine_dbgstr_longlong(req1->RequestId));
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s1);
closesocket(s2);
@@ -489,6 +538,8 @@ static void test_v1_short_buffer(void)
char DECLSPEC_ALIGN(8) req_buffer[2048], DECLSPEC_ALIGN(8) req_buffer2[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer, *req2 = (HTTP_REQUEST_V1 *)req_buffer2;
HTTP_REQUEST_ID req_id;
+ unsigned short port;
+ char req_text[200];
OVERLAPPED ovl;
DWORD ret_size;
HANDLE queue;
@@ -499,12 +550,12 @@ static void test_v1_short_buffer(void)
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
+ port = add_url_v1(queue);
- s = create_client_socket();
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, simple_req, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(HTTP_REQUEST_V1) - 1, &ret_size, NULL);
@@ -536,7 +587,7 @@ static void test_v1_short_buffer(void)
CancelIo(queue);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(ovl.hEvent);
@@ -551,6 +602,8 @@ static void test_v1_entity_body(void)
HTTP_RESPONSE_V1 response = {};
HTTP_DATA_CHUNK chunks[2] = {};
ULONG ret, chunk_size;
+ unsigned short port;
+ char req_text[200];
unsigned int i;
OVERLAPPED ovl;
DWORD ret_size;
@@ -559,7 +612,7 @@ static void test_v1_entity_body(void)
static const char post_req[] =
"POST /xyzzy HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"Content-Length: 5\r\n"
"\r\n"
@@ -567,7 +620,7 @@ static void test_v1_entity_body(void)
static const char post_req2[] =
"POST /xyzzy HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"Content-Length: 2048\r\n"
"\r\n";
@@ -579,12 +632,12 @@ static void test_v1_entity_body(void)
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
+ port = add_url_v1(queue);
- s = create_client_socket();
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, post_req, port);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
/* Windows versions before 8 will return success, and report that an entity
* body exists in the Flags member, but fail to account for it in the
* BytesReceived member or actually copy it to the buffer, if
@@ -597,7 +650,7 @@ static void test_v1_entity_body(void)
ok(!ret, "Got error %u.\n", ret);
ok(ret_size > sizeof(*req), "Got size %u.\n", ret_size);
ok(req->Flags == HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS, "Got flags %#x.\n", req->Flags);
- ok(req->BytesReceived == sizeof(post_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text) + 1, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength == 1,
"Got header length %u.\n", req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength);
ok(!strcmp(req->Headers.KnownHeaders[HttpHeaderContentLength].pRawValue, "5"),
@@ -637,8 +690,8 @@ static void test_v1_entity_body(void)
* but it also won't truncate the entity body to match. It will however
* always write its own Date header. */
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
ok(!ret, "Got error %u.\n", ret);
@@ -661,8 +714,8 @@ static void test_v1_entity_body(void)
/* Test the COPY_BODY flag. */
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY,
@@ -670,7 +723,7 @@ static void test_v1_entity_body(void)
ok(!ret, "Got error %u.\n", ret);
ok(ret_size > sizeof(*req), "Got size %u.\n", ret_size);
ok(!req->Flags, "Got flags %#x.\n", req->Flags);
- ok(req->BytesReceived == sizeof(post_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text) + 1, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength == 1,
"Got header length %u.\n", req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength);
ok(!strcmp(req->Headers.KnownHeaders[HttpHeaderContentLength].pRawValue, "5"),
@@ -685,8 +738,9 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req2, strlen(post_req2), 0);
- ok(ret == strlen(post_req2), "send() returned %d.\n", ret);
+ sprintf(req_text, post_req2, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = send(s, req_body, sizeof(req_body), 0);
ok(ret == sizeof(req_body), "send() returned %d.\n", ret);
@@ -697,7 +751,7 @@ static void test_v1_entity_body(void)
ok(!ret, "Got error %u.\n", ret);
ok(ret_size == 2000, "Got size %u.\n", ret_size);
ok(req->Flags == HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS, "Got flags %#x.\n", req->Flags);
- ok(req->BytesReceived == strlen(post_req2) + 2048, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text) + 2048, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength == 4,
"Got header length %u.\n", req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength);
ok(!strcmp(req->Headers.KnownHeaders[HttpHeaderContentLength].pRawValue, "2048"),
@@ -713,8 +767,9 @@ static void test_v1_entity_body(void)
/* Test HttpReceiveRequestEntityBody(). */
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ sprintf(req_text, post_req, port);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -739,8 +794,8 @@ static void test_v1_entity_body(void)
ret = HttpReceiveRequestEntityBody(queue, req->RequestId, 0, recv_body, sizeof(recv_body), &ret_size, NULL);
ok(ret == ERROR_CONNECTION_INVALID, "Got error %u.\n", ret);
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -766,8 +821,8 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -787,8 +842,8 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY,
@@ -800,8 +855,9 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req2, strlen(post_req2), 0);
- ok(ret == strlen(post_req2), "send() returned %d.\n", ret);
+ sprintf(req_text, post_req2, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = send(s, req_body, sizeof(req_body), 0);
ok(ret == sizeof(req_body), "send() returned %d.\n", ret);
@@ -824,7 +880,7 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
CloseHandle(ovl.hEvent);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -834,16 +890,16 @@ static void test_v1_entity_body(void)
static void test_v1_bad_request(void)
{
char response_buffer[2048];
+ unsigned short port;
HANDLE queue;
ULONG ret;
SOCKET s;
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
+ port = add_url_v1(queue);
- s = create_client_socket();
+ s = create_client_socket(port);
ret = send(s, "foo\r\n", strlen("foo\r\n"), 0);
ok(ret == strlen("foo\r\n"), "send() returned %d.\n", ret);
@@ -864,7 +920,7 @@ static void test_v1_bad_request(void)
ok(!ret, "Connection should be shut down.\n");
ok(!WSAGetLastError(), "Got error %u.\n", WSAGetLastError());
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -873,11 +929,11 @@ static void test_v1_bad_request(void)
static void test_v1_cooked_url(void)
{
- static const WCHAR cooked_urlW[] = {'h','t','t','p',':','/','/',
- 'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/','f','o','o','b','a','r','?','a','=','b',0};
-
char DECLSPEC_ALIGN(8) req_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
+ char expect[24], req_text[200];
+ unsigned short port;
+ WCHAR expectW[50];
DWORD ret_size;
HANDLE queue;
ULONG ret;
@@ -885,24 +941,24 @@ static void test_v1_cooked_url(void)
static const char req1[] =
"GET /foobar?a=b HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"\r\n";
static const char req2[] =
- "GET http://localhost:50000/ HTTP/1.1\r\n"
+ "GET http://localhost:%u/ HTTP/1.1\r\n"
"Host: ignored\r\n"
"Connection: keep-alive\r\n"
"\r\n";
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
+ port = add_url_v1(queue);
- s = create_client_socket();
- ret = send(s, req1, strlen(req1), 0);
- ok(ret == strlen(req1), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, req1, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -914,8 +970,9 @@ static void test_v1_cooked_url(void)
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 14, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(req->CookedUrl.QueryStringLength == 8, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, cooked_urlW),
- "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(expectW, ARRAY_SIZE(expectW), L"http://localhost:%u/foobar?a=b", port);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, expectW), "Expected full URL %s, got %s.\n",
+ debugstr_w(expectW), debugstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -924,21 +981,24 @@ static void test_v1_cooked_url(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, req2, strlen(req2), 0);
- ok(ret == strlen(req2), "send() returned %d.\n", ret);
+ sprintf(req_text, req2, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
ok(!ret, "Got error %u.\n", ret);
ok(ret_size > sizeof(*req), "Got size %u.\n", ret_size);
ok(req->RawUrlLength == 23, "Got raw URL length %u.\n", req->RawUrlLength);
- ok(!strcmp(req->pRawUrl, "http://localhost:50000/"), "Got raw URL %s.\n", req->pRawUrl);
+ sprintf(expect, "http://localhost:%u/", port);
+ ok(!strcmp(req->pRawUrl, expect), "Expected raw URL \"%s\", got \"%s\".\n", expect, req->pRawUrl);
ok(req->CookedUrl.FullUrlLength == 46, "Got full URL length %u.\n", req->CookedUrl.FullUrlLength);
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 2, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(!req->CookedUrl.QueryStringLength, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, localhost_urlW),
- "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(expectW, ARRAY_SIZE(expectW), L"http://localhost:%u/", port);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, expectW), "Expected full URL %s, got %s.\n",
+ wine_dbgstr_w(expectW), wine_dbgstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -946,7 +1006,7 @@ static void test_v1_cooked_url(void)
send_response_v1(queue, req->RequestId, s);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -957,6 +1017,8 @@ static void test_v1_unknown_tokens(void)
{
char DECLSPEC_ALIGN(8) req_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
+ unsigned short port;
+ char req_text[200];
DWORD ret_size;
HANDLE queue;
ULONG ret;
@@ -964,19 +1026,19 @@ static void test_v1_unknown_tokens(void)
static const char req1[] =
"xyzzy / HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"Qux: foo baz \r\n"
"\r\n";
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
- ok(!ret, "Got error %u.\n", ret);
+ port = add_url_v1(queue);
- s = create_client_socket();
- ret = send(s, req1, strlen(req1), 0);
- ok(ret == strlen(req1), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, req1, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -994,7 +1056,7 @@ static void test_v1_unknown_tokens(void)
ok(!strcmp(req->Headers.pUnknownHeaders[0].pRawValue, "foo baz"), "Got value %s.\n",
req->Headers.pUnknownHeaders[0].pRawValue);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -1088,9 +1150,6 @@ static void test_HttpCreateUrlGroup(void)
static void test_v2_server(void)
{
- static const WCHAR cooked_urlW[] = {'h','t','t','p',':','/','/',
- 'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/','f','o','o','b','a','r',0};
-
char DECLSPEC_ALIGN(8) req_buffer[2048], response_buffer[2048];
HTTP_REQUEST_V2 *reqv2 = (HTTP_REQUEST_V2 *)req_buffer;
static const HTTPAPI_VERSION version = {2, 0};
@@ -1100,9 +1159,12 @@ static void test_v2_server(void)
HTTP_RESPONSE_V2 response = {};
HTTP_BINDING_INFO binding;
HTTP_URL_GROUP_ID group;
+ unsigned short port;
+ char req_text[100];
unsigned int i;
OVERLAPPED ovl;
DWORD ret_size;
+ WCHAR url[50];
HANDLE queue;
ULONG ret;
SOCKET s;
@@ -1134,8 +1196,8 @@ static void test_v2_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = pHttpAddUrlToUrlGroup(group, localhost_urlW, 0xdeadbeef, 0);
- ok(!ret, "Got error %u.\n", ret);
+ port = add_url_v2(group);
+
ret = pHttpAddUrlToUrlGroup(group, invalid_url1, 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
ret = pHttpAddUrlToUrlGroup(group, invalid_url2, 0xdeadbeef, 0);
@@ -1148,12 +1210,11 @@ static void test_v2_server(void)
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
ret = pHttpAddUrlToUrlGroup(group, invalid_url6, 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, localhost_urlW, 0xdeadbeef, 0);
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ ret = pHttpAddUrlToUrlGroup(group, url, 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_ALREADY_EXISTS, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, localhost_url2W, 0xdeadbeef, 0);
- todo_wine ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
+ s = create_client_socket(port);
len = sizeof(sockaddr);
ret = getsockname(s, (struct sockaddr *)&sockaddr, &len);
ok(ret == 0, "getsockname() failed, error %u.\n", WSAGetLastError());
@@ -1163,8 +1224,9 @@ static void test_v2_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = GetOverlappedResult(queue, &ovl, &ret_size, TRUE);
ok(ret, "Got error %u.\n", GetLastError());
@@ -1186,7 +1248,9 @@ static void test_v2_server(void)
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 14, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(!req->CookedUrl.QueryStringLength, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, cooked_urlW), "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/foobar", port);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, url), "Expected full URL %s, got %s.\n",
+ debugstr_w(url), debugstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -1194,7 +1258,7 @@ static void test_v2_server(void)
ok(!memcmp(req->Address.pRemoteAddress, &sockaddr, len), "Client addresses didn't match.\n");
sin = (SOCKADDR_IN *)req->Address.pLocalAddress;
ok(sin->sin_family == AF_INET, "Got family %u.\n", sin->sin_family);
- ok(ntohs(sin->sin_port) == 50000, "Got wrong port %u.\n", ntohs(sin->sin_port));
+ ok(ntohs(sin->sin_port) == port, "Got wrong port %u.\n", ntohs(sin->sin_port));
ok(sin->sin_addr.S_un.S_addr == inet_addr("127.0.0.1"), "Got address %08x.\n", sin->sin_addr.S_un.S_addr);
ok(!req->Headers.UnknownHeaderCount, "Got %u unknown headers.\n", req->Headers.UnknownHeaderCount);
ok(!req->Headers.pUnknownHeaders, "Got unknown headers %p.\n", req->Headers.pUnknownHeaders);
@@ -1209,9 +1273,11 @@ static void test_v2_server(void)
}
else if (i == HttpHeaderHost)
{
- ok(req->Headers.KnownHeaders[i].RawValueLength == 15, "Got length %u.\n",
+ char expect[16];
+ sprintf(expect, "localhost:%u", port);
+ ok(req->Headers.KnownHeaders[i].RawValueLength == strlen(expect), "Got length %u.\n",
req->Headers.KnownHeaders[i].RawValueLength);
- ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, "localhost:50000"),
+ ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, expect),
"Got connection '%s'.\n", req->Headers.KnownHeaders[i].pRawValue);
}
else if (i == HttpHeaderUserAgent)
@@ -1229,7 +1295,7 @@ static void test_v2_server(void)
i, req->Headers.KnownHeaders[i].pRawValue);
}
}
- ok(req->BytesReceived == strlen(simple_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(!req->EntityChunkCount, "Got %u entity chunks.\n", req->EntityChunkCount);
ok(!req->pEntityChunks, "Got entity chunks %p.\n", req->pEntityChunks);
ok(!req->RawConnectionId, "Got SSL connection ID %s.\n", wine_dbgstr_longlong(req->RawConnectionId));
@@ -1262,12 +1328,10 @@ static void test_v2_server(void)
ret = HttpReceiveHttpRequest(queue, req->RequestId, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), NULL, &ovl);
ok(ret == ERROR_CONNECTION_INVALID, "Got error %u.\n", ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_urlW, 0);
+ ret = remove_url_v2(group, port);
ok(!ret, "Got error %u.\n", ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_urlW, 0);
+ ret = remove_url_v2(group, port);
ok(ret == ERROR_FILE_NOT_FOUND, "Got error %u.\n", ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_url2W, 0);
- todo_wine ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(ovl.hEvent);
@@ -1288,8 +1352,10 @@ static void test_v2_completion_port(void)
HTTP_RESPONSE_V2 response = {};
HTTP_BINDING_INFO binding;
HTTP_URL_GROUP_ID group;
+ unsigned short tcp_port;
OVERLAPPED ovl, *povl;
HANDLE queue, port;
+ char req_text[100];
DWORD ret_size;
ULONG_PTR key;
ULONG ret;
@@ -1318,17 +1384,16 @@ static void test_v2_completion_port(void)
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), NULL, &ovl);
ok(ret == ERROR_IO_PENDING, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, localhost_urlW, 0, 0);
- ok(!ret, "Got error %u.\n", ret);
-
- s = create_client_socket();
+ tcp_port = add_url_v2(group);
+ s = create_client_socket(tcp_port);
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 0);
ok(!ret, "Expected failure.\n");
ok(GetLastError() == WAIT_TIMEOUT, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, tcp_port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret_size = key = 0xdeadbeef;
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 1000);
@@ -1356,7 +1421,7 @@ static void test_v2_completion_port(void)
ret = recv(s, response_buffer, sizeof(response_buffer), 0);
ok(ret == ret_size, "Expected size %u, got %u.\n", ret_size, ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_urlW, 0);
+ ret = remove_url_v2(group, tcp_port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(port);
--
2.24.1
1
0
[PATCH] httpapi/tests: Avoid depending on the availability of specific ports.
by Zebediah Figura 10 Jan '20
by Zebediah Figura 10 Jan '20
10 Jan '20
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/httpapi/tests/httpapi.c | 322 ++++++++++++++++++++++-------------
1 file changed, 201 insertions(+), 121 deletions(-)
diff --git a/dlls/httpapi/tests/httpapi.c b/dlls/httpapi/tests/httpapi.c
index c506023ee7..24c341a904 100644
--- a/dlls/httpapi/tests/httpapi.c
+++ b/dlls/httpapi/tests/httpapi.c
@@ -20,6 +20,8 @@
*/
#include <stdarg.h>
+#include <stdio.h>
+#include <wchar.h>
#include "ntstatus.h"
#define WIN32_NO_STATUS
@@ -31,8 +33,6 @@
#include "wine/test.h"
-static const WCHAR localhost_urlW[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/',0};
-static const WCHAR localhost_url2W[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','5','0','0','0','1','/',0};
static const WCHAR invalid_url1[] = {'h','t','t','p',':','/','/','l','o','c','a','l','h','o','s','t',':','5','0','0','0','0',0};
static const WCHAR invalid_url2[] = {'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0',0};
static const WCHAR invalid_url3[] = {'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/',0};
@@ -69,17 +69,17 @@ static void init(void)
static const char simple_req[] =
"GET /foobar HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"User-Agent: WINE\r\n"
"\r\n";
-static SOCKET create_client_socket(void)
+static SOCKET create_client_socket(unsigned short port)
{
struct sockaddr_in sockaddr =
{
.sin_family = AF_INET,
- .sin_port = htons(50000),
+ .sin_port = htons(port),
.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"),
};
SOCKET s = socket(AF_INET, SOCK_STREAM, 0), ret;
@@ -104,19 +104,61 @@ static void send_response_v1(HANDLE queue, HTTP_REQUEST_ID id, int s)
ok(ret > 0, "recv() failed.\n");
}
-static void test_v1_server(void)
+static ULONG add_url_v1(HANDLE queue, unsigned short *port)
+{
+ WCHAR url[50];
+ ULONG ret;
+
+ for (*port = 50010; *port < 51000; ++*port)
+ {
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", *port);
+ if ((ret = HttpAddUrl(queue, url, NULL)) != ERROR_SHARING_VIOLATION)
+ break;
+ }
+ return ret;
+}
+
+static ULONG add_url_v2(HTTP_URL_GROUP_ID group, unsigned short *port)
{
- static const WCHAR cooked_urlW[] = {'h','t','t','p',':','/','/',
- 'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/','f','o','o','b','a','r',0};
+ WCHAR url[50];
+ ULONG ret;
+ for (*port = 50010; *port < 51000; ++*port)
+ {
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", *port);
+ if ((ret = pHttpAddUrlToUrlGroup(group, url, 0xdeadbeef, 0)) != ERROR_SHARING_VIOLATION)
+ break;
+ }
+ return ret;
+}
+
+static ULONG remove_url_v1(HANDLE queue, unsigned short port)
+{
+ WCHAR url[50];
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ return HttpRemoveUrl(queue, url);
+}
+
+static ULONG remove_url_v2(HTTP_URL_GROUP_ID group, unsigned short port)
+{
+ WCHAR url[50];
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ return pHttpRemoveUrlFromUrlGroup(group, url, 0);
+}
+
+static void test_v1_server(void)
+{
char DECLSPEC_ALIGN(8) req_buffer[2048], response_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
struct sockaddr_in sockaddr, *sin;
HTTP_RESPONSE_V1 response = {};
+ unsigned short port1, port2;
HANDLE queue, queue2;
+ char req_text[200];
unsigned int i;
OVERLAPPED ovl;
DWORD ret_size;
+ WCHAR url[50];
ULONG ret;
SOCKET s;
int len;
@@ -152,7 +194,7 @@ static void test_v1_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = HttpAddUrl(NULL, localhost_urlW, NULL);
+ ret = HttpAddUrl(NULL, L"http://localhost:50000/", NULL);
ok(ret == ERROR_INVALID_HANDLE || ret == ERROR_INVALID_PARAMETER /* < Vista */, "Got error %u.\n", ret);
ret = HttpAddUrl(queue, invalid_url1, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
@@ -166,14 +208,15 @@ static void test_v1_server(void)
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
ret = HttpAddUrl(queue, invalid_url6, NULL);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &port1);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port1);
+ ret = HttpAddUrl(queue, url, NULL);
ok(ret == ERROR_ALREADY_EXISTS, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_url2W, NULL);
+ ret = add_url_v1(queue, &port2);
todo_wine ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
+ s = create_client_socket(port1);
len = sizeof(sockaddr);
ret = getsockname(s, (struct sockaddr *)&sockaddr, &len);
ok(ret == 0, "getsockname() failed, error %u.\n", WSAGetLastError());
@@ -183,8 +226,9 @@ static void test_v1_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, port1);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = GetOverlappedResult(queue, &ovl, &ret_size, TRUE);
ok(ret, "Got error %u.\n", GetLastError());
@@ -210,7 +254,8 @@ static void test_v1_server(void)
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 14, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(!req->CookedUrl.QueryStringLength, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, cooked_urlW), "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/foobar", port1);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, url), "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -218,7 +263,7 @@ static void test_v1_server(void)
ok(!memcmp(req->Address.pRemoteAddress, &sockaddr, len), "Client addresses didn't match.\n");
sin = (SOCKADDR_IN *)req->Address.pLocalAddress;
ok(sin->sin_family == AF_INET, "Got family %u.\n", sin->sin_family);
- ok(ntohs(sin->sin_port) == 50000, "Got wrong port %u.\n", ntohs(sin->sin_port));
+ ok(ntohs(sin->sin_port) == port1, "Got wrong port %u.\n", ntohs(sin->sin_port));
ok(sin->sin_addr.S_un.S_addr == inet_addr("127.0.0.1"), "Got address %08x.\n", sin->sin_addr.S_un.S_addr);
ok(!req->Headers.UnknownHeaderCount, "Got %u unknown headers.\n", req->Headers.UnknownHeaderCount);
ok(!req->Headers.pUnknownHeaders, "Got unknown headers %p.\n", req->Headers.pUnknownHeaders);
@@ -233,9 +278,11 @@ static void test_v1_server(void)
}
else if (i == HttpHeaderHost)
{
- ok(req->Headers.KnownHeaders[i].RawValueLength == 15, "Got length %u.\n",
+ char expect[16];
+ sprintf(expect, "localhost:%u", port1);
+ ok(req->Headers.KnownHeaders[i].RawValueLength == strlen(expect), "Got length %u.\n",
req->Headers.KnownHeaders[i].RawValueLength);
- ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, "localhost:50000"),
+ ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, expect),
"Got connection '%s'.\n", req->Headers.KnownHeaders[i].pRawValue);
}
else if (i == HttpHeaderUserAgent)
@@ -253,7 +300,7 @@ static void test_v1_server(void)
i, req->Headers.KnownHeaders[i].pRawValue);
}
}
- ok(req->BytesReceived == strlen(simple_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(!req->EntityChunkCount, "Got %u entity chunks.\n", req->EntityChunkCount);
ok(!req->pEntityChunks, "Got entity chunks %p.\n", req->pEntityChunks);
ok(!req->RawConnectionId, "Got SSL connection ID %s.\n", wine_dbgstr_longlong(req->RawConnectionId));
@@ -288,13 +335,13 @@ static void test_v1_server(void)
* reliably tested. Introducing a delay after send() and before
* HttpReceiveHttpRequest() confirms this. */
- ret = HttpRemoveUrl(NULL, localhost_urlW);
+ ret = remove_url_v1(NULL, port1);
ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port1);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port1);
ok(ret == ERROR_FILE_NOT_FOUND, "Got error %u.\n", ret);
- ret = HttpRemoveUrl(queue, localhost_url2W);
+ ret = remove_url_v1(queue, port2);
todo_wine ok(!ret, "Got error %u.\n", ret);
closesocket(s);
@@ -302,7 +349,7 @@ static void test_v1_server(void)
ret = CloseHandle(queue);
ok(ret, "Failed to close queue handle, error %u.\n", GetLastError());
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = HttpAddUrl(queue, L"http://localhost:50000/", NULL);
ok(ret == ERROR_INVALID_HANDLE, "Got error %u.\n", ret);
}
@@ -311,8 +358,10 @@ static void test_v1_completion_port(void)
char DECLSPEC_ALIGN(8) req_buffer[2048], response_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
HTTP_RESPONSE_V1 response = {};
+ unsigned short tcp_port;
OVERLAPPED ovl, *povl;
HANDLE queue, port;
+ char req_text[200];
DWORD ret_size;
ULONG_PTR key;
ULONG ret;
@@ -333,17 +382,18 @@ static void test_v1_completion_port(void)
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), NULL, &ovl);
ok(ret == ERROR_IO_PENDING, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &tcp_port);
ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
+ s = create_client_socket(tcp_port);
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 0);
ok(!ret, "Expected failure.\n");
ok(GetLastError() == WAIT_TIMEOUT, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, tcp_port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret_size = key = 0xdeadbeef;
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 1000);
@@ -371,7 +421,7 @@ static void test_v1_completion_port(void)
ret = recv(s, response_buffer, sizeof(response_buffer), 0);
ok(ret == ret_size, "Expected size %u, got %u.\n", ret_size, ret);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, tcp_port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(port);
@@ -387,6 +437,8 @@ static void test_v1_multiple_requests(void)
HTTP_RESPONSE_V1 response = {};
struct sockaddr_in sockaddr;
OVERLAPPED ovl1, ovl2;
+ unsigned short port;
+ char req_text[200];
DWORD ret_size;
SOCKET s1, s2;
HANDLE queue;
@@ -398,7 +450,7 @@ static void test_v1_multiple_requests(void)
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &port);
ok(!ret, "Got error %u.\n", ret);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req1, sizeof(req_buffer1), NULL, &ovl1);
@@ -411,18 +463,19 @@ static void test_v1_multiple_requests(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- s1 = create_client_socket();
- ret = send(s1, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ s1 = create_client_socket(port);
+ sprintf(req_text, simple_req, port);
+ ret = send(s1, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = WaitForSingleObject(ovl1.hEvent, 100);
ok(!ret, "Got %u.\n", ret);
ret = WaitForSingleObject(ovl2.hEvent, 100);
ok(ret == WAIT_TIMEOUT, "Got %u.\n", ret);
- s2 = create_client_socket();
- ret = send(s2, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ s2 = create_client_socket(port);
+ ret = send(s2, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = WaitForSingleObject(ovl1.hEvent, 0);
ok(!ret, "Got %u.\n", ret);
@@ -455,10 +508,10 @@ static void test_v1_multiple_requests(void)
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req2, sizeof(req_buffer2), NULL, &ovl2);
ok(ret == ERROR_IO_PENDING, "Got error %u.\n", ret);
- ret = send(s1, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
- ret = send(s1, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ ret = send(s1, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
+ ret = send(s1, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = WaitForSingleObject(ovl1.hEvent, 100);
ok(!ret, "Got %u.\n", ret);
@@ -474,7 +527,7 @@ static void test_v1_multiple_requests(void)
ok(req1->RequestId != req2->RequestId,
"Expected different request IDs, but got %s.\n", wine_dbgstr_longlong(req1->RequestId));
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s1);
closesocket(s2);
@@ -489,6 +542,8 @@ static void test_v1_short_buffer(void)
char DECLSPEC_ALIGN(8) req_buffer[2048], DECLSPEC_ALIGN(8) req_buffer2[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer, *req2 = (HTTP_REQUEST_V1 *)req_buffer2;
HTTP_REQUEST_ID req_id;
+ unsigned short port;
+ char req_text[200];
OVERLAPPED ovl;
DWORD ret_size;
HANDLE queue;
@@ -499,12 +554,13 @@ static void test_v1_short_buffer(void)
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &port);
ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, simple_req, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(HTTP_REQUEST_V1) - 1, &ret_size, NULL);
@@ -536,7 +592,7 @@ static void test_v1_short_buffer(void)
CancelIo(queue);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(ovl.hEvent);
@@ -551,6 +607,8 @@ static void test_v1_entity_body(void)
HTTP_RESPONSE_V1 response = {};
HTTP_DATA_CHUNK chunks[2] = {};
ULONG ret, chunk_size;
+ unsigned short port;
+ char req_text[200];
unsigned int i;
OVERLAPPED ovl;
DWORD ret_size;
@@ -559,7 +617,7 @@ static void test_v1_entity_body(void)
static const char post_req[] =
"POST /xyzzy HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"Content-Length: 5\r\n"
"\r\n"
@@ -567,7 +625,7 @@ static void test_v1_entity_body(void)
static const char post_req2[] =
"POST /xyzzy HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"Content-Length: 2048\r\n"
"\r\n";
@@ -579,12 +637,13 @@ static void test_v1_entity_body(void)
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &port);
ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, post_req, port);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
/* Windows versions before 8 will return success, and report that an entity
* body exists in the Flags member, but fail to account for it in the
* BytesReceived member or actually copy it to the buffer, if
@@ -597,7 +656,7 @@ static void test_v1_entity_body(void)
ok(!ret, "Got error %u.\n", ret);
ok(ret_size > sizeof(*req), "Got size %u.\n", ret_size);
ok(req->Flags == HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS, "Got flags %#x.\n", req->Flags);
- ok(req->BytesReceived == sizeof(post_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text) + 1, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength == 1,
"Got header length %u.\n", req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength);
ok(!strcmp(req->Headers.KnownHeaders[HttpHeaderContentLength].pRawValue, "5"),
@@ -637,8 +696,8 @@ static void test_v1_entity_body(void)
* but it also won't truncate the entity body to match. It will however
* always write its own Date header. */
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
ok(!ret, "Got error %u.\n", ret);
@@ -661,8 +720,8 @@ static void test_v1_entity_body(void)
/* Test the COPY_BODY flag. */
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY,
@@ -670,7 +729,7 @@ static void test_v1_entity_body(void)
ok(!ret, "Got error %u.\n", ret);
ok(ret_size > sizeof(*req), "Got size %u.\n", ret_size);
ok(!req->Flags, "Got flags %#x.\n", req->Flags);
- ok(req->BytesReceived == sizeof(post_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text) + 1, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength == 1,
"Got header length %u.\n", req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength);
ok(!strcmp(req->Headers.KnownHeaders[HttpHeaderContentLength].pRawValue, "5"),
@@ -685,8 +744,9 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req2, strlen(post_req2), 0);
- ok(ret == strlen(post_req2), "send() returned %d.\n", ret);
+ sprintf(req_text, post_req2, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = send(s, req_body, sizeof(req_body), 0);
ok(ret == sizeof(req_body), "send() returned %d.\n", ret);
@@ -697,7 +757,7 @@ static void test_v1_entity_body(void)
ok(!ret, "Got error %u.\n", ret);
ok(ret_size == 2000, "Got size %u.\n", ret_size);
ok(req->Flags == HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS, "Got flags %#x.\n", req->Flags);
- ok(req->BytesReceived == strlen(post_req2) + 2048, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text) + 2048, "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength == 4,
"Got header length %u.\n", req->Headers.KnownHeaders[HttpHeaderContentLength].RawValueLength);
ok(!strcmp(req->Headers.KnownHeaders[HttpHeaderContentLength].pRawValue, "2048"),
@@ -713,8 +773,9 @@ static void test_v1_entity_body(void)
/* Test HttpReceiveRequestEntityBody(). */
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ sprintf(req_text, post_req, port);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -739,8 +800,8 @@ static void test_v1_entity_body(void)
ret = HttpReceiveRequestEntityBody(queue, req->RequestId, 0, recv_body, sizeof(recv_body), &ret_size, NULL);
ok(ret == ERROR_CONNECTION_INVALID, "Got error %u.\n", ret);
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -766,8 +827,8 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -787,8 +848,8 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req, sizeof(post_req), 0);
- ok(ret == sizeof(post_req), "send() returned %d.\n", ret);
+ ret = send(s, req_text, strlen(req_text) + 1, 0);
+ ok(ret == strlen(req_text) + 1, "send() returned %d.\n", ret);
Sleep(100);
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY,
@@ -800,8 +861,9 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, post_req2, strlen(post_req2), 0);
- ok(ret == strlen(post_req2), "send() returned %d.\n", ret);
+ sprintf(req_text, post_req2, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = send(s, req_body, sizeof(req_body), 0);
ok(ret == sizeof(req_body), "send() returned %d.\n", ret);
@@ -824,7 +886,7 @@ static void test_v1_entity_body(void)
send_response_v1(queue, req->RequestId, s);
CloseHandle(ovl.hEvent);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -834,16 +896,17 @@ static void test_v1_entity_body(void)
static void test_v1_bad_request(void)
{
char response_buffer[2048];
+ unsigned short port;
HANDLE queue;
ULONG ret;
SOCKET s;
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &port);
ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
+ s = create_client_socket(port);
ret = send(s, "foo\r\n", strlen("foo\r\n"), 0);
ok(ret == strlen("foo\r\n"), "send() returned %d.\n", ret);
@@ -864,7 +927,7 @@ static void test_v1_bad_request(void)
ok(!ret, "Connection should be shut down.\n");
ok(!WSAGetLastError(), "Got error %u.\n", WSAGetLastError());
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -873,11 +936,11 @@ static void test_v1_bad_request(void)
static void test_v1_cooked_url(void)
{
- static const WCHAR cooked_urlW[] = {'h','t','t','p',':','/','/',
- 'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/','f','o','o','b','a','r','?','a','=','b',0};
-
char DECLSPEC_ALIGN(8) req_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
+ char expect[24], req_text[200];
+ unsigned short port;
+ WCHAR expectW[50];
DWORD ret_size;
HANDLE queue;
ULONG ret;
@@ -885,24 +948,25 @@ static void test_v1_cooked_url(void)
static const char req1[] =
"GET /foobar?a=b HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"\r\n";
static const char req2[] =
- "GET http://localhost:50000/ HTTP/1.1\r\n"
+ "GET http://localhost:%u/ HTTP/1.1\r\n"
"Host: ignored\r\n"
"Connection: keep-alive\r\n"
"\r\n";
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &port);
ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
- ret = send(s, req1, strlen(req1), 0);
- ok(ret == strlen(req1), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, req1, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -914,8 +978,9 @@ static void test_v1_cooked_url(void)
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 14, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(req->CookedUrl.QueryStringLength == 8, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, cooked_urlW),
- "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(expectW, ARRAY_SIZE(expectW), L"http://localhost:%u/foobar?a=b", port);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, expectW), "Expected full URL %s, got %s.\n",
+ debugstr_w(expectW), debugstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -924,21 +989,24 @@ static void test_v1_cooked_url(void)
send_response_v1(queue, req->RequestId, s);
- ret = send(s, req2, strlen(req2), 0);
- ok(ret == strlen(req2), "send() returned %d.\n", ret);
+ sprintf(req_text, req2, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
ok(!ret, "Got error %u.\n", ret);
ok(ret_size > sizeof(*req), "Got size %u.\n", ret_size);
ok(req->RawUrlLength == 23, "Got raw URL length %u.\n", req->RawUrlLength);
- ok(!strcmp(req->pRawUrl, "http://localhost:50000/"), "Got raw URL %s.\n", req->pRawUrl);
+ sprintf(expect, "http://localhost:%u/", port);
+ ok(!strcmp(req->pRawUrl, expect), "Expected raw URL \"%s\", got \"%s\".\n", expect, req->pRawUrl);
ok(req->CookedUrl.FullUrlLength == 46, "Got full URL length %u.\n", req->CookedUrl.FullUrlLength);
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 2, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(!req->CookedUrl.QueryStringLength, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, localhost_urlW),
- "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(expectW, ARRAY_SIZE(expectW), L"http://localhost:%u/", port);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, expectW), "Expected full URL %s, got %s.\n",
+ wine_dbgstr_w(expectW), wine_dbgstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -946,7 +1014,7 @@ static void test_v1_cooked_url(void)
send_response_v1(queue, req->RequestId, s);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -957,6 +1025,8 @@ static void test_v1_unknown_tokens(void)
{
char DECLSPEC_ALIGN(8) req_buffer[2048];
HTTP_REQUEST_V1 *req = (HTTP_REQUEST_V1 *)req_buffer;
+ unsigned short port;
+ char req_text[200];
DWORD ret_size;
HANDLE queue;
ULONG ret;
@@ -964,19 +1034,20 @@ static void test_v1_unknown_tokens(void)
static const char req1[] =
"xyzzy / HTTP/1.1\r\n"
- "Host: localhost:50000\r\n"
+ "Host: localhost:%u\r\n"
"Connection: keep-alive\r\n"
"Qux: foo baz \r\n"
"\r\n";
ret = HttpCreateHttpHandle(&queue, 0);
ok(!ret, "Got error %u.\n", ret);
- ret = HttpAddUrl(queue, localhost_urlW, NULL);
+ ret = add_url_v1(queue, &port);
ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
- ret = send(s, req1, strlen(req1), 0);
- ok(ret == strlen(req1), "send() returned %d.\n", ret);
+ s = create_client_socket(port);
+ sprintf(req_text, req1, port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
memset(req_buffer, 0xcc, sizeof(req_buffer));
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), &ret_size, NULL);
@@ -994,7 +1065,7 @@ static void test_v1_unknown_tokens(void)
ok(!strcmp(req->Headers.pUnknownHeaders[0].pRawValue, "foo baz"), "Got value %s.\n",
req->Headers.pUnknownHeaders[0].pRawValue);
- ret = HttpRemoveUrl(queue, localhost_urlW);
+ ret = remove_url_v1(queue, port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
ret = CloseHandle(queue);
@@ -1088,9 +1159,6 @@ static void test_HttpCreateUrlGroup(void)
static void test_v2_server(void)
{
- static const WCHAR cooked_urlW[] = {'h','t','t','p',':','/','/',
- 'l','o','c','a','l','h','o','s','t',':','5','0','0','0','0','/','f','o','o','b','a','r',0};
-
char DECLSPEC_ALIGN(8) req_buffer[2048], response_buffer[2048];
HTTP_REQUEST_V2 *reqv2 = (HTTP_REQUEST_V2 *)req_buffer;
static const HTTPAPI_VERSION version = {2, 0};
@@ -1098,11 +1166,14 @@ static void test_v2_server(void)
HTTP_REQUEST_V1 *req = &reqv2->s;
HTTP_SERVER_SESSION_ID session;
HTTP_RESPONSE_V2 response = {};
+ unsigned short port1, port2;
HTTP_BINDING_INFO binding;
HTTP_URL_GROUP_ID group;
+ char req_text[100];
unsigned int i;
OVERLAPPED ovl;
DWORD ret_size;
+ WCHAR url[50];
HANDLE queue;
ULONG ret;
SOCKET s;
@@ -1134,7 +1205,7 @@ static void test_v2_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = pHttpAddUrlToUrlGroup(group, localhost_urlW, 0xdeadbeef, 0);
+ ret = add_url_v2(group, &port1);
ok(!ret, "Got error %u.\n", ret);
ret = pHttpAddUrlToUrlGroup(group, invalid_url1, 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
@@ -1148,12 +1219,13 @@ static void test_v2_server(void)
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
ret = pHttpAddUrlToUrlGroup(group, invalid_url6, 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_INVALID_PARAMETER, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, localhost_urlW, 0xdeadbeef, 0);
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port1);
+ ret = pHttpAddUrlToUrlGroup(group, url, 0xdeadbeef, 0);
todo_wine ok(ret == ERROR_ALREADY_EXISTS, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, localhost_url2W, 0xdeadbeef, 0);
+ ret = add_url_v2(group, &port2);
todo_wine ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
+ s = create_client_socket(port1);
len = sizeof(sockaddr);
ret = getsockname(s, (struct sockaddr *)&sockaddr, &len);
ok(ret == 0, "getsockname() failed, error %u.\n", WSAGetLastError());
@@ -1163,8 +1235,9 @@ static void test_v2_server(void)
ok(!ret, "Expected failure.\n");
ok(GetLastError() == ERROR_IO_INCOMPLETE, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, port1);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret = GetOverlappedResult(queue, &ovl, &ret_size, TRUE);
ok(ret, "Got error %u.\n", GetLastError());
@@ -1186,7 +1259,9 @@ static void test_v2_server(void)
ok(req->CookedUrl.HostLength == 30, "Got host length %u.\n", req->CookedUrl.HostLength);
ok(req->CookedUrl.AbsPathLength == 14, "Got absolute path length %u.\n", req->CookedUrl.AbsPathLength);
ok(!req->CookedUrl.QueryStringLength, "Got query string length %u.\n", req->CookedUrl.QueryStringLength);
- ok(!wcscmp(req->CookedUrl.pFullUrl, cooked_urlW), "Got full URL %s.\n", wine_dbgstr_w(req->CookedUrl.pFullUrl));
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/foobar", port1);
+ ok(!wcscmp(req->CookedUrl.pFullUrl, url), "Expected full URL %s, got %s.\n",
+ debugstr_w(url), debugstr_w(req->CookedUrl.pFullUrl));
ok(req->CookedUrl.pHost == req->CookedUrl.pFullUrl + 7, "Got host %s.\n", wine_dbgstr_w(req->CookedUrl.pHost));
ok(req->CookedUrl.pAbsPath == req->CookedUrl.pFullUrl + 22,
"Got absolute path %s.\n", wine_dbgstr_w(req->CookedUrl.pAbsPath));
@@ -1194,7 +1269,7 @@ static void test_v2_server(void)
ok(!memcmp(req->Address.pRemoteAddress, &sockaddr, len), "Client addresses didn't match.\n");
sin = (SOCKADDR_IN *)req->Address.pLocalAddress;
ok(sin->sin_family == AF_INET, "Got family %u.\n", sin->sin_family);
- ok(ntohs(sin->sin_port) == 50000, "Got wrong port %u.\n", ntohs(sin->sin_port));
+ ok(ntohs(sin->sin_port) == port1, "Got wrong port %u.\n", ntohs(sin->sin_port));
ok(sin->sin_addr.S_un.S_addr == inet_addr("127.0.0.1"), "Got address %08x.\n", sin->sin_addr.S_un.S_addr);
ok(!req->Headers.UnknownHeaderCount, "Got %u unknown headers.\n", req->Headers.UnknownHeaderCount);
ok(!req->Headers.pUnknownHeaders, "Got unknown headers %p.\n", req->Headers.pUnknownHeaders);
@@ -1209,9 +1284,11 @@ static void test_v2_server(void)
}
else if (i == HttpHeaderHost)
{
- ok(req->Headers.KnownHeaders[i].RawValueLength == 15, "Got length %u.\n",
+ char expect[16];
+ sprintf(expect, "localhost:%u", port1);
+ ok(req->Headers.KnownHeaders[i].RawValueLength == strlen(expect), "Got length %u.\n",
req->Headers.KnownHeaders[i].RawValueLength);
- ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, "localhost:50000"),
+ ok(!strcmp(req->Headers.KnownHeaders[i].pRawValue, expect),
"Got connection '%s'.\n", req->Headers.KnownHeaders[i].pRawValue);
}
else if (i == HttpHeaderUserAgent)
@@ -1229,7 +1306,7 @@ static void test_v2_server(void)
i, req->Headers.KnownHeaders[i].pRawValue);
}
}
- ok(req->BytesReceived == strlen(simple_req), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+ ok(req->BytesReceived == strlen(req_text), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
ok(!req->EntityChunkCount, "Got %u entity chunks.\n", req->EntityChunkCount);
ok(!req->pEntityChunks, "Got entity chunks %p.\n", req->pEntityChunks);
ok(!req->RawConnectionId, "Got SSL connection ID %s.\n", wine_dbgstr_longlong(req->RawConnectionId));
@@ -1262,11 +1339,11 @@ static void test_v2_server(void)
ret = HttpReceiveHttpRequest(queue, req->RequestId, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), NULL, &ovl);
ok(ret == ERROR_CONNECTION_INVALID, "Got error %u.\n", ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_urlW, 0);
+ ret = remove_url_v2(group, port1);
ok(!ret, "Got error %u.\n", ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_urlW, 0);
+ ret = remove_url_v2(group, port1);
ok(ret == ERROR_FILE_NOT_FOUND, "Got error %u.\n", ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_url2W, 0);
+ ret = remove_url_v2(group, port2);
todo_wine ok(!ret, "Got error %u.\n", ret);
closesocket(s);
@@ -1288,8 +1365,10 @@ static void test_v2_completion_port(void)
HTTP_RESPONSE_V2 response = {};
HTTP_BINDING_INFO binding;
HTTP_URL_GROUP_ID group;
+ unsigned short tcp_port;
OVERLAPPED ovl, *povl;
HANDLE queue, port;
+ char req_text[100];
DWORD ret_size;
ULONG_PTR key;
ULONG ret;
@@ -1318,17 +1397,18 @@ static void test_v2_completion_port(void)
ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), NULL, &ovl);
ok(ret == ERROR_IO_PENDING, "Got error %u.\n", ret);
- ret = pHttpAddUrlToUrlGroup(group, localhost_urlW, 0, 0);
+ ret = add_url_v2(group, &tcp_port);
ok(!ret, "Got error %u.\n", ret);
- s = create_client_socket();
+ s = create_client_socket(tcp_port);
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 0);
ok(!ret, "Expected failure.\n");
ok(GetLastError() == WAIT_TIMEOUT, "Got error %u.\n", GetLastError());
- ret = send(s, simple_req, strlen(simple_req), 0);
- ok(ret == strlen(simple_req), "send() returned %d.\n", ret);
+ sprintf(req_text, simple_req, tcp_port);
+ ret = send(s, req_text, strlen(req_text), 0);
+ ok(ret == strlen(req_text), "send() returned %d.\n", ret);
ret_size = key = 0xdeadbeef;
ret = GetQueuedCompletionStatus(port, &ret_size, &key, &povl, 1000);
@@ -1356,7 +1436,7 @@ static void test_v2_completion_port(void)
ret = recv(s, response_buffer, sizeof(response_buffer), 0);
ok(ret == ret_size, "Expected size %u, got %u.\n", ret_size, ret);
- ret = pHttpRemoveUrlFromUrlGroup(group, localhost_urlW, 0);
+ ret = remove_url_v2(group, tcp_port);
ok(!ret, "Got error %u.\n", ret);
closesocket(s);
CloseHandle(port);
--
2.24.1
2
1
[PATCH v2 1/2] strmbase: Do not notify the parent of the window's destruction.
by Gabriel Ivăncescu 10 Jan '20
by Gabriel Ivăncescu 10 Jan '20
10 Jan '20
Fixes a regression introduced by
3b5198c8283d891095612c1001edb5e5788d6059. Media Player Classic deadlocks when
the window is destroyed, because DestroyWindow will notify the parent, which
is on a different thread and waiting on a signal from the filter's thread.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode(a)gmail.com>
---
Tests (next patch) also show that Windows does not notify the parent either,
despite not having the style set prior to destruction (without this patch,
the test would fail on Wine).
dlls/strmbase/window.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/dlls/strmbase/window.c b/dlls/strmbase/window.c
index 07a12ec..d646f7e 100644
--- a/dlls/strmbase/window.c
+++ b/dlls/strmbase/window.c
@@ -77,6 +77,13 @@ static LRESULT CALLBACK WndProcW(HWND hwnd, UINT message, WPARAM wparam, LPARAM
This->Width = LOWORD(lparam);
This->Height = HIWORD(lparam);
+ break;
+ case WM_CLOSE:
+ /* Some applications like Media Player Classic deadlock when the parent,
+ which is on a different thread, is notified before the destruction.
+ Windows also doesn't notify it, despite not having the style prior. */
+ SetWindowLongW(hwnd, GWL_EXSTYLE, GetWindowLongW(hwnd, GWL_EXSTYLE) | WS_EX_NOPARENTNOTIFY);
+ break;
}
return DefWindowProcW(hwnd, message, wparam, lparam);
--
2.21.0
3
5
Together with the previous patch this fixes some crashes reproduced
with Heroes of the Storm.
Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
---
v2: Use -arch=!i386 in the specfiles.
.../api-ms-win-crt-private-l1-1-0.spec | 4 ++--
dlls/ucrtbase/ucrtbase.spec | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
index 7e2717c44ab..668b8c02fbe 100644
--- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
@@ -957,8 +957,8 @@
@ stub _o_fma
@ stub _o_fmaf
@ stub _o_fmal
-@ stub _o_fmod
-@ stub _o_fmodf
+@ cdecl _o_fmod(double double) ucrtbase._o_fmod
+@ cdecl -arch=!i386 _o_fmodf(float float) ucrtbase._o_fmodf
@ stub _o_fopen
@ stub _o_fopen_s
@ stub _o_fputc
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 8987134d97f..dc95824a1f5 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -1621,8 +1621,8 @@
@ stub _o_fma
@ stub _o_fmaf
@ stub _o_fmal
-@ stub _o_fmod
-@ stub _o_fmodf
+@ cdecl _o_fmod(double double) MSVCRT_fmod
+@ cdecl -arch=!i386 _o_fmodf(float float) MSVCRT_fmodf
@ stub _o_fopen
@ stub _o_fopen_s
@ stub _o_fputc
--
2.24.1
2
1
[PATCH 1/3] ucrtbase: Export _o_to{lower, upper}() as to{lower, upper}().
by Matteo Bruni 10 Jan '20
by Matteo Bruni 10 Jan '20
10 Jan '20
As opposed to _to{lower,upper}() i.e. the broken-by-design version.
Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com>
---
dlls/ucrtbase/ucrtbase.spec | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index a262cc63459..8987134d97f 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -1806,8 +1806,8 @@
@ stub _o_tgammal
@ stub _o_tmpfile_s
@ stub _o_tmpnam_s
-@ cdecl _o_tolower(long) MSVCRT__tolower
-@ cdecl _o_toupper(long) MSVCRT__toupper
+@ cdecl _o_tolower(long) MSVCRT_tolower
+@ cdecl _o_toupper(long) MSVCRT_toupper
@ stub _o_towlower
@ stub _o_towupper
@ stub _o_ungetc
--
2.24.1
5
8
10 Jan '20
Maybe the author abandonned it or some email server dropped some part.
So just trace the deletion and the pending parts so we know which were
missing.
Signed-off-by: Francois Gouget <fgouget(a)codeweavers.com>
---
testbot/bin/Janitor.pl | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/testbot/bin/Janitor.pl b/testbot/bin/Janitor.pl
index 9ee5517fc..4eda071fa 100755
--- a/testbot/bin/Janitor.pl
+++ b/testbot/bin/Janitor.pl
@@ -148,9 +148,10 @@ my $DeleteBefore = time() - 1 * 86400;
my $Sets = CreatePendingPatchSets();
foreach my $Set (@{$Sets->GetItems()})
{
- my $MostRecentPatch;
+ my ($MostRecentPatch, @Parts);
foreach my $Part (@{$Set->Parts->GetItems()})
{
+ push @Parts, $Part->No;
my $Patch = $Part->Patch;
if (! defined($MostRecentPatch) ||
$MostRecentPatch->Received < $Patch->Received)
@@ -161,7 +162,7 @@ foreach my $Set (@{$Sets->GetItems()})
if (! defined($MostRecentPatch) ||
$MostRecentPatch->Received < $DeleteBefore)
{
- Error "Deleting pending series for ", $Set->EMail, "\n";
+ Trace "Deleting pending series for ", $Set->EMail, " (got ", join(" ", sort @Parts), " / ", $Set->TotalParts, ")\n";
next if ($DryRun);
$Sets->DeleteItem($Set);
--
2.20.1
1
0
10 Jan '20
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/user32/tests/dce.c | 37 +++++--------
dlls/user32/tests/win.c | 117 +++++++++++++++++++---------------------
2 files changed, 68 insertions(+), 86 deletions(-)
diff --git a/dlls/user32/tests/dce.c b/dlls/user32/tests/dce.c
index 116a6177b0..b76f8fac45 100644
--- a/dlls/user32/tests/dce.c
+++ b/dlls/user32/tests/dce.c
@@ -550,24 +550,13 @@ static void test_invisible_create(void)
static void test_dc_layout(void)
{
- DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
- DWORD (WINAPI *pGetLayout)(HDC hdc);
HWND hwnd_cache_rtl, hwnd_owndc_rtl, hwnd_classdc_rtl, hwnd_classdc2_rtl;
HDC hdc;
DWORD layout;
- HMODULE mod = GetModuleHandleA("gdi32.dll");
-
- pGetLayout = (void *)GetProcAddress( mod, "GetLayout" );
- pSetLayout = (void *)GetProcAddress( mod, "SetLayout" );
- if (!pGetLayout || !pSetLayout)
- {
- win_skip( "Don't have SetLayout\n" );
- return;
- }
hdc = GetDC( hwnd_cache );
- pSetLayout( hdc, LAYOUT_RTL );
- layout = pGetLayout( hdc );
+ SetLayout( hdc, LAYOUT_RTL );
+ layout = GetLayout( hdc );
ReleaseDC( hwnd_cache, hdc );
if (!layout)
{
@@ -584,42 +573,42 @@ static void test_dc_layout(void)
hwnd_classdc2_rtl = CreateWindowExA(WS_EX_LAYOUTRTL, "classdc_class", NULL, WS_OVERLAPPED | WS_VISIBLE,
200, 200, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
hdc = GetDC( hwnd_cache_rtl );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == LAYOUT_RTL, "wrong layout %x\n", layout );
- pSetLayout( hdc, 0 );
+ SetLayout( hdc, 0 );
ReleaseDC( hwnd_cache_rtl, hdc );
hdc = GetDC( hwnd_owndc_rtl );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == LAYOUT_RTL, "wrong layout %x\n", layout );
ReleaseDC( hwnd_cache_rtl, hdc );
hdc = GetDC( hwnd_cache );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == 0, "wrong layout %x\n", layout );
ReleaseDC( hwnd_cache, hdc );
hdc = GetDC( hwnd_owndc_rtl );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == LAYOUT_RTL, "wrong layout %x\n", layout );
- pSetLayout( hdc, 0 );
+ SetLayout( hdc, 0 );
ReleaseDC( hwnd_owndc_rtl, hdc );
hdc = GetDC( hwnd_owndc_rtl );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == LAYOUT_RTL, "wrong layout %x\n", layout );
ReleaseDC( hwnd_owndc_rtl, hdc );
hdc = GetDC( hwnd_classdc_rtl );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == LAYOUT_RTL, "wrong layout %x\n", layout );
- pSetLayout( hdc, 0 );
+ SetLayout( hdc, 0 );
ReleaseDC( hwnd_classdc_rtl, hdc );
hdc = GetDC( hwnd_classdc2_rtl );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == LAYOUT_RTL, "wrong layout %x\n", layout );
ReleaseDC( hwnd_classdc2_rtl, hdc );
hdc = GetDC( hwnd_classdc );
- layout = pGetLayout( hdc );
+ layout = GetLayout( hdc );
ok( layout == LAYOUT_RTL, "wrong layout %x\n", layout );
ReleaseDC( hwnd_classdc_rtl, hdc );
diff --git a/dlls/user32/tests/win.c b/dlls/user32/tests/win.c
index 9230c4cf79..0f683f858a 100644
--- a/dlls/user32/tests/win.c
+++ b/dlls/user32/tests/win.c
@@ -62,8 +62,6 @@ static BOOL (WINAPI *pGetProcessDefaultLayout)( DWORD *layout );
static BOOL (WINAPI *pSetProcessDefaultLayout)( DWORD layout );
static BOOL (WINAPI *pFlashWindow)( HWND hwnd, BOOL bInvert );
static BOOL (WINAPI *pFlashWindowEx)( PFLASHWINFO pfwi );
-static DWORD (WINAPI *pSetLayout)(HDC hdc, DWORD layout);
-static DWORD (WINAPI *pGetLayout)(HDC hdc);
static BOOL (WINAPI *pMirrorRgn)(HWND hwnd, HRGN hrgn);
static BOOL (WINAPI *pGetWindowDisplayAffinity)(HWND hwnd, DWORD *affinity);
static BOOL (WINAPI *pSetWindowDisplayAffinity)(HWND hwnd, DWORD affinity);
@@ -5908,6 +5906,7 @@ static void test_CreateWindow(void)
RECT rc, rc_minmax;
MINMAXINFO minmax;
BOOL res;
+ HDC hdc;
#define expect_menu(window, menu) \
SetLastError(0xdeadbeef); \
@@ -6248,73 +6247,69 @@ static void test_CreateWindow(void)
"invalid error %u\n", GetLastError());
DestroyWindow(hwnd);
- if (pGetLayout && pSetLayout)
+ hdc = GetDC( parent );
+ SetLayout( hdc, LAYOUT_RTL );
+ if (GetLayout( hdc ))
{
- HDC hdc = GetDC( parent );
- pSetLayout( hdc, LAYOUT_RTL );
- if (pGetLayout( hdc ))
+ ReleaseDC( parent, hdc );
+ DestroyWindow( parent );
+ SetLastError( 0xdeadbeef );
+ parent = CreateWindowExA(WS_EX_APPWINDOW | WS_EX_LAYOUTRTL, "static", NULL, WS_POPUP,
+ 0, 0, 100, 100, 0, 0, 0, NULL);
+ ok( parent != 0, "creation failed err %u\n", GetLastError());
+ expect_ex_style( parent, WS_EX_APPWINDOW | WS_EX_LAYOUTRTL );
+ hwnd = CreateWindowExA(0, "static", NULL, WS_CHILD, 0, 0, 20, 20, parent, 0, 0, NULL);
+ ok( hwnd != 0, "creation failed err %u\n", GetLastError());
+ expect_ex_style( hwnd, WS_EX_LAYOUTRTL );
+ DestroyWindow( hwnd );
+ hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 0, 0, 20, 20, parent, 0, 0, NULL);
+ ok( hwnd != 0, "creation failed err %u\n", GetLastError());
+ expect_ex_style( hwnd, 0 );
+ DestroyWindow( hwnd );
+ SetWindowLongW( parent, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_LAYOUTRTL | WS_EX_NOINHERITLAYOUT );
+ hwnd = CreateWindowExA(0, "static", NULL, WS_CHILD, 0, 0, 20, 20, parent, 0, 0, NULL);
+ ok( hwnd != 0, "creation failed err %u\n", GetLastError());
+ expect_ex_style( hwnd, 0 );
+ DestroyWindow( hwnd );
+
+ if (pGetProcessDefaultLayout && pSetProcessDefaultLayout)
{
- ReleaseDC( parent, hdc );
- DestroyWindow( parent );
+ DWORD layout;
+
SetLastError( 0xdeadbeef );
- parent = CreateWindowExA(WS_EX_APPWINDOW | WS_EX_LAYOUTRTL, "static", NULL, WS_POPUP,
- 0, 0, 100, 100, 0, 0, 0, NULL);
- ok( parent != 0, "creation failed err %u\n", GetLastError());
- expect_ex_style( parent, WS_EX_APPWINDOW | WS_EX_LAYOUTRTL );
- hwnd = CreateWindowExA(0, "static", NULL, WS_CHILD, 0, 0, 20, 20, parent, 0, 0, NULL);
- ok( hwnd != 0, "creation failed err %u\n", GetLastError());
- expect_ex_style( hwnd, WS_EX_LAYOUTRTL );
- DestroyWindow( hwnd );
- hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 0, 0, 20, 20, parent, 0, 0, NULL);
+ ok( !pGetProcessDefaultLayout( NULL ), "GetProcessDefaultLayout succeeded\n" );
+ ok( GetLastError() == ERROR_NOACCESS, "wrong error %u\n", GetLastError() );
+ SetLastError( 0xdeadbeef );
+ res = pGetProcessDefaultLayout( &layout );
+ ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ());
+ ok( layout == 0, "GetProcessDefaultLayout wrong layout %x\n", layout );
+ SetLastError( 0xdeadbeef );
+ res = pSetProcessDefaultLayout( 7 );
+ ok( res, "SetProcessDefaultLayout failed err %u\n", GetLastError ());
+ res = pGetProcessDefaultLayout( &layout );
+ ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ());
+ ok( layout == 7, "GetProcessDefaultLayout wrong layout %x\n", layout );
+ SetLastError( 0xdeadbeef );
+ res = pSetProcessDefaultLayout( LAYOUT_RTL );
+ ok( res, "SetProcessDefaultLayout failed err %u\n", GetLastError ());
+ res = pGetProcessDefaultLayout( &layout );
+ ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ());
+ ok( layout == LAYOUT_RTL, "GetProcessDefaultLayout wrong layout %x\n", layout );
+ hwnd = CreateWindowExA(WS_EX_APPWINDOW, "static", NULL, WS_POPUP,
+ 0, 0, 100, 100, 0, 0, 0, NULL);
ok( hwnd != 0, "creation failed err %u\n", GetLastError());
- expect_ex_style( hwnd, 0 );
+ expect_ex_style( hwnd, WS_EX_APPWINDOW | WS_EX_LAYOUTRTL );
DestroyWindow( hwnd );
- SetWindowLongW( parent, GWL_EXSTYLE, WS_EX_APPWINDOW | WS_EX_LAYOUTRTL | WS_EX_NOINHERITLAYOUT );
- hwnd = CreateWindowExA(0, "static", NULL, WS_CHILD, 0, 0, 20, 20, parent, 0, 0, NULL);
+ hwnd = CreateWindowExA(WS_EX_APPWINDOW, "static", NULL, WS_POPUP,
+ 0, 0, 100, 100, parent, 0, 0, NULL);
ok( hwnd != 0, "creation failed err %u\n", GetLastError());
- expect_ex_style( hwnd, 0 );
+ expect_ex_style( hwnd, WS_EX_APPWINDOW );
DestroyWindow( hwnd );
-
- if (pGetProcessDefaultLayout && pSetProcessDefaultLayout)
- {
- DWORD layout;
-
- SetLastError( 0xdeadbeef );
- ok( !pGetProcessDefaultLayout( NULL ), "GetProcessDefaultLayout succeeded\n" );
- ok( GetLastError() == ERROR_NOACCESS, "wrong error %u\n", GetLastError() );
- SetLastError( 0xdeadbeef );
- res = pGetProcessDefaultLayout( &layout );
- ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ());
- ok( layout == 0, "GetProcessDefaultLayout wrong layout %x\n", layout );
- SetLastError( 0xdeadbeef );
- res = pSetProcessDefaultLayout( 7 );
- ok( res, "SetProcessDefaultLayout failed err %u\n", GetLastError ());
- res = pGetProcessDefaultLayout( &layout );
- ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ());
- ok( layout == 7, "GetProcessDefaultLayout wrong layout %x\n", layout );
- SetLastError( 0xdeadbeef );
- res = pSetProcessDefaultLayout( LAYOUT_RTL );
- ok( res, "SetProcessDefaultLayout failed err %u\n", GetLastError ());
- res = pGetProcessDefaultLayout( &layout );
- ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ());
- ok( layout == LAYOUT_RTL, "GetProcessDefaultLayout wrong layout %x\n", layout );
- hwnd = CreateWindowExA(WS_EX_APPWINDOW, "static", NULL, WS_POPUP,
- 0, 0, 100, 100, 0, 0, 0, NULL);
- ok( hwnd != 0, "creation failed err %u\n", GetLastError());
- expect_ex_style( hwnd, WS_EX_APPWINDOW | WS_EX_LAYOUTRTL );
- DestroyWindow( hwnd );
- hwnd = CreateWindowExA(WS_EX_APPWINDOW, "static", NULL, WS_POPUP,
- 0, 0, 100, 100, parent, 0, 0, NULL);
- ok( hwnd != 0, "creation failed err %u\n", GetLastError());
- expect_ex_style( hwnd, WS_EX_APPWINDOW );
- DestroyWindow( hwnd );
- pSetProcessDefaultLayout( 0 );
- }
- else win_skip( "SetProcessDefaultLayout not supported\n" );
+ pSetProcessDefaultLayout( 0 );
}
- else win_skip( "SetLayout not supported\n" );
+ else win_skip( "SetProcessDefaultLayout not supported\n" );
}
- else win_skip( "SetLayout not available\n" );
+ else win_skip( "SetLayout not supported\n" );
DestroyWindow(parent);
@@ -11856,8 +11851,6 @@ START_TEST(win)
pSetProcessDefaultLayout = (void *)GetProcAddress( user32, "SetProcessDefaultLayout" );
pFlashWindow = (void *)GetProcAddress( user32, "FlashWindow" );
pFlashWindowEx = (void *)GetProcAddress( user32, "FlashWindowEx" );
- pGetLayout = (void *)GetProcAddress( gdi32, "GetLayout" );
- pSetLayout = (void *)GetProcAddress( gdi32, "SetLayout" );
pMirrorRgn = (void *)GetProcAddress( gdi32, "MirrorRgn" );
pGetWindowDisplayAffinity = (void *)GetProcAddress( user32, "GetWindowDisplayAffinity" );
pSetWindowDisplayAffinity = (void *)GetProcAddress( user32, "SetWindowDisplayAffinity" );
--
2.24.1
2
1
09 Jan '20
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/advapi32/tests/security.c | 211 ++++++++++++++-------------------
1 file changed, 88 insertions(+), 123 deletions(-)
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index 48389bf42b..6d73300c1d 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -93,7 +93,6 @@ static DWORD (WINAPI *pGetNamedSecurityInfoA)(LPSTR, SE_OBJECT_TYPE, SECURITY_IN
static DWORD (WINAPI *pSetNamedSecurityInfoA)(LPSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
PSID, PSID, PACL, PACL);
static DWORD (WINAPI *pRtlAdjustPrivilege)(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN);
-static BOOL (WINAPI *pCreateWellKnownSid)(WELL_KNOWN_SID_TYPE,PSID,PSID,DWORD*);
static BOOL (WINAPI *pDuplicateTokenEx)(HANDLE,DWORD,LPSECURITY_ATTRIBUTES,
SECURITY_IMPERSONATION_LEVEL,TOKEN_TYPE,PHANDLE);
@@ -171,7 +170,6 @@ static void init(void)
pConvertSecurityDescriptorToStringSecurityDescriptorA =
(void *)GetProcAddress(hmod, "ConvertSecurityDescriptorToStringSecurityDescriptorA" );
pSetFileSecurityA = (void *)GetProcAddress(hmod, "SetFileSecurityA" );
- pCreateWellKnownSid = (void *)GetProcAddress( hmod, "CreateWellKnownSid" );
pGetNamedSecurityInfoA = (void *)GetProcAddress(hmod, "GetNamedSecurityInfoA");
pSetNamedSecurityInfoA = (void *)GetProcAddress(hmod, "SetNamedSecurityInfoA");
pSetEntriesInAclW = (void *)GetProcAddress(hmod, "SetEntriesInAclW");
@@ -2075,28 +2073,22 @@ static void test_CreateWellKnownSid(void)
BOOL ret;
unsigned int i;
- if (!pCreateWellKnownSid)
- {
- win_skip("CreateWellKnownSid not available\n");
- return;
- }
-
size = 0;
SetLastError(0xdeadbeef);
- ret = pCreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
+ ret = CreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
error = GetLastError();
ok(!ret, "CreateWellKnownSid succeeded\n");
ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error);
ok(size, "expected size > 0\n");
SetLastError(0xdeadbeef);
- ret = pCreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
+ ret = CreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
error = GetLastError();
ok(!ret, "CreateWellKnownSid succeeded\n");
ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
sid = HeapAlloc(GetProcessHeap(), 0, size);
- ret = pCreateWellKnownSid(WinInteractiveSid, NULL, sid, &size);
+ ret = CreateWellKnownSid(WinInteractiveSid, NULL, sid, &size);
ok(ret, "CreateWellKnownSid failed %u\n", GetLastError());
HeapFree(GetProcessHeap(), 0, sid);
@@ -2115,14 +2107,14 @@ static void test_CreateWellKnownSid(void)
/* some SIDs aren't implemented by all Windows versions - detect it */
cb = sizeof(sid_buffer);
- if (!pCreateWellKnownSid(i, NULL, sid_buffer, &cb))
+ if (!CreateWellKnownSid(i, NULL, sid_buffer, &cb))
{
skip("Well known SID %u not implemented\n", i);
continue;
}
cb = sizeof(sid_buffer);
- ok(pCreateWellKnownSid(i, value->without_domain ? NULL : domainsid, sid_buffer, &cb), "Couldn't create well known sid %u\n", i);
+ ok(CreateWellKnownSid(i, value->without_domain ? NULL : domainsid, sid_buffer, &cb), "Couldn't create well known sid %u\n", i);
expect_eq(GetSidLengthRequired(*GetSidSubAuthorityCount(sid_buffer)), cb, DWORD, "%d");
ok(IsValidSid(sid_buffer), "The sid is not valid\n");
ok(ConvertSidToStringSidA(sid_buffer, &str), "Couldn't convert SID to string\n");
@@ -2134,7 +2126,7 @@ static void test_CreateWellKnownSid(void)
{
char buf2[SECURITY_MAX_SID_SIZE];
cb = sizeof(buf2);
- ok(pCreateWellKnownSid(i, domainsid, buf2, &cb), "Couldn't create well known sid %u with optional domain\n", i);
+ ok(CreateWellKnownSid(i, domainsid, buf2, &cb), "Couldn't create well known sid %u with optional domain\n", i);
expect_eq(GetSidLengthRequired(*GetSidSubAuthorityCount(sid_buffer)), cb, DWORD, "%d");
ok(memcmp(buf2, sid_buffer, cb) == 0, "SID create with domain is different than without (%u)\n", i);
}
@@ -2351,94 +2343,91 @@ static void test_LookupAccountSid(void)
}
HeapFree(GetProcessHeap(), 0, ptiUser);
- if (pCreateWellKnownSid)
+ trace("Well Known SIDs:\n");
+ for (i = 0; i <= 60; i++)
{
- trace("Well Known SIDs:\n");
- for (i = 0; i <= 60; i++)
+ size = SECURITY_MAX_SID_SIZE;
+ if (CreateWellKnownSid(i, NULL, &max_sid.sid, &size))
{
- size = SECURITY_MAX_SID_SIZE;
- if (pCreateWellKnownSid(i, NULL, &max_sid.sid, &size))
+ if (ConvertSidToStringSidA(&max_sid.sid, &str_sidA))
{
- if (ConvertSidToStringSidA(&max_sid.sid, &str_sidA))
- {
- acc_sizeA = MAX_PATH;
- dom_sizeA = MAX_PATH;
- if (LookupAccountSidA(NULL, &max_sid.sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use))
- trace(" %d: %s %s\\%s %d\n", i, str_sidA, domainA, accountA, use);
- LocalFree(str_sidA);
- }
+ acc_sizeA = MAX_PATH;
+ dom_sizeA = MAX_PATH;
+ if (LookupAccountSidA(NULL, &max_sid.sid, accountA, &acc_sizeA, domainA, &dom_sizeA, &use))
+ trace(" %d: %s %s\\%s %d\n", i, str_sidA, domainA, accountA, use);
+ LocalFree(str_sidA);
}
+ }
+ else
+ {
+ if (GetLastError() != ERROR_INVALID_PARAMETER)
+ trace(" CreateWellKnownSid(%d) failed: %d\n", i, GetLastError());
else
- {
- if (GetLastError() != ERROR_INVALID_PARAMETER)
- trace(" CreateWellKnownSid(%d) failed: %d\n", i, GetLastError());
- else
- trace(" %d: not supported\n", i);
- }
+ trace(" %d: not supported\n", i);
}
+ }
- ZeroMemory(&object_attributes, sizeof(object_attributes));
- object_attributes.Length = sizeof(object_attributes);
+ ZeroMemory(&object_attributes, sizeof(object_attributes));
+ object_attributes.Length = sizeof(object_attributes);
- status = LsaOpenPolicy( NULL, &object_attributes, POLICY_ALL_ACCESS, &handle);
- ok(status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED,
- "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status);
+ status = LsaOpenPolicy( NULL, &object_attributes, POLICY_ALL_ACCESS, &handle);
+ ok(status == STATUS_SUCCESS || status == STATUS_ACCESS_DENIED,
+ "LsaOpenPolicy(POLICY_ALL_ACCESS) returned 0x%08x\n", status);
- /* try a more restricted access mask if necessary */
- if (status == STATUS_ACCESS_DENIED) {
- trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n");
- status = LsaOpenPolicy( NULL, &object_attributes, POLICY_VIEW_LOCAL_INFORMATION, &handle);
- ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status);
- }
+ /* try a more restricted access mask if necessary */
+ if (status == STATUS_ACCESS_DENIED) {
+ trace("LsaOpenPolicy(POLICY_ALL_ACCESS) failed, trying POLICY_VIEW_LOCAL_INFORMATION\n");
+ status = LsaOpenPolicy( NULL, &object_attributes, POLICY_VIEW_LOCAL_INFORMATION, &handle);
+ ok(status == STATUS_SUCCESS, "LsaOpenPolicy(POLICY_VIEW_LOCAL_INFORMATION) returned 0x%08x\n", status);
+ }
+ if (status == STATUS_SUCCESS)
+ {
+ PPOLICY_ACCOUNT_DOMAIN_INFO info;
+ status = LsaQueryInformationPolicy(handle, PolicyAccountDomainInformation, (PVOID*)&info);
+ ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy() failed, returned 0x%08x\n", status);
if (status == STATUS_SUCCESS)
{
- PPOLICY_ACCOUNT_DOMAIN_INFO info;
- status = LsaQueryInformationPolicy(handle, PolicyAccountDomainInformation, (PVOID*)&info);
- ok(status == STATUS_SUCCESS, "LsaQueryInformationPolicy() failed, returned 0x%08x\n", status);
- if (status == STATUS_SUCCESS)
+ ok(info->DomainSid!=0, "LsaQueryInformationPolicy(PolicyAccountDomainInformation) missing SID\n");
+ if (info->DomainSid)
{
- ok(info->DomainSid!=0, "LsaQueryInformationPolicy(PolicyAccountDomainInformation) missing SID\n");
- if (info->DomainSid)
- {
- int count = *GetSidSubAuthorityCount(info->DomainSid);
- CopySid(GetSidLengthRequired(count), &max_sid, info->DomainSid);
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_USER_RID_ADMIN;
- max_sid.sid.SubAuthorityCount = count + 1;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_USER_RID_GUEST;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_ADMINS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_USERS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_GUESTS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_COMPUTERS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_CONTROLLERS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_CERT_ADMINS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_SCHEMA_ADMINS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_ENTERPRISE_ADMINS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_POLICY_ADMINS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = DOMAIN_ALIAS_RID_RAS_SERVERS;
- test_sid_str((PSID)&max_sid.sid);
- max_sid.sid.SubAuthority[count] = 1000; /* first user account */
- test_sid_str((PSID)&max_sid.sid);
- }
-
- LsaFreeMemory(info);
+ int count = *GetSidSubAuthorityCount(info->DomainSid);
+ CopySid(GetSidLengthRequired(count), &max_sid, info->DomainSid);
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_USER_RID_ADMIN;
+ max_sid.sid.SubAuthorityCount = count + 1;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_USER_RID_GUEST;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_ADMINS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_USERS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_GUESTS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_COMPUTERS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_CONTROLLERS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_CERT_ADMINS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_SCHEMA_ADMINS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_ENTERPRISE_ADMINS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_GROUP_RID_POLICY_ADMINS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = DOMAIN_ALIAS_RID_RAS_SERVERS;
+ test_sid_str((PSID)&max_sid.sid);
+ max_sid.sid.SubAuthority[count] = 1000; /* first user account */
+ test_sid_str((PSID)&max_sid.sid);
}
- status = LsaClose(handle);
- ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status);
+ LsaFreeMemory(info);
}
+
+ status = LsaClose(handle);
+ ok(status == STATUS_SUCCESS, "LsaClose() failed, returned 0x%08x\n", status);
}
}
@@ -2488,7 +2477,7 @@ static void check_wellknown_name(const char* name, WELL_KNOWN_SID_TYPE result)
AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
cb = sizeof(wk_sid);
- if (!pCreateWellKnownSid(result, domainsid, wk_sid, &cb))
+ if (!CreateWellKnownSid(result, domainsid, wk_sid, &cb))
{
win_skip("SID %i is not available on the system\n",result);
goto cleanup;
@@ -2710,12 +2699,6 @@ static void test_LookupAccountName(void)
}
/* Well Known names */
- if (!pCreateWellKnownSid)
- {
- win_skip("CreateWellKnownSid not available\n");
- return;
- }
-
if (PRIMARYLANGID(GetSystemDefaultLangID()) != LANG_ENGLISH)
{
skip("Non-English locale (skipping well known name creation tests)\n");
@@ -3606,7 +3589,7 @@ static void test_CreateDirectoryA(void)
DWORD error;
PACL pDacl;
- if (!pGetNamedSecurityInfoA || !pCreateWellKnownSid)
+ if (!pGetNamedSecurityInfoA)
{
win_skip("Required functions are not available\n");
return;
@@ -3635,7 +3618,7 @@ static void test_CreateDirectoryA(void)
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = TRUE;
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
- pCreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
+ CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
pDacl = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 100);
bret = InitializeAcl(pDacl, 100, ACL_REVISION);
ok(bret, "Failed to initialize ACL.\n");
@@ -3848,7 +3831,7 @@ static void test_GetNamedSecurityInfoA(void)
BYTE flags;
NTSTATUS status;
- if (!pSetNamedSecurityInfoA || !pGetNamedSecurityInfoA || !pCreateWellKnownSid)
+ if (!pSetNamedSecurityInfoA || !pGetNamedSecurityInfoA)
{
win_skip("Required functions are not available\n");
return;
@@ -3941,7 +3924,7 @@ static void test_GetNamedSecurityInfoA(void)
pSD = &sd;
pDacl = HeapAlloc(GetProcessHeap(), 0, 100);
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
- pCreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
+ CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
bret = InitializeAcl(pDacl, 100, ACL_REVISION);
ok(bret, "Failed to initialize ACL.\n");
bret = pAddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
@@ -4123,7 +4106,7 @@ static void test_GetNamedSecurityInfoA(void)
/* Test querying the ownership of a built-in registry key */
sid_size = sizeof(system_ptr);
- pCreateWellKnownSid(WinLocalSystemSid, NULL, system_sid, &sid_size);
+ CreateWellKnownSid(WinLocalSystemSid, NULL, system_sid, &sid_size);
error = pGetNamedSecurityInfoA(software_key, SE_REGISTRY_KEY,
OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION,
NULL, NULL, NULL, NULL, &pSD);
@@ -4150,7 +4133,7 @@ static void test_GetNamedSecurityInfoA(void)
/* Test querying the DACL of a built-in registry key */
sid_size = sizeof(users_ptr);
- pCreateWellKnownSid(WinBuiltinUsersSid, NULL, users_sid, &sid_size);
+ CreateWellKnownSid(WinBuiltinUsersSid, NULL, users_sid, &sid_size);
error = pGetNamedSecurityInfoA(software_key, SE_REGISTRY_KEY, DACL_SECURITY_INFORMATION,
NULL, NULL, NULL, NULL, &pSD);
ok(!error, "GetNamedSecurityInfo failed with error %d\n", error);
@@ -4368,11 +4351,6 @@ static void test_ConvertSecurityDescriptorToString(void)
win_skip("ConvertSecurityDescriptorToStringSecurityDescriptor is not available\n");
return;
}
- if (!pCreateWellKnownSid)
- {
- win_skip("CreateWellKnownSid is not available\n");
- return;
- }
/* It seems Windows XP adds an extra character to the length of the string for each ACE in an ACL. We
* don't replicate this feature so we only test len >= strlen+1. */
@@ -4391,7 +4369,7 @@ static void test_ConvertSecurityDescriptorToString(void)
CHECK_RESULT_AND_FREE("");
size = 4096;
- pCreateWellKnownSid(WinLocalSid, NULL, sid_buf, &size);
+ CreateWellKnownSid(WinLocalSid, NULL, sid_buf, &size);
SetSecurityDescriptorOwner(&desc, sid_buf, FALSE);
ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
CHECK_RESULT_AND_FREE("O:S-1-2-0");
@@ -4401,7 +4379,7 @@ static void test_ConvertSecurityDescriptorToString(void)
CHECK_RESULT_AND_FREE("O:S-1-2-0");
size = sizeof(sid_buf);
- pCreateWellKnownSid(WinLocalSystemSid, NULL, sid_buf, &size);
+ CreateWellKnownSid(WinLocalSystemSid, NULL, sid_buf, &size);
SetSecurityDescriptorOwner(&desc, sid_buf, TRUE);
ok(pConvertSecurityDescriptorToStringSecurityDescriptorA(&desc, SDDL_REVISION_1, sec_info, &string, &len), "Conversion failed\n");
CHECK_RESULT_AND_FREE("O:SY");
@@ -4766,13 +4744,6 @@ static void test_GetSecurityInfo(void)
LocalFree(pSD);
- if (!pCreateWellKnownSid)
- {
- win_skip("NULL parameter test would crash on NT4\n");
- CloseHandle(obj);
- return;
- }
-
/* If we don't ask for the security descriptor, Windows will still give us
the other stuff, leaving us no way to free it. */
ret = GetSecurityInfo(obj, SE_FILE_OBJECT,
@@ -4790,7 +4761,7 @@ static void test_GetSecurityInfo(void)
pSD = &sd;
pDacl = (PACL)&dacl;
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
- pCreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
+ CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, admin_sid, &sid_size);
bret = InitializeAcl(pDacl, sizeof(dacl), ACL_REVISION);
ok(bret, "Failed to initialize ACL.\n");
bret = pAddAccessAllowedAceEx(pDacl, ACL_REVISION, 0, GENERIC_ALL, user_sid);
@@ -4844,7 +4815,7 @@ static void test_GetSecurityInfo(void)
return;
}
sid_size = sizeof(domain_users_ptr);
- pCreateWellKnownSid(WinAccountDomainUsersSid, domain_sid, domain_users_sid, &sid_size);
+ CreateWellKnownSid(WinAccountDomainUsersSid, domain_sid, domain_users_sid, &sid_size);
FreeSid(domain_sid);
/* Test querying the ownership of a process */
@@ -7502,12 +7473,6 @@ static void test_EqualDomainSid(void)
return;
}
- if (!pCreateWellKnownSid)
- {
- win_skip("CreateWellKnownSid not available\n");
- return;
- }
-
ret = AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
ok(ret, "AllocateAndInitializeSid error %u\n", GetLastError());
@@ -7526,7 +7491,7 @@ static void test_EqualDomainSid(void)
SID *pisid = sid;
size = sizeof(sid_buffer);
- if (!pCreateWellKnownSid(i, NULL, sid, &size))
+ if (!CreateWellKnownSid(i, NULL, sid, &size))
{
trace("Well known SID %u not supported\n", i);
continue;
@@ -7548,7 +7513,7 @@ static void test_EqualDomainSid(void)
ok(equal == 0, "%u: got %d\n", i, equal);
size = sizeof(sid_buffer2);
- ret = pCreateWellKnownSid(i, well_known_sid_values[i].without_domain ? NULL : domainsid, sid2, &size);
+ ret = CreateWellKnownSid(i, well_known_sid_values[i].without_domain ? NULL : domainsid, sid2, &size);
ok(ret, "%u: CreateWellKnownSid error %u\n", i, GetLastError());
equal = 0xdeadbeef;
--
2.24.1
1
1
Signed-off-by: André Hentschel <nerv(a)dawncrow.de>
---
dlls/d3dx9_36/d3dx9_36.spec | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_36.spec b/dlls/d3dx9_36/d3dx9_36.spec
index de8b12ce03b..b46efd8d9cf 100644
--- a/dlls/d3dx9_36/d3dx9_36.spec
+++ b/dlls/d3dx9_36/d3dx9_36.spec
@@ -37,10 +37,10 @@
@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr)
@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr)
@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr)
-@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr)
+@ stdcall D3DXCreateCubeTextureFromFileExW(ptr wstr long long long long long long long long ptr ptr ptr)
@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr)
@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr)
-@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr)
+@ stdcall D3DXCreateCubeTextureFromFileW(ptr wstr ptr)
@ stub D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr)
@ stub D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr)
@ stub D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr)
@@ -109,10 +109,10 @@
@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr)
@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr)
@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr)
-@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr)
+@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr wstr long long long long long long long long long long ptr ptr ptr)
@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr)
@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr)
-@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr)
+@ stdcall D3DXCreateVolumeTextureFromFileW(ptr wstr ptr)
@ stub D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr)
@ stub D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr)
@ stub D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr)
@@ -191,7 +191,7 @@
@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long long)
@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr)
@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr)
-@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr)
+@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr wstr ptr long long ptr)
@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long)
@ stub D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr)
@ stub D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr)
@@ -283,10 +283,10 @@
@ stub D3DXSavePRTCompBufferToFileW(ptr ptr)
@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr)
@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr)
-@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr)
+@ stdcall D3DXSaveSurfaceToFileW(wstr long ptr ptr ptr)
@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr)
@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr)
-@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr)
+@ stdcall D3DXSaveTextureToFileW(wstr long ptr ptr)
@ stub D3DXSaveVolumeToFileA(ptr long ptr ptr ptr)
@ stub D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr)
@ stub D3DXSaveVolumeToFileW(ptr long ptr ptr ptr)
--
2.17.1
3
2