2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for getaddrinfo
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
10 #define ok_addrinfo(ai, flags, family, socktype, protocol, addrlen) do \
12 ok_hex((ai)->ai_flags, flags); \
13 ok_dec((ai)->ai_family, family); \
14 ok_dec((ai)->ai_socktype, socktype); \
15 ok_dec((ai)->ai_protocol, protocol); \
16 ok_dec((ai)->ai_addrlen, addrlen); \
19 #define ok_sockaddr_in(sockaddr, family, port, addr) do \
22 ok_dec(((SOCKADDR_IN *)(sockaddr))->sin_family, family); \
23 ok_dec(ntohs(((SOCKADDR_IN *)(sockaddr))->sin_port), port); \
24 ok_hex(((SOCKADDR_IN *)(sockaddr))->sin_addr.S_un.S_addr, \
26 for (_i = 0; _i < 7; _i++) \
27 ok_dec(((SOCKADDR_IN *)(sockaddr))->sin_zero[_i], 0); \
30 CHAR LocalAddress
[sizeof("255.255.255.255")];
42 PCSTR ExpectedAddress
;
48 { "doesntexist.example.com", NULL
},
49 { "localhost", "127.0.0.1" },
50 { "localhost:80", NULL
},
51 { "7.8.9.10", "7.8.9.10", AI_NUMERICHOST
},
52 { "0.0.0.0", "0.0.0.0", AI_NUMERICHOST
},
53 { "255.255.255.255", "255.255.255.255", AI_NUMERICHOST
},
54 { "0.0.0.0 ", "0.0.0.0", /* no AI_NUMERICHOST */ },
55 { "0.0.0.0:80", NULL
},
56 { "0.0.0.0.0", NULL
},
57 { "1.1.1.256", NULL
},
59 { "1.2.3.0x4", "1.2.3.4", AI_NUMERICHOST
},
60 { "1.2.3.010", "1.2.3.8", AI_NUMERICHOST
},
61 /* let's just assume this one doesn't change any time soon ;) */
62 { "google-public-dns-a.google.com", "8.8.8.8" },
64 const INT TestCount
= sizeof(Tests
) / sizeof(Tests
[0]);
67 /* make sure we don't get IPv6 responses */
68 ZeroMemory(&Hints
, sizeof(Hints
));
69 Hints
.ai_family
= AF_INET
;
72 for (i
= 0; i
< TestCount
; i
++)
74 trace("%d: '%s'\n", i
, Tests
[i
].NodeName
);
76 AddrInfo
= InvalidPointer
;
77 Error
= getaddrinfo(Tests
[i
].NodeName
, NULL
, &Hints
, &AddrInfo
);
78 if (Tests
[i
].ExpectedAddress
)
81 ok_dec(WSAGetLastError(), 0);
82 ok(AddrInfo
!= NULL
&& AddrInfo
!= InvalidPointer
,
83 "AddrInfo = %p\n", AddrInfo
);
87 ok_dec(Error
, WSAHOST_NOT_FOUND
);
88 ok_dec(WSAGetLastError(), WSAHOST_NOT_FOUND
);
89 ok_ptr(AddrInfo
, NULL
);
91 if (!Error
&& AddrInfo
&& AddrInfo
!= InvalidPointer
)
93 ok_addrinfo(AddrInfo
, Tests
[i
].Flags
, AF_INET
,
94 0, 0, sizeof(SOCKADDR_IN
));
95 ok_ptr(AddrInfo
->ai_canonname
, NULL
);
96 ok_sockaddr_in(AddrInfo
->ai_addr
, AF_INET
,
97 0, Tests
[i
].ExpectedAddress
);
98 ok_ptr(AddrInfo
->ai_next
, NULL
);
99 freeaddrinfo(AddrInfo
);
101 EndSeh(STATUS_SUCCESS
);
107 TestServiceName(VOID
)
125 { "http", 80, SOCK_STREAM
},
126 { "smtp", 25, SOCK_STREAM
},
127 { "mail", 25, SOCK_STREAM
}, /* alias for smtp */
128 { "router", 520, SOCK_DGRAM
},
129 { "domain", 53, 0 /* DNS supports both UDP and TCP */ },
141 { "4294967295", 65535 },
142 { "4294967296", 65535 },
143 { "9999999999", 65535 },
144 { "999999999999999999999999999999999999", 65535 },
156 const INT TestCount
= sizeof(Tests
) / sizeof(Tests
[0]);
159 /* make sure we don't get IPv6 responses */
160 ZeroMemory(&Hints
, sizeof(Hints
));
161 Hints
.ai_family
= AF_INET
;
164 for (i
= 0; i
< TestCount
; i
++)
166 trace("%d: '%s'\n", i
, Tests
[i
].ServiceName
);
168 AddrInfo
= InvalidPointer
;
169 Error
= getaddrinfo(NULL
, Tests
[i
].ServiceName
, &Hints
, &AddrInfo
);
170 if (Tests
[i
].ExpectedPort
!= -1)
173 ok_dec(WSAGetLastError(), 0);
174 ok(AddrInfo
!= NULL
&& AddrInfo
!= InvalidPointer
,
175 "AddrInfo = %p\n", AddrInfo
);
179 ok_dec(Error
, WSATYPE_NOT_FOUND
);
180 ok_dec(WSAGetLastError(), WSATYPE_NOT_FOUND
);
181 ok_ptr(AddrInfo
, NULL
);
183 if (!Error
&& AddrInfo
&& AddrInfo
!= InvalidPointer
)
185 ok_addrinfo(AddrInfo
, 0, AF_INET
,
186 Tests
[i
].SockType
, 0, sizeof(SOCKADDR_IN
));
187 ok_ptr(AddrInfo
->ai_canonname
, NULL
);
188 ok_sockaddr_in(AddrInfo
->ai_addr
, AF_INET
,
189 Tests
[i
].ExpectedPort
, "127.0.0.1");
190 ok_ptr(AddrInfo
->ai_next
, NULL
);
191 freeaddrinfo(AddrInfo
);
193 EndSeh(STATUS_SUCCESS
);
197 START_TEST(getaddrinfo
)
203 CHAR LocalHostName
[128];
204 struct hostent
*Hostent
;
206 /* not yet initialized */
208 Error
= getaddrinfo(NULL
, NULL
, NULL
, NULL
);
209 ok_dec(Error
, WSANOTINITIALISED
);
210 EndSeh(STATUS_SUCCESS
);
212 AddrInfo
= InvalidPointer
;
213 Error
= getaddrinfo(NULL
, NULL
, NULL
, &AddrInfo
);
214 ok_dec(Error
, WSANOTINITIALISED
);
215 ok_ptr(AddrInfo
, InvalidPointer
);
216 EndSeh(STATUS_SUCCESS
);
218 Error
= getaddrinfo("127.0.0.1", "80", NULL
, &AddrInfo
);
219 ok_dec(Error
, WSANOTINITIALISED
);
221 Error
= WSAStartup(MAKEWORD(2, 2), &WsaData
);
224 /* initialize LocalAddress for tests */
225 Error
= gethostname(LocalHostName
, sizeof(LocalHostName
));
227 ok_dec(WSAGetLastError(), 0);
228 trace("Local host name is '%s'\n", LocalHostName
);
229 Hostent
= gethostbyname(LocalHostName
);
230 ok(Hostent
!= NULL
, "gethostbyname failed with %d\n", WSAGetLastError());
231 if (Hostent
&& Hostent
->h_addr_list
[0] && Hostent
->h_length
== sizeof(IN_ADDR
))
234 memcpy(&Address
, Hostent
->h_addr_list
[0], sizeof(Address
));
235 strcpy(LocalAddress
, inet_ntoa(Address
));
237 trace("Local address is '%s'\n", LocalAddress
);
238 ok(LocalAddress
[0] != '\0',
239 "Could not determine local address. Following test results may be wrong.\n");
241 ZeroMemory(&Hints
, sizeof(Hints
));
242 /* parameter tests */
243 StartSeh() getaddrinfo(NULL
, NULL
, NULL
, NULL
); EndSeh(STATUS_ACCESS_VIOLATION
);
244 StartSeh() getaddrinfo("", "", &Hints
, NULL
); EndSeh(STATUS_ACCESS_VIOLATION
);
246 AddrInfo
= InvalidPointer
;
247 Error
= getaddrinfo(NULL
, NULL
, NULL
, &AddrInfo
);
248 ok_dec(Error
, WSAHOST_NOT_FOUND
);
249 ok_dec(WSAGetLastError(), WSAHOST_NOT_FOUND
);
250 ok_ptr(AddrInfo
, NULL
);
251 EndSeh(STATUS_SUCCESS
);
255 /* TODO: test passing both node name and service name */
256 /* TODO: test hints */
257 /* TODO: test IPv6 */
259 Error
= WSACleanup();
262 /* not initialized anymore */
263 Error
= getaddrinfo("127.0.0.1", "80", NULL
, &AddrInfo
);
264 ok_dec(Error
, WSANOTINITIALISED
);