[PATCH 2/4] httpapi/tests: Add tests for when URLs fail to be added to a queue.
Julian Klemann
jklemann at codeweavers.com
Tue Jun 14 16:38:06 CDT 2022
If a queue is associated to a URL group and the URL cannot be added to
the queue, the URL should not be set in the group. In other cases, it
should be.
Signed-off-by: Julian Klemann <jklemann at codeweavers.com>
---
dlls/httpapi/tests/httpapi.c | 118 +++++++++++++++++++++++++++++++++++
1 file changed, 118 insertions(+)
diff --git a/dlls/httpapi/tests/httpapi.c b/dlls/httpapi/tests/httpapi.c
index 9d344f26d02..d231fd1d8ed 100644
--- a/dlls/httpapi/tests/httpapi.c
+++ b/dlls/httpapi/tests/httpapi.c
@@ -1218,6 +1218,122 @@ static void test_HttpCreateUrlGroup(void)
ok(!ret, "Unexpected return value %u.\n", ret);
}
+static void test_v2_bound_port(void)
+{
+ static const HTTPAPI_VERSION version = {2, 0};
+ struct sockaddr_in sockaddr;
+ HTTP_SERVER_SESSION_ID session;
+ HTTP_BINDING_INFO binding;
+ HTTP_URL_GROUP_ID group;
+ unsigned short port;
+ WCHAR url[50];
+ HANDLE queue, dummy_queue;
+ int ret;
+ SOCKET s, s2;
+
+ ret = pHttpCreateServerSession(version, &session, 0);
+ ok(!ret, "Failed to create session, error %u.\n", ret);
+ ret = pHttpCreateUrlGroup(session, &group, 0);
+ ok(!ret, "Failed to create URL group, error %u.\n", ret);
+
+ ret = pHttpCreateRequestQueue(version, NULL, NULL, 0, &queue);
+ ok(!ret, "Failed to create request queue, error %u.\n", ret);
+ ret = pHttpCreateRequestQueue(version, NULL, NULL, 0, &dummy_queue);
+ ok(!ret, "Failed to create request queue, error %u.\n", ret);
+ binding.Flags.Present = 1;
+ binding.RequestQueueHandle = queue;
+ ret = pHttpSetUrlGroupProperty(group, HttpServerBindingProperty, &binding, sizeof(binding));
+ ok(!ret, "Failed to bind request queue, error %u.\n", ret);
+
+ s2 = socket(AF_INET, SOCK_STREAM, 0);
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
+ for (port = 50000; port < 51000; ++port)
+ {
+ sockaddr.sin_port = htons(port);
+ ret = bind(s2, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
+ if (!ret)
+ break;
+ }
+ ok(!ret, "Failed to bind to port\n");
+ swprintf(url, ARRAY_SIZE(url), L"http://localhost:%u/", port);
+ ret = pHttpAddUrlToUrlGroup(group, url, 0xdeadbeef, 0);
+ ok(ret == ERROR_SHARING_VIOLATION, "Unexpected failure adding %s, error %u.\n", debugstr_w(url), ret);
+ shutdown(s2, SD_BOTH);
+ closesocket(s2);
+
+ binding.RequestQueueHandle = dummy_queue;
+ ret = pHttpSetUrlGroupProperty(group, HttpServerBindingProperty, &binding, sizeof(binding));
+ ok(!ret, "Failed to rebind request queue, error %u.\n", ret);
+
+ s = socket(AF_INET, SOCK_STREAM, 0);
+ ret = connect(s, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
+ todo_wine ok(ret, "Connecting to socket succeeded, %lu.\n", GetLastError());
+ todo_wine ok(GetLastError() == WSAECONNREFUSED, "Unexpected error connecting to socket, %lu.\n", GetLastError());
+
+ closesocket(s);
+ ret = pHttpCloseRequestQueue(dummy_queue);
+ ok(!ret, "Failed to close queue handle, error %u.\n", ret);
+ ret = pHttpCloseRequestQueue(queue);
+ ok(!ret, "Failed to close queue handle, error %u.\n", ret);
+ ret = pHttpCloseUrlGroup(group);
+ ok(!ret, "Failed to close group, error %u.\n", ret);
+ ret = pHttpCloseServerSession(session);
+ ok(!ret, "Failed to close group, error %u.\n", ret);
+}
+
+static void test_v2_queue_after_url(void)
+{
+ char DECLSPEC_ALIGN(8) req_buffer[2048];
+ HTTP_REQUEST_V2 *reqv2 = (HTTP_REQUEST_V2 *)req_buffer;
+ static const HTTPAPI_VERSION version = {2, 0};
+ HTTP_REQUEST_V1 *req = &reqv2->s;
+ HTTP_SERVER_SESSION_ID session;
+ HTTP_BINDING_INFO binding;
+ HTTP_URL_GROUP_ID group;
+ unsigned short port;
+ char req_text[100];
+ HANDLE queue;
+ int ret;
+ SOCKET s;
+
+ ret = pHttpCreateServerSession(version, &session, 0);
+ ok(!ret, "Failed to create session, error %u.\n", ret);
+ ret = pHttpCreateUrlGroup(session, &group, 0);
+ ok(!ret, "Failed to create URL group, error %u.\n", ret);
+
+ port = add_url_v2(group);
+
+ ret = pHttpCreateRequestQueue(version, NULL, NULL, 0, &queue);
+ ok(!ret, "Failed to create request queue, error %u.\n", ret);
+ binding.Flags.Present = 1;
+ binding.RequestQueueHandle = queue;
+ ret = pHttpSetUrlGroupProperty(group, HttpServerBindingProperty, &binding, sizeof(binding));
+ ok(!ret, "Failed to bind request queue, error %u.\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);
+
+ ret = HttpReceiveHttpRequest(queue, HTTP_NULL_ID, 0, (HTTP_REQUEST *)req, sizeof(req_buffer), NULL, NULL);
+ ok(!ret, "Got error %u.\n", ret);
+
+ ok(req->BytesReceived == strlen(req_text), "Got %s bytes.\n", wine_dbgstr_longlong(req->BytesReceived));
+
+ ret = remove_url_v2(group, port);
+ ok(!ret, "Got error %u.\n", ret);
+
+ closesocket(s);
+ ret = pHttpCloseRequestQueue(queue);
+ ok(!ret, "Failed to close queue handle, error %u.\n", ret);
+ ret = pHttpCloseUrlGroup(group);
+ ok(!ret, "Failed to close group, error %u.\n", ret);
+ ret = pHttpCloseServerSession(session);
+ ok(!ret, "Failed to close group, error %u.\n", ret);
+}
+
static void test_v2_server(void)
{
char DECLSPEC_ALIGN(8) req_buffer[2048], response_buffer[2048];
@@ -1538,6 +1654,8 @@ START_TEST(httpapi)
test_HttpCreateServerSession();
test_HttpCreateUrlGroup();
test_v2_server();
+ test_v2_queue_after_url();
+ test_v2_bound_port();
test_v2_completion_port();
ret = HttpTerminate(HTTP_INITIALIZE_SERVER, NULL);
--
2.36.1
More information about the wine-devel
mailing list