[WS2_32_APITESTS] Add tests for WSAAsync original by Miroslav Mastný. Converted to...
[reactos.git] / rostests / apitests / ws2_32 / getservbyname.c
1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for getservbyname
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6 */
7
8 #include <apitest.h>
9
10 #define WIN32_NO_STATUS
11 #define _INC_WINDOWS
12 #define COM_NO_WINDOWS_H
13 #include <stdarg.h>
14 #include <windef.h>
15 #include <winbase.h>
16 #include <ws2tcpip.h>
17
18 START_TEST(getservbyname)
19 {
20 WSADATA WsaData;
21 struct servent *Serv;
22 const struct
23 {
24 PCSTR Name;
25 struct
26 {
27 PCSTR Proto;
28 int Port;
29 PCSTR Name;
30 PCSTR Aliases[5+1];
31 } Protos[3+1];
32 } Tests[] =
33 {
34 { "" },
35 { "xyzzy" },
36 { "http", { { "tcp", 80, "http", { "www", "www-http" } },
37 { "udp", 0 },
38 { "xyz", 0 } } },
39 { "smtp", { { "tcp", 25, "smtp", { "mail" } } } },
40 { "mail", { { "tcp", 25, "smtp", { "mail" } } } },
41 { "microsoft-ds", { { "tcp", 445, "microsoft-ds", },
42 { "udp", 445, "microsoft-ds", } } },
43 { "cmd", { { "tcp", 514, "cmd", { "shell" } },
44 { "udp", 0 } } },
45 { "syslog", { { "udp", 514, "syslog" },
46 { "tcp", 0 } } },
47 { "directplaysrvr", { { "tcp", 47624, "directplaysrvr" },
48 { "udp", 47624, "directplaysrvr" } } },
49 };
50 ULONG i, Proto, Alias;
51 int Error;
52 ULONG ExpectProto;
53
54 /* not yet initialized */
55 Serv = getservbyname(NULL, NULL);
56 Error = WSAGetLastError();
57 ok(Serv == NULL, "Serv = %p\n", Serv);
58 ok(Error == WSANOTINITIALISED, "Error = %d\n", Error);
59
60 Error = WSAStartup(MAKEWORD(2, 2), &WsaData);
61 ok_dec(Error, 0);
62
63 for (i = 0; i < RTL_NUMBER_OF(Tests); i++)
64 {
65 Proto = 0;
66 do
67 {
68 Serv = getservbyname(Tests[i].Name, Tests[i].Protos[Proto].Proto);
69 Error = WSAGetLastError();
70
71 /* For a NULL proto we expect the same as the first array entry */
72 ExpectProto = Proto;
73 if (Tests[i].Protos[Proto].Proto == NULL)
74 {
75 ExpectProto = 0;
76 }
77
78 if (Tests[i].Protos[ExpectProto].Port == 0)
79 {
80 ok(Serv == NULL, "[%s, %s] getservbyname succeeded unexpectedly\n",
81 Tests[i].Name, Tests[i].Protos[Proto].Proto);
82 ok(Error == WSANO_DATA, "[%s, %s] getservbyname returned error %d\n",
83 Tests[i].Name, Tests[i].Protos[Proto].Proto, Error);
84 continue;
85 }
86 else
87 {
88 ok(Serv != NULL, "[%s, %s] getservbyname failed with %d\n",
89 Tests[i].Name, Tests[i].Protos[Proto].Proto, Error);
90 }
91
92 if (Serv == NULL)
93 {
94 continue;
95 }
96
97 /* Check name */
98 ok(!strcmp(Serv->s_name, Tests[i].Protos[ExpectProto].Name),
99 "[%s, %s] s_name = '%s', expected '%s'\n",
100 Tests[i].Name, Tests[i].Protos[Proto].Proto, Serv->s_name, Tests[i].Protos[ExpectProto].Name);
101
102 /* Check aliases */
103 ok(Serv->s_aliases != NULL, "[%s, %s] s_aliases = NULL\n",
104 Tests[i].Name, Tests[i].Protos[Proto].Proto);
105 for (Alias = 0; Serv->s_aliases; Alias++)
106 {
107 if (Alias >= RTL_NUMBER_OF(Tests[i].Protos[ExpectProto].Aliases))
108 {
109 ok(0, "[%s, %s] Too many aliases\n",
110 Tests[i].Name, Tests[i].Protos[Proto].Proto);
111 break;
112 }
113 if (Serv->s_aliases[Alias] == NULL)
114 {
115 ok(Tests[i].Protos[ExpectProto].Aliases[Alias] == NULL,
116 "[%s, %s] getservbyname did not return expected alias '%s'\n",
117 Tests[i].Name, Tests[i].Protos[Proto].Proto, Tests[i].Protos[ExpectProto].Aliases[Alias]);
118 break;
119 }
120 if (Tests[i].Protos[ExpectProto].Aliases[Alias] == NULL)
121 {
122 ok(Serv->s_aliases[Alias] == NULL,
123 "[%s, %s] getservbyname returned additional alias '%s'\n",
124 Tests[i].Name, Tests[i].Protos[Proto].Proto, Serv->s_aliases[Alias]);
125 break;
126 }
127
128 ok(!strcmp(Serv->s_aliases[Alias], Tests[i].Protos[ExpectProto].Aliases[Alias]),
129 "[%s, %s] Got alias '%s', expected '%s'\n",
130 Tests[i].Name, Tests[i].Protos[Proto].Proto, Serv->s_aliases[Alias],Tests[i].Protos[ExpectProto].Aliases[Alias]);
131 }
132
133 /* Check port */
134 ok(ntohs(Serv->s_port) == Tests[i].Protos[ExpectProto].Port, "[%s, %s] s_port = %d\n",
135 Tests[i].Name, Tests[i].Protos[Proto].Proto, ntohs(Serv->s_port));
136
137 /* Check proto */
138 ok(!strcmp(Serv->s_proto, Tests[i].Protos[ExpectProto].Proto), "[%s, %s] s_proto = '%s', expected '%s'\n",
139 Tests[i].Name, Tests[i].Protos[Proto].Proto, Serv->s_proto, Tests[i].Protos[ExpectProto].Proto);
140 /* We want to include one NULL past the last proto in the array */
141 } while (Tests[i].Protos[Proto++].Proto != NULL);
142 }
143
144 Error = WSACleanup();
145 ok_dec(Error, 0);
146 }