def test_logging_no_hang(self): '''Try to ensure Popen.check_call doesn't hang when trying to do logging''' # To ensure the logger keyword arg is implemented in a way that # doesn't cause hangs, and since the use of logger causes blocking # behavior, spawn a non-blocking subprocess that spawns a blocking # subprocess. If the non-blocking subprocess doesn't complete # in a reasonable amount of time, kill both and fail cmd = [ sys.executable, "-c", "from solaris_install import Popen; import logging; " "Popen.check_call(['/usr/bin/pkg', 'foo'], " "logger=logging.getLogger())" ] popen = Popen(cmd, stdout=Popen.DEVNULL, stderr=Popen.DEVNULL) for wait_count in xrange(15): # If it's not done nearly instantly, something is wrong. # However, give the benefit of the doubt by waiting up to # 5 seconds for completion if popen.poll() is not None: break else: time.sleep(0.5) else: popen.kill() self.fail("subprocess hung while attempting logging")
def test_logging_no_hang(self): '''Try to ensure Popen.check_call doesn't hang when trying to do logging''' # To ensure the logger keyword arg is implemented in a way that # doesn't cause hangs, and since the use of logger causes blocking # behavior, spawn a non-blocking subprocess that spawns a blocking # subprocess. If the non-blocking subprocess doesn't complete # in a reasonable amount of time, kill both and fail cmd = [sys.executable, "-c", "from solaris_install import Popen; import logging; " "Popen.check_call(['/usr/bin/pkg', 'foo'], " "logger=logging.getLogger())"] popen = Popen(cmd, stdout=Popen.DEVNULL, stderr=Popen.DEVNULL) for wait_count in xrange(15): # If it's not done nearly instantly, something is wrong. # However, give the benefit of the doubt by waiting up to # 5 seconds for completion if popen.poll() is not None: break else: time.sleep(0.5) else: popen.kill() self.fail("subprocess hung while attempting logging")
def test_devnull(self): '''Test using Popen.DEVNULL for stdin''' popen = Popen(["/usr/bin/cat"], stdin=Popen.DEVNULL, stdout=Popen.PIPE) # Use PIPE for stdout as, for a failure case, the subprocess call # could hang indefinitely, so we can't block on it for wait_count in xrange(10): # If it's not done nearly instantly, something is wrong. # However, give the benefit of the doubt by waiting up to # 5 seconds for completion if popen.poll() is not None: break else: time.sleep(0.5) else: popen.kill() self.fail("stdin=Popen.DEVNULL did not work") stdout = popen.communicate()[0] self.assertEqual("", stdout)