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>
11 #include "dll_startup.h"
15 extern int static_init_counter
;
17 static int static_init_counter_at_startup
;
18 static int static_construct_counter_at_startup
;
19 static int m_uninit_at_startup
;
21 int static_construct_counter
= 789;
24 static struct init_static
32 static_init_counter_at_startup
= static_init_counter
;
33 static_construct_counter_at_startup
= static_construct_counter
;
34 m_uninit_at_startup
= m_uninit
;
35 static_construct_counter
++;
44 ok(static_init_counter_at_startup
== 123, "static_init_counter at startup: %d\n", static_init_counter_at_startup
);
45 ok(static_construct_counter_at_startup
== 789, "static_construct_counter at startup: %d\n", static_construct_counter_at_startup
);
46 ok(m_uninit_at_startup
== 0, "init_static.m_uninit at startup: %d\n", m_uninit_at_startup
);
48 ok(static_init_counter
== 123, "static_init_counter: %d\n", static_init_counter
);
50 ok(static_construct_counter
== 790, "static_construct_counter: %d\n", static_construct_counter
);
51 ok(init_static
.m_counter
== 2, "init_static.m_counter: %d\n", init_static
.m_counter
);
52 ok(init_static
.m_uninit
== 1, "init_static.m_uninit: %d\n", init_static
.m_uninit
);
59 #if defined(TEST_MSVCRT)
60 const PCWSTR DllName
= L
"msvcrt_crt_dll_startup.dll";
61 #elif defined(TEST_STATIC_CRT)
62 const PCWSTR DllName
= L
"static_crt_dll_startup.dll";
64 #error This test only makes sense for static CRT and msvcrt.dll
66 WCHAR DllPath
[MAX_PATH
];
67 GetModuleFileNameW(NULL
, DllPath
, _countof(DllPath
));
68 wcsrchr(DllPath
, L
'\\')[1] = UNICODE_NULL
;
69 StringCchCatW(DllPath
, _countof(DllPath
), DllName
);
71 HMODULE hDll
= LoadLibraryW(DllPath
);
74 skip("Helper dll not found\n");
77 SET_COUNTER_VALUES_POINTER
*pSetCounterValuesPointer
= reinterpret_cast<SET_COUNTER_VALUES_POINTER
*>(GetProcAddress(hDll
, "SetCounterValuesPointer"));
78 if (pSetCounterValuesPointer
== NULL
)
80 skip("Helper function not found\n");
84 counter_values values
;
85 pSetCounterValuesPointer(&values
);
86 ok(values
.m_uninit_at_startup
== 0, "m_uninit_at_startup = %d\n", values
.m_uninit_at_startup
);
87 ok(values
.m_uninit
== 1, "m_uninit = %d\n", values
.m_uninit
);
88 ok(values
.m_counter
== 2, "m_counter = %d\n", values
.m_counter
);
89 ok(values
.static_construct_counter_at_startup
== 5656, "static_construct_counter_at_startup = %d\n", values
.static_construct_counter_at_startup
);
90 ok(values
.static_construct_counter
== 5657, "static_construct_counter = %d\n", values
.static_construct_counter
);
91 ok(values
.dtor_counter_at_detach
== 0, "dtor_counter_at_detach = %d\n", values
.dtor_counter_at_detach
);
92 ok(values
.dtor_counter
== 0, "dtor_counter = %d\n", values
.dtor_counter
);
93 values
.dtor_counter_at_detach
= 78789;
94 values
.dtor_counter
= 7878;
96 ok(values
.m_uninit_at_startup
== 0, "m_uninit_at_startup = %d\n", values
.m_uninit_at_startup
);
97 ok(values
.m_uninit
== 1, "m_uninit = %d\n", values
.m_uninit
);
98 ok(values
.m_counter
== 2, "m_counter = %d\n", values
.m_counter
);
99 ok(values
.static_construct_counter_at_startup
== 5656, "static_construct_counter_at_startup = %d\n", values
.static_construct_counter_at_startup
);
100 ok(values
.static_construct_counter
== 5657, "static_construct_counter = %d\n", values
.static_construct_counter
);
101 ok(values
.dtor_counter_at_detach
== 7878, "dtor_counter_at_detach = %d\n", values
.dtor_counter_at_detach
);
102 ok(values
.dtor_counter
== 7879, "dtor_counter = %d\n", values
.dtor_counter
);
111 static HANDLE g_FileMapping
= NULL
;
112 static BOOL g_CreatedFileMapping
= FALSE
;
113 static shared_memory
* g_Memory
= NULL
;
115 #define MAPPING_NAME L"crt_apitest_static_construct"
117 static void map_memory()
122 g_FileMapping
= OpenFileMappingW(FILE_MAP_ALL_ACCESS
, FALSE
, MAPPING_NAME
);
125 g_CreatedFileMapping
= FALSE
;
129 g_FileMapping
= CreateFileMappingW(INVALID_HANDLE_VALUE
, NULL
, PAGE_READWRITE
, 0, sizeof(shared_memory
), MAPPING_NAME
);
130 g_CreatedFileMapping
= TRUE
;
132 if (g_FileMapping
== NULL
)
134 skip("Could not map shared memory\n");
137 g_Memory
= static_cast<shared_memory
*>(MapViewOfFile(g_FileMapping
, FILE_MAP_ALL_ACCESS
, 0, 0, sizeof(shared_memory
)));
138 if (g_Memory
== NULL
)
140 skip("Could not map view of shared memory\n");
141 CloseHandle(g_FileMapping
);
142 g_FileMapping
= NULL
;
144 if (g_CreatedFileMapping
)
145 ZeroMemory(g_Memory
, sizeof(shared_memory
));
148 static void unmap_memory()
150 // we do not clean the mapping in the child, since we want to count all dtor's!
151 if (g_FileMapping
&& g_CreatedFileMapping
)
153 UnmapViewOfFile(g_Memory
);
154 CloseHandle(g_FileMapping
);
156 g_FileMapping
= NULL
;
160 static struct shared_mem_static
166 g_Memory
->init_count
++;
172 g_Memory
->uninit_count
++;
180 TestStaticDestruct(VOID
)
182 ok(g_Memory
!= NULL
, "Expected the mapping to be in place\n");
183 ok(g_CreatedFileMapping
== TRUE
, "Expected to create a new shared section!\n");
184 if (g_Memory
== NULL
)
186 skip("Can't proceed without file mapping\n");
189 ok(g_Memory
->init_count
== 1, "Expected init_count to be 1, was: %d\n", g_Memory
->init_count
);
190 ok(g_Memory
->uninit_count
== 0, "Expected uninit_count to be 0, was: %d\n", g_Memory
->uninit_count
);
192 WCHAR path
[MAX_PATH
];
193 // we just need an extra argument to tell the test it's only running to increment the dtor count :)
194 GetModuleFileNameW(NULL
, path
, _countof(path
));
195 WCHAR buf
[MAX_PATH
+40];
196 StringCchPrintfW(buf
, _countof(buf
), L
"\"%ls\" static_construct dummy", path
);
198 STARTUPINFOW si
= { sizeof(si
) };
199 PROCESS_INFORMATION pi
;
200 BOOL created
= CreateProcessW(NULL
, buf
, NULL
, NULL
, FALSE
, 0, NULL
, NULL
, &si
, &pi
);
201 ok(created
, "Expected CreateProcess to succeed\n");
204 winetest_wait_child_process(pi
.hProcess
);
205 CloseHandle(pi
.hThread
);
206 CloseHandle(pi
.hProcess
);
207 ok(g_Memory
->init_count
== 2, "Expected init_count to be 2, was: %d\n", g_Memory
->init_count
);
208 ok(g_Memory
->uninit_count
== 1, "Expected uninit_count to be 1, was: %d\n", g_Memory
->uninit_count
);
212 START_TEST(static_construct
)
215 int argc
= winetest_get_mainargs(&argv
);
219 // we are just here to increment the reference count in the shared section!
220 ok(g_Memory
!= NULL
, "Expected the shared memory to be mapped!\n");
221 ok(g_CreatedFileMapping
== FALSE
, "Expected the shared memory to be created by my parent!\n");
227 TestStaticDestruct();