ReactOS  0.4.14-dev-114-gc8cbd56
static_construct.cpp
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS API tests
3  * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE: Test for static C++ object construction
5  * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
6  * Mark Jansen
7  */
8 
9 #include <apitest.h>
10 #include <strsafe.h>
11 #include "dll_startup.h"
12 
13 #ifdef __GNUC__
14 #pragma GCC diagnostic ignored "-Wuninitialized"
15 #endif
16 
17 extern "C"
18 {
19 extern int static_init_counter;
20 
24 
26 }
27 
28 static struct init_static
29 {
30  int m_uninit;
31  int m_counter;
32 
34  m_counter(2)
35  {
40  m_uninit++;
41  }
42 } init_static;
43 
44 static
45 VOID
47 {
48  ok(static_init_counter_at_startup == 123, "static_init_counter at startup: %d\n", static_init_counter_at_startup);
49  ok(static_construct_counter_at_startup == 789, "static_construct_counter at startup: %d\n", static_construct_counter_at_startup);
50  ok(m_uninit_at_startup == 0, "init_static.m_uninit at startup: %d\n", m_uninit_at_startup);
51 
52  ok(static_init_counter == 123, "static_init_counter: %d\n", static_init_counter);
53 
54  ok(static_construct_counter == 790, "static_construct_counter: %d\n", static_construct_counter);
55  ok(init_static.m_counter == 2, "init_static.m_counter: %d\n", init_static.m_counter);
56  ok(init_static.m_uninit == 1, "init_static.m_uninit: %d\n", init_static.m_uninit);
57 }
58 
59 static
60 VOID
62 {
63 #if defined(TEST_MSVCRT)
64  const PCWSTR DllName = L"msvcrt_crt_dll_startup.dll";
65 #elif defined(TEST_STATIC_CRT)
66  const PCWSTR DllName = L"static_crt_dll_startup.dll";
67 #else
68 #error This test only makes sense for static CRT and msvcrt.dll
69 #endif
72  wcsrchr(DllPath, L'\\')[1] = UNICODE_NULL;
74 
76  if (hDll == NULL)
77  {
78  skip("Helper dll not found\n");
79  return;
80  }
81  SET_COUNTER_VALUES_POINTER *pSetCounterValuesPointer = reinterpret_cast<SET_COUNTER_VALUES_POINTER*>(GetProcAddress(hDll, "SetCounterValuesPointer"));
82  if (pSetCounterValuesPointer == NULL)
83  {
84  skip("Helper function not found\n");
85  FreeLibrary(hDll);
86  return;
87  }
89  pSetCounterValuesPointer(&values);
90  ok(values.m_uninit_at_startup == 0, "m_uninit_at_startup = %d\n", values.m_uninit_at_startup);
91  ok(values.m_uninit == 1, "m_uninit = %d\n", values.m_uninit);
92  ok(values.m_counter == 2, "m_counter = %d\n", values.m_counter);
93  ok(values.static_construct_counter_at_startup == 5656, "static_construct_counter_at_startup = %d\n", values.static_construct_counter_at_startup);
94  ok(values.static_construct_counter == 5657, "static_construct_counter = %d\n", values.static_construct_counter);
95  ok(values.dtor_counter_at_detach == 0, "dtor_counter_at_detach = %d\n", values.dtor_counter_at_detach);
96  ok(values.dtor_counter == 0, "dtor_counter = %d\n", values.dtor_counter);
97  values.dtor_counter_at_detach = 78789;
98  values.dtor_counter = 7878;
99  FreeLibrary(hDll);
100  ok(values.m_uninit_at_startup == 0, "m_uninit_at_startup = %d\n", values.m_uninit_at_startup);
101  ok(values.m_uninit == 1, "m_uninit = %d\n", values.m_uninit);
102  ok(values.m_counter == 2, "m_counter = %d\n", values.m_counter);
103  ok(values.static_construct_counter_at_startup == 5656, "static_construct_counter_at_startup = %d\n", values.static_construct_counter_at_startup);
104  ok(values.static_construct_counter == 5657, "static_construct_counter = %d\n", values.static_construct_counter);
105  ok(values.dtor_counter_at_detach == 7878, "dtor_counter_at_detach = %d\n", values.dtor_counter_at_detach);
106  ok(values.dtor_counter == 7879, "dtor_counter = %d\n", values.dtor_counter);
107 }
108 
110 {
113 };
114 
118 
119 #define MAPPING_NAME L"crt_apitest_static_construct"
120 
121 static void map_memory()
122 {
123  if (g_FileMapping)
124  return;
125 
127  if (g_FileMapping)
128  {
130  }
131  else
132  {
135  }
136  if (g_FileMapping == NULL)
137  {
138  skip("Could not map shared memory\n");
139  return;
140  }
141  g_Memory = static_cast<shared_memory*>(MapViewOfFile(g_FileMapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(shared_memory)));
142  if (g_Memory == NULL)
143  {
144  skip("Could not map view of shared memory\n");
147  }
150 }
151 
152 static void unmap_memory()
153 {
154  // we do not clean the mapping in the child, since we want to count all dtor's!
156  {
159  g_Memory = NULL;
161  }
162 }
163 
164 static struct shared_mem_static
165 {
167  {
168  map_memory();
169  if (g_Memory)
170  g_Memory->init_count++;
171  }
172 
174  {
175  if (g_Memory)
177  unmap_memory();
178  }
179 
181 
182 static
183 VOID
185 {
186  ok(g_Memory != NULL, "Expected the mapping to be in place\n");
187  ok(g_CreatedFileMapping == TRUE, "Expected to create a new shared section!\n");
188  if (g_Memory == NULL)
189  {
190  skip("Can't proceed without file mapping\n");
191  return;
192  }
193  ok(g_Memory->init_count == 1, "Expected init_count to be 1, was: %d\n", g_Memory->init_count);
194  ok(g_Memory->uninit_count == 0, "Expected uninit_count to be 0, was: %d\n", g_Memory->uninit_count);
195 
197  // we just need an extra argument to tell the test it's only running to increment the dtor count :)
199  WCHAR buf[MAX_PATH+40];
200  StringCchPrintfW(buf, _countof(buf), L"\"%ls\" static_construct dummy", path);
201 
202  STARTUPINFOW si = { sizeof(si) };
204  BOOL created = CreateProcessW(NULL, buf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
205  ok(created, "Expected CreateProcess to succeed\n");
206  if (created)
207  {
209  CloseHandle(pi.hThread);
210  CloseHandle(pi.hProcess);
211  ok(g_Memory->init_count == 2, "Expected init_count to be 2, was: %d\n", g_Memory->init_count);
212  ok(g_Memory->uninit_count == 1, "Expected uninit_count to be 1, was: %d\n", g_Memory->uninit_count);
213  }
214 }
215 
216 START_TEST(static_construct)
217 {
218  char **argv;
220 
221  if (argc >= 3)
222  {
223  // we are just here to increment the reference count in the shared section!
224  ok(g_Memory != NULL, "Expected the shared memory to be mapped!\n");
225  ok(g_CreatedFileMapping == FALSE, "Expected the shared memory to be created by my parent!\n");
226  return;
227  }
228 
229  TestInitStatic();
230  TestDllStartup();
232 }
void WINAPI SET_COUNTER_VALUES_POINTER(_Out_ struct counter_values *pcv)
Definition: dll_startup.h:24
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:609
static int argc
Definition: ServiceArgs.c:12
const uint16_t * PCWSTR
Definition: typedefs.h:55
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:398
static int static_init_counter_at_startup
#define MapViewOfFile
Definition: compat.h:402
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
static struct init_static init_static
#define MAPPING_NAME
#define _countof(array)
Definition: fontsub.cpp:30
GLboolean GLenum GLenum GLvoid * values
Definition: glext.h:5666
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
#define ZeroMemory
Definition: winbase.h:1642
int static_init_counter
Definition: static_init.c:12
#define argv
Definition: mplay32.c:18
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
#define UNICODE_NULL
unsigned int BOOL
Definition: ntddk_ex.h:94
static int m_uninit_at_startup
static VOID TestDllStartup(VOID)
#define LoadLibraryW(x)
Definition: compat.h:404
smooth NULL
Definition: ftsmooth.c:416
#define FILE_MAP_ALL_ACCESS
Definition: winbase.h:156
_Check_return_ _CRTIMP _CONST_RETURN wchar_t *__cdecl wcsrchr(_In_z_ const wchar_t *_Str, _In_ wchar_t _Ch)
static BOOL g_CreatedFileMapping
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4593
static HANDLE g_FileMapping
#define FreeLibrary(x)
Definition: compat.h:405
static VOID TestInitStatic(VOID)
START_TEST(static_construct)
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:401
#define MAX_PATH
Definition: compat.h:26
int winetest_get_mainargs(char ***pargv)
static DWORD pi
Definition: protocol.c:150
static const WCHAR L[]
Definition: oid.c:1250
HANDLE NTAPI OpenFileMappingW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName)
Definition: filemap.c:297
void winetest_wait_child_process(HANDLE process)
static int static_construct_counter_at_startup
static VOID TestStaticDestruct(VOID)
static const char const char * DllPath
Definition: image.c:34
#define ok(value,...)
Definition: atltest.h:57
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
Definition: services.c:325
static void unmap_memory()
#define skip(...)
Definition: atltest.h:64
static shared_memory * g_Memory
#define GetProcAddress(x, y)
Definition: compat.h:410
#define UnmapViewOfFile
Definition: compat.h:403
static struct shared_mem_static shared_mem_static
static void map_memory()
int static_construct_counter
#define PAGE_READWRITE
Definition: nt_native.h:1304