(root)/
Python-3.11.7/
Lib/
test/
test_wait3.py
       1  """This test checks for correct wait3() behavior.
       2  """
       3  
       4  import os
       5  import subprocess
       6  import sys
       7  import unittest
       8  from test.fork_wait import ForkWait
       9  from test import support
      10  
      11  if not support.has_fork_support:
      12      raise unittest.SkipTest("requires working os.fork()")
      13  
      14  if not hasattr(os, 'wait3'):
      15      raise unittest.SkipTest("os.wait3 not defined")
      16  
      17  class ESC[4;38;5;81mWait3Test(ESC[4;38;5;149mForkWait):
      18      def wait_impl(self, cpid, *, exitcode):
      19          # This many iterations can be required, since some previously run
      20          # tests (e.g. test_ctypes) could have spawned a lot of children
      21          # very quickly.
      22          for _ in support.sleeping_retry(support.SHORT_TIMEOUT, error=False):
      23              # wait3() shouldn't hang, but some of the buildbots seem to hang
      24              # in the forking tests.  This is an attempt to fix the problem.
      25              spid, status, rusage = os.wait3(os.WNOHANG)
      26              if spid == cpid:
      27                  break
      28  
      29          self.assertEqual(spid, cpid)
      30          self.assertEqual(os.waitstatus_to_exitcode(status), exitcode)
      31          self.assertTrue(rusage)
      32  
      33      def test_wait3_rusage_initialized(self):
      34          # Ensure a successful wait3() call where no child was ready to report
      35          # its exit status does not return uninitialized memory in the rusage
      36          # structure. See bpo-36279.
      37          args = [sys.executable, '-c', 'import sys; sys.stdin.read()']
      38          proc = subprocess.Popen(args, stdin=subprocess.PIPE)
      39          try:
      40              pid, status, rusage = os.wait3(os.WNOHANG)
      41              self.assertEqual(0, pid)
      42              self.assertEqual(0, status)
      43              self.assertEqual(0, sum(rusage))
      44          finally:
      45              proc.stdin.close()
      46              proc.wait()
      47  
      48  
      49  def tearDownModule():
      50      support.reap_children()
      51  
      52  if __name__ == "__main__":
      53      unittest.main()