Sebastian Lackner : kernel32/tests: Add tests for waiting on an job object.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Apr 7 10:11:28 CDT 2015


Module: wine
Branch: master
Commit: 7984fb9fbe881b596d58c6dfa10d853ab0d06b6a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7984fb9fbe881b596d58c6dfa10d853ab0d06b6a

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Fri Apr  3 17:20:05 2015 +1100

kernel32/tests: Add tests for waiting on an job object.

---

 dlls/kernel32/tests/process.c | 85 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c
index d981ec9..0bd14dc 100644
--- a/dlls/kernel32/tests/process.c
+++ b/dlls/kernel32/tests/process.c
@@ -2443,6 +2443,90 @@ static void test_KillOnJobClose(void)
     CloseHandle(pi.hThread);
 }
 
+static void test_WaitForJobObject(void)
+{
+    HANDLE job;
+    PROCESS_INFORMATION pi;
+    BOOL ret;
+    DWORD dwret;
+
+    /* test waiting for a job object when the process is killed */
+    job = pCreateJobObjectW(NULL, NULL);
+    ok(job != NULL, "CreateJobObject error %u\n", GetLastError());
+
+    dwret = WaitForSingleObject(job, 100);
+    ok(dwret == WAIT_TIMEOUT, "WaitForSingleObject returned %u\n", dwret);
+
+    create_process("wait", &pi);
+
+    ret = pAssignProcessToJobObject(job, pi.hProcess);
+    ok(ret, "AssignProcessToJobObject error %u\n", GetLastError());
+
+    dwret = WaitForSingleObject(job, 100);
+    ok(dwret == WAIT_TIMEOUT, "WaitForSingleObject returned %u\n", dwret);
+
+    ret = pTerminateJobObject(job, 123);
+    ok(ret, "TerminateJobObject error %u\n", GetLastError());
+
+    dwret = WaitForSingleObject(job, 500);
+    todo_wine
+    ok(dwret == WAIT_OBJECT_0 || broken(dwret == WAIT_TIMEOUT),
+       "WaitForSingleObject returned %u\n", dwret);
+
+    if (dwret == WAIT_TIMEOUT) /* Win 2000/XP */
+    {
+        CloseHandle(pi.hProcess);
+        CloseHandle(pi.hThread);
+        CloseHandle(job);
+        todo_wine
+        win_skip("TerminateJobObject doesn't signal job, skipping tests\n");
+        return;
+    }
+
+    /* the object is not reset immediately */
+    dwret = WaitForSingleObject(job, 100);
+    ok(dwret == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", dwret);
+
+    CloseHandle(pi.hProcess);
+    CloseHandle(pi.hThread);
+
+    /* creating a new process doesn't reset the signalled state */
+    create_process("wait", &pi);
+
+    ret = pAssignProcessToJobObject(job, pi.hProcess);
+    ok(ret, "AssignProcessToJobObject error %u\n", GetLastError());
+
+    dwret = WaitForSingleObject(job, 100);
+    ok(dwret == WAIT_OBJECT_0, "WaitForSingleObject returned %u\n", dwret);
+
+    ret = pTerminateJobObject(job, 123);
+    ok(ret, "TerminateJobObject error %u\n", GetLastError());
+
+    CloseHandle(pi.hProcess);
+    CloseHandle(pi.hThread);
+
+    CloseHandle(job);
+
+    /* repeat the test, but this time the process terminates properly */
+    job = pCreateJobObjectW(NULL, NULL);
+    ok(job != NULL, "CreateJobObject error %u\n", GetLastError());
+
+    dwret = WaitForSingleObject(job, 100);
+    ok(dwret == WAIT_TIMEOUT, "WaitForSingleObject returned %u\n", dwret);
+
+    create_process("exit", &pi);
+
+    ret = pAssignProcessToJobObject(job, pi.hProcess);
+    ok(ret, "AssignProcessToJobObject error %u\n", GetLastError());
+
+    dwret = WaitForSingleObject(job, 100);
+    ok(dwret == WAIT_TIMEOUT, "WaitForSingleObject returned %u\n", dwret);
+
+    CloseHandle(pi.hProcess);
+    CloseHandle(pi.hThread);
+    CloseHandle(job);
+}
+
 static HANDLE test_AddSelfToJob(void)
 {
     HANDLE job;
@@ -2625,6 +2709,7 @@ START_TEST(process)
     test_QueryInformationJobObject();
     test_CompletionPort();
     test_KillOnJobClose();
+    test_WaitForJobObject();
     job = test_AddSelfToJob();
     test_jobInheritance(job);
     test_BreakawayOk(job);




More information about the wine-cvs mailing list