Module: wine Branch: master Commit: f90a32d5abf04bfc3a2249662f25f1d4aab9850c URL: https://source.winehq.org/git/wine.git/?a=commit;h=f90a32d5abf04bfc3a2249662...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Jul 9 18:03:29 2018 +0200
ucrtbase: Report child process test failures in exit() tests.
Signed-off-by: Piotr Caban piotr@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ucrtbase/tests/misc.c | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/dlls/ucrtbase/tests/misc.c b/dlls/ucrtbase/tests/misc.c index 99b9fd2..fad9311 100644 --- a/dlls/ucrtbase/tests/misc.c +++ b/dlls/ucrtbase/tests/misc.c @@ -769,16 +769,41 @@ static void test_asctime(void) ok(!strcmp(ret, "Thu Jan 1 00:00:00 1970\n"), "asctime returned %s\n", ret); }
+static LONG* get_failures_counter(HANDLE *map) +{ + *map = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, + 0, sizeof(LONG), "winetest_failures_counter"); + return MapViewOfFile(*map, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(LONG)); +} + +static void free_failures_counter(LONG *mem, HANDLE map) +{ + UnmapViewOfFile(mem); + CloseHandle(map); +} + +static void set_failures_counter(LONG add) +{ + HANDLE failures_map; + LONG *failures; + + failures = get_failures_counter(&failures_map); + *failures = add; + free_failures_counter(failures, failures_map); +} + static void test_exit(const char *argv0) { PROCESS_INFORMATION proc; STARTUPINFOA startup = {0}; char path[MAX_PATH]; - HANDLE exit_event; + HANDLE failures_map, exit_event; + LONG *failures; DWORD ret;
exit_event = CreateEventA(NULL, FALSE, FALSE, "exit_event");
+ failures = get_failures_counter(&failures_map); sprintf(path, "%s misc exit", argv0); startup.cb = sizeof(startup); CreateProcessA(NULL, path, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &proc); @@ -788,6 +813,9 @@ static void test_exit(const char *argv0) ok(ret == 1, "child process exited with code %d\n", ret); CloseHandle(proc.hProcess); CloseHandle(proc.hThread); + ok(!*failures, "%d tests failed in child process\n", *failures); + free_failures_counter(failures, failures_map); +
ret = WaitForSingleObject(exit_event, 0); ok(ret == WAIT_OBJECT_0, "exit_event was not set (%x)\n", ret); @@ -805,18 +833,21 @@ static void CDECL at_exit_func1(void) atexit_called++; SetEvent(exit_event); CloseHandle(exit_event); + set_failures_counter(winetest_get_failures()); }
static void CDECL at_exit_func2(void) { ok(!atexit_called, "atexit_called = %d\n", atexit_called); atexit_called++; + set_failures_counter(winetest_get_failures()); }
static void test_call_exit(void) { ok(!p__crt_atexit(at_exit_func1), "_crt_atexit failed\n"); ok(!p__crt_atexit(at_exit_func2), "_crt_atexit failed\n"); + set_failures_counter(winetest_get_failures()); p_exit(1); }