[PATCH v2 4/5] kernel32/tests: Cleanup and add Heap(Query|Set)Information tests.

Rémi Bernon rbernon at codeweavers.com
Fri Apr 8 09:06:50 CDT 2022


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/kernel32/tests/heap.c | 156 ++++++++++++++++++++++++-------------
 1 file changed, 104 insertions(+), 52 deletions(-)

diff --git a/dlls/kernel32/tests/heap.c b/dlls/kernel32/tests/heap.c
index 3e608efb8dc..108f750aa55 100644
--- a/dlls/kernel32/tests/heap.c
+++ b/dlls/kernel32/tests/heap.c
@@ -44,6 +44,7 @@ static BOOL (WINAPI *pGetPhysicallyInstalledSystemMemory)( ULONGLONG * );
 
 #define MAKE_FUNC(f) static typeof(f) *p ## f
 MAKE_FUNC( HeapQueryInformation );
+MAKE_FUNC( HeapSetInformation );
 MAKE_FUNC( GlobalFlags );
 MAKE_FUNC( RtlGetNtGlobalFlags );
 #undef MAKE_FUNC
@@ -57,6 +58,7 @@ static void load_functions(void)
     LOAD_FUNC( kernel32, HeapAlloc );
     LOAD_FUNC( kernel32, HeapReAlloc );
     LOAD_FUNC( kernel32, HeapQueryInformation );
+    LOAD_FUNC( kernel32, HeapSetInformation );
     LOAD_FUNC( kernel32, GetPhysicallyInstalledSystemMemory );
     LOAD_FUNC( kernel32, GlobalFlags );
     LOAD_FUNC( ntdll, RtlGetNtGlobalFlags );
@@ -84,6 +86,7 @@ static void test_HeapCreate(void)
     HANDLE heap, heap1, heaps[8];
     BYTE *ptr, *ptr1, *ptrs[128];
     DWORD heap_count, count;
+    ULONG compat_info;
     UINT_PTR align;
     BOOL ret;
 
@@ -643,6 +646,107 @@ static void test_HeapCreate(void)
     ret = HeapFree( heap, 0, ptr );
     ok( ret, "HeapFree failed, error %lu\n", GetLastError() );
 
+    size = 0;
+    SetLastError( 0xdeadbeef );
+    ret = pHeapQueryInformation( 0, HeapCompatibilityInformation, &compat_info, sizeof(compat_info), &size );
+    todo_wine
+    ok( !ret, "HeapQueryInformation succeeded\n" );
+    todo_wine
+    ok( GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError() );
+    todo_wine
+    ok( size == 0, "got size %Iu\n", size );
+
+#if 0 /* crashes on wine */
+    size = 0;
+    SetLastError( 0xdeadbeef );
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, NULL, sizeof(compat_info), &size );
+    ok( !ret, "HeapQueryInformation succeeded\n" );
+    ok( GetLastError() == ERROR_NOACCESS, "got error %lu\n", GetLastError() );
+    ok( size == 0, "got size %Iu\n", size );
+#endif
+
+    size = 0;
+    SetLastError( 0xdeadbeef );
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, NULL, 0, &size );
+    ok( !ret, "HeapQueryInformation succeeded\n" );
+    ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError() );
+    ok( size == sizeof(ULONG), "got size %Iu\n", size );
+
+    SetLastError( 0xdeadbeef );
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, NULL, 0, NULL );
+    ok( !ret, "HeapQueryInformation succeeded\n" );
+    ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "got error %lu\n", GetLastError() );
+
+    SetLastError( 0xdeadbeef );
+    compat_info = 0xdeadbeef;
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info) + 1, NULL );
+    ok( ret, "HeapQueryInformation failed, error %lu\n", GetLastError() );
+    ok( compat_info == 0, "got compat_info %lu\n", compat_info );
+
+    ret = HeapDestroy( heap );
+    ok( ret, "HeapDestroy failed, error %lu\n", GetLastError() );
+
+
+    /* check setting LFH compat info */
+
+    heap = HeapCreate( 0, 0, 0 );
+    ok( !!heap, "HeapCreate failed, error %lu\n", GetLastError() );
+    ok( !((ULONG_PTR)heap & 0xffff), "wrong heap alignment\n" );
+
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info), &size );
+    ok( ret, "HeapQueryInformation failed, error %lu\n", GetLastError() );
+    ok( compat_info == 0, "got HeapCompatibilityInformation %lu\n", compat_info );
+
+    compat_info = 2;
+    ret = pHeapSetInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info) );
+    ok( ret, "HeapSetInformation failed, error %lu\n", GetLastError() );
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info), &size );
+    ok( ret, "HeapQueryInformation failed, error %lu\n", GetLastError() );
+    todo_wine
+    ok( compat_info == 2, "got HeapCompatibilityInformation %lu\n", compat_info );
+
+    /* cannot be undone */
+
+    compat_info = 0;
+    SetLastError( 0xdeadbeef );
+    ret = pHeapSetInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info) );
+    todo_wine
+    ok( !ret, "HeapSetInformation succeeded\n" );
+    todo_wine
+    ok( GetLastError() == ERROR_GEN_FAILURE, "got error %lu\n", GetLastError() );
+    compat_info = 1;
+    SetLastError( 0xdeadbeef );
+    ret = pHeapSetInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info) );
+    todo_wine
+    ok( !ret, "HeapSetInformation succeeded\n" );
+    todo_wine
+    ok( GetLastError() == ERROR_GEN_FAILURE, "got error %lu\n", GetLastError() );
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info), &size );
+    ok( ret, "HeapQueryInformation failed, error %lu\n", GetLastError() );
+    todo_wine
+    ok( compat_info == 2, "got HeapCompatibilityInformation %lu\n", compat_info );
+
+    ret = HeapDestroy( heap );
+    ok( ret, "HeapDestroy failed, error %lu\n", GetLastError() );
+
+    /* some allocation pattern automatically enables LFH */
+
+    heap = HeapCreate( 0, 0, 0 );
+    ok( !!heap, "HeapCreate failed, error %lu\n", GetLastError() );
+    ok( !((ULONG_PTR)heap & 0xffff), "wrong heap alignment\n" );
+
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info), &size );
+    ok( ret, "HeapQueryInformation failed, error %lu\n", GetLastError() );
+    ok( compat_info == 0, "got HeapCompatibilityInformation %lu\n", compat_info );
+
+    for (i = 0; i < 0x12; i++) ptrs[i] = pHeapAlloc( heap, 0, 0 );
+    for (i = 0; i < 0x12; i++) HeapFree( heap, 0, ptrs[i] );
+
+    ret = pHeapQueryInformation( heap, HeapCompatibilityInformation, &compat_info, sizeof(compat_info), &size );
+    ok( ret, "HeapQueryInformation failed, error %lu\n", GetLastError() );
+    todo_wine
+    ok( compat_info == 2, "got HeapCompatibilityInformation %lu\n", compat_info );
+
     ret = HeapDestroy( heap );
     ok( ret, "HeapDestroy failed, error %lu\n", GetLastError() );
 }
@@ -1505,57 +1609,6 @@ static void test_LocalAlloc(void)
     }
 }
 
-static void test_HeapQueryInformation(void)
-{
-    ULONG info;
-    SIZE_T size;
-    BOOL ret;
-
-    if (!pHeapQueryInformation)
-    {
-        win_skip("HeapQueryInformation is not available\n");
-        return;
-    }
-
-    if (0) /* crashes under XP */
-    {
-        size = 0;
-        pHeapQueryInformation(0,
-                                HeapCompatibilityInformation,
-                                &info, sizeof(info), &size);
-        size = 0;
-        pHeapQueryInformation(GetProcessHeap(),
-                                HeapCompatibilityInformation,
-                                NULL, sizeof(info), &size);
-    }
-
-    size = 0;
-    SetLastError(0xdeadbeef);
-    ret = pHeapQueryInformation(GetProcessHeap(),
-                                HeapCompatibilityInformation,
-                                NULL, 0, &size);
-    ok(!ret, "HeapQueryInformation should fail\n");
-    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
-       "expected ERROR_INSUFFICIENT_BUFFER got %lu\n", GetLastError());
-    ok(size == sizeof(ULONG), "expected 4, got %Iu\n", size);
-
-    SetLastError(0xdeadbeef);
-    ret = pHeapQueryInformation(GetProcessHeap(),
-                                HeapCompatibilityInformation,
-                                NULL, 0, NULL);
-    ok(!ret, "HeapQueryInformation should fail\n");
-    ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
-       "expected ERROR_INSUFFICIENT_BUFFER got %lu\n", GetLastError());
-
-    info = 0xdeadbeaf;
-    SetLastError(0xdeadbeef);
-    ret = pHeapQueryInformation(GetProcessHeap(),
-                                HeapCompatibilityInformation,
-                                &info, sizeof(info) + 1, NULL);
-    ok(ret, "HeapQueryInformation error %lu\n", GetLastError());
-    ok(info == 0 || info == 1 || info == 2, "expected 0, 1 or 2, got %lu\n", info);
-}
-
 static void test_heap_checks( DWORD flags )
 {
     BYTE old, *p, *p2;
@@ -2017,7 +2070,6 @@ START_TEST(heap)
     test_GlobalAlloc();
     test_LocalAlloc();
 
-    test_HeapQueryInformation();
     test_GetPhysicallyInstalledSystemMemory();
     test_GlobalMemoryStatus();
 
-- 
2.35.1




More information about the wine-devel mailing list