2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for WSARecv
5 * PROGRAMMERS: Peter Hater
11 #define WSARecv_TIMEOUT 2000
19 LPWSAOVERLAPPED lpOverlapped
,
22 //trace("completion called dwFlags %ld cbTransferred %ld lpOverlapped %p dwFlags %ld\n", dwError, cbTransferred, lpOverlapped, dwFlags);
24 ok(count
== 1, "completion sould be called only once count = %d\n", count
);
25 ok(dwError
== 0, "dwError = %ld\n", dwError
);
26 ok(cbTransferred
== RECV_BUF
, "cbTransferred %ld != %d\n", cbTransferred
, RECV_BUF
);
27 ok(lpOverlapped
!= NULL
, "lpOverlapped %p\n", lpOverlapped
);
30 ok(lpOverlapped
->hEvent
!= INVALID_HANDLE_VALUE
, "lpOverlapped->hEvent %p\n", lpOverlapped
->hEvent
);
31 if (lpOverlapped
->hEvent
!= INVALID_HANDLE_VALUE
)
32 WSASetEvent(lpOverlapped
->hEvent
);
38 const char szDummyBytes
[RECV_BUF
] = { 0xFF, 0x00, 0xFF, 0x00 };
41 char szRecvBuf
[RECV_BUF
];
46 DWORD dwRecv
, dwSent
, dwFlags
;
47 WSAOVERLAPPED overlapped
;
48 char szGetRequest
[] = "GET / HTTP/1.0\r\n\r\n";
49 struct fd_set readable
;
51 /* Start up Winsock */
52 iResult
= WSAStartup(MAKEWORD(2, 2), &wdata
);
53 ok(iResult
== 0, "WSAStartup failed, iResult == %d\n", iResult
);
55 /* If we call recv without a socket, it should return with an error and do nothing. */
56 memcpy(szBuf
, szDummyBytes
, RECV_BUF
);
58 buffers
.len
= sizeof(szBuf
);
61 iResult
= WSARecv(0, &buffers
, 1, &dwRecv
, &dwFlags
, NULL
, NULL
);
62 ok(iResult
== SOCKET_ERROR
, "iRseult = %d\n", iResult
);
63 ok(!memcmp(szBuf
, szDummyBytes
, RECV_BUF
), "not equal\n");
65 /* Create the socket */
66 sck
= WSASocketW(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
, NULL
, 0, WSA_FLAG_OVERLAPPED
);
67 if(sck
== INVALID_SOCKET
)
70 skip("CreateSocket failed. Aborting test.\n");
74 /* Now we can pass at least a socket, but we have no connection yet. Should return with an error and do nothing. */
75 memcpy(szBuf
, szDummyBytes
, RECV_BUF
);
77 buffers
.len
= sizeof(szBuf
);
80 iResult
= WSARecv(sck
, &buffers
, 1, &dwRecv
, &dwFlags
, NULL
, NULL
);
81 ok(iResult
== SOCKET_ERROR
, "iResult = %d\n", iResult
);
82 ok(!memcmp(szBuf
, szDummyBytes
, RECV_BUF
), "not equal\n");
84 /* Connect to "www.reactos.org" */
85 if (!ConnectToReactOSWebsite(sck
))
88 skip("ConnectToReactOSWebsite failed. Aborting test.\n");
92 /* prepare overlapped */
93 memset(&overlapped
, 0, sizeof(overlapped
));
94 overlapped
.hEvent
= WSACreateEvent();
96 /* Send the GET request */
97 buffers
.buf
= szGetRequest
;
98 buffers
.len
= lstrlenA(szGetRequest
);
100 iResult
= WSASend(sck
, &buffers
, 1, &dwSent
, 0, &overlapped
, NULL
);
101 err
= WSAGetLastError();
102 ok(iResult
== 0 || (iResult
== SOCKET_ERROR
&& err
== WSA_IO_PENDING
), "iResult = %d, %d\n", iResult
, err
);
103 if (err
== WSA_IO_PENDING
)
105 iResult
= WSAWaitForMultipleEvents(1, &overlapped
.hEvent
, TRUE
, WSARecv_TIMEOUT
, TRUE
);
106 ok(iResult
== WSA_WAIT_EVENT_0
, "WSAWaitForMultipleEvents failed %d\n", iResult
);
107 ok(WSAGetOverlappedResult(sck
, &overlapped
, &dwSent
, TRUE
, &dwFlags
), "WSAGetOverlappedResult failed %d\n", WSAGetLastError());
109 ok(dwSent
== strlen(szGetRequest
), "dwSent %ld != %d\n", dwSent
, strlen(szGetRequest
));
110 #if 0 /* break windows too */
111 /* Shutdown the SEND connection */
112 iResult
= shutdown(sck
, SD_SEND
);
113 ok(iResult
!= SOCKET_ERROR
, "iResult = %d\n", iResult
);
115 /* Wait until we're ready to read */
117 FD_SET(sck
, &readable
);
119 iResult
= select(0, &readable
, NULL
, NULL
, NULL
);
120 ok(iResult
!= SOCKET_ERROR
, "iResult = %d\n", iResult
);
122 /* Receive the data. */
124 buffers
.len
= sizeof(szBuf
);
125 dwRecv
= sizeof(szBuf
);
126 iResult
= WSARecv(sck
, &buffers
, 1, &dwRecv
, &dwFlags
, NULL
, NULL
);
127 ok(iResult
!= SOCKET_ERROR
, "iResult = %d\n", iResult
);
128 ok(dwRecv
== sizeof(szBuf
), "dwRecv %ld != %d\n", dwRecv
, sizeof(szBuf
));
129 /* MSG_PEEK is invalid for overlapped (MSDN), but passes??? */
130 buffers
.buf
= szRecvBuf
;
131 buffers
.len
= sizeof(szRecvBuf
);
133 dwRecv
= sizeof(szRecvBuf
);
134 ok(overlapped
.hEvent
!= NULL
, "WSACreateEvent failed %d\n", WSAGetLastError());
135 iResult
= WSARecv(sck
, &buffers
, 1, &dwRecv
, &dwFlags
, &overlapped
, NULL
);
136 err
= WSAGetLastError();
137 ok(iResult
== 0 || (iResult
== SOCKET_ERROR
&& err
== WSA_IO_PENDING
), "iResult = %d, %d\n", iResult
, err
);
138 if (err
== WSA_IO_PENDING
)
140 iResult
= WSAWaitForMultipleEvents(1, &overlapped
.hEvent
, TRUE
, WSARecv_TIMEOUT
, TRUE
);
141 ok(iResult
== WSA_WAIT_EVENT_0
, "WSAWaitForMultipleEvents failed %d\n", iResult
);
142 ok(WSAGetOverlappedResult(sck
, &overlapped
, &dwRecv
, TRUE
, &dwFlags
), "WSAGetOverlappedResult failed %d\n", WSAGetLastError());
144 ok(dwRecv
== sizeof(szRecvBuf
), "dwRecv %ld != %d\n", dwRecv
, sizeof(szRecvBuf
));
145 /* normal overlapped, no completion */
147 buffers
.len
= sizeof(szBuf
);
149 dwRecv
= sizeof(szBuf
);
150 WSAResetEvent(overlapped
.hEvent
);
151 iResult
= WSARecv(sck
, &buffers
, 1, &dwRecv
, &dwFlags
, &overlapped
, NULL
);
152 err
= WSAGetLastError();
153 ok(iResult
== 0 || (iResult
== SOCKET_ERROR
&& err
== WSA_IO_PENDING
), "iResult = %d, %d\n", iResult
, err
);
154 if (err
== WSA_IO_PENDING
)
156 iResult
= WSAWaitForMultipleEvents(1, &overlapped
.hEvent
, TRUE
, WSARecv_TIMEOUT
, TRUE
);
157 ok(iResult
== WSA_WAIT_EVENT_0
, "WSAWaitForMultipleEvents failed %d\n", iResult
);
158 ok(WSAGetOverlappedResult(sck
, &overlapped
, &dwRecv
, TRUE
, &dwFlags
), "WSAGetOverlappedResult failed %d\n", WSAGetLastError());
160 ok(dwRecv
== sizeof(szBuf
), "dwRecv %ld != %d\n", dwRecv
, sizeof(szBuf
));
161 ok(memcmp(szRecvBuf
, szBuf
, sizeof(szBuf
)) == 0, "MSG_PEEK shouldn't have moved the pointer\n");
162 /* overlapped with completion */
164 dwRecv
= sizeof(szBuf
);
165 WSAResetEvent(overlapped
.hEvent
);
166 iResult
= WSARecv(sck
, &buffers
, 1, &dwRecv
, &dwFlags
, &overlapped
, &completion
);
167 err
= WSAGetLastError();
168 ok(iResult
== 0 || (iResult
== SOCKET_ERROR
&& err
== WSA_IO_PENDING
), "iResult = %d, %d\n", iResult
, err
);
169 if (err
== WSA_IO_PENDING
)
171 iResult
= WSAWaitForMultipleEvents(1, &overlapped
.hEvent
, TRUE
, WSARecv_TIMEOUT
, TRUE
);
172 ok(iResult
== WSA_WAIT_EVENT_0
, "WSAWaitForMultipleEvents failed %d\n", iResult
);
173 ok(WSAGetOverlappedResult(sck
, &overlapped
, &dwRecv
, TRUE
, &dwFlags
), "WSAGetOverlappedResult failed %d\n", WSAGetLastError());
175 ok(WSACloseEvent(overlapped
.hEvent
), "WSAGetOverlappedResult failed %d\n", WSAGetLastError());
176 ok(dwRecv
== sizeof(szBuf
), "dwRecv %ld != %d\n", dwRecv
, sizeof(szBuf
));
177 /* no overlapped with completion */
179 dwRecv
= sizeof(szBuf
);
180 /* call doesn't fail, but completion is not called */
181 iResult
= WSARecv(sck
, &buffers
, 1, &dwRecv
, &dwFlags
, NULL
, &completion
);
182 err
= WSAGetLastError();
183 ok(iResult
== 0 || (iResult
== SOCKET_ERROR
&& err
== WSA_IO_PENDING
), "iResult = %d, %d\n", iResult
, err
);
184 ok(WSAGetLastError() == 0, "WSAGetLastError failed %d\n", WSAGetLastError());
185 ok(dwRecv
== sizeof(szBuf
), "dwRecv %ld != %d and 0\n", dwRecv
, sizeof(szBuf
));