2 * PROJECT: ReactOS API Tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Tests for UDP connections enumeration functions
5 * COPYRIGHT: Copyright 2018 Pierre Schweitzer
10 #define WIN32_NO_STATUS
14 static DWORD
GetExtendedUdpTableWithAlloc(PVOID
*UdpTable
, BOOL Order
, DWORD Family
, UDP_TABLE_CLASS Class
)
21 ret
= GetExtendedUdpTable(*UdpTable
, &Size
, Order
, Family
, Class
, 0);
22 if (ret
== ERROR_INSUFFICIENT_BUFFER
)
24 *UdpTable
= HeapAlloc(GetProcessHeap(), 0, Size
);
25 if (*UdpTable
== NULL
)
27 return ERROR_OUTOFMEMORY
;
30 ret
= GetExtendedUdpTable(*UdpTable
, &Size
, Order
, Family
, Class
, 0);
33 HeapFree(GetProcessHeap(), 0, *UdpTable
);
41 START_TEST(GetExtendedUdpTable
)
46 PMIB_UDPTABLE UdpTable
;
47 PMIB_UDPTABLE_OWNER_PID UdpTableOwner
;
48 PMIB_UDPTABLE_OWNER_MODULE UdpTableOwnerMod
;
52 LARGE_INTEGER CreationTime
;
53 DWORD Pid
= GetCurrentProcessId();
55 if (WSAStartup(MAKEWORD(2, 2), &wsaData
) != 0)
57 skip("Failed to init WS2\n");
61 GetSystemTimeAsFileTime(&Creation
);
62 CreationTime
.LowPart
= Creation
.dwLowDateTime
;
63 CreationTime
.HighPart
= Creation
.dwHighDateTime
;
65 sock
= socket(AF_INET
, SOCK_DGRAM
, IPPROTO_UDP
);
66 if (sock
== INVALID_SOCKET
)
68 skip("Cannot create socket\n");
72 ZeroMemory(&server
, sizeof(SOCKADDR_IN
));
73 server
.sin_family
= AF_INET
;
74 server
.sin_addr
.s_addr
= htonl(INADDR_ANY
);
75 server
.sin_port
= htons(9876);
77 if (bind(sock
, (SOCKADDR
*)&server
, sizeof(SOCKADDR_IN
)) == SOCKET_ERROR
)
79 skip("Cannot bind socket\n");
83 if (GetExtendedUdpTableWithAlloc((PVOID
*)&UdpTable
, TRUE
, AF_INET
, UDP_TABLE_BASIC
) == ERROR_SUCCESS
)
85 ok(UdpTable
->dwNumEntries
> 0, "No UDP connections?!\n");
88 for (i
= 0; i
< UdpTable
->dwNumEntries
; ++i
)
90 if (UdpTable
->table
[i
].dwLocalAddr
== 0 &&
91 UdpTable
->table
[i
].dwLocalPort
== htons(9876))
97 ok(Found
, "Our socket wasn't found!\n");
99 HeapFree(GetProcessHeap(), 0, UdpTable
);
103 skip("GetExtendedUdpTableWithAlloc failure\n");
106 if (GetExtendedUdpTableWithAlloc((PVOID
*)&UdpTableOwner
, TRUE
, AF_INET
, UDP_TABLE_OWNER_PID
) == ERROR_SUCCESS
)
108 ok(UdpTableOwner
->dwNumEntries
> 0, "No UDP connections?!\n");
111 for (i
= 0; i
< UdpTableOwner
->dwNumEntries
; ++i
)
113 if (UdpTableOwner
->table
[i
].dwLocalAddr
== 0 &&
114 UdpTableOwner
->table
[i
].dwLocalPort
== htons(9876))
123 skip("Our socket wasn't found!\n");
127 ok(UdpTableOwner
->table
[i
].dwOwningPid
== Pid
, "Invalid owner\n");
130 HeapFree(GetProcessHeap(), 0, UdpTableOwner
);
134 skip("GetExtendedUdpTableWithAlloc failure\n");
137 if (GetExtendedUdpTableWithAlloc((PVOID
*)&UdpTableOwnerMod
, TRUE
, AF_INET
, UDP_TABLE_OWNER_MODULE
) == ERROR_SUCCESS
)
139 ok(UdpTableOwnerMod
->dwNumEntries
> 0, "No TCP connections?!\n");
142 for (i
= 0; i
< UdpTableOwnerMod
->dwNumEntries
; ++i
)
144 if (UdpTableOwnerMod
->table
[i
].dwLocalAddr
== 0 &&
145 UdpTableOwnerMod
->table
[i
].dwLocalPort
== htons(9876))
154 skip("Our socket wasn't found!\n");
158 ok(UdpTableOwnerMod
->table
[i
].dwOwningPid
== Pid
, "Invalid owner\n");
160 ok(UdpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
>= CreationTime
.QuadPart
, "Invalid time\n");
161 ok(UdpTableOwnerMod
->table
[i
].liCreateTimestamp
.QuadPart
<= CreationTime
.QuadPart
+ 60000000000LL, "Invalid time\n");
164 HeapFree(GetProcessHeap(), 0, UdpTableOwnerMod
);
168 skip("GetExtendedUdpTableWithAlloc failure\n");