Author: tfaber
Date: Mon Jun 25 08:21:11 2012
New Revision: 56802
URL:
http://svn.reactos.org/svn/reactos?rev=56802&view=rev
Log:
[WS2_32_APITEST]
- Add a few more getaddrinfo tests
- Add a test for WSAStartup
Added:
trunk/rostests/apitests/ws2_32/WSAStartup.c (with props)
Modified:
trunk/rostests/apitests/ws2_32/CMakeLists.txt
trunk/rostests/apitests/ws2_32/getaddrinfo.c
trunk/rostests/apitests/ws2_32/testlist.c
Modified: trunk/rostests/apitests/ws2_32/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/CMakeList…
==============================================================================
--- trunk/rostests/apitests/ws2_32/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/rostests/apitests/ws2_32/CMakeLists.txt [iso-8859-1] Mon Jun 25 08:21:11 2012
@@ -4,6 +4,7 @@
helpers.c
ioctlsocket.c
recv.c
+ WSAStartup.c
testlist.c)
add_executable(ws2_32_apitest ${SOURCE})
Added: trunk/rostests/apitests/ws2_32/WSAStartup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/WSAStartu…
==============================================================================
--- trunk/rostests/apitests/ws2_32/WSAStartup.c (added)
+++ trunk/rostests/apitests/ws2_32/WSAStartup.c [iso-8859-1] Mon Jun 25 08:21:11 2012
@@ -1,0 +1,272 @@
+/*
+ * PROJECT: ReactOS api tests
+ * LICENSE: GPLv2+ - See COPYING in the top level directory
+ * PURPOSE: Test for WSAStartup
+ * PROGRAMMER: Thomas Faber <thfabba(a)gmx.de>
+ */
+
+#define WIN32_NO_STATUS
+#include <winsock2.h>
+#include <wine/test.h>
+#include <pseh/pseh2.h>
+#include <ndk/rtlfuncs.h>
+#include <ndk/mmfuncs.h>
+
+#define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
+#define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok(ExceptionStatus ==
ExpectedStatus, "Exception %lx, expected %lx\n", ExceptionStatus,
ExpectedStatus)
+
+static
+PVOID
+AllocateGuarded(
+ SIZE_T SizeRequested)
+{
+ NTSTATUS Status;
+ SIZE_T Size = PAGE_ROUND_UP(SizeRequested + PAGE_SIZE);
+ PVOID VirtualMemory = NULL;
+ PCHAR StartOfBuffer;
+
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0,
&Size, MEM_RESERVE, PAGE_NOACCESS);
+
+ if (!NT_SUCCESS(Status))
+ return NULL;
+
+ Size -= PAGE_SIZE;
+ if (Size)
+ {
+ Status = NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory, 0,
&Size, MEM_COMMIT, PAGE_READWRITE);
+ if (!NT_SUCCESS(Status))
+ {
+ Size = 0;
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory,
&Size, MEM_RELEASE);
+ ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status);
+ return NULL;
+ }
+ }
+
+ StartOfBuffer = VirtualMemory;
+ StartOfBuffer += Size - SizeRequested;
+
+ return StartOfBuffer;
+}
+
+static
+VOID
+FreeGuarded(
+ PVOID Pointer)
+{
+ NTSTATUS Status;
+ PVOID VirtualMemory = (PVOID)PAGE_ROUND_DOWN((SIZE_T)Pointer);
+ SIZE_T Size = 0;
+
+ Status = NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory, &Size,
MEM_RELEASE);
+ ok(Status == STATUS_SUCCESS, "Status = %lx\n", Status);
+}
+
+static
+BOOLEAN
+IsInitialized(VOID)
+{
+ struct hostent *Hostent;
+
+ Hostent = gethostbyname("localhost");
+ if (!Hostent)
+ ok_dec(WSAGetLastError(), WSANOTINITIALISED);
+ return Hostent != NULL;
+}
+
+static
+BOOLEAN
+AreLegacyFunctionsSupported(VOID)
+{
+ int Error;
+
+ Error = WSACancelBlockingCall();
+ ok(Error == SOCKET_ERROR, "Error = %d\n", Error);
+ ok(WSAGetLastError() == WSAEOPNOTSUPP ||
+ WSAGetLastError() == WSAEINVAL, "WSAGetLastError = %d\n",
WSAGetLastError());
+
+ return WSAGetLastError() != WSAEOPNOTSUPP;
+}
+
+START_TEST(WSAStartup)
+{
+ NTSTATUS ExceptionStatus;
+ LPWSADATA WsaData;
+ int Error;
+ struct
+ {
+ WORD Version;
+ BOOLEAN ExpectedSuccess;
+ WORD ExpectedVersion;
+ } Tests[] =
+ {
+ { MAKEWORD(0, 0), FALSE, MAKEWORD(2, 2) },
+ { MAKEWORD(0, 9), FALSE, MAKEWORD(2, 2) },
+ { MAKEWORD(1, 0), TRUE },
+ { MAKEWORD(1, 1), TRUE },
+ { MAKEWORD(1, 2), TRUE, MAKEWORD(1, 1) },
+ { MAKEWORD(1, 15), TRUE, MAKEWORD(1, 1) },
+ { MAKEWORD(1, 255), TRUE, MAKEWORD(1, 1) },
+ { MAKEWORD(2, 0), TRUE },
+ { MAKEWORD(2, 1), TRUE },
+ { MAKEWORD(2, 2), TRUE },
+ { MAKEWORD(2, 3), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(2, 15), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(2, 255), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(3, 0), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(3, 1), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(3, 2), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(3, 3), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(3, 15), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(3, 255), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(15, 255), TRUE, MAKEWORD(2, 2) },
+ { MAKEWORD(255, 255), TRUE, MAKEWORD(2, 2) },
+ };
+ const INT TestCount = sizeof(Tests) / sizeof(Tests[0]);
+ INT i;
+
+ ok(!IsInitialized(), "Winsock unexpectedly initialized\n");
+
+ /* parameter checks */
+ StartSeh()
+ Error = WSAStartup(0, NULL);
+ ok_dec(Error, WSAVERNOTSUPPORTED);
+ ok_dec(WSAGetLastError(), WSANOTINITIALISED);
+ EndSeh(STATUS_SUCCESS);
+ StartSeh()
+ Error = WSAStartup(MAKEWORD(2, 2), NULL);
+ ok_dec(Error, WSAEFAULT);
+ ok_dec(WSAGetLastError(), WSANOTINITIALISED);
+ EndSeh(STATUS_SUCCESS);
+ ok(!IsInitialized(), "Winsock unexpectedly initialized\n");
+
+ WsaData = AllocateGuarded(sizeof(*WsaData));
+ if (!WsaData)
+ {
+ skip("Out of memory\n");
+ return;
+ }
+
+ /* test different version */
+ for (i = 0; i < TestCount; i++)
+ {
+ trace("%d: version %d.%d\n",
+ i, LOBYTE(Tests[i].Version), HIBYTE(Tests[i].Version));
+ FillMemory(WsaData, sizeof(*WsaData), 0x55);
+ Error = WSANO_RECOVERY;
+ StartSeh()
+ Error = WSAStartup(Tests[i].Version, WsaData);
+ EndSeh(STATUS_SUCCESS);
+ if (Error)
+ {
+ ok(!Tests[i].ExpectedSuccess, "WSAStartup failed unexpectedly\n");
+ ok_dec(Error, WSAVERNOTSUPPORTED);
+ ok_dec(WSAGetLastError(), WSANOTINITIALISED);
+ ok(!IsInitialized(), "Winsock unexpectedly initialized\n");
+ }
+ else
+ {
+ ok(Tests[i].ExpectedSuccess, "WSAStartup succeeded
unexpectedly\n");
+ ok_dec(WSAGetLastError(), 0);
+ ok(IsInitialized(), "Winsock not initialized despite success\n");
+ if (LOBYTE(Tests[i].Version) < 2)
+ ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
+ else
+ ok(!AreLegacyFunctionsSupported(), "Legacy function
succeeded\n");
+ WSACleanup();
+ ok(!IsInitialized(), "Winsock still initialized after cleanup\n");
+ }
+ if (Tests[i].ExpectedVersion)
+ ok_hex(WsaData->wVersion, Tests[i].ExpectedVersion);
+ else
+ ok_hex(WsaData->wVersion, Tests[i].Version);
+ ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
+ ok_str(WsaData->szDescription, "WinSock 2.0");
+ ok_str(WsaData->szSystemStatus, "Running");
+ if (LOBYTE(WsaData->wVersion) >= 2)
+ {
+ ok_dec(WsaData->iMaxSockets, 0);
+ ok_dec(WsaData->iMaxUdpDg, 0);
+ }
+ else
+ {
+ ok_dec(WsaData->iMaxSockets, 32767);
+ ok_dec(WsaData->iMaxUdpDg, 65467);
+ }
+ ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
+ }
+
+ /* upgrade the version */
+ FillMemory(WsaData, sizeof(*WsaData), 0x55);
+ Error = WSAStartup(MAKEWORD(1, 1), WsaData);
+ ok_dec(Error, 0);
+ ok_dec(WSAGetLastError(), 0);
+ ok_hex(WsaData->wVersion, MAKEWORD(1, 1));
+ ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
+ ok_str(WsaData->szDescription, "WinSock 2.0");
+ ok_str(WsaData->szSystemStatus, "Running");
+ ok_dec(WsaData->iMaxSockets, 32767);
+ ok_dec(WsaData->iMaxUdpDg, 65467);
+ ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
+ ok(IsInitialized(), "Winsock not initialized\n");
+ if (!Error)
+ {
+ ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
+ FillMemory(WsaData, sizeof(*WsaData), 0x55);
+ Error = WSAStartup(MAKEWORD(2, 2), WsaData);
+ ok_dec(Error, 0);
+ ok_hex(WsaData->wVersion, MAKEWORD(2, 2));
+ ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
+ ok_str(WsaData->szDescription, "WinSock 2.0");
+ ok_str(WsaData->szSystemStatus, "Running");
+ ok_dec(WsaData->iMaxSockets, 0);
+ ok_dec(WsaData->iMaxUdpDg, 0);
+ ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
+ if (!Error)
+ {
+ ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
+ WSACleanup();
+ ok(IsInitialized(), "Winsock prematurely uninitialized\n");
+ }
+ WSACleanup();
+ ok(!IsInitialized(), "Winsock still initialized after cleanup\n");
+ }
+
+ /* downgrade the version */
+ FillMemory(WsaData, sizeof(*WsaData), 0x55);
+ Error = WSAStartup(MAKEWORD(2, 2), WsaData);
+ ok_dec(Error, 0);
+ ok_dec(WSAGetLastError(), 0);
+ ok_hex(WsaData->wVersion, MAKEWORD(2, 2));
+ ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
+ ok_str(WsaData->szDescription, "WinSock 2.0");
+ ok_str(WsaData->szSystemStatus, "Running");
+ ok_dec(WsaData->iMaxSockets, 0);
+ ok_dec(WsaData->iMaxUdpDg, 0);
+ ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
+ ok(IsInitialized(), "Winsock not initialized\n");
+ if (!Error)
+ {
+ ok(!AreLegacyFunctionsSupported(), "Legacy function succeeded\n");
+ FillMemory(WsaData, sizeof(*WsaData), 0x55);
+ Error = WSAStartup(MAKEWORD(1, 1), WsaData);
+ ok_dec(Error, 0);
+ ok_hex(WsaData->wVersion, MAKEWORD(1, 1));
+ ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
+ ok_str(WsaData->szDescription, "WinSock 2.0");
+ ok_str(WsaData->szSystemStatus, "Running");
+ ok_dec(WsaData->iMaxSockets, 32767);
+ ok_dec(WsaData->iMaxUdpDg, 65467);
+ ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
+ if (!Error)
+ {
+ ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
+ WSACleanup();
+ ok(IsInitialized(), "Winsock prematurely uninitialized\n");
+ }
+ WSACleanup();
+ ok(!IsInitialized(), "Winsock still initialized after cleanup\n");
+ }
+
+ FreeGuarded(WsaData);
+}
Propchange: trunk/rostests/apitests/ws2_32/WSAStartup.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/rostests/apitests/ws2_32/getaddrinfo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/getaddrin…
==============================================================================
--- trunk/rostests/apitests/ws2_32/getaddrinfo.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/ws2_32/getaddrinfo.c [iso-8859-1] Mon Jun 25 08:21:11 2012
@@ -66,6 +66,9 @@
{ "0.0.0.0:80", NULL },
{ "0.0.0.0.0", NULL },
{ "1.1.1.256", NULL },
+ { "1.2.3", NULL },
+ { "1.2.3.0x4", "1.2.3.4",
AI_NUMERICHOST },
+ { "1.2.3.010", "1.2.3.8",
AI_NUMERICHOST },
/* let's just assume this one doesn't change any time soon ;) */
{ "google-public-dns-a.google.com", "8.8.8.8" },
};
@@ -80,7 +83,7 @@
for (i = 0; i < TestCount; i++)
{
trace("%d: '%s'\n", i, Tests[i].NodeName);
- StartSeh();
+ StartSeh()
AddrInfo = InvalidPointer;
Error = getaddrinfo(Tests[i].NodeName, NULL, &Hints, &AddrInfo);
if (Tests[i].ExpectedAddress)
@@ -214,6 +217,17 @@
struct hostent *Hostent;
/* not yet initialized */
+ StartSeh()
+ Error = getaddrinfo(NULL, NULL, NULL, NULL);
+ ok_dec(Error, WSANOTINITIALISED);
+ EndSeh(STATUS_SUCCESS);
+ StartSeh()
+ AddrInfo = InvalidPointer;
+ Error = getaddrinfo(NULL, NULL, NULL, &AddrInfo);
+ ok_dec(Error, WSANOTINITIALISED);
+ ok_ptr(AddrInfo, InvalidPointer);
+ EndSeh(STATUS_SUCCESS);
+
Error = getaddrinfo("127.0.0.1", "80", NULL, &AddrInfo);
ok_dec(Error, WSANOTINITIALISED);
@@ -239,9 +253,9 @@
ZeroMemory(&Hints, sizeof(Hints));
/* parameter tests */
- StartSeh(); getaddrinfo(NULL, NULL, NULL, NULL); EndSeh(STATUS_ACCESS_VIOLATION);
- StartSeh(); getaddrinfo("", "", &Hints, NULL);
EndSeh(STATUS_ACCESS_VIOLATION);
- StartSeh();
+ StartSeh() getaddrinfo(NULL, NULL, NULL, NULL); EndSeh(STATUS_ACCESS_VIOLATION);
+ StartSeh() getaddrinfo("", "", &Hints, NULL);
EndSeh(STATUS_ACCESS_VIOLATION);
+ StartSeh()
AddrInfo = InvalidPointer;
Error = getaddrinfo(NULL, NULL, NULL, &AddrInfo);
ok_dec(Error, WSAHOST_NOT_FOUND);
Modified: trunk/rostests/apitests/ws2_32/testlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/ws2_32/testlist.…
==============================================================================
--- trunk/rostests/apitests/ws2_32/testlist.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/ws2_32/testlist.c [iso-8859-1] Mon Jun 25 08:21:11 2012
@@ -8,12 +8,14 @@
extern void func_getaddrinfo(void);
extern void func_ioctlsocket(void);
extern void func_recv(void);
+extern void func_WSAStartup(void);
const struct test winetest_testlist[] =
{
{ "getaddrinfo", func_getaddrinfo },
{ "ioctlsocket", func_ioctlsocket },
{ "recv", func_recv },
+ { "WSAStartup", func_WSAStartup },
{ 0, 0 }
};