Skip to content

Commit

Permalink
pythongh-110673: test_pty raises on short write (pythonGH-110677)
Browse files Browse the repository at this point in the history
Add write_all() helper function to test_pty to raise an exception on
short write: if os.writes() does not write all bytes. It should not
happen for a PTY.
(cherry picked from commit b4e8049)

Co-authored-by: Victor Stinner <vstinner@python.org>
  • Loading branch information
vstinner authored and miss-islington committed Oct 11, 2023
1 parent 90b2620 commit 2b94bc7
Showing 1 changed file with 14 additions and 5 deletions.
19 changes: 14 additions & 5 deletions Lib/test/test_pty.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,15 @@ def expectedFailureIfStdinIsTTY(fun):
pass
return fun


def write_all(fd, data):
written = os.write(fd, data)
if written != len(data):
# gh-73256, gh-110673: It should never happen, but check just in case
raise Exception(f"short write: os.write({fd}, {len(data)} bytes) "
f"wrote {written} bytes")


# Marginal testing of pty suite. Cannot do extensive 'do or fail' testing
# because pty code is not too portable.
class PtyTest(unittest.TestCase):
Expand Down Expand Up @@ -170,14 +179,14 @@ def test_openpty(self):
os.set_blocking(master_fd, blocking)

debug("Writing to slave_fd")
os.write(slave_fd, TEST_STRING_1)
write_all(slave_fd, TEST_STRING_1)
s1 = _readline(master_fd)
self.assertEqual(b'I wish to buy a fish license.\n',
normalize_output(s1))

debug("Writing chunked output")
os.write(slave_fd, TEST_STRING_2[:5])
os.write(slave_fd, TEST_STRING_2[5:])
write_all(slave_fd, TEST_STRING_2[:5])
write_all(slave_fd, TEST_STRING_2[5:])
s2 = _readline(master_fd)
self.assertEqual(b'For my pet fish, Eric.\n', normalize_output(s2))

Expand Down Expand Up @@ -360,8 +369,8 @@ def test__copy_to_each(self):
masters = [s.fileno() for s in socketpair]

# Feed data. Smaller than PIPEBUF. These writes will not block.
os.write(masters[1], b'from master')
os.write(write_to_stdin_fd, b'from stdin')
write_all(masters[1], b'from master')
write_all(write_to_stdin_fd, b'from stdin')

# Expect three select calls, the last one will cause IndexError
pty.select = self._mock_select
Expand Down

0 comments on commit 2b94bc7

Please sign in to comment.