2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for bind
5 * PROGRAMMER: Peter Hater
10 #define WIN32_NO_STATUS
12 #define COM_NO_WINDOWS_H
17 #include <ndk/umtypes.h>
19 CHAR LocalAddress
[sizeof("255.255.255.255")];
24 TestBind(IN_ADDR Address
)
31 struct sockaddr_in Addr
;
33 INT ExpectedWSAResult
;
34 struct sockaddr_in ExpectedAddr
;
37 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, PORT
, {{{ 0x7f, 0x00, 0x00, 0x01 }}} }, 0, 0, { AF_INET
, PORT
, {{{ 0x7f, 0x00, 0x00, 0x01 }}} } },
38 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, PORT
, {{{ 0x00, 0x00, 0x00, 0x00 }}} }, 0, 0, { AF_INET
, PORT
, {{{ 0x00, 0x00, 0x00, 0x00 }}} } },
39 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, PORT
, Address
}, 0, 0, { AF_INET
, PORT
, Address
} },
40 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, PORT
, {{{ 0xff, 0xff, 0xff, 0xff }}} }, SOCKET_ERROR
, WSAEADDRNOTAVAIL
},
41 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, 0, {{{ 0x7f, 0x00, 0x00, 0x01 }}} }, 0, 0, { AF_INET
, 0, {{{ 0x7f, 0x00, 0x00, 0x01 }}} } },
42 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, 0, {{{ 0x00, 0x00, 0x00, 0x00 }}} } },
43 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, 0, Address
}, 0, 0, { AF_INET
, 0, Address
} },
44 { SOCK_STREAM
, IPPROTO_TCP
, { AF_INET
, 0, {{{ 0xff, 0xff, 0xff, 0xff }}} }, SOCKET_ERROR
, WSAEADDRNOTAVAIL
},
45 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, PORT
, {{{ 0x7f, 0x00, 0x00, 0x01 }}} }, 0, 0, { AF_INET
, PORT
, {{{ 0x7f, 0x00, 0x00, 0x01 }}} } },
46 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, PORT
, {{{ 0x00, 0x00, 0x00, 0x00 }}} }, 0, 0, { AF_INET
, PORT
, {{{ 0x00, 0x00, 0x00, 0x00 }}} } },
47 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, PORT
, Address
}, 0, 0, { AF_INET
, PORT
, Address
} },
48 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, PORT
, {{{ 0xff, 0xff, 0xff, 0xff }}} }, SOCKET_ERROR
, WSAEADDRNOTAVAIL
},
49 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, 0, {{{ 0x7f, 0x00, 0x00, 0x01 }}} }, 0, 0, { AF_INET
, 0, {{{ 0x7f, 0x00, 0x00, 0x01 }}} } },
50 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, 0, {{{ 0x00, 0x00, 0x00, 0x00 }}} } },
51 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, 0, Address
}, 0, 0,{ AF_INET
, 0, Address
} },
52 { SOCK_DGRAM
, IPPROTO_UDP
, { AF_INET
, 0, {{{ 0xff, 0xff, 0xff, 0xff }}} }, SOCKET_ERROR
, WSAEADDRNOTAVAIL
},
54 const INT TestCount
= _countof(Tests
);
57 struct sockaddr_in Addr
;
59 BOOL Broadcast
= FALSE
;
62 for (i
= 0; i
< TestCount
; i
++)
64 trace("%d: %s %d.%d.%d.%d:%d\n", i
, Tests
[i
].Type
== SOCK_STREAM
? "TCP" : "UDP", Tests
[i
].Addr
.sin_addr
.S_un
.S_un_b
.s_b1
, Tests
[i
].Addr
.sin_addr
.S_un
.S_un_b
.s_b2
, Tests
[i
].Addr
.sin_addr
.S_un
.S_un_b
.s_b3
, Tests
[i
].Addr
.sin_addr
.S_un
.S_un_b
.s_b4
, Tests
[i
].ExpectedAddr
.sin_port
);
65 Socket
= socket(AF_INET
, Tests
[i
].Type
, Tests
[i
].Proto
);
66 if (Socket
== INVALID_SOCKET
)
68 skip("Failed to create socket, skipping");
71 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[i
].Addr
, sizeof(Tests
[i
].Addr
));
72 ok_dec(Error
, Tests
[i
].ExpectedResult
);
75 ok_dec(WSAGetLastError(), Tests
[i
].ExpectedWSAResult
);
79 ok_dec(WSAGetLastError(), 0);
80 Error
= getsockname(Socket
, (struct sockaddr
*) &Addr
, &AddrSize
);
81 ok(Error
== 0, "Error getsockname for test %d, Error %d\n", i
, Error
);
82 ok_dec(WSAGetLastError(), 0);
83 ok_dec(AddrSize
, sizeof(Addr
));
84 ok_dec(Addr
.sin_addr
.s_addr
, Tests
[i
].ExpectedAddr
.sin_addr
.s_addr
);
85 if (Tests
[i
].ExpectedAddr
.sin_port
)
87 ok_dec(Addr
.sin_port
, Tests
[i
].ExpectedAddr
.sin_port
);
91 ok(Addr
.sin_port
!= 0, "Port remained zero\n");
94 Error
= closesocket(Socket
);
98 /* Check double bind */
99 Socket
= socket(AF_INET
, Tests
[0].Type
, Tests
[0].Proto
);
100 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[0].Addr
, sizeof(Tests
[0].Addr
));
101 ok_dec(Error
, Tests
[0].ExpectedResult
);
104 ok_dec(WSAGetLastError(), Tests
[0].ExpectedWSAResult
);
108 ok_dec(WSAGetLastError(), 0);
109 Error
= getsockname(Socket
, (struct sockaddr
*) &Addr
, &AddrSize
);
111 ok_dec(AddrSize
, sizeof(Addr
));
112 ok_dec(Addr
.sin_addr
.s_addr
, Tests
[0].ExpectedAddr
.sin_addr
.s_addr
);
113 if (Tests
[0].ExpectedAddr
.sin_port
)
115 ok_dec(Addr
.sin_port
, Tests
[0].ExpectedAddr
.sin_port
);
119 ok(Addr
.sin_port
!= 0, "Port remained zero\n");
121 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[2].Addr
, sizeof(Tests
[2].Addr
));
122 ok_dec(Error
, SOCKET_ERROR
);
123 ok_dec(WSAGetLastError(), WSAEINVAL
);
126 /* Check disabled SO_BROADCAST and bind to broadcast address */
127 Socket
= socket(AF_INET
, Tests
[10].Type
, Tests
[10].Proto
);
128 Error
= setsockopt(Socket
, SOL_SOCKET
, SO_BROADCAST
, (const char *) &Broadcast
, sizeof(Broadcast
));
130 // FIXME: should be made properly broadcast address
131 Tests
[10].Addr
.sin_addr
.S_un
.S_un_b
.s_b4
= 0xff;
132 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[10].Addr
, sizeof(Tests
[10].Addr
));
133 ok_dec(Error
, SOCKET_ERROR
);
134 ok_dec(WSAGetLastError(), WSAEACCES
);
143 CHAR LocalHostName
[128];
144 struct hostent
*Hostent
;
147 struct sockaddr_in Addr
= { AF_INET
};
149 /* not yet initialized */
151 Error
= bind(INVALID_SOCKET
, NULL
, 0);
153 EndSeh(STATUS_SUCCESS
);
155 Error
= bind(INVALID_SOCKET
, InvalidPointer
, 0);
157 EndSeh(STATUS_SUCCESS
);
159 Error
= WSAStartup(MAKEWORD(2, 2), &WsaData
);
162 /* initialize LocalAddress for tests */
163 Error
= gethostname(LocalHostName
, sizeof(LocalHostName
));
165 ok_dec(WSAGetLastError(), 0);
166 trace("Local host name is '%s'\n", LocalHostName
);
167 Hostent
= gethostbyname(LocalHostName
);
168 ok(Hostent
!= NULL
, "gethostbyname failed with %d\n", WSAGetLastError());
169 if (Hostent
&& Hostent
->h_addr_list
[0] && Hostent
->h_length
== sizeof(IN_ADDR
))
171 memcpy(&Address
, Hostent
->h_addr_list
[0], sizeof(Address
));
172 strcpy(LocalAddress
, inet_ntoa(Address
));
174 trace("Local address is '%s'\n", LocalAddress
);
175 ok(LocalAddress
[0] != '\0',
176 "Could not determine local address. Following test results may be wrong.\n");
178 /* parameter tests */
180 Error
= bind(INVALID_SOCKET
, NULL
, 0);
181 ok_dec(Error
, SOCKET_ERROR
);
182 ok_dec(WSAGetLastError(), WSAENOTSOCK
);
183 EndSeh(STATUS_SUCCESS
);
185 Error
= bind(INVALID_SOCKET
, InvalidPointer
, 0);
186 ok_dec(Error
, SOCKET_ERROR
);
187 ok_dec(WSAGetLastError(), WSAENOTSOCK
);
188 EndSeh(STATUS_SUCCESS
);
190 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
191 Error
= bind(Socket
, NULL
, 0);
192 ok_dec(Error
, SOCKET_ERROR
);
193 ok_dec(WSAGetLastError(), WSAEFAULT
);
195 EndSeh(STATUS_SUCCESS
);
197 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
198 Error
= bind(Socket
, InvalidPointer
, 0);
199 ok_dec(Error
, SOCKET_ERROR
);
200 ok_dec(WSAGetLastError(), WSAEFAULT
);
202 EndSeh(STATUS_SUCCESS
);
204 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
205 Error
= bind(Socket
, NULL
, sizeof(Addr
));
206 ok_dec(Error
, SOCKET_ERROR
);
207 ok_dec(WSAGetLastError(), WSAEFAULT
);
209 EndSeh(STATUS_SUCCESS
);
211 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
212 Error
= bind(Socket
, InvalidPointer
, sizeof(Addr
));
213 ok_dec(Error
, SOCKET_ERROR
);
214 ok_dec(WSAGetLastError(), WSAEFAULT
);
216 EndSeh(STATUS_ACCESS_VIOLATION
);
218 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
219 Error
= bind(Socket
, (const struct sockaddr
*) &Addr
, 0);
220 ok_dec(Error
, SOCKET_ERROR
);
221 ok_dec(WSAGetLastError(), WSAEFAULT
);
223 EndSeh(STATUS_SUCCESS
);
225 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
226 Error
= bind(Socket
, (const struct sockaddr
*) &Addr
, sizeof(Addr
)-1);
227 ok_dec(Error
, SOCKET_ERROR
);
228 ok_dec(WSAGetLastError(), WSAEFAULT
);
230 EndSeh(STATUS_SUCCESS
);
233 /* TODO: test IPv6 */
235 Error
= WSACleanup();