xref: /third_party/python/Lib/test/test_wait4.py (revision 7db96d56)
17db96d56Sopenharmony_ci"""This test checks for correct wait4() behavior.
27db96d56Sopenharmony_ci"""
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ciimport os
57db96d56Sopenharmony_ciimport time
67db96d56Sopenharmony_ciimport sys
77db96d56Sopenharmony_ciimport unittest
87db96d56Sopenharmony_cifrom test.fork_wait import ForkWait
97db96d56Sopenharmony_cifrom test import support
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci# If either of these do not exist, skip this test.
127db96d56Sopenharmony_ciif not support.has_fork_support:
137db96d56Sopenharmony_ci    raise unittest.SkipTest("requires working os.fork()")
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cisupport.get_attribute(os, 'wait4')
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciclass Wait4Test(ForkWait):
197db96d56Sopenharmony_ci    def wait_impl(self, cpid, *, exitcode):
207db96d56Sopenharmony_ci        option = os.WNOHANG
217db96d56Sopenharmony_ci        if sys.platform.startswith('aix'):
227db96d56Sopenharmony_ci            # Issue #11185: wait4 is broken on AIX and will always return 0
237db96d56Sopenharmony_ci            # with WNOHANG.
247db96d56Sopenharmony_ci            option = 0
257db96d56Sopenharmony_ci        deadline = time.monotonic() + support.SHORT_TIMEOUT
267db96d56Sopenharmony_ci        while time.monotonic() <= deadline:
277db96d56Sopenharmony_ci            # wait4() shouldn't hang, but some of the buildbots seem to hang
287db96d56Sopenharmony_ci            # in the forking tests.  This is an attempt to fix the problem.
297db96d56Sopenharmony_ci            spid, status, rusage = os.wait4(cpid, option)
307db96d56Sopenharmony_ci            if spid == cpid:
317db96d56Sopenharmony_ci                break
327db96d56Sopenharmony_ci            time.sleep(0.1)
337db96d56Sopenharmony_ci        self.assertEqual(spid, cpid)
347db96d56Sopenharmony_ci        self.assertEqual(os.waitstatus_to_exitcode(status), exitcode)
357db96d56Sopenharmony_ci        self.assertTrue(rusage)
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_cidef tearDownModule():
387db96d56Sopenharmony_ci    support.reap_children()
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ciif __name__ == "__main__":
417db96d56Sopenharmony_ci    unittest.main()
42