Author: tfaber Date: Sat Nov 21 13:45:45 2015 New Revision: 69993
URL: http://svn.reactos.org/svn/reactos?rev=69993&view=rev Log: [CRT_APITEST] - Also test static constructors/destructors in a DLL. CORE-10562
Added: trunk/rostests/apitests/crt/dll_startup.cpp (with props) trunk/rostests/apitests/crt/dll_startup.h (with props) trunk/rostests/apitests/crt/dll_startup.spec (with props) Modified: trunk/rostests/apitests/crt/msvcrt_crt_apitest.cmake trunk/rostests/apitests/crt/static_construct.cpp trunk/rostests/apitests/crt/static_init.c
Added: trunk/rostests/apitests/crt/dll_startup.cpp URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/crt/dll_startup.c... ============================================================================== --- trunk/rostests/apitests/crt/dll_startup.cpp (added) +++ trunk/rostests/apitests/crt/dll_startup.cpp [iso-8859-1] Sat Nov 21 13:45:45 2015 @@ -0,0 +1,68 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory + * PURPOSE: Test for static C++ object construction/destruction in a DLL + * PROGRAMMER: Thomas Faber thomas.faber@reactos.org + */ + +#include <apitest.h> +#include "dll_startup.h" + +static struct counter_values counter_values = +{ + 0, 0, 0, 0, 5656, 0, 0 +}; +static struct counter_values *p_counter_values; + +static struct init_static +{ + int m_uninit; + int m_counter; + + init_static() : + m_counter(2) + { + counter_values.static_construct_counter_at_startup = counter_values.static_construct_counter; + counter_values.m_uninit_at_startup = m_uninit; + counter_values.static_construct_counter++; + m_uninit++; + } + + ~init_static() + { + p_counter_values->dtor_counter++; + } +} init_static; + +extern "C" +{ +SET_COUNTER_VALUES_POINTER SetCounterValuesPointer; +void +WINAPI +SetCounterValuesPointer( + _Out_ struct counter_values *pcv) +{ + p_counter_values = pcv; + memcpy(pcv, &counter_values, sizeof(counter_values)); +} + +BOOL +WINAPI +DllMain( + _In_ HINSTANCE hinstDLL, + _In_ DWORD fdwReason, + _In_ PVOID pvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + { + counter_values.m_uninit = init_static.m_uninit; + counter_values.m_counter = init_static.m_counter; + } + else if (fdwReason == DLL_PROCESS_DETACH) + { + p_counter_values->dtor_counter_at_detach = p_counter_values->dtor_counter; + } + return TRUE; +} + +}
Propchange: trunk/rostests/apitests/crt/dll_startup.cpp ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/apitests/crt/dll_startup.h URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/crt/dll_startup.h... ============================================================================== --- trunk/rostests/apitests/crt/dll_startup.h (added) +++ trunk/rostests/apitests/crt/dll_startup.h [iso-8859-1] Sat Nov 21 13:45:45 2015 @@ -0,0 +1,25 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory + * PURPOSE: Helper declarations for DLL construction/destruction test + * PROGRAMMER: Thomas Faber thomas.faber@reactos.org + */ + +#pragma once + +struct counter_values +{ + int m_uninit_at_startup; + int m_uninit; + int m_counter; + int static_construct_counter_at_startup; + int static_construct_counter; + int dtor_counter_at_detach; + int dtor_counter; +}; + +typedef +void +WINAPI +SET_COUNTER_VALUES_POINTER( + _Out_ struct counter_values *pcv);
Propchange: trunk/rostests/apitests/crt/dll_startup.h ------------------------------------------------------------------------------ svn:eol-style = native
Added: trunk/rostests/apitests/crt/dll_startup.spec URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/crt/dll_startup.s... ============================================================================== --- trunk/rostests/apitests/crt/dll_startup.spec (added) +++ trunk/rostests/apitests/crt/dll_startup.spec [iso-8859-1] Sat Nov 21 13:45:45 2015 @@ -0,0 +1 @@ +@ stdcall SetCounterValuesPointer(ptr)
Propchange: trunk/rostests/apitests/crt/dll_startup.spec ------------------------------------------------------------------------------ svn:eol-style = native
Modified: trunk/rostests/apitests/crt/msvcrt_crt_apitest.cmake URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/crt/msvcrt_crt_ap... ============================================================================== --- trunk/rostests/apitests/crt/msvcrt_crt_apitest.cmake [iso-8859-1] (original) +++ trunk/rostests/apitests/crt/msvcrt_crt_apitest.cmake [iso-8859-1] Sat Nov 21 13:45:45 2015 @@ -1380,9 +1380,26 @@ #add_importlibs(static_crt_apitest kernel32 ntdll) #add_cd_file(TARGET static_crt_apitest DESTINATION reactos/bin FOR all)
+#spec2def(static_crt_dll_startup.dll dll_startup.spec) +#add_library(static_crt_dll_startup SHARED +# dll_startup.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/static_crt_dll_startup.def) +#target_link_libraries(static_crt_dll_startup crt) +#set_module_type(static_crt_dll_startup win32dll) +#add_importlibs(static_crt_dll_startup kernel32 ntdll) +#add_cd_file(TARGET static_crt_dll_startup DESTINATION reactos/bin FOR all) + add_executable(msvcrt_crt_apitest testlist.c ${SOURCE_MSVCRT}) add_target_compile_definitions(msvcrt_crt_apitest TEST_MSVCRT) target_link_libraries(msvcrt_crt_apitest wine ${PSEH_LIB}) set_module_type(msvcrt_crt_apitest win32cui) add_importlibs(msvcrt_crt_apitest msvcrt kernel32 ntdll) add_cd_file(TARGET msvcrt_crt_apitest DESTINATION reactos/bin FOR all) + +spec2def(msvcrt_crt_dll_startup.dll dll_startup.spec) +add_library(msvcrt_crt_dll_startup SHARED + dll_startup.cpp + ${CMAKE_CURRENT_BINARY_DIR}/msvcrt_crt_dll_startup.def) +set_module_type(msvcrt_crt_dll_startup win32dll) +add_importlibs(msvcrt_crt_dll_startup msvcrt kernel32 ntdll) +add_cd_file(TARGET msvcrt_crt_dll_startup DESTINATION reactos/bin FOR all)
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] Sat Nov 21 13:45:45 2015 @@ -1,11 +1,12 @@ /* - * PROJECT: ReactOS api tests + * PROJECT: ReactOS API tests * 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 */
#include <apitest.h> +#include "dll_startup.h"
extern "C" { @@ -13,12 +14,14 @@
static int static_init_counter_at_startup; static int static_construct_counter_at_startup; +static int m_uninit_at_startup;
int static_construct_counter = 789; }
-struct init_static +static struct init_static { + int m_uninit; int m_counter;
init_static() : @@ -26,7 +29,9 @@ { static_init_counter_at_startup = static_init_counter; static_construct_counter_at_startup = static_construct_counter; + m_uninit_at_startup = m_uninit; static_construct_counter++; + m_uninit++; } } init_static;
@@ -34,9 +39,50 @@ { ok(static_init_counter_at_startup == 123, "static_init_counter at startup: %d\n", static_init_counter_at_startup); ok(static_construct_counter_at_startup == 789, "static_construct_counter at startup: %d\n", static_construct_counter_at_startup); + ok(m_uninit_at_startup == 0, "init_static.m_uninit at startup: %d\n", m_uninit_at_startup);
ok(static_init_counter == 123, "static_init_counter: %d\n", static_init_counter);
ok(static_construct_counter == 790, "static_construct_counter: %d\n", static_construct_counter); ok(init_static.m_counter == 2, "init_static.m_counter: %d\n", init_static.m_counter); + ok(init_static.m_uninit == 1, "init_static.m_uninit: %d\n", init_static.m_uninit); + + counter_values values; +#if defined(TEST_MSVCRT) + HMODULE hDll = LoadLibraryW(L"msvcrt_crt_dll_startup.dll"); +#elif defined(TEST_STATIC_CRT) + HMODULE hDll = LoadLibraryW(L"static_crt_dll_startup.dll"); +#else +#error This test only makes sense for static CRT and msvcrt.dll +#endif + if (hDll == NULL) + { + skip("Helper dll not found\n"); + return; + } + SET_COUNTER_VALUES_POINTER *pSetCounterValuesPointer = reinterpret_cast<SET_COUNTER_VALUES_POINTER*>(GetProcAddress(hDll, "SetCounterValuesPointer")); + if (pSetCounterValuesPointer == NULL) + { + skip("Helper function not found\n"); + FreeLibrary(hDll); + return; + } + pSetCounterValuesPointer(&values); + ok(values.m_uninit_at_startup == 0, "m_uninit_at_startup = %d\n", values.m_uninit_at_startup); + ok(values.m_uninit == 1, "m_uninit = %d\n", values.m_uninit); + ok(values.m_counter == 2, "m_counter = %d\n", values.m_counter); + ok(values.static_construct_counter_at_startup == 5656, "static_construct_counter_at_startup = %d\n", values.static_construct_counter_at_startup); + ok(values.static_construct_counter == 5657, "static_construct_counter = %d\n", values.static_construct_counter); + ok(values.dtor_counter_at_detach == 0, "dtor_counter_at_detach = %d\n", values.dtor_counter_at_detach); + ok(values.dtor_counter == 0, "dtor_counter = %d\n", values.dtor_counter); + values.dtor_counter_at_detach = 78789; + values.dtor_counter = 7878; + FreeLibrary(hDll); + ok(values.m_uninit_at_startup == 0, "m_uninit_at_startup = %d\n", values.m_uninit_at_startup); + ok(values.m_uninit == 1, "m_uninit = %d\n", values.m_uninit); + ok(values.m_counter == 2, "m_counter = %d\n", values.m_counter); + ok(values.static_construct_counter_at_startup == 5656, "static_construct_counter_at_startup = %d\n", values.static_construct_counter_at_startup); + ok(values.static_construct_counter == 5657, "static_construct_counter = %d\n", values.static_construct_counter); + ok(values.dtor_counter_at_detach == 7878, "dtor_counter_at_detach = %d\n", values.dtor_counter_at_detach); + ok(values.dtor_counter == 7879, "dtor_counter = %d\n", values.dtor_counter); }
Modified: trunk/rostests/apitests/crt/static_init.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/crt/static_init.c... ============================================================================== --- trunk/rostests/apitests/crt/static_init.c [iso-8859-1] (original) +++ trunk/rostests/apitests/crt/static_init.c [iso-8859-1] Sat Nov 21 13:45:45 2015 @@ -1,5 +1,5 @@ /* - * PROJECT: ReactOS api tests + * PROJECT: ReactOS API tests * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory * PURPOSE: Test for static variable initialization * PROGRAMMER: Thomas Faber thomas.faber@reactos.org @@ -12,7 +12,7 @@ int static_init_counter = 123;
START_TEST(static_init) -{ +{ ok(static_init_counter == 123, "static_init_counter: %d\n", static_init_counter); ok(static_construct_counter == 790, "static_construct_counter: %d\n", static_construct_counter); }