2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for recv
5 * PROGRAMMERS: Colin Finck
15 /* For valid test results, the ReactOS Website needs to return at least 8 bytes on a "GET / HTTP/1.0" request.
16 Also the first 4 bytes and the last 4 bytes need to be different.
17 Both factors usually apply on standard HTTP responses. */
21 const char szDummyBytes
[RECV_BUF
] = {0xFF, 0x00, 0xFF, 0x00};
23 char szBuf1
[RECV_BUF
];
24 char szBuf2
[RECV_BUF
];
29 IO_STATUS_BLOCK readIosb
;
31 LARGE_INTEGER readOffset
;
33 /* Start up Winsock */
34 iResult
= WSAStartup(MAKEWORD(2, 2), &wdata
);
35 ok(iResult
== 0, "WSAStartup failed, iResult == %d\n", iResult
);
37 /* If we call recv without a socket, it should return with an error and do nothing. */
38 memcpy(szBuf1
, szDummyBytes
, RECV_BUF
);
39 iResult
= recv(0, szBuf1
, RECV_BUF
, 0);
40 ok(iResult
== SOCKET_ERROR
, "iRseult = %d\n", iResult
);
41 ok(!memcmp(szBuf1
, szDummyBytes
, RECV_BUF
), "not equal\n");
43 /* Create the socket */
44 if (!CreateSocket(&sck
))
46 ok(0, "CreateSocket failed. Aborting test.\n");
50 /* Now we can pass at least a socket, but we have no connection yet. Should return with an error and do nothing. */
51 memcpy(szBuf1
, szDummyBytes
, RECV_BUF
);
52 iResult
= recv(sck
, szBuf1
, RECV_BUF
, 0);
53 ok(iResult
== SOCKET_ERROR
, "iResult = %d\n", iResult
);
54 ok(!memcmp(szBuf1
, szDummyBytes
, RECV_BUF
), "not equal\n");
56 /* Connect to "www.reactos.org" */
57 if (!ConnectToReactOSWebsite(sck
))
59 ok(0, "ConnectToReactOSWebsite failed. Aborting test.\n");
63 /* Send the GET request */
64 if (!GetRequestAndWait(sck
))
66 ok(0, "GetRequestAndWait failed. Aborting test.\n");
71 MSG_PEEK will not change the internal number of bytes read, so that a subsequent request should return the same bytes again. */
72 SCKTEST(recv(sck
, szBuf1
, RECV_BUF
, MSG_PEEK
));
73 SCKTEST(recv(sck
, szBuf2
, RECV_BUF
, 0));
74 ok(!memcmp(szBuf1
, szBuf2
, RECV_BUF
), "not equal\n");
76 /* The last recv() call moved the internal file pointer, so that the next request should return different data. */
77 SCKTEST(recv(sck
, szBuf1
, RECV_BUF
, 0));
78 ok(memcmp(szBuf1
, szBuf2
, RECV_BUF
), "equal\n");
80 /* Create an event for NtReadFile */
81 readOffset
.QuadPart
= 0LL;
82 memcpy(szBuf1
, szBuf2
, RECV_BUF
);
83 status
= NtCreateEvent(&readEvent
,
90 ok(0, "Failed to create event\n");
94 /* Try reading the socket using the NT file API */
95 status
= NtReadFile((HANDLE
)sck
,
104 if (status
== STATUS_PENDING
)
106 WaitForSingleObject(readEvent
, INFINITE
);
107 status
= readIosb
.Status
;
110 ok(status
== 0, "Read failed with status 0x%x\n", (unsigned int)status
);
111 ok(memcmp(szBuf2
, szBuf1
, RECV_BUF
), "equal\n");
112 ok(readIosb
.Information
== RECV_BUF
, "Short read\n");