ReactOS  0.4.15-dev-489-g75a0787
WSAStartup.c
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS api tests
3  * LICENSE: GPLv2+ - See COPYING in the top level directory
4  * PURPOSE: Test for WSAStartup
5  * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6  */
7 
8 #include "ws2_32.h"
9 #include <apitest_guard.h>
10 
11 static
12 BOOLEAN
14  PCSTR Buffer,
17  UCHAR Fill)
18 {
20  SIZE_T EqualLength;
22  SIZE_T i;
23 
24  EqualLength = RtlCompareMemory(Buffer, Expected, Length);
25  if (EqualLength != Length)
26  {
27  ok(0, "String is '%.*s', expected '%s'\n", (int)MaximumLength, Buffer, Expected);
28  Result = FALSE;
29  }
30 
31  if (Buffer[Length] != ANSI_NULL)
32  {
33  ok(0, "Not null terminated\n");
34  Result = FALSE;
35  }
36 
37  /* The function nulls the rest of the buffer! */
38  for (i = Length + 1; i < MaximumLength; i++)
39  {
40  UCHAR Char = ((PUCHAR)Buffer)[i];
41  if (Char != Fill)
42  {
43  ok(0, "Found 0x%x at offset %lu, expected 0x%x\n", Char, (ULONG)i, Fill);
44  /* Don't count this as a failure unless the string was actually wrong */
45  //Result = FALSE;
46  /* Don't flood the log */
47  break;
48  }
49  }
50 
51  return Result;
52 }
53 
54 static
55 BOOLEAN
57 {
58  struct hostent *Hostent;
59 
60  Hostent = gethostbyname("localhost");
61  if (!Hostent)
63  return Hostent != NULL;
64 }
65 
66 static
67 BOOLEAN
69 {
70  int Error;
71 
73  ok(Error == SOCKET_ERROR, "Error = %d\n", Error);
75  WSAGetLastError() == WSAEINVAL, "WSAGetLastError = %d\n", WSAGetLastError());
76 
77  return WSAGetLastError() != WSAEOPNOTSUPP;
78 }
79 
81 {
82  BOOLEAN Okay;
83  LPWSADATA WsaData;
84  int Error;
85  struct
86  {
87  WORD Version;
88  BOOLEAN ExpectedSuccess;
89  WORD ExpectedVersion;
90  } Tests[] =
91  {
92  { MAKEWORD(0, 0), FALSE, MAKEWORD(2, 2) },
93  { MAKEWORD(0, 9), FALSE, MAKEWORD(2, 2) },
94  { MAKEWORD(1, 0), TRUE },
95  { MAKEWORD(1, 1), TRUE },
96  { MAKEWORD(1, 2), TRUE, MAKEWORD(1, 1) },
97  { MAKEWORD(1, 15), TRUE, MAKEWORD(1, 1) },
98  { MAKEWORD(1, 255), TRUE, MAKEWORD(1, 1) },
99  { MAKEWORD(2, 0), TRUE },
100  { MAKEWORD(2, 1), TRUE },
101  { MAKEWORD(2, 2), TRUE },
102  { MAKEWORD(2, 3), TRUE, MAKEWORD(2, 2) },
103  { MAKEWORD(2, 15), TRUE, MAKEWORD(2, 2) },
104  { MAKEWORD(2, 255), TRUE, MAKEWORD(2, 2) },
105  { MAKEWORD(3, 0), TRUE, MAKEWORD(2, 2) },
106  { MAKEWORD(3, 1), TRUE, MAKEWORD(2, 2) },
107  { MAKEWORD(3, 2), TRUE, MAKEWORD(2, 2) },
108  { MAKEWORD(3, 3), TRUE, MAKEWORD(2, 2) },
109  { MAKEWORD(3, 15), TRUE, MAKEWORD(2, 2) },
110  { MAKEWORD(3, 255), TRUE, MAKEWORD(2, 2) },
111  { MAKEWORD(15, 255), TRUE, MAKEWORD(2, 2) },
112  { MAKEWORD(255, 255), TRUE, MAKEWORD(2, 2) },
113  };
114  const INT TestCount = sizeof(Tests) / sizeof(Tests[0]);
115  INT i;
116 
117  ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
118 
119  /* parameter checks */
120  StartSeh()
121  Error = WSAStartup(0, NULL);
125  StartSeh()
126  Error = WSAStartup(MAKEWORD(2, 2), NULL);
130  ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
131 
132  WsaData = AllocateGuarded(sizeof(*WsaData));
133  if (!WsaData)
134  {
135  skip("Out of memory\n");
136  return;
137  }
138 
139  /* test different version */
140  for (i = 0; i < TestCount; i++)
141  {
142  trace("%d: version %d.%d\n",
144  FillMemory(WsaData, sizeof(*WsaData), 0x55);
146  StartSeh()
147  Error = WSAStartup(Tests[i].Version, WsaData);
149  if (Error)
150  {
151  ok(!Tests[i].ExpectedSuccess, "WSAStartup failed unexpectedly\n");
154  ok(!IsWinsockInitialized(), "Winsock unexpectedly initialized\n");
155  }
156  else
157  {
158  ok(Tests[i].ExpectedSuccess, "WSAStartup succeeded unexpectedly\n");
159  ok_dec(WSAGetLastError(), 0);
160  ok(IsWinsockInitialized(), "Winsock not initialized despite success\n");
161  if (LOBYTE(Tests[i].Version) < 2)
162  ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
163  else
164  ok(!AreLegacyFunctionsSupported(), "Legacy function succeeded\n");
165  WSACleanup();
166  ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
167  }
168  if (Tests[i].ExpectedVersion)
169  ok_hex(WsaData->wVersion, Tests[i].ExpectedVersion);
170  else
171  ok_hex(WsaData->wVersion, Tests[i].Version);
172  ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
173  Okay = CheckStringBuffer(WsaData->szDescription,
174  sizeof(WsaData->szDescription),
175  "WinSock 2.0",
176  0x55);
177  ok(Okay, "CheckStringBuffer failed\n");
178  Okay = CheckStringBuffer(WsaData->szSystemStatus,
179  sizeof(WsaData->szSystemStatus),
180  "Running",
181  0x55);
182  ok(Okay, "CheckStringBuffer failed\n");
183  if (LOBYTE(WsaData->wVersion) >= 2)
184  {
185  ok_dec(WsaData->iMaxSockets, 0);
186  ok_dec(WsaData->iMaxUdpDg, 0);
187  }
188  else
189  {
190  ok_dec(WsaData->iMaxSockets, 32767);
191  ok_dec(WsaData->iMaxUdpDg, 65467);
192  }
193  ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
194  }
195 
196  /* upgrade the version */
197  FillMemory(WsaData, sizeof(*WsaData), 0x55);
198  Error = WSAStartup(MAKEWORD(1, 1), WsaData);
199  ok_dec(Error, 0);
200  ok_dec(WSAGetLastError(), 0);
201  ok_hex(WsaData->wVersion, MAKEWORD(1, 1));
202  ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
203  Okay = CheckStringBuffer(WsaData->szDescription,
204  sizeof(WsaData->szDescription),
205  "WinSock 2.0",
206  0x55);
207  ok(Okay, "CheckStringBuffer failed\n");
208  Okay = CheckStringBuffer(WsaData->szSystemStatus,
209  sizeof(WsaData->szSystemStatus),
210  "Running",
211  0x55);
212  ok(Okay, "CheckStringBuffer failed\n");
213  ok_dec(WsaData->iMaxSockets, 32767);
214  ok_dec(WsaData->iMaxUdpDg, 65467);
215  ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
216  ok(IsWinsockInitialized(), "Winsock not initialized\n");
217  if (!Error)
218  {
219  ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
220  FillMemory(WsaData, sizeof(*WsaData), 0x55);
221  Error = WSAStartup(MAKEWORD(2, 2), WsaData);
222  ok_dec(Error, 0);
223  ok_hex(WsaData->wVersion, MAKEWORD(2, 2));
224  ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
225  Okay = CheckStringBuffer(WsaData->szDescription,
226  sizeof(WsaData->szDescription),
227  "WinSock 2.0",
228  0x55);
229  ok(Okay, "CheckStringBuffer failed\n");
230  Okay = CheckStringBuffer(WsaData->szSystemStatus,
231  sizeof(WsaData->szSystemStatus),
232  "Running",
233  0x55);
234  ok(Okay, "CheckStringBuffer failed\n");
235  ok_dec(WsaData->iMaxSockets, 0);
236  ok_dec(WsaData->iMaxUdpDg, 0);
237  ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
238  if (!Error)
239  {
240  ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
241  WSACleanup();
242  ok(IsWinsockInitialized(), "Winsock prematurely uninitialized\n");
243  }
244  WSACleanup();
245  ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
246  }
247 
248  /* downgrade the version */
249  FillMemory(WsaData, sizeof(*WsaData), 0x55);
250  Error = WSAStartup(MAKEWORD(2, 2), WsaData);
251  ok_dec(Error, 0);
252  ok_dec(WSAGetLastError(), 0);
253  ok_hex(WsaData->wVersion, MAKEWORD(2, 2));
254  ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
255  Okay = CheckStringBuffer(WsaData->szDescription,
256  sizeof(WsaData->szDescription),
257  "WinSock 2.0",
258  0x55);
259  ok(Okay, "CheckStringBuffer failed\n");
260  Okay = CheckStringBuffer(WsaData->szSystemStatus,
261  sizeof(WsaData->szSystemStatus),
262  "Running",
263  0x55);
264  ok(Okay, "CheckStringBuffer failed\n");
265  ok_dec(WsaData->iMaxSockets, 0);
266  ok_dec(WsaData->iMaxUdpDg, 0);
267  ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
268  ok(IsWinsockInitialized(), "Winsock not initialized\n");
269  if (!Error)
270  {
271  ok(!AreLegacyFunctionsSupported(), "Legacy function succeeded\n");
272  FillMemory(WsaData, sizeof(*WsaData), 0x55);
273  Error = WSAStartup(MAKEWORD(1, 1), WsaData);
274  ok_dec(Error, 0);
275  ok_hex(WsaData->wVersion, MAKEWORD(1, 1));
276  ok_hex(WsaData->wHighVersion, MAKEWORD(2, 2));
277  Okay = CheckStringBuffer(WsaData->szDescription,
278  sizeof(WsaData->szDescription),
279  "WinSock 2.0",
280  0x55);
281  ok(Okay, "CheckStringBuffer failed\n");
282  Okay = CheckStringBuffer(WsaData->szSystemStatus,
283  sizeof(WsaData->szSystemStatus),
284  "Running",
285  0x55);
286  ok(Okay, "CheckStringBuffer failed\n");
287  ok_dec(WsaData->iMaxSockets, 32767);
288  ok_dec(WsaData->iMaxUdpDg, 65467);
289  ok_ptr(WsaData->lpVendorInfo, (PVOID)0x5555555555555555ULL);
290  if (!Error)
291  {
292  ok(AreLegacyFunctionsSupported(), "Legacy function failed\n");
293  WSACleanup();
294  ok(IsWinsockInitialized(), "Winsock prematurely uninitialized\n");
295  }
296  WSACleanup();
297  ok(!IsWinsockInitialized(), "Winsock still initialized after cleanup\n");
298  }
299 
300  FreeGuarded(WsaData);
301 }
#define SOCKET_ERROR
Definition: winsock.h:333
#define TRUE
Definition: types.h:120
IN PVOID IN PVOID IN USHORT Version
Definition: pci.h:361
#define WSAEFAULT
Definition: winerror.h:1945
void Fill(HDC hdc, LONG x, LONG y, COLORREF color)
Definition: drawing.cpp:109
#define LOBYTE(W)
Definition: jmemdos.c:487
static BOOLEAN AreLegacyFunctionsSupported(VOID)
Definition: WSAStartup.c:68
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define MAKEWORD(a, b)
Definition: typedefs.h:247
#define WSAEINVAL
Definition: winerror.h:1946
WORD wVersion
Definition: winsock.h:517
unsigned char * PUCHAR
Definition: retypes.h:3
INT WSAAPI WSACleanup(VOID)
Definition: startup.c:60
#define HIBYTE(W)
Definition: jmemdos.c:486
#define ok_ptr(expression, result)
Definition: atltest.h:108
static VOID FreeGuarded(_In_ PVOID Pointer)
Definition: apitest_guard.h:45
unsigned short iMaxUdpDg
Definition: winsock.h:529
#define StartSeh()
Definition: _sntprintf.h:16
int32_t INT
Definition: typedefs.h:57
#define ok_hex(expression, result)
Definition: atltest.h:94
#define WSAVERNOTSUPPORTED
Definition: winerror.h:1986
#define WSAEOPNOTSUPP
Definition: winerror.h:1958
static PVOID AllocateGuarded(_In_ SIZE_T SizeRequested)
Definition: apitest_guard.h:10
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ANSI_NULL
unsigned char BOOLEAN
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
smooth NULL
Definition: ftsmooth.c:416
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
Definition: bufpool.h:45
char szSystemStatus[WSASYS_STATUS_LEN+1]
Definition: winsock.h:527
#define WSANOTINITIALISED
Definition: winerror.h:1987
PHOSTENT WSAAPI gethostbyname(IN const char FAR *name)
Definition: getxbyxx.c:221
INT WSAAPI WSAGetLastError(VOID)
Definition: dllmain.c:112
#define WSANO_RECOVERY
Definition: winerror.h:2002
#define trace
Definition: atltest.h:70
unsigned short iMaxSockets
Definition: winsock.h:528
INT WSAAPI WSACancelBlockingCall(VOID)
Definition: bhook.c:23
static BOOLEAN CheckStringBuffer(PCSTR Buffer, SIZE_T MaximumLength, PCSTR Expected, UCHAR Fill)
Definition: WSAStartup.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
#define FillMemory(BUF, SIZ, MASK)
Definition: strucsup.c:31
BOOL Error
Definition: chkdsk.c:66
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
char * lpVendorInfo
Definition: winsock.h:530
START_TEST(WSAStartup)
Definition: WSAStartup.c:80
unsigned char UCHAR
Definition: xmlstorage.h:181
char szDescription[WSADESCRIPTION_LEN+1]
Definition: winsock.h:526
UnicodeString MaximumLength
Definition: rtlfuncs.h:2982
ULONG_PTR SIZE_T
Definition: typedefs.h:79
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
unsigned int ULONG
Definition: retypes.h:1
WORD wHighVersion
Definition: winsock.h:518
const char * PCSTR
Definition: typedefs.h:52
static BOOLEAN IsWinsockInitialized(VOID)
Definition: WSAStartup.c:56
BOOLEAN Expected
return STATUS_SUCCESS
Definition: btrfs.c:3014
#define ok_dec(expression, result)
Definition: atltest.h:101
struct test_data Tests[]
#define RtlCompareMemory(s1, s2, l)
Definition: env_spec_w32.h:465
#define EndSeh(ExpectedStatus)
Definition: _sntprintf.h:17