Author: tfaber Date: Sun Nov 22 14:01:04 2015 New Revision: 70023
URL: http://svn.reactos.org/svn/reactos?rev=70023&view=rev Log: [CRT_APITEST] - Add tests for static object destructors. Patch by Mark Jansen. CORE-10562
Modified: trunk/rostests/apitests/crt/static_construct.cpp
Modified: trunk/rostests/apitests/crt/static_construct.cpp URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/crt/static_constr... ============================================================================== --- trunk/rostests/apitests/crt/static_construct.cpp [iso-8859-1] (original) +++ trunk/rostests/apitests/crt/static_construct.cpp [iso-8859-1] Sun Nov 22 14:01:04 2015 @@ -3,6 +3,7 @@ * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory * PURPOSE: Test for static C++ object construction * PROGRAMMER: Thomas Faber thomas.faber@reactos.org + * Mark Jansen */
#include <apitest.h> @@ -101,8 +102,127 @@ ok(values.dtor_counter == 7879, "dtor_counter = %d\n", values.dtor_counter); }
+struct shared_memory +{ + int init_count; + int uninit_count; +}; + +static HANDLE g_FileMapping = NULL; +static BOOL g_CreatedFileMapping = FALSE; +static shared_memory* g_Memory = NULL; + +#define MAPPING_NAME L"crt_apitest_static_construct" + +static void map_memory() +{ + if (g_FileMapping) + return; + + g_FileMapping = OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, MAPPING_NAME); + if (g_FileMapping) + { + g_CreatedFileMapping = FALSE; + } + else + { + g_FileMapping = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(shared_memory), MAPPING_NAME); + g_CreatedFileMapping = TRUE; + } + if (g_FileMapping == NULL) + { + skip("Could not map shared memory\n"); + return; + } + g_Memory = static_cast<shared_memory*>(MapViewOfFile(g_FileMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(shared_memory))); + if (g_Memory == NULL) + { + skip("Could not map view of shared memory\n"); + CloseHandle(g_FileMapping); + g_FileMapping = NULL; + } + if (g_CreatedFileMapping) + ZeroMemory(g_Memory, sizeof(shared_memory)); +} + +static void unmap_memory() +{ + // we do not clean the mapping in the child, since we want to count all dtor's! + if (g_FileMapping && g_CreatedFileMapping) + { + UnmapViewOfFile(g_Memory); + CloseHandle(g_FileMapping); + g_Memory = NULL; + g_FileMapping = NULL; + } +} + +static struct shared_mem_static +{ + shared_mem_static() + { + map_memory(); + if (g_Memory) + g_Memory->init_count++; + } + + ~shared_mem_static() + { + if (g_Memory) + g_Memory->uninit_count++; + unmap_memory(); + } + +} shared_mem_static; + +static +VOID +TestStaticDestruct(VOID) +{ + ok(g_Memory != NULL, "Expected the mapping to be in place\n"); + ok(g_CreatedFileMapping == TRUE, "Expected to create a new shared section!\n"); + if (g_Memory == NULL) + { + skip("Can't proceed without file mapping\n"); + return; + } + ok(g_Memory->init_count == 1, "Expected init_count to be 1, was: %d\n", g_Memory->init_count); + ok(g_Memory->uninit_count == 0, "Expected uninit_count to be 0, was: %d\n", g_Memory->uninit_count); + + WCHAR path[MAX_PATH]; + // we just need an extra argument to tell the test it's only running to increment the dtor count :) + GetModuleFileNameW(NULL, path, _countof(path)); + WCHAR buf[MAX_PATH+40]; + StringCchPrintfW(buf, _countof(buf), L""%ls" static_construct dummy", path); + + STARTUPINFOW si = { sizeof(si) }; + PROCESS_INFORMATION pi; + BOOL created = CreateProcessW(NULL, buf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); + ok(created, "Expected CreateProcess to succeed\n"); + if (created) + { + winetest_wait_child_process(pi.hProcess); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); + ok(g_Memory->init_count == 2, "Expected init_count to be 2, was: %d\n", g_Memory->init_count); + ok(g_Memory->uninit_count == 1, "Expected uninit_count to be 1, was: %d\n", g_Memory->uninit_count); + } +} + START_TEST(static_construct) { + char **argv; + int argc = winetest_get_mainargs(&argv); + + if (argc >= 3) + { + // we are just here to increment the reference count in the shared section! + ok(g_Memory != NULL, "Expected the shared memory to be mapped!\n"); + ok(g_CreatedFileMapping == FALSE, "Expected the shared memory to be created by my parent!\n"); + return; + } + TestInitStatic(); TestDllStartup(); -} + TestStaticDestruct(); +}