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.…
==============================================================================
--- 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(a)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.…
==============================================================================
--- 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(a)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.…
==============================================================================
--- 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_a…
==============================================================================
--- 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_const…
==============================================================================
--- 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(a)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.…
==============================================================================
--- 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(a)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);
}