kernel32/tests: Add a test for async cancellation due to process exit.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
f870cf9282
commit
4eddeff18a
|
@ -4116,6 +4116,66 @@ static void test_GetOverlappedResultEx(void)
|
||||||
CloseHandle(server);
|
CloseHandle(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void child_process_exit_process_async(DWORD parent_pid, HANDLE parent_pipe)
|
||||||
|
{
|
||||||
|
OVERLAPPED overlapped = {0};
|
||||||
|
static char buffer[1];
|
||||||
|
HANDLE parent, pipe;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
parent = OpenProcess(PROCESS_DUP_HANDLE, FALSE, parent_pid);
|
||||||
|
ok(!!parent, "got parent %p\n", parent);
|
||||||
|
|
||||||
|
ret = DuplicateHandle(parent, parent_pipe, GetCurrentProcess(), &pipe, 0,
|
||||||
|
FALSE, DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE);
|
||||||
|
ok(ret, "got error %u\n", GetLastError());
|
||||||
|
|
||||||
|
overlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL);
|
||||||
|
|
||||||
|
ret = ReadFile(pipe, buffer, sizeof(buffer), NULL, &overlapped);
|
||||||
|
ok(!ret, "expected failure\n");
|
||||||
|
ok(GetLastError() == ERROR_IO_PENDING, "got error %u\n", GetLastError());
|
||||||
|
|
||||||
|
/* exit without closing the pipe handle */
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_exit_process_async(void)
|
||||||
|
{
|
||||||
|
HANDLE client, server, port;
|
||||||
|
OVERLAPPED *overlapped;
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
STARTUPINFOA si = {0};
|
||||||
|
char cmdline[300];
|
||||||
|
ULONG_PTR key;
|
||||||
|
char **argv;
|
||||||
|
DWORD size;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
|
winetest_get_mainargs(&argv);
|
||||||
|
|
||||||
|
create_overlapped_pipe(PIPE_TYPE_BYTE, &client, &server);
|
||||||
|
port = CreateIoCompletionPort(client, NULL, 123, 0);
|
||||||
|
|
||||||
|
sprintf(cmdline, "%s pipe exit_process_async %x %p", argv[0], GetCurrentProcessId(), client);
|
||||||
|
ret = CreateProcessA(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
|
||||||
|
ok(ret, "got error %u\n", GetLastError());
|
||||||
|
ret = WaitForSingleObject(pi.hProcess, 1000);
|
||||||
|
ok(!ret, "wait timed out\n");
|
||||||
|
CloseHandle(pi.hThread);
|
||||||
|
CloseHandle(pi.hProcess);
|
||||||
|
|
||||||
|
key = 0xdeadbeef;
|
||||||
|
size = 0xdeadbeef;
|
||||||
|
ret = GetQueuedCompletionStatus(port, &size, &key, &overlapped, 1000);
|
||||||
|
ok(!ret, "expected failure\n");
|
||||||
|
todo_wine ok(GetLastError() == ERROR_OPERATION_ABORTED, "got error %u\n", GetLastError());
|
||||||
|
todo_wine ok(!size, "got size %u\n", size);
|
||||||
|
todo_wine ok(key == 123, "got key %Iu\n", key);
|
||||||
|
|
||||||
|
CloseHandle(port);
|
||||||
|
CloseHandle(server);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(pipe)
|
START_TEST(pipe)
|
||||||
{
|
{
|
||||||
char **argv;
|
char **argv;
|
||||||
|
@ -4158,6 +4218,15 @@ START_TEST(pipe)
|
||||||
child_process_check_session_id(id);
|
child_process_check_session_id(id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(argv[2], "exit_process_async"))
|
||||||
|
{
|
||||||
|
HANDLE handle;
|
||||||
|
DWORD pid;
|
||||||
|
sscanf(argv[3], "%x", &pid);
|
||||||
|
sscanf(argv[4], "%p", &handle);
|
||||||
|
child_process_exit_process_async(pid, handle);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_DisconnectNamedPipe())
|
if (test_DisconnectNamedPipe())
|
||||||
|
@ -4186,4 +4255,5 @@ START_TEST(pipe)
|
||||||
test_nowait(PIPE_TYPE_BYTE);
|
test_nowait(PIPE_TYPE_BYTE);
|
||||||
test_nowait(PIPE_TYPE_MESSAGE);
|
test_nowait(PIPE_TYPE_MESSAGE);
|
||||||
test_GetOverlappedResultEx();
|
test_GetOverlappedResultEx();
|
||||||
|
test_exit_process_async();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue