26f41be59f9f901c82c05350fea6772500c689e5
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for getaddrinfo
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
8 #define WIN32_NO_STATUS
11 #include <wine/test.h>
12 #include <pseh/pseh2.h>
13 #include <ndk/umtypes.h>
15 #define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
16 #define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok(ExceptionStatus == ExpectedStatus, "Exception %lx, expected %lx\n", ExceptionStatus, ExpectedStatus)
18 #define ok_addrinfo(ai, flags, family, socktype, protocol, addrlen) do \
20 ok_hex((ai)->ai_flags, flags); \
21 ok_dec((ai)->ai_family, family); \
22 ok_dec((ai)->ai_socktype, socktype); \
23 ok_dec((ai)->ai_protocol, protocol); \
24 ok_dec((ai)->ai_addrlen, addrlen); \
27 #define ok_sockaddr_in(sockaddr, family, port, addr) do \
30 ok_dec(((SOCKADDR_IN *)(sockaddr))->sin_family, family); \
31 ok_dec(ntohs(((SOCKADDR_IN *)(sockaddr))->sin_port), port); \
32 ok_hex(((SOCKADDR_IN *)(sockaddr))->sin_addr.S_un.S_addr, \
34 for (_i = 0; _i < 7; _i++) \
35 ok_dec(((SOCKADDR_IN *)(sockaddr))->sin_zero[_i], 0); \
38 #define InvalidPointer ((PVOID)0x5555555555555555ULL)
40 CHAR LocalAddress
[sizeof("255.255.255.255")];
49 NTSTATUS ExceptionStatus
;
53 PCSTR ExpectedAddress
;
59 { "doesntexist.reactos.org", NULL
},
60 { "localhost", "127.0.0.1" },
61 { "localhost:80", NULL
},
62 { "7.8.9.10", "7.8.9.10", AI_NUMERICHOST
},
63 { "0.0.0.0", "0.0.0.0", AI_NUMERICHOST
},
64 { "255.255.255.255", "255.255.255.255", AI_NUMERICHOST
},
65 { "0.0.0.0 ", "0.0.0.0", /* no AI_NUMERICHOST */ },
66 { "0.0.0.0:80", NULL
},
67 { "0.0.0.0.0", NULL
},
68 { "1.1.1.256", NULL
},
69 /* let's just assume this one doesn't change any time soon ;) */
70 { "google-public-dns-a.google.com", "8.8.8.8" },
72 const INT TestCount
= sizeof(Tests
) / sizeof(Tests
[0]);
75 /* make sure we don't get IPv6 responses */
76 ZeroMemory(&Hints
, sizeof(Hints
));
77 Hints
.ai_family
= AF_INET
;
80 for (i
= 0; i
< TestCount
; i
++)
82 trace("%d: '%s'\n", i
, Tests
[i
].NodeName
);
84 AddrInfo
= InvalidPointer
;
85 Error
= getaddrinfo(Tests
[i
].NodeName
, NULL
, &Hints
, &AddrInfo
);
86 if (Tests
[i
].ExpectedAddress
)
89 ok_dec(WSAGetLastError(), 0);
90 ok(AddrInfo
!= NULL
&& AddrInfo
!= InvalidPointer
,
91 "AddrInfo = %p\n", AddrInfo
);
95 ok_dec(Error
, WSAHOST_NOT_FOUND
);
96 ok_dec(WSAGetLastError(), WSAHOST_NOT_FOUND
);
97 ok_ptr(AddrInfo
, NULL
);
99 if (!Error
&& AddrInfo
&& AddrInfo
!= InvalidPointer
)
101 ok_addrinfo(AddrInfo
, Tests
[i
].Flags
, AF_INET
,
102 0, 0, sizeof(SOCKADDR_IN
));
103 ok_ptr(AddrInfo
->ai_canonname
, NULL
);
104 ok_sockaddr_in(AddrInfo
->ai_addr
, AF_INET
,
105 0, Tests
[i
].ExpectedAddress
);
106 ok_ptr(AddrInfo
->ai_next
, NULL
);
107 freeaddrinfo(AddrInfo
);
109 EndSeh(STATUS_SUCCESS
);
115 TestServiceName(VOID
)
120 NTSTATUS ExceptionStatus
;
134 { "http", 80, SOCK_STREAM
},
135 { "smtp", 25, SOCK_STREAM
},
136 { "mail", 25, SOCK_STREAM
}, /* alias for smtp */
137 { "router", 520, SOCK_DGRAM
},
138 { "domain", 53, 0 /* DNS supports both UDP and TCP */ },
150 { "4294967295", 65535 },
151 { "4294967296", 65535 },
152 { "9999999999", 65535 },
153 { "999999999999999999999999999999999999", 65535 },
165 const INT TestCount
= sizeof(Tests
) / sizeof(Tests
[0]);
168 /* make sure we don't get IPv6 responses */
169 ZeroMemory(&Hints
, sizeof(Hints
));
170 Hints
.ai_family
= AF_INET
;
173 for (i
= 0; i
< TestCount
; i
++)
175 trace("%d: '%s'\n", i
, Tests
[i
].ServiceName
);
177 AddrInfo
= InvalidPointer
;
178 Error
= getaddrinfo(NULL
, Tests
[i
].ServiceName
, &Hints
, &AddrInfo
);
179 if (Tests
[i
].ExpectedPort
!= -1)
182 ok_dec(WSAGetLastError(), 0);
183 ok(AddrInfo
!= NULL
&& AddrInfo
!= InvalidPointer
,
184 "AddrInfo = %p\n", AddrInfo
);
188 ok_dec(Error
, WSATYPE_NOT_FOUND
);
189 ok_dec(WSAGetLastError(), WSATYPE_NOT_FOUND
);
190 ok_ptr(AddrInfo
, NULL
);
192 if (!Error
&& AddrInfo
&& AddrInfo
!= InvalidPointer
)
194 ok_addrinfo(AddrInfo
, 0, AF_INET
,
195 Tests
[i
].SockType
, 0, sizeof(SOCKADDR_IN
));
196 ok_ptr(AddrInfo
->ai_canonname
, NULL
);
197 ok_sockaddr_in(AddrInfo
->ai_addr
, AF_INET
,
198 Tests
[i
].ExpectedPort
, "127.0.0.1");
199 ok_ptr(AddrInfo
->ai_next
, NULL
);
200 freeaddrinfo(AddrInfo
);
202 EndSeh(STATUS_SUCCESS
);
206 START_TEST(getaddrinfo
)
212 NTSTATUS ExceptionStatus
;
213 CHAR LocalHostName
[128];
214 struct hostent
*Hostent
;
216 /* not yet initialized */
217 Error
= getaddrinfo("127.0.0.1", "80", NULL
, &AddrInfo
);
218 ok_dec(Error
, WSANOTINITIALISED
);
220 Error
= WSAStartup(MAKEWORD(2, 2), &WsaData
);
223 /* initialize LocalAddress for tests */
224 Error
= gethostname(LocalHostName
, sizeof(LocalHostName
));
226 ok_dec(WSAGetLastError(), 0);
227 trace("Local host name is '%s'\n", LocalHostName
);
228 Hostent
= gethostbyname(LocalHostName
);
229 ok(Hostent
!= NULL
, "gethostbyname failed with %d\n", WSAGetLastError());
230 if (Hostent
&& Hostent
->h_addr_list
[0] && Hostent
->h_length
== sizeof(IN_ADDR
))
233 memcpy(&Address
, Hostent
->h_addr_list
[0], sizeof(Address
));
234 strcpy(LocalAddress
, inet_ntoa(Address
));
236 trace("Local address is '%s'\n", LocalAddress
);
237 ok(LocalAddress
[0] != '\0',
238 "Could not determine local address. Following test results may be wrong.\n");
240 ZeroMemory(&Hints
, sizeof(Hints
));
241 /* parameter tests */
242 StartSeh(); getaddrinfo(NULL
, NULL
, NULL
, NULL
); EndSeh(STATUS_ACCESS_VIOLATION
);
243 StartSeh(); getaddrinfo("", "", &Hints
, NULL
); EndSeh(STATUS_ACCESS_VIOLATION
);
245 AddrInfo
= InvalidPointer
;
246 Error
= getaddrinfo(NULL
, NULL
, NULL
, &AddrInfo
);
247 ok_dec(Error
, WSAHOST_NOT_FOUND
);
248 ok_dec(WSAGetLastError(), WSAHOST_NOT_FOUND
);
249 ok_ptr(AddrInfo
, NULL
);
250 EndSeh(STATUS_SUCCESS
);
254 /* TODO: test passing both node name and service name */
255 /* TODO: test hints */
256 /* TODO: test IPv6 */
258 Error
= WSACleanup();
261 /* not initialized anymore */
262 Error
= getaddrinfo("127.0.0.1", "80", NULL
, &AddrInfo
);
263 ok_dec(Error
, WSANOTINITIALISED
);