[PATCH 4/5] kernel32/tests: Cleanup and add Heap(Query|Set)Information tests.
Rémi Bernon
rbernon at codeweavers.com
Fri Apr 8 06:44:33 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