1
0
mirror of https://git.FreeBSD.org/ports.git synced 2025-01-02 06:03:50 +00:00

misc/py-pexpect: fix most of the test cases

A number of test cases included in the pexpect distribution failed on
FreeBSD. The patches included in the commit fix most of these tests.

One of the tests used /bin/bash and long options for the nl command.
Other tests assumed pipe buffers larger than provided by FreeBSD.

3 tests are still failing:

tests/test_replwrap.py::REPLWrapTestCase::test_existing_spawn FAILED

The text received contains bracketed paste escape characters when
a bash version 5.1 or newer is installed. There may be another problem
with this test, though, since it seems to depend on some bash rc file
of the account executing this test.

tests/test_socket.py::ExpectTestCase::test_interrupt FAILED
tests/test_socket.py::ExpectTestCase::test_multiple_interrupts FAILED

These two test seem to fail due to an early exit of the sending
process. It appears to be in Zombie state and cannot be signaled.
The "non-blocking read" seems to be blocking in this situation.

The real cause is unclear, it seems to be a mismatch between process
lifetime semantics in Linux and FreeBSD. I have removed an infinite
wait loop with these patches, which causes a test failure to be
detected (instead of preventing the execution of any further test
cases).

I have created a pull request on Github to get these patches into the
upstream, but it seems that the owner of the pexpect repository is not
very active.

Approved by:	sunpoet (maintainer)
This commit is contained in:
Stefan Eßer 2021-09-27 15:49:11 +02:00
parent ab84ba53f1
commit a642f92e86
8 changed files with 144 additions and 0 deletions

View File

@ -2,6 +2,7 @@
PORTNAME= pexpect
PORTVERSION= 4.8.0
PORTREVISION= 1
CATEGORIES= misc python
MASTER_SITES= CHEESESHOP
PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}

View File

@ -0,0 +1,8 @@
--- pexpect/bashrc.sh.orig 2020-01-17 17:08:15 UTC
+++ pexpect/bashrc.sh
@@ -14,3 +14,5 @@ PS1="$"
# Unset PROMPT_COMMAND, so that it can't change PS1 to something unexpected.
unset PROMPT_COMMAND
+
+bind 'set enable-bracketed-paste off'

View File

@ -0,0 +1,11 @@
--- tests/PexpectTestCase.py.orig 2020-01-17 17:08:15 UTC
+++ tests/PexpectTestCase.py
@@ -97,7 +97,7 @@ class PexpectTestCase(unittest.TestCase):
raise AssertionError("%s was not raised" % excClass)
@contextlib.contextmanager
- def assertRaisesRegexp(self, excClass, pattern):
+ def assertRaisesRegex(self, excClass, pattern):
import re
try:
yield

View File

@ -0,0 +1,47 @@
--- tests/test_expect.py.orig 2021-09-22 12:21:58 UTC
+++ tests/test_expect.py
@@ -411,7 +411,7 @@ class ExpectTestCase (PexpectTestCase.PexpectTestCase):
def test_before_across_chunks(self):
# https://github.com/pexpect/pexpect/issues/478
child = pexpect.spawn(
- '''/bin/bash -c "openssl rand -base64 {} 2>/dev/null | head -500 | nl --number-format=rz --number-width=5 2>&1 ; echo 'PATTERN!!!'"'''.format(1024 * 1024 * 2),
+ '''/bin/sh -c "openssl rand -base64 {} 2>/dev/null | head -500 | nl -n rz -w 5 2>&1 ; echo 'PATTERN!!!'"'''.format(1024 * 1024 * 2),
searchwindowsize=128
)
child.expect(['PATTERN'])
@@ -456,7 +456,7 @@ class ExpectTestCase (PexpectTestCase.PexpectTestCase):
child = pexpect.spawn('cat', echo=False)
child.sendline('BEGIN')
for i in range(100):
- child.sendline('foo' * 100)
+ child.sendline('foo' * 10)
e = child.expect([b'xyzzy', pexpect.TIMEOUT],
searchwindowsize=10, timeout=0.001)
self.assertEqual(e, 1)
@@ -473,7 +473,7 @@ class ExpectTestCase (PexpectTestCase.PexpectTestCase):
child = pexpect.spawn('cat', echo=False)
child.sendline('BEGIN')
for i in range(100):
- child.sendline('foo' * 100)
+ child.sendline('foo' * 10)
e = child.expect([b'xyzzy', pexpect.TIMEOUT],
searchwindowsize=10, timeout=0.5)
self.assertEqual(e, 1)
@@ -569,13 +569,13 @@ class ExpectTestCase (PexpectTestCase.PexpectTestCase)
def test_bad_arg(self):
p = pexpect.spawn('cat')
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect(1)
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect([1, b'2'])
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect_exact(1)
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect_exact([1, b'2'])
def test_timeout_none(self):

View File

@ -0,0 +1,20 @@
--- tests/test_misc.py.orig 2020-01-17 17:08:15 UTC
+++ tests/test_misc.py
@@ -214,7 +214,7 @@ class TestCaseMisc(PexpectTestCase.PexpectTestCase):
# Force an invalid state to test isalive
child.ptyproc.terminated = 0
try:
- with self.assertRaisesRegexp(pexpect.ExceptionPexpect,
+ with self.assertRaisesRegex(pexpect.ExceptionPexpect,
".*" + expect_errmsg):
child.isalive()
finally:
@@ -224,7 +224,7 @@ class TestCaseMisc(PexpectTestCase.PexpectTestCase):
def test_bad_arguments_suggest_fdpsawn(self):
" assert custom exception for spawn(int). "
expect_errmsg = "maybe you want to use fdpexpect.fdspawn"
- with self.assertRaisesRegexp(pexpect.ExceptionPexpect,
+ with self.assertRaisesRegex(pexpect.ExceptionPexpect,
".*" + expect_errmsg):
pexpect.spawn(1)

View File

@ -0,0 +1,20 @@
--- tests/test_popen_spawn.py.orig 2020-01-17 17:08:15 UTC
+++ tests/test_popen_spawn.py
@@ -110,13 +110,13 @@ class ExpectTestCase (PexpectTestCase.PexpectTestCase)
def test_bad_arg(self):
p = PopenSpawn('cat')
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect(1)
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect([1, b'2'])
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect_exact(1)
- with self.assertRaisesRegexp(TypeError, '.*must be one of'):
+ with self.assertRaisesRegex(TypeError, '.*must be one of'):
p.expect_exact([1, b'2'])
def test_timeout_none(self):

View File

@ -0,0 +1,11 @@
--- tests/test_replwrap.py.orig 2021-09-22 14:15:55 UTC
+++ tests/test_replwrap.py
@@ -24,7 +24,7 @@ class REPLWrapTestCase(unittest.TestCase):
def test_bash(self):
bash = replwrap.bash()
- res = bash.run_command("alias")
+ res = bash.run_command("alias xyzzy=true; alias")
assert 'alias' in res, res
try:

View File

@ -0,0 +1,26 @@
--- tests/test_socket.py.orig 2020-01-17 17:08:15 UTC
+++ tests/test_socket.py
@@ -201,8 +201,8 @@ class ExpectTestCase(PexpectTestCase.PexpectTestCase):
while not all_read.is_set():
time.sleep(1.0)
os.kill(test_proc.pid, signal.SIGWINCH)
- while not timed_out.is_set():
- time.sleep(1.0)
+# while not timed_out.is_set():
+# time.sleep(1.0)
test_proc.join(timeout=5.0)
self.assertEqual(test_proc.exitcode, errno.ETIMEDOUT)
@@ -214,9 +214,9 @@ class ExpectTestCase(PexpectTestCase.PexpectTestCase):
test_proc.start()
while not all_read.is_set():
time.sleep(1.0)
- while not timed_out.is_set():
- os.kill(test_proc.pid, signal.SIGWINCH)
- time.sleep(1.0)
+# while not timed_out.is_set():
+# os.kill(test_proc.pid, signal.SIGWINCH)
+# time.sleep(1.0)
test_proc.join(timeout=5.0)
self.assertEqual(test_proc.exitcode, errno.ETIMEDOUT)