8000 gh-110673: test_pty raises on short write by vstinner · Pull Request #110677 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

gh-110673: test_pty raises on short write #110677

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 11, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
gh-110673: test_pty raises on short write
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.
  • Loading branch information
vstinner committed Oct 11, 2023
commit b5ebb45fba82814fd672d2107f6596deec46b62d
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