diff options
author | Jeff Quast <contact@jeffquast.com> | 2014-11-24 15:17:17 -0800 |
---|---|---|
committer | Jeff Quast <contact@jeffquast.com> | 2014-11-24 15:17:17 -0800 |
commit | 3484b93d7a4df75eb501105e6ac66f69995e7bdf (patch) | |
tree | aaab4ca3b3787cfce50d44684508eb8f945201fa /tests | |
parent | 71a52c752219d8c5174b362ea99f3b0cb5675e58 (diff) | |
parent | c99c4b306454aec32118dead3f05e974c61bd34b (diff) | |
download | pexpect-git-3484b93d7a4df75eb501105e6ac66f69995e7bdf.tar.gz |
Merge pull request #148 from jquast/unset-buildagent-signal-handlers
Unset ignored signal handlers by build agents
Diffstat (limited to 'tests')
-rw-r--r-- | tests/PexpectTestCase.py | 35 | ||||
-rwxr-xr-x | tests/test_misc.py | 51 |
2 files changed, 49 insertions, 37 deletions
diff --git a/tests/PexpectTestCase.py b/tests/PexpectTestCase.py index 7a9574e..9d620f8 100644 --- a/tests/PexpectTestCase.py +++ b/tests/PexpectTestCase.py @@ -22,26 +22,55 @@ from __future__ import print_function import contextlib import unittest +import signal import sys import os + class PexpectTestCase(unittest.TestCase): def setUp(self): self.PYTHONBIN = sys.executable self.original_path = os.getcwd() tests_dir = os.path.dirname(__file__) self.project_dir = project_dir = os.path.dirname(tests_dir) + + # all tests are executed in this folder; there are many auxiliary + # programs in this folder executed by spawn(). os.chdir(tests_dir) - os.environ['COVERAGE_PROCESS_START'] = os.path.join(project_dir, '.coveragerc') + + coverage_rc = os.path.join(project_dir, '.coveragerc') + os.environ['COVERAGE_PROCESS_START'] = coverage_rc os.environ['COVERAGE_FILE'] = os.path.join(project_dir, '.coverage') print('\n', self.id(), end=' ') sys.stdout.flush() + + # some build agents will ignore SIGHUP and SIGINT, which python + # inherits. This causes some of the tests related to terminate() + # to fail. We set them to the default handlers that they should + # be, and restore them back to their SIG_IGN value on tearDown. + # + # I'm not entirely convinced they need to be restored, only our + # test runner is affected. + self.restore_ignored_signals = [ + value for value in (signal.SIGHUP, signal.SIGINT,) + if signal.getsignal(value) == signal.SIG_IGN] + if signal.SIGHUP in self.restore_ignored_signals: + # sighup should be set to default handler + signal.signal(signal.SIGHUP, signal.SIG_DFL) + if signal.SIGINT in self.restore_ignored_signals: + # SIGINT should be set to signal.default_int_handler + signal.signal(signal.SIGINT, signal.default_int_handler) unittest.TestCase.setUp(self) def tearDown(self): - os.chdir (self.original_path) + # restore original working folder + os.chdir(self.original_path) + + # restore signal handlers + for signal_value in self.restore_ignored_signals: + signal.signal(signal_value, signal.SIG_IGN) - if sys.version_info < (2,7): + if sys.version_info < (2, 7): # We want to use these methods, which are new/improved in 2.7, but # we are still supporting 2.6 for the moment. This section can be # removed when we drop Python 2.6 support. diff --git a/tests/test_misc.py b/tests/test_misc.py index 9e44bab..28df570 100755 --- a/tests/test_misc.py +++ b/tests/test_misc.py @@ -149,41 +149,24 @@ class TestCaseMisc(PexpectTestCase.PexpectTestCase): def test_sighup(self): " validate argument `ignore_sighup=True` and `ignore_sighup=False`. " - # If a parent process sets an Ignore handler for SIGHUP (as on Fedora's - # build machines), this test breaks. We temporarily restore the default - # handler, so the child process will quit. However, we can't simply - # replace any installed handler, because getsignal returns None for - # handlers not set in Python code, so we wouldn't be able to restore - # them. - if signal.getsignal(signal.SIGHUP) == signal.SIG_IGN: - signal.signal(signal.SIGHUP, signal.SIG_DFL) - restore_sig_ign = True - else: - restore_sig_ign = False - getch = sys.executable + ' getch.py' - try: - child = pexpect.spawn(getch, ignore_sighup=True) - child.expect('READY') - child.kill(signal.SIGHUP) - for _ in range(10): - if not child.isalive(): - self.fail('Child process should not have exited.') - time.sleep(0.1) - - child = pexpect.spawn(getch, ignore_sighup=False) - child.expect('READY') - child.kill(signal.SIGHUP) - for _ in range(10): - if not child.isalive(): - break - time.sleep(0.1) - else: - self.fail('Child process should have exited.') - - finally: - if restore_sig_ign: - signal.signal(signal.SIGHUP, signal.SIG_IGN) + child = pexpect.spawn(getch, ignore_sighup=True) + child.expect('READY') + child.kill(signal.SIGHUP) + for _ in range(10): + if not child.isalive(): + self.fail('Child process should not have exited.') + time.sleep(0.1) + + child = pexpect.spawn(getch, ignore_sighup=False) + child.expect('READY') + child.kill(signal.SIGHUP) + for _ in range(10): + if not child.isalive(): + break + time.sleep(0.1) + else: + self.fail('Child process should have exited.') def test_bad_child_pid(self): " assert bad condition error in isalive(). " |