Reactos
1/*
2 * PROJECT: ReactOS API Tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Tests for ICMP functions
5 * PROGRAMMERS: Tim Crawford
6 */
7
8#include <apitest.h>
9#include <ws2tcpip.h>
10#include <iphlpapi.h>
11#include <icmpapi.h>
12
13static
14void
15test_IcmpCreateFile(void)
16{
17 HANDLE hIcmp;
18
19 SetLastError(0xDEADBEEF);
20 hIcmp = IcmpCreateFile();
21 ok(hIcmp != INVALID_HANDLE_VALUE, "IcmpCreateFile failed unexpectedly: %lu\n", GetLastError());
22
23 if (hIcmp != INVALID_HANDLE_VALUE)
24 IcmpCloseHandle(hIcmp);
25}
26
27static
28void
29test_Icmp6CreateFile(void)
30{
31 HANDLE hIcmp;
32
33 SetLastError(0xDEADBEEF);
34 hIcmp = Icmp6CreateFile();
35
36 if (GetLastError() == ERROR_FILE_NOT_FOUND)
37 {
38 /* On Windows Server 2003, the IPv6 protocol must be installed. */
39 skip("IPv6 is not available.\n");
40 return;
41 }
42
43 ok(hIcmp != INVALID_HANDLE_VALUE, "Icmp6CreateFile failed unexpectedly: %lu\n", GetLastError());
44
45 if (hIcmp != INVALID_HANDLE_VALUE)
46 IcmpCloseHandle(hIcmp);
47}
48
49static
50void
51test_IcmpCloseHandle(void)
52{
53 HANDLE hIcmp;
54 BOOL bRet;
55 DWORD LastError;
56
57 SetLastError(0xDEADBEEF);
58 hIcmp = IcmpCreateFile();
59 if (hIcmp != INVALID_HANDLE_VALUE)
60 {
61 bRet = IcmpCloseHandle(hIcmp);
62 ok(bRet, "IcmpCloseHandle failed unexpectedly: %lu\n", GetLastError());
63 }
64
65 SetLastError(0xDEADBEEF);
66 hIcmp = Icmp6CreateFile();
67 if (hIcmp != INVALID_HANDLE_VALUE)
68 {
69 bRet = IcmpCloseHandle(hIcmp);
70 ok(bRet, "IcmpCloseHandle failed unexpectedly: %lu\n", GetLastError());
71 }
72
73 hIcmp = INVALID_HANDLE_VALUE;
74 SetLastError(0xDEADBEEF);
75 bRet = IcmpCloseHandle(hIcmp);
76 ok(!bRet, "IcmpCloseHandle succeeded unexpectedly\n");
77 LastError = GetLastError();
78 ok(LastError == ERROR_INVALID_HANDLE || LastError == ERROR_INVALID_PARAMETER,
79 "Unexpected last error (0x%lX)\n", LastError);
80
81 hIcmp = NULL;
82 SetLastError(0xDEADBEEF);
83 bRet = IcmpCloseHandle(hIcmp);
84 ok(!bRet, "IcmpCloseHandle succeeded unexpectedly\n");
85 LastError = GetLastError();
86 ok(LastError == ERROR_INVALID_HANDLE || LastError == ERROR_INVALID_PARAMETER,
87 "Unexpected last error (0x%lX)\n", LastError);
88}
89
90static
91void
92test_IcmpSendEcho(void)
93{
94 HANDLE hIcmp;
95 unsigned long ipaddr = INADDR_NONE;
96 DWORD bRet = 0, error = 0;
97 char SendData[32] = "Data Buffer";
98 PVOID ReplyBuffer;
99 DWORD ReplySize = 0;
100
101 SetLastError(0xDEADBEEF);
102 hIcmp = IcmpCreateFile();
103 if (hIcmp == INVALID_HANDLE_VALUE)
104 {
105 skip("IcmpCreateFile failed unexpectedly: %lu\n", GetLastError());
106 return;
107 }
108
109 ipaddr = 0x08080808; // 8.8.8.8
110 ReplyBuffer = malloc(sizeof(ICMP_ECHO_REPLY) + sizeof(SendData));
111
112 ReplySize = sizeof(ICMP_ECHO_REPLY);
113 SetLastError(0xDEADBEEF);
114 bRet = IcmpSendEcho(hIcmp, ipaddr, SendData, sizeof(SendData),
115 NULL, ReplyBuffer, ReplySize, 5000);
116
117 ok(!bRet, "IcmpSendEcho succeeded unexpectedly\n");
118 error = GetLastError();
119 ok(error == IP_BUF_TOO_SMALL /* Win2003 */ ||
120 error == IP_GENERAL_FAILURE /* Win10 */,
121 "IcmpSendEcho returned unexpected error: %lu\n", error);
122
123 ReplySize = sizeof(ICMP_ECHO_REPLY) + sizeof(SendData);
124 SetLastError(0xDEADBEEF);
125 bRet = IcmpSendEcho(hIcmp, ipaddr, SendData, sizeof(SendData),
126 NULL, ReplyBuffer, ReplySize, 5000);
127
128 ok(bRet, "IcmpSendEcho failed unexpectedly: %lu\n", GetLastError());
129
130 free(ReplyBuffer);
131 IcmpCloseHandle(hIcmp);
132}
133
134START_TEST(icmp)
135{
136 test_IcmpCreateFile();
137 test_Icmp6CreateFile();
138 test_IcmpCloseHandle();
139 test_IcmpSendEcho();
140}