Index: third_party/pexpect/tests/test_isalive.py |
diff --git a/third_party/pexpect/tests/test_isalive.py b/third_party/pexpect/tests/test_isalive.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cd79d09a4d312979fcec3479367d757d26f312df |
--- /dev/null |
+++ b/third_party/pexpect/tests/test_isalive.py |
@@ -0,0 +1,125 @@ |
+#!/usr/bin/env python |
+''' |
+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. |
+ |
+''' |
+import pexpect |
+import unittest |
+import signal |
+import sys |
+import time |
+from . import PexpectTestCase |
+ |
+ |
+class IsAliveTestCase(PexpectTestCase.PexpectTestCase): |
+ """Various tests for the running status of processes.""" |
+ |
+ def test_expect_wait(self): |
+ """Ensure consistency in wait() and isalive().""" |
+ p = pexpect.spawn('sleep 1') |
+ assert p.isalive() |
+ assert p.wait() == 0 |
+ assert not p.isalive() |
+ # In previous versions of ptyprocess/pexpect, calling wait() a second |
+ # time would raise an exception, but not since v4.0 |
+ assert p.wait() == 0 |
+ |
+ def test_expect_wait_after_termination(self): |
+ """Ensure wait on a process terminated by kill -9.""" |
+ p = pexpect.spawn('sleep 3') |
+ assert p.isalive() |
+ p.kill(9) |
+ time.sleep(1) |
+ |
+ # when terminated, the exitstatus is None, but p.signalstatus |
+ # and p.terminated reflects that the kill -9 nature. |
+ assert p.wait() is None |
+ assert p.signalstatus == 9 |
+ assert p.terminated == True |
+ assert not p.isalive() |
+ |
+ def test_signal_wait(self): |
+ '''Test calling wait with a process terminated by a signal.''' |
+ if not hasattr(signal, 'SIGALRM'): |
+ return 'SKIP' |
+ p = pexpect.spawn(sys.executable, ['alarm_die.py']) |
+ p.wait() |
+ assert p.exitstatus is None |
+ self.assertEqual(p.signalstatus, signal.SIGALRM) |
+ |
+ def test_expect_isalive_dead_after_normal_termination (self): |
+ p = pexpect.spawn('ls', timeout=15) |
+ p.expect(pexpect.EOF) |
+ assert not p.isalive() |
+ |
+ def test_expect_isalive_dead_after_SIGHUP(self): |
+ p = pexpect.spawn('cat', timeout=5, ignore_sighup=False) |
+ assert p.isalive() |
+ force = False |
+ if sys.platform.lower().startswith('sunos'): |
+ # On Solaris (SmartOs), and only when executed from cron(1), SIGKILL |
+ # is required to end the sub-process. This is done using force=True |
+ force = True |
+ assert p.terminate(force) == True |
+ p.expect(pexpect.EOF) |
+ assert not p.isalive() |
+ |
+ def test_expect_isalive_dead_after_SIGINT(self): |
+ p = pexpect.spawn('cat', timeout=5) |
+ assert p.isalive() |
+ force = False |
+ if sys.platform.lower().startswith('sunos'): |
+ # On Solaris (SmartOs), and only when executed from cron(1), SIGKILL |
+ # is required to end the sub-process. This is done using force=True |
+ force = True |
+ assert p.terminate(force) == True |
+ p.expect(pexpect.EOF) |
+ assert not p.isalive() |
+ |
+ def test_expect_isalive_dead_after_SIGKILL(self): |
+ p = pexpect.spawn('cat', timeout=5) |
+ assert p.isalive() |
+ p.kill(9) |
+ p.expect(pexpect.EOF) |
+ assert not p.isalive() |
+ |
+ def test_forced_terminate(self): |
+ p = pexpect.spawn(sys.executable, ['needs_kill.py']) |
+ p.expect('READY') |
+ assert p.terminate(force=True) == True |
+ p.expect(pexpect.EOF) |
+ assert not p.isalive() |
+ |
+### Some platforms allow this. Some reset status after call to waitpid. |
+### probably not necessary, isalive() returns early when terminate is False. |
+ def test_expect_isalive_consistent_multiple_calls (self): |
+ '''This tests that multiple calls to isalive() return same value. |
+ ''' |
+ p = pexpect.spawn('cat') |
+ assert p.isalive() |
+ assert p.isalive() |
+ p.sendeof() |
+ p.expect(pexpect.EOF) |
+ assert not p.isalive() |
+ assert not p.isalive() |
+ |
+if __name__ == '__main__': |
+ unittest.main() |
+ |
+suite = unittest.makeSuite(IsAliveTestCase, 'test') |
+ |