"""This test checks for correct wait3() behavior.

"""



import os

import time

from test.fork_wait import ForkWait

from test.test_support import TestSkipped, run_unittest, reap_children



try:

    os.fork

except AttributeError:

    raise TestSkipped, "os.fork not defined -- skipping test_wait3"



try:

    os.wait3

except AttributeError:

    raise TestSkipped, "os.wait3 not defined -- skipping test_wait3"



class Wait3Test(ForkWait):

    def wait_impl(self, cpid):

        for i in range(10):

            # wait3() shouldn't hang, but some of the buildbots seem to hang

            # in the forking tests.  This is an attempt to fix the problem.

            spid, status, rusage = os.wait3(os.WNOHANG)

            if spid == cpid:

                break

            time.sleep(1.0)



        self.assertEqual(spid, cpid)

        self.assertEqual(status, 0, "cause = %d, exit = %d" % (status&0xff, status>>8))

        self.assertTrue(rusage)



def test_main():

    run_unittest(Wait3Test)

    reap_children()



if __name__ == "__main__":

    test_main()

