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