[ROSTESTS]
[reactos.git] / rostests / apitests / iphlpapi / GetNetworkParams.c
1 /*
2 * PROJECT: ReactOS API Tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Tests for GetNetworkParams function
5 * PROGRAMMERS: Peter Hater
6 */
7
8 #include <apitest.h>
9
10 #define WIN32_NO_STATUS
11 #include <iphlpapi.h>
12 #include <winreg.h>
13
14 #define ROSTESTDHCPHOST "testdhcproshost"
15 #define ROSTESTDHCPDOMAIN "testrosdomain"
16
17 static
18 INT
19 ReadRegistryValue(PCHAR ValueName, PCHAR Value)
20 {
21 INT ErrorCode;
22 HKEY ParametersKey;
23 DWORD RegType;
24 DWORD RegSize = 0;
25
26 /* Open the database path key */
27 ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
28 "System\\CurrentControlSet\\Services\\Tcpip\\Parameters",
29 0,
30 KEY_READ,
31 &ParametersKey);
32 if (ErrorCode == NO_ERROR)
33 {
34 /* Read the actual path */
35 ErrorCode = RegQueryValueExA(ParametersKey,
36 ValueName,
37 NULL,
38 &RegType,
39 NULL,
40 &RegSize);
41 if (RegSize)
42 {
43 /* Read the actual path */
44 ErrorCode = RegQueryValueExA(ParametersKey,
45 ValueName,
46 NULL,
47 &RegType,
48 (LPBYTE)Value,
49 &RegSize);
50 }
51
52 /* Close the key */
53 RegCloseKey(ParametersKey);
54 }
55 return ErrorCode;
56 }
57
58 static
59 INT
60 WriteRegistryValue(PCHAR ValueName, PCHAR Value)
61 {
62 INT ErrorCode;
63 HKEY ParametersKey;
64
65 /* Open the database path key */
66 ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
67 "System\\CurrentControlSet\\Services\\Tcpip\\Parameters",
68 0,
69 KEY_WRITE,
70 &ParametersKey);
71 if (ErrorCode == NO_ERROR)
72 {
73 /* Read the actual path */
74 ErrorCode = RegSetValueExA(ParametersKey,
75 ValueName,
76 0,
77 REG_SZ,
78 (LPBYTE)Value,
79 strlen(Value) + 1);
80
81 /* Close the key */
82 RegCloseKey(ParametersKey);
83 }
84 return ErrorCode;
85 }
86
87 static
88 INT
89 DeleteRegistryValue(PCHAR ValueName)
90 {
91 INT ErrorCode;
92 HKEY ParametersKey;
93
94 /* Open the database path key */
95 ErrorCode = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
96 "System\\CurrentControlSet\\Services\\Tcpip\\Parameters",
97 0,
98 KEY_WRITE,
99 &ParametersKey);
100 if (ErrorCode == NO_ERROR)
101 {
102 /* Read the actual path */
103 ErrorCode = RegDeleteValueA(ParametersKey, ValueName);
104
105 /* Close the key */
106 RegCloseKey(ParametersKey);
107 }
108 return ErrorCode;
109 }
110
111 static
112 VOID
113 test_GetNetworkParams(VOID)
114 {
115 DWORD len = 0;
116 INT ErrorCode;
117 CHAR OrigHostname[128];
118 CHAR OrigDomainName[128];
119 CHAR OrigDhcpHostname[128];
120 CHAR OrigDhcpDomainName[128];
121 BOOL OrigHostnameExists;
122 BOOL OrigDomainNameExists;
123 BOOL OrigDhcpHostnameExists;
124 BOOL OrigDhcpDomainNameExists;
125 PFIXED_INFO FixedInfo;
126 DWORD ApiReturn;
127
128 memset(OrigHostname, 0, sizeof(OrigHostname));
129 memset(OrigDomainName, 0, sizeof(OrigDomainName));
130 memset(OrigDhcpHostname, 0, sizeof(OrigDhcpHostname));
131 memset(OrigDhcpDomainName, 0, sizeof(OrigDhcpDomainName));
132 /* read current registry values */
133 ErrorCode = ReadRegistryValue("Hostname", OrigHostname);
134 ok(ErrorCode == ERROR_SUCCESS, "Failed to read registry key Hostname %d\n", ErrorCode);
135 OrigHostnameExists = ErrorCode == NO_ERROR;
136 ErrorCode = ReadRegistryValue("Domain", OrigDomainName);
137 ok(ErrorCode == ERROR_SUCCESS || ErrorCode == ERROR_FILE_NOT_FOUND, "Failed to read registry key DomainName %d\n", ErrorCode);
138 OrigDomainNameExists = ErrorCode == NO_ERROR;
139 ErrorCode = ReadRegistryValue("DhcpHostname", OrigDhcpHostname);
140 ok(ErrorCode == ERROR_SUCCESS || ErrorCode == ERROR_FILE_NOT_FOUND, "Failed to read registry key DhcpHostname %d\n", ErrorCode);
141 OrigDhcpHostnameExists = ErrorCode == NO_ERROR;
142 ErrorCode = ReadRegistryValue("DhcpDomain", OrigDhcpDomainName);
143 ok(ErrorCode == ERROR_SUCCESS || ErrorCode == ERROR_FILE_NOT_FOUND, "Failed to read registry key DhcpDomainName %d\n", ErrorCode);
144 OrigDhcpDomainNameExists = ErrorCode == NO_ERROR;
145
146 trace("Starting values:\n");
147 trace("Hostname: %s, exists %s\n", OrigHostname, OrigHostnameExists ? "yes" : "no");
148 trace("Domain: %s, exists %s\n", OrigDomainName, OrigDomainNameExists ? "yes" : "no");
149 trace("DhcpHostname: %s, exists %s\n", OrigDhcpHostnameExists ? OrigDhcpHostname : "", OrigDhcpHostnameExists ? "yes" : "no");
150 trace("DhcpDomain: %s, exists %s\n", OrigDhcpDomainNameExists ? OrigDhcpDomainName : "", OrigDhcpDomainNameExists ? "yes" : "no");
151
152 ApiReturn = GetNetworkParams(NULL, &len);
153 ok(ApiReturn == ERROR_BUFFER_OVERFLOW,
154 "GetNetworkParams returned %ld, expected ERROR_BUFFER_OVERFLOW\n",
155 ApiReturn);
156 if (ApiReturn != ERROR_BUFFER_OVERFLOW)
157 skip("Can't determine size of FIXED_INFO. Can't proceed\n");
158 FixedInfo = HeapAlloc(GetProcessHeap(), 0, len);
159 if (FixedInfo == NULL)
160 skip("FixedInfo is NULL. Can't proceed\n");
161
162 ApiReturn = GetNetworkParams(FixedInfo, &len);
163 ok(ApiReturn == NO_ERROR,
164 "GetNetworkParams(buf, &dwSize) returned %ld, expected NO_ERROR\n",
165 ApiReturn);
166 if (ApiReturn != NO_ERROR)
167 {
168 HeapFree(GetProcessHeap(), 0, FixedInfo);
169 skip("GetNetworkParams failed. Can't proceed\n");
170 }
171 ok(FixedInfo->HostName != NULL, "FixedInfo->HostName is NULL\n");
172 if (FixedInfo->HostName == NULL)
173 {
174 HeapFree(GetProcessHeap(), 0, FixedInfo);
175 skip("FixedInfo->HostName is NULL. Can't proceed\n");
176 }
177 if (OrigDhcpHostnameExists)
178 {
179 /* Windows doesn't honor DHCP option 12 even if RFC requires it if it is returned by DHCP server! */
180 //ok(strcmp(FixedInfo->HostName, OrigDhcpHostname) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, OrigDhcpHostname);
181 }
182 else
183 ok(strcmp(FixedInfo->HostName, OrigHostname) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, OrigHostname);
184 ok(FixedInfo->DomainName != NULL, "FixedInfo->DomainName is NULL\n");
185 if (FixedInfo->DomainName == NULL)
186 {
187 HeapFree(GetProcessHeap(), 0, FixedInfo);
188 skip("FixedInfo->DomainName is NULL. Can't proceed\n");
189 }
190 if(OrigDhcpDomainNameExists)
191 ok(strcmp(FixedInfo->DomainName, OrigDhcpDomainName) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, OrigDhcpDomainName);
192 else
193 ok(strcmp(FixedInfo->DomainName, OrigDomainName) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, OrigDomainName);
194 if (!OrigDhcpHostnameExists)
195 {
196 ErrorCode = WriteRegistryValue("DhcpHostname", ROSTESTDHCPHOST);
197 ok(ErrorCode == NO_ERROR, "Failed to write registry key DhcpHostname %d\n", ErrorCode);
198 }
199 else
200 {
201 ErrorCode = DeleteRegistryValue("DhcpHostname");
202 ok(ErrorCode == NO_ERROR, "Failed to remove registry key DhcpHostname %d\n", ErrorCode);
203 }
204 if (!OrigDhcpDomainNameExists)
205 {
206 ErrorCode = WriteRegistryValue("DhcpDomain", ROSTESTDHCPDOMAIN);
207 ok(ErrorCode == NO_ERROR, "Failed to write registry key DhcpDomainName %d\n", ErrorCode);
208 }
209 else
210 {
211 ErrorCode = DeleteRegistryValue("DhcpDomain");
212 ok(ErrorCode == NO_ERROR, "Failed to remove registry key DhcpDomainName %d\n", ErrorCode);
213 }
214
215 HeapFree(GetProcessHeap(), 0, FixedInfo);
216 len = 0;
217 ApiReturn = GetNetworkParams(NULL, &len);
218 ok(ApiReturn == ERROR_BUFFER_OVERFLOW,
219 "GetNetworkParams returned %ld, expected ERROR_BUFFER_OVERFLOW\n",
220 ApiReturn);
221 if (ApiReturn != ERROR_BUFFER_OVERFLOW)
222 skip("Can't determine size of FIXED_INFO. Can't proceed\n");
223 FixedInfo = HeapAlloc(GetProcessHeap(), 0, len);
224 if (FixedInfo == NULL)
225 skip("FixedInfo is NULL. Can't proceed\n");
226 ApiReturn = GetNetworkParams(FixedInfo, &len);
227 ok(ApiReturn == NO_ERROR,
228 "GetNetworkParams(buf, &dwSize) returned %ld, expected NO_ERROR\n",
229 ApiReturn);
230 if (ApiReturn != NO_ERROR)
231 {
232 HeapFree(GetProcessHeap(), 0, FixedInfo);
233 skip("GetNetworkParams failed. Can't proceed\n");
234 }
235
236 /* restore registry values */
237 if (OrigDhcpHostnameExists)
238 ErrorCode = WriteRegistryValue("DhcpHostname", OrigDhcpHostname);
239 else
240 ErrorCode = DeleteRegistryValue("DhcpHostname");
241 ok(ErrorCode == NO_ERROR, "Failed to restore registry key DhcpHostname %d\n", ErrorCode);
242 if (OrigDhcpDomainNameExists)
243 ErrorCode = WriteRegistryValue("DhcpDomain", OrigDhcpDomainName);
244 else
245 ErrorCode = DeleteRegistryValue("DhcpDomain");
246 ok(ErrorCode == NO_ERROR, "Failed to restore registry key DhcpDomainName %d\n", ErrorCode);
247
248 ok(ApiReturn == NO_ERROR,
249 "GetNetworkParams(buf, &dwSize) returned %ld, expected NO_ERROR\n",
250 ApiReturn);
251 ok(FixedInfo->HostName != NULL, "FixedInfo->HostName is NULL\n");
252 if (FixedInfo->HostName == NULL)
253 skip("FixedInfo->HostName is NULL. Can't proceed\n");
254 if (!OrigDhcpHostnameExists)
255 {
256 /* Windows doesn't honor DHCP option 12 even if RFC requires it if it is returned by DHCP server! */
257 //ok(strcmp(FixedInfo->HostName, ROSTESTDHCPHOST) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, ROSTESTDHCPHOST);
258 }
259 else
260 ok(strcmp(FixedInfo->HostName, OrigHostname) == 0, "FixedInfo->HostName is wrong '%s' != '%s'\n", FixedInfo->HostName, OrigHostname);
261 ok(FixedInfo->DomainName != NULL, "FixedInfo->DomainName is NULL\n");
262 if (FixedInfo->DomainName == NULL)
263 skip("FixedInfo->DomainName is NULL. Can't proceed\n");
264 if (!OrigDhcpDomainNameExists)
265 ok(strcmp(FixedInfo->DomainName, ROSTESTDHCPDOMAIN) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, ROSTESTDHCPDOMAIN);
266 else
267 ok(strcmp(FixedInfo->DomainName, OrigDomainName) == 0, "FixedInfo->DomainName is wrong '%s' != '%s'\n", FixedInfo->DomainName, OrigDomainName);
268
269 HeapFree(GetProcessHeap(), 0, FixedInfo);
270 }
271
272 START_TEST(GetNetworkParams)
273 {
274 test_GetNetworkParams();
275 }