[ros-diffs] [akhaldi] 53964: [IPHLPAPI_WINETEST] * Sync with Wine 1.3.29.

akhaldi at svn.reactos.org akhaldi at svn.reactos.org
Mon Oct 3 16:17:33 UTC 2011


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/iphlpapi.c?rev=53964&r1=53963&r2=53964&view=diff
==============================================================================
--- 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)




More information about the Ros-diffs mailing list