Index: third_party/pexpect/tests/PexpectTestCase.py |
diff --git a/third_party/pexpect/tests/PexpectTestCase.py b/third_party/pexpect/tests/PexpectTestCase.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..307437efad3c377cb00ea9cf09fef7098df64a76 |
--- /dev/null |
+++ b/third_party/pexpect/tests/PexpectTestCase.py |
@@ -0,0 +1,108 @@ |
+ |
+''' |
+PEXPECT LICENSE |
+ |
+ This license is approved by the OSI and FSF as GPL-compatible. |
+ http://opensource.org/licenses/isc-license.txt |
+ |
+ Copyright (c) 2012, Noah Spurrier <noah@noah.org> |
+ PERMISSION TO USE, COPY, MODIFY, AND/OR DISTRIBUTE THIS SOFTWARE FOR ANY |
+ PURPOSE WITH OR WITHOUT FEE IS HEREBY GRANTED, PROVIDED THAT THE ABOVE |
+ COPYRIGHT NOTICE AND THIS PERMISSION NOTICE APPEAR IN ALL COPIES. |
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
+ |
+''' |
+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) |
+ |
+ # If the pexpect raises an exception after fork(), but before |
+ # exec(), our test runner *also* forks. We prevent this by |
+ # storing our pid and asserting equality on tearDown. |
+ self.pid = os.getpid() |
+ |
+ 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): |
+ # restore original working folder |
+ os.chdir(self.original_path) |
+ |
+ if self.pid != os.getpid(): |
+ # The build server pattern-matches phrase 'Test runner has forked!' |
+ print("Test runner has forked! This means a child process raised " |
+ "an exception before exec() in a test case, the error is " |
+ "more than likely found above this line in stderr.", |
+ file=sys.stderr) |
+ exit(1) |
+ |
+ # restore signal handlers |
+ for signal_value in self.restore_ignored_signals: |
+ signal.signal(signal_value, signal.SIG_IGN) |
+ |
+ 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. |
+ @contextlib.contextmanager |
+ def assertRaises(self, excClass): |
+ try: |
+ yield |
+ except Exception as e: |
+ assert isinstance(e, excClass) |
+ else: |
+ raise AssertionError("%s was not raised" % excClass) |
+ |
+ @contextlib.contextmanager |
+ def assertRaisesRegexp(self, excClass, pattern): |
+ import re |
+ try: |
+ yield |
+ except Exception as e: |
+ assert isinstance(e, excClass) |
+ assert re.match(pattern, str(e)) |
+ else: |
+ raise AssertionError("%s was not raised" % excClass) |