2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for recv
5 * PROGRAMMERS: Colin Finck
10 #include <ndk/exfuncs.h>
11 #include <ndk/iofuncs.h>
12 #include <ndk/obfuncs.h>
16 /* For valid test results, the ReactOS Website needs to return at least 8 bytes on a "GET / HTTP/1.0" request.
17 Also the first 4 bytes and the last 4 bytes need to be different.
18 Both factors usually apply on standard HTTP responses. */
22 const char szDummyBytes
[RECV_BUF
] = {0xFF, 0x00, 0xFF, 0x00};
24 char szBuf1
[RECV_BUF
];
25 char szBuf2
[RECV_BUF
];
30 IO_STATUS_BLOCK readIosb
;
32 LARGE_INTEGER readOffset
;
34 /* Start up Winsock */
35 iResult
= WSAStartup(MAKEWORD(2, 2), &wdata
);
36 ok(iResult
== 0, "WSAStartup failed, iResult == %d\n", iResult
);
38 /* If we call recv without a socket, it should return with an error and do nothing. */
39 memcpy(szBuf1
, szDummyBytes
, RECV_BUF
);
40 iResult
= recv(0, szBuf1
, RECV_BUF
, 0);
41 ok(iResult
== SOCKET_ERROR
, "iRseult = %d\n", iResult
);
42 ok(!memcmp(szBuf1
, szDummyBytes
, RECV_BUF
), "not equal\n");
44 /* Create the socket */
45 if (!CreateSocket(&sck
))
47 ok(0, "CreateSocket failed. Aborting test.\n");
51 /* Now we can pass at least a socket, but we have no connection yet. Should return with an error and do nothing. */
52 memcpy(szBuf1
, szDummyBytes
, RECV_BUF
);
53 iResult
= recv(sck
, szBuf1
, RECV_BUF
, 0);
54 ok(iResult
== SOCKET_ERROR
, "iResult = %d\n", iResult
);
55 ok(!memcmp(szBuf1
, szDummyBytes
, RECV_BUF
), "not equal\n");
57 /* Connect to "www.reactos.org" */
58 if (!ConnectToReactOSWebsite(sck
))
60 ok(0, "ConnectToReactOSWebsite failed. Aborting test.\n");
64 /* Send the GET request */
65 if (!GetRequestAndWait(sck
))
67 ok(0, "GetRequestAndWait failed. Aborting test.\n");
72 MSG_PEEK will not change the internal number of bytes read, so that a subsequent request should return the same bytes again. */
73 SCKTEST(recv(sck
, szBuf1
, RECV_BUF
, MSG_PEEK
));
74 SCKTEST(recv(sck
, szBuf2
, RECV_BUF
, 0));
75 ok(!memcmp(szBuf1
, szBuf2
, RECV_BUF
), "not equal\n");
77 /* The last recv() call moved the internal file pointer, so that the next request should return different data. */
78 SCKTEST(recv(sck
, szBuf1
, RECV_BUF
, 0));
79 ok(memcmp(szBuf1
, szBuf2
, RECV_BUF
), "equal\n");
81 /* Create an event for NtReadFile */
82 readOffset
.QuadPart
= 0LL;
83 memcpy(szBuf1
, szBuf2
, RECV_BUF
);
84 status
= NtCreateEvent(&readEvent
,
91 ok(0, "Failed to create event\n");
95 /* Try reading the socket using the NT file API */
96 status
= NtReadFile((HANDLE
)sck
,
105 if (status
== STATUS_PENDING
)
107 WaitForSingleObject(readEvent
, INFINITE
);
108 status
= readIosb
.Status
;
111 ok(status
== 0, "Read failed with status 0x%x\n", (unsigned int)status
);
112 ok(memcmp(szBuf2
, szBuf1
, RECV_BUF
), "equal\n");
113 ok(readIosb
.Information
== RECV_BUF
, "Short read\n");