The official name (shown by --list) has no path nor extension.
Signed-off-by: Francois Gouget fgouget@codeweavers.com --- dlls/kernel32/tests/process.c | 68 +++++++++++++++++----------------- dlls/kernel32/tests/toolhelp.c | 2 +- 2 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 323f8092d72..8e80bdba3a9 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -613,7 +613,7 @@ static void test_Startup(void) startup.wShowWindow = SW_SHOWNORMAL;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -653,7 +653,7 @@ static void test_Startup(void) startup.dwFillAttribute = 0xA55A;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -693,7 +693,7 @@ static void test_Startup(void) startup.dwFillAttribute = 0xA55A;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -733,7 +733,7 @@ static void test_Startup(void) startup.dwFillAttribute = 0xA55A;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -773,7 +773,7 @@ static void test_Startup(void) startup.dwFillAttribute = 0xA55A;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -815,7 +815,7 @@ static void test_Startup(void) startup.dwFillAttribute = 0xA55A;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -855,7 +855,7 @@ static void test_Startup(void) startup.dwFillAttribute = 0xA55A;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -897,7 +897,7 @@ static void test_CommandLine(void)
/* the basics */ get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s" "C:\Program Files\my nice app.exe" """"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s" "C:\Program Files\my nice app.exe" """"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -921,7 +921,7 @@ static void test_CommandLine(void)
/* test main()'s quotes handling */ get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s" "a\"b\\" c\" d", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s" "a\"b\\" c\" d", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -942,7 +942,7 @@ static void test_CommandLine(void) /* Test for Bug1330 to show that XP doesn't change '/' to '\' in argv[0]*/ get_file_name(resfile); /* Use exename to avoid buffer containing things like 'C:' */ - sprintf(buffer, "./%s tests/process.c dump "%s" "a\"b\\" c\" d", exename, resfile); + sprintf(buffer, "./%s process dump "%s" "a\"b\\" c\" d", exename, resfile); SetLastError(0xdeadbeef); ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); ok(ret, "CreateProcess (%s) failed : %d\n", buffer, GetLastError()); @@ -959,7 +959,7 @@ static void test_CommandLine(void)
get_file_name(resfile); /* Use exename to avoid buffer containing things like 'C:' */ - sprintf(buffer, ".\%s tests/process.c dump "%s" "a\"b\\" c\" d", exename, resfile); + sprintf(buffer, ".\%s process dump "%s" "a\"b\\" c\" d", exename, resfile); SetLastError(0xdeadbeef); ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); ok(ret, "CreateProcess (%s) failed : %d\n", buffer, GetLastError()); @@ -980,8 +980,8 @@ static void test_CommandLine(void) *(lpFilePart -1 ) = 0; p = strrchr(fullpath, '\'); /* Use exename to avoid buffer containing things like 'C:' */ - if (p) sprintf(buffer, "..%s/%s tests/process.c dump "%s" "a\"b\\" c\" d", p, exename, resfile); - else sprintf(buffer, "./%s tests/process.c dump "%s" "a\"b\\" c\" d", exename, resfile); + if (p) sprintf(buffer, "..%s/%s process dump "%s" "a\"b\\" c\" d", p, exename, resfile); + else sprintf(buffer, "./%s process dump "%s" "a\"b\\" c\" d", exename, resfile); SetLastError(0xdeadbeef); ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); ok(ret, "CreateProcess (%s) failed : %d\n", buffer, GetLastError()); @@ -1006,7 +1006,7 @@ static void test_CommandLine(void) /* Use exename to avoid buffer containing things like 'C:' */ if (p) sprintf(buffer, "..%s/%s", p, exename); else sprintf(buffer, "./%s", exename); - sprintf(buffer2, "dummy tests/process.c dump "%s" "a\"b\\" c\" d", resfile); + sprintf(buffer2, "dummy process dump "%s" "a\"b\\" c\" d", resfile); SetLastError(0xdeadbeef); ret = CreateProcessA(buffer, buffer2, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); ok(ret, "CreateProcess (%s) failed : %d\n", buffer, GetLastError()); @@ -1016,7 +1016,7 @@ static void test_CommandLine(void) WritePrivateProfileStringA(NULL, NULL, NULL, resfile); CloseHandle(info.hThread); CloseHandle(info.hProcess); - sprintf(buffer, "tests/process.c dump %s", resfile); + sprintf(buffer, "process dump %s", resfile); okChildString("Arguments", "argvA0", "dummy"); okChildString("Arguments", "CommandLineA", buffer2); okChildStringWA("Arguments", "CommandLineW", buffer2); @@ -1106,7 +1106,7 @@ static void test_Directory(void)
/* the basics */ get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); GetWindowsDirectoryA( windir, sizeof(windir) ); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, windir, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ @@ -1152,7 +1152,7 @@ static void test_Toolhelp(void) startup.wShowWindow = SW_SHOWNORMAL;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess failed\n"); ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); CloseHandle(info.hProcess); @@ -1170,7 +1170,7 @@ static void test_Toolhelp(void) DeleteFileA(resfile);
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c nested "%s"", selfname, resfile); + sprintf(buffer, ""%s" process nested "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess failed\n"); ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n");
@@ -1323,7 +1323,7 @@ static void test_Environment(void)
/* the basics */ get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to terminate */ ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -1342,7 +1342,7 @@ static void test_Environment(void)
/* the basics */ get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile);
child_env_len = 0; ptr = env; @@ -1410,7 +1410,7 @@ static void test_SuspendFlag(void) startup.wShowWindow = SW_SHOWNORMAL;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startup, &info), "CreateProcess\n");
ok(GetExitCodeThread(info.hThread, &exit_status) && exit_status == STILL_ACTIVE, "thread still running\n"); @@ -1460,7 +1460,7 @@ static void test_DebuggingFlag(void) startup.wShowWindow = SW_SHOWNORMAL;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, DEBUG_PROCESS, NULL, NULL, &startup, &info), "CreateProcess\n");
/* get all startup events up to the entry point break exception */ @@ -1558,7 +1558,7 @@ static void test_Console(void) cpOut = GetConsoleOutputCP();
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s" console", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s" console", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &info), "CreateProcess\n");
/* wait for child to terminate */ @@ -1672,7 +1672,7 @@ static void test_Console(void) startup.hStdError = hChildOutInh;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s" stdhandle", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s" stdhandle", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &startup, &info), "CreateProcess\n"); ok(CloseHandle(hChildInInh), "Closing handle\n"); ok(CloseHandle(hChildOutInh), "Closing handle\n"); @@ -1712,7 +1712,7 @@ static void test_ExitCode(void) startup.wShowWindow = SW_SHOWNORMAL;
get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s" exit_code", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s" exit_code", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &info), "CreateProcess\n");
/* wait for child to terminate */ @@ -2418,7 +2418,7 @@ static void _create_process(int line, const char *command, LPPROCESS_INFORMATION char buffer[MAX_PATH + 19]; STARTUPINFOA si = {0};
- sprintf(buffer, ""%s" tests/process.c %s", selfname, command); + sprintf(buffer, ""%s" process %s", selfname, command);
ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, pi); ok_(__FILE__, line)(ret, "CreateProcess error %u\n", GetLastError()); @@ -2842,7 +2842,7 @@ static void test_jobInheritance(HANDLE job) return; }
- sprintf(buffer, ""%s" tests/process.c %s", selfname, "exit"); + sprintf(buffer, ""%s" process %s", selfname, "exit");
ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); ok(ret, "CreateProcessA error %u\n", GetLastError()); @@ -2874,7 +2874,7 @@ static void test_BreakawayOk(HANDLE job) return; }
- sprintf(buffer, ""%s" tests/process.c %s", selfname, "exit"); + sprintf(buffer, ""%s" process %s", selfname, "exit");
ret = CreateProcessA(NULL, buffer, NULL, NULL, FALSE, CREATE_BREAKAWAY_FROM_JOB, NULL, NULL, &si, &pi); ok(!ret, "CreateProcessA expected failure\n"); @@ -2943,7 +2943,7 @@ static void test_StartupNoConsole(void) startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = SW_SHOWNORMAL; get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &startup, &info), "CreateProcess\n"); ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -2975,7 +2975,7 @@ static void test_DetachConsoleHandles(void) startup.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); startup.hStdError = GetStdHandle(STD_ERROR_HANDLE); get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile); ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, DETACHED_PROCESS, NULL, NULL, &startup, &info), "CreateProcess\n"); ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, "Child process termination\n"); @@ -3404,7 +3404,7 @@ static void test_DetachStdHandles(void) startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = SW_SHOWNORMAL; get_file_name(resfile); - sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, resfile); + sprintf(buffer, ""%s" process dump "%s"", selfname, resfile);
SetStdHandle(STD_INPUT_HANDLE, htemp); SetStdHandle(STD_OUTPUT_HANDLE, htemp); @@ -3889,7 +3889,7 @@ void test_parent_process_attribute(unsigned int level, HANDLE read_pipe) ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got unexpected ret %#x, GetLastError() %u.\n", ret, GetLastError());
- sprintf(buffer, ""%s" tests/process.c parent %u %p", selfname, 255, read_pipe); + sprintf(buffer, ""%s" process parent %u %p", selfname, 255, read_pipe);
#if 0 /* Crashes on some Windows installations, otherwise successfully creates process. */ @@ -3977,7 +3977,7 @@ void test_parent_process_attribute(unsigned int level, HANDLE read_pipe) ok(ret, "Got unexpected ret %#x, GetLastError() %u.\n", ret, GetLastError()); }
- sprintf(buffer, ""%s" tests/process.c parent %u %p", selfname, level + 1, read_pipe); + sprintf(buffer, ""%s" process parent %u %p", selfname, level + 1, read_pipe); ret = CreateProcessA(NULL, buffer, NULL, NULL, level == 1, level == 1 ? EXTENDED_STARTUPINFO_PRESENT : 0, NULL, NULL, (STARTUPINFOA *)&si, &info); ok(ret, "Got unexpected ret %#x, GetLastError() %u.\n", ret, GetLastError()); @@ -4043,7 +4043,7 @@ START_TEST(process) startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = SW_SHOWNORMAL;
- sprintf(buffer, ""%s" tests/process.c dump "%s"", selfname, myARGV[3]); + sprintf(buffer, ""%s" process dump "%s"", selfname, myARGV[3]); ok(CreateProcessA(NULL, buffer, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &startup, &info), "CreateProcess failed\n"); CloseHandle(info.hProcess); CloseHandle(info.hThread); diff --git a/dlls/kernel32/tests/toolhelp.c b/dlls/kernel32/tests/toolhelp.c index eb9a6759914..159d71a20cd 100644 --- a/dlls/kernel32/tests/toolhelp.c +++ b/dlls/kernel32/tests/toolhelp.c @@ -325,7 +325,7 @@ START_TEST(toolhelp) startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = SW_SHOWNORMAL;
- sprintf(buffer, "%s tests/toolhelp.c %lu %lu", selfname, (DWORD_PTR)ev1, (DWORD_PTR)ev2); + sprintf(buffer, "%s toolhelp %lu %lu", selfname, (DWORD_PTR)ev1, (DWORD_PTR)ev2); ok(CreateProcessA(NULL, buffer, NULL, NULL, TRUE, 0, NULL, NULL, &startup, &info), "CreateProcess\n"); /* wait for child to be initialized */ w = WaitForSingleObject(ev1, WAIT_TIME);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=65601
Your paranoid android.
=== w1064v1507 (32 bit report) ===
kernel32: process.c:2856: Test failed: WaitForSingleObjectk ereturned 258
On Fri, 21 Feb 2020, Marvin wrote: [...]
=== w1064v1507 (32 bit report) ===
kernel32: 0e30:process: 1 tests exe0ecuted98:process : 1 tests execu(te0d (m0 marked as todo, 0 failures), 0a srkipped. process.c:2856: Test failed: WaitForSingleObjectk ereturned 258
This looks like a random failure in the Job tests.
On the one hand there is no occurence of this issue on test.winehq.org which would suggest it's new (all we have there is Toolhelp and cursor position failures).
https://test.winehq.org/data/tests/kernel32:process.html
But a rerun of this patch shows no failure:
https://testbot.winehq.org/JobDetails.pl?Key=65603
Besides the race condition, the important point is the timeout which occurred in test_jobInheritance():
process.c:2856: Test failed: WaitForSingleObjectk ereturned 258
But I don't know more precisely what happened.
So I managed to reproduce this failure: https://testbot.winehq.org/JobDetails.pl?Key=65628
First ignore the w7pro64 failures: it seems one cannot run the job tests twice in a row on Windows 7, presumably because some missing cleanup isses. So these are not interesting here.
Also I get 3 failures out of 9 Windows 10 runs, where each goes through the job tests 10 times. So that's a failure rate of 3.3%. That seems inconsistent with the test.winehq.org results: it has between 40 times 10 (newtb*) and 40 times 16 (newtb*+cw*) WineTest runs and none shows this failure, putting the failure rate below 0.25%.
This job is also not sufficient to prove that the issue is specific to Windows 10: it does not have enough Windows 8 runs to get a statistically significant result. test.winehq.org has between 40*2 (newtb*) and 40*5 (newtb*+cw*) WineTest runs which still seems inconsistent with a 3% failure rate.
So although there's not really definitive proof, it looks like this may be specific to standalone kernel32:process runs on Windows 10.
Timeout -------
The timeouts happened on the 1st or 2nd round while waiting for 'kernel32_test.exe process exit': * 1x WaitForSingleObject(1s) of test_jobInheritance() * 2x WaitForSingleObject(1s) of test_QueryInformationJobObject()
'process exit' has a 0.1s sleep which may not be strictly necessary. Still there is no clear reason for it to not complete within the imparted 1s.
So I suspect something delayed 'process exit' either within the VM or outside it.
* An out-of-VM troublemaker should be decorrelated from the in-VM activity and thus hit WineTest and any kernel32:process job tests pass with equal frequency... except if it's something related to the VM revert / startup (e.g. SSD garbage collecting after the revert I/O peak).
* Normally all in-VM troublemakers such as Windows Update, Defender, Search are disabled [1]. Maybe there's still something running shortly after the VM's clock gets changed that causes trouble.
Options: * The simplest would be to increase the timeout to 2s for instance? This should have essentially no impact on run time since we should not hit the timeout in most cases.
* Automatically rerun any wine-dev task that has failures, hoping that it will not fail on the second run.
This would not be specific to this kernel32:process issue. The drawbacks are that: - This risks letting in any test that fails less than 50% of the time. - This would delay emails notifying that a patch causes new failures. - This would increase the TestBot load somewhat but that would likely be manageable.
I would also argue that this is not really necessary: - Now that intermittently failing tests are properly accounted for this case should be quite rare. - When this happens one can simply analyze the test (and fix it?) and rerun the patch manually or resubmit it through wine-devel to prove the failure was an unrelated fluke.
Conversely some timeouts are pretty high: 30s and 60s. Presumably we hope they will never happen. There is also a 1s Sleep(1000) which I don't really see the relevance of (in test_SuspendFlag()).
Trace mangling --------------
Two of the timeouts happened in the absence of trace mangling. So the two issues seem unrelated.
The processes involved in the trace mangling are:
* w1064v1709 x3+, w1064v1607 x2, w1064v1809_fr x1 the last 'process exit' started by test_WaitForJobObject() polluting the 'not waited for' parent trace -> This proves test_WaitForJobObject() is buggy.
* w1064v1709 x1 'process exit' started by test_jobInheritance() polluting the WaitForSingleObject() timeout failure for that same process in the parent. -> The only way to avoid that is to avoid the timeout?
[1] Here are the full notes for the base 1507 snapshot:
Windows 10 1507 64-bit Home Edition. Uses a SCSI disk (0.1.164), e1000 network card, ich6 sound card, VGA graphics card. Disabled the screensaver, disk and computer suspend, Windows update, Windows defender, Windows search, restoration points, defragmentation, telemetry and the CEIP, hibernation, swap, time of last access (fsutil behavior set disablelastaccess 1). Added optional DirectX components. Autologin and TestAgent 1.7 autostart.
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU] "NoAutoUpdate"=DWORD:1 "AUOptions"=DWORD:2