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 with error %d for test %d, skipping\n", WSAGetLastError(), i
);
71 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[i
].Addr
, sizeof(Tests
[i
].Addr
));
72 ok(Error
== Tests
[i
].ExpectedResult
, "Error %d differs from expected %d for test %d\n", Error
, Tests
[i
].ExpectedResult
, i
);
75 ok(WSAGetLastError() == Tests
[i
].ExpectedWSAResult
, "Error %d differs from expected %d for test %d\n", WSAGetLastError(), Tests
[i
].ExpectedWSAResult
, i
);
79 ok(WSAGetLastError() == 0, "Unexpected error %d on bind for test %d\n", WSAGetLastError(), i
);
80 AddrSize
= sizeof(Addr
);
81 Error
= getsockname(Socket
, (struct sockaddr
*) &Addr
, &AddrSize
);
82 ok(Error
== 0, "Unexpected error %d on getsockname for test %d\n", Error
, i
);
83 ok(WSAGetLastError() == 0, "Unexpected error %d on getsockname for test %d\n", WSAGetLastError(), i
);
84 ok(AddrSize
== sizeof(Addr
), "Returned size %d differs from expected %d for test %d\n", AddrSize
, sizeof(Addr
), i
);
85 ok(Addr
.sin_addr
.s_addr
== Tests
[i
].ExpectedAddr
.sin_addr
.s_addr
, "Expected address %lx differs from returned address %lx for test %d\n", Tests
[i
].ExpectedAddr
.sin_addr
.s_addr
, Addr
.sin_addr
.s_addr
, i
);
86 if (Tests
[i
].ExpectedAddr
.sin_port
)
88 ok(Addr
.sin_port
== Tests
[i
].ExpectedAddr
.sin_port
, "Returned port %d differs from expected %d for test %d\n", Addr
.sin_port
, Tests
[i
].ExpectedAddr
.sin_port
, i
);
92 ok(Addr
.sin_port
!= 0, "Port remained zero for test %d\n", i
);
95 Error
= closesocket(Socket
);
96 ok(Error
== 0, "Unexpected error %d on closesocket for test %d\n", Error
, i
);
97 ok(WSAGetLastError() == 0, "Unexpected error %d on closesocket for test %d\n", WSAGetLastError(), i
);
100 /* Check double bind */
101 Socket
= socket(AF_INET
, Tests
[0].Type
, Tests
[0].Proto
);
102 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[0].Addr
, sizeof(Tests
[0].Addr
));
103 ok_dec(Error
, Tests
[0].ExpectedResult
);
106 ok_dec(WSAGetLastError(), Tests
[0].ExpectedWSAResult
);
110 ok_dec(WSAGetLastError(), 0);
111 Error
= getsockname(Socket
, (struct sockaddr
*) &Addr
, &AddrSize
);
113 ok_dec(AddrSize
, sizeof(Addr
));
114 ok_dec(Addr
.sin_addr
.s_addr
, Tests
[0].ExpectedAddr
.sin_addr
.s_addr
);
115 if (Tests
[0].ExpectedAddr
.sin_port
)
117 ok_dec(Addr
.sin_port
, Tests
[0].ExpectedAddr
.sin_port
);
121 ok(Addr
.sin_port
!= 0, "Port remained zero\n");
123 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[2].Addr
, sizeof(Tests
[2].Addr
));
124 ok_dec(Error
, SOCKET_ERROR
);
125 ok_dec(WSAGetLastError(), WSAEINVAL
);
128 /* Check disabled SO_BROADCAST and bind to broadcast address */
129 Socket
= socket(AF_INET
, Tests
[10].Type
, Tests
[10].Proto
);
130 Error
= setsockopt(Socket
, SOL_SOCKET
, SO_BROADCAST
, (const char *) &Broadcast
, sizeof(Broadcast
));
132 // FIXME: should be made properly broadcast address
133 Tests
[10].Addr
.sin_addr
.S_un
.S_un_b
.s_b4
= 0xff;
134 Error
= bind(Socket
, (const struct sockaddr
*) &Tests
[10].Addr
, sizeof(Tests
[10].Addr
));
135 ok_dec(Error
, SOCKET_ERROR
);
136 ok_dec(WSAGetLastError(), WSAEACCES
);
145 CHAR LocalHostName
[128];
146 struct hostent
*Hostent
;
149 struct sockaddr_in Addr
= { AF_INET
};
151 /* not yet initialized */
153 Error
= bind(INVALID_SOCKET
, NULL
, 0);
155 EndSeh(STATUS_SUCCESS
);
157 Error
= bind(INVALID_SOCKET
, InvalidPointer
, 0);
159 EndSeh(STATUS_SUCCESS
);
161 Error
= WSAStartup(MAKEWORD(2, 2), &WsaData
);
164 /* initialize LocalAddress for tests */
165 Error
= gethostname(LocalHostName
, sizeof(LocalHostName
));
167 ok_dec(WSAGetLastError(), 0);
168 trace("Local host name is '%s'\n", LocalHostName
);
169 Hostent
= gethostbyname(LocalHostName
);
170 ok(Hostent
!= NULL
, "gethostbyname failed with %d\n", WSAGetLastError());
171 if (Hostent
&& Hostent
->h_addr_list
[0] && Hostent
->h_length
== sizeof(IN_ADDR
))
173 memcpy(&Address
, Hostent
->h_addr_list
[0], sizeof(Address
));
174 strcpy(LocalAddress
, inet_ntoa(Address
));
176 trace("Local address is '%s'\n", LocalAddress
);
177 ok(LocalAddress
[0] != '\0',
178 "Could not determine local address. Following test results may be wrong.\n");
180 /* parameter tests */
182 Error
= bind(INVALID_SOCKET
, NULL
, 0);
183 ok_dec(Error
, SOCKET_ERROR
);
184 ok_dec(WSAGetLastError(), WSAENOTSOCK
);
185 EndSeh(STATUS_SUCCESS
);
187 Error
= bind(INVALID_SOCKET
, InvalidPointer
, 0);
188 ok_dec(Error
, SOCKET_ERROR
);
189 ok_dec(WSAGetLastError(), WSAENOTSOCK
);
190 EndSeh(STATUS_SUCCESS
);
192 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
193 Error
= bind(Socket
, NULL
, 0);
194 ok_dec(Error
, SOCKET_ERROR
);
195 ok_dec(WSAGetLastError(), WSAEFAULT
);
197 EndSeh(STATUS_SUCCESS
);
199 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
200 Error
= bind(Socket
, InvalidPointer
, 0);
201 ok_dec(Error
, SOCKET_ERROR
);
202 ok_dec(WSAGetLastError(), WSAEFAULT
);
204 EndSeh(STATUS_SUCCESS
);
206 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
207 Error
= bind(Socket
, NULL
, sizeof(Addr
));
208 ok_dec(Error
, SOCKET_ERROR
);
209 ok_dec(WSAGetLastError(), WSAEFAULT
);
211 EndSeh(STATUS_SUCCESS
);
213 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
214 Error
= bind(Socket
, InvalidPointer
, sizeof(Addr
));
215 ok_dec(Error
, SOCKET_ERROR
);
216 ok_dec(WSAGetLastError(), WSAEFAULT
);
218 EndSeh(STATUS_ACCESS_VIOLATION
);
220 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
221 Error
= bind(Socket
, (const struct sockaddr
*) &Addr
, 0);
222 ok_dec(Error
, SOCKET_ERROR
);
223 ok_dec(WSAGetLastError(), WSAEFAULT
);
225 EndSeh(STATUS_SUCCESS
);
227 Socket
= socket(AF_INET
, SOCK_STREAM
, IPPROTO_TCP
);
228 Error
= bind(Socket
, (const struct sockaddr
*) &Addr
, sizeof(Addr
)-1);
229 ok_dec(Error
, SOCKET_ERROR
);
230 ok_dec(WSAGetLastError(), WSAEFAULT
);
232 EndSeh(STATUS_SUCCESS
);
235 /* TODO: test IPv6 */
237 Error
= WSACleanup();