Author: akhaldi Date: Mon Oct 3 16:17:33 2011 New Revision: 53964
URL: http://svn.reactos.org/svn/reactos?rev=53964&view=rev Log: [IPHLPAPI_WINETEST] * Sync with Wine 1.3.29.
Modified: trunk/rostests/winetests/iphlpapi/iphlpapi.c
Modified: trunk/rostests/winetests/iphlpapi/iphlpapi.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/iphlpapi/iphlpap... ============================================================================== --- trunk/rostests/winetests/iphlpapi/iphlpapi.c [iso-8859-1] (original) +++ trunk/rostests/winetests/iphlpapi/iphlpapi.c [iso-8859-1] Mon Oct 3 16:17:33 2011 @@ -74,6 +74,8 @@ typedef DWORD (WINAPI *GetUdpTableFunc)(PMIB_UDPTABLE,PDWORD,BOOL); typedef DWORD (WINAPI *GetPerAdapterInfoFunc)(ULONG,PIP_PER_ADAPTER_INFO,PULONG); typedef DWORD (WINAPI *GetAdaptersAddressesFunc)(ULONG,ULONG,PVOID,PIP_ADAPTER_ADDRESSES,PULONG); +typedef DWORD (WINAPI *NotifyAddrChangeFunc)(PHANDLE,LPOVERLAPPED); +typedef BOOL (WINAPI *CancelIPChangeNotifyFunc)(LPOVERLAPPED);
static GetNumberOfInterfacesFunc gGetNumberOfInterfaces = NULL; static GetIpAddrTableFunc gGetIpAddrTable = NULL; @@ -93,6 +95,8 @@ static GetUdpTableFunc gGetUdpTable = NULL; static GetPerAdapterInfoFunc gGetPerAdapterInfo = NULL; static GetAdaptersAddressesFunc gGetAdaptersAddresses = NULL; +static NotifyAddrChangeFunc gNotifyAddrChange = NULL; +static CancelIPChangeNotifyFunc gCancelIPChangeNotify = NULL;
static void loadIPHlpApi(void) { @@ -132,6 +136,10 @@ hLibrary, "GetUdpTable"); gGetPerAdapterInfo = (GetPerAdapterInfoFunc)GetProcAddress(hLibrary, "GetPerAdapterInfo"); gGetAdaptersAddresses = (GetAdaptersAddressesFunc)GetProcAddress(hLibrary, "GetAdaptersAddresses"); + gNotifyAddrChange = (NotifyAddrChangeFunc)GetProcAddress( + hLibrary, "NotifyAddrChange"); + gCancelIPChangeNotify = (CancelIPChangeNotifyFunc)GetProcAddress( + hLibrary, "CancelIPChangeNotify"); } }
@@ -154,6 +162,8 @@ gGetUdpStatistics = NULL; gGetTcpTable = NULL; gGetUdpTable = NULL; + gNotifyAddrChange = NULL; + gCancelIPChangeNotify = NULL; FreeLibrary(hLibrary); hLibrary = NULL; } @@ -184,7 +194,7 @@
/* Crashes on Vista */ if (0) { - apiReturn = gGetNumberOfInterfaces(NULL), numInterfaces; + apiReturn = gGetNumberOfInterfaces(NULL); if (apiReturn == ERROR_NOT_SUPPORTED) return; ok(apiReturn == ERROR_INVALID_PARAMETER, @@ -806,6 +816,78 @@ HeapFree( GetProcessHeap(), 0, buffer ); }
+static void testNotifyAddrChange(void) +{ + DWORD ret, bytes; + OVERLAPPED overlapped; + HANDLE handle; + BOOL success; + + if (!gNotifyAddrChange) + { + win_skip("NotifyAddrChange not present\n"); + return; + } + if (!gCancelIPChangeNotify) + { + win_skip("CancelIPChangeNotify not present\n"); + return; + } + + handle = NULL; + ZeroMemory(&overlapped, sizeof(overlapped)); + ret = gNotifyAddrChange(&handle, &overlapped); + if (ret == ERROR_NOT_SUPPORTED) + { + win_skip("NotifyAddrChange is not supported\n"); + return; + } + ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected ERROR_IO_PENDING\n", ret); + ret = GetLastError(); + todo_wine ok(ret == ERROR_IO_PENDING, "GetLastError returned %d, expected ERROR_IO_PENDING\n", ret); + success = gCancelIPChangeNotify(&overlapped); + todo_wine ok(success == TRUE, "CancelIPChangeNotify returned FALSE, expected TRUE\n"); + + ZeroMemory(&overlapped, sizeof(overlapped)); + success = gCancelIPChangeNotify(&overlapped); + ok(success == FALSE, "CancelIPChangeNotify returned TRUE, expected FALSE\n"); + + handle = NULL; + ZeroMemory(&overlapped, sizeof(overlapped)); + overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + ret = gNotifyAddrChange(&handle, &overlapped); + ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected ERROR_IO_PENDING\n", ret); + todo_wine ok(handle != INVALID_HANDLE_VALUE, "NotifyAddrChange returned invalid file handle\n"); + success = GetOverlappedResult(handle, &overlapped, &bytes, FALSE); + ok(success == FALSE, "GetOverlappedResult returned TRUE, expected FALSE\n"); + ret = GetLastError(); + ok(ret == ERROR_IO_INCOMPLETE, "GetLastError returned %d, expected ERROR_IO_INCOMPLETE\n", ret); + success = gCancelIPChangeNotify(&overlapped); + todo_wine ok(success == TRUE, "CancelIPChangeNotify returned FALSE, expected TRUE\n"); + + if (winetest_interactive) + { + handle = NULL; + ZeroMemory(&overlapped, sizeof(overlapped)); + overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + trace("Testing asynchronous ipv4 address change notification. Please " + "change the ipv4 address of one of your network interfaces\n"); + ret = gNotifyAddrChange(&handle, &overlapped); + ok(ret == ERROR_IO_PENDING, "NotifyAddrChange returned %d, expected NO_ERROR\n", ret); + success = GetOverlappedResult(handle, &overlapped, &bytes, TRUE); + ok(success == TRUE, "GetOverlappedResult returned FALSE, expected TRUE\n"); + } + + /* test synchronous functionality */ + if (winetest_interactive) + { + trace("Testing synchronous ipv4 address change notification. Please " + "change the ipv4 address of one of your network interfaces\n"); + ret = gNotifyAddrChange(NULL, NULL); + todo_wine ok(ret == NO_ERROR, "NotifyAddrChange returned %d, expected NO_ERROR\n", ret); + } +} + /* still-to-be-tested 2K-onward functions: AddIPAddress @@ -815,20 +897,20 @@ EnableRouter FlushIpNetTable GetAdapterIndex -NotifyAddrChange -NotifyRouteChange +NotifyRouteChange + CancelIPChangeNotify SendARP UnenableRouter */ static void testWin2KFunctions(void) { testGetPerAdapterInfo(); + testNotifyAddrChange(); }
static void test_GetAdaptersAddresses(void) { ULONG ret, size; - IP_ADAPTER_ADDRESSES *aa; + IP_ADAPTER_ADDRESSES *aa, *ptr; IP_ADAPTER_UNICAST_ADDRESS *ua;
if (!gGetAdaptersAddresses) @@ -840,17 +922,25 @@ ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, NULL); ok(ret == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER got %u\n", ret);
- size = 0; + /* size should be ignored and overwritten if buffer is NULL */ + size = 0x7fffffff; ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, NULL, &size); ok(ret == ERROR_BUFFER_OVERFLOW, "expected ERROR_BUFFER_OVERFLOW, got %u\n", ret); if (ret != ERROR_BUFFER_OVERFLOW) return;
- aa = HeapAlloc(GetProcessHeap(), 0, size); - ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, aa, &size); + ptr = HeapAlloc(GetProcessHeap(), 0, size); + ret = gGetAdaptersAddresses(AF_UNSPEC, 0, NULL, ptr, &size); ok(!ret, "expected ERROR_SUCCESS got %u\n", ret);
- while (!ret && winetest_debug > 1 && aa) - { + for (aa = ptr; !ret && aa; aa = aa->Next) + { + ok(aa->DnsSuffix != NULL, "DnsSuffix is not a valid pointer\n"); + ok(aa->Description != NULL, "Description is not a valid pointer\n"); + ok(aa->FriendlyName != NULL, "FriendlyName is not a valid pointer\n"); + + if (winetest_debug <= 1) + continue; + trace("Length: %u\n", S(U(*aa)).Length); trace("IfIndex: %u\n", S(U(*aa)).IfIndex); trace("Next: %p\n", aa->Next); @@ -886,9 +976,8 @@ trace("IfType: %u\n", aa->IfType); trace("OperStatus: %u\n", aa->OperStatus); trace("\n"); - aa = aa->Next; - } - HeapFree(GetProcessHeap(), 0, aa); + } + HeapFree(GetProcessHeap(), 0, ptr); }
START_TEST(iphlpapi)