Cornelius Diekmann added the comment:

I did a larger update to my proposed patch. I read the pty man pages and posix 
standard and designed a test suite which documents the expected behavior of the 
pty module. The test suite is biased towards my Linux system, but I respect the 
posix standard. Tested on Linux, OS X, and FreeBSD.

The patch introduces no behavioral changes to the actual module! It 
should be easy to merge.

Changes to I made _select and _execlp local definitions of the pty 
module to ease mocking them in the test suite. A comment finally explains why defines STDIN_FILENO, STDOUT_FILENO, ... itself.

All tests pass on Linux.
Tests fail on macOS 10.6.8 and FreeBSD 11. The tests just hang. The patch 
suggested in issue26228 solves these issues. With this patch (or even without 
patch on Linux), the test suite needs about 1 to 2 seconds). I did not include 
the patch of issue26228 into the patch proposed here since I promised no change 
in behavior to the pty module. We now have a lot of test cases for the pty 
module and we are now finally aware that something is broken in the module. 
It's better to have failing tests than to have no tests at all :-)

I included the change to the documentation I proposed in issue29054.

The test suite does several things:

* SmallPtyTests mainly tests the _copy loop and documents current behavior. As 
issue issue26228 has shown, this behavior is not what one would expect. When 
adding the patch for the mentioned issue, one also needs to adapt 
test__copy_eof_on_all and test__copy_eof_on_master. These tests will make it 
easier to resolve issue26228 since they provide a clear documentation of the 
current behavior and contribute the missing test cases.

* PtyTest is left unchanged.

* One has probably noticed that the current suite randomly fails. I 
introduced _os_read_exactly and _os_read_only to make all new tests 
deterministic and easy to debug.

* PtyPosixIntegrationTest does a very simple integration test by spawning the 
programs `true' and `false'. Currently, these tests hang on the platforms where 
pty.spawn() is broken and testing cannot continue. As stated above, with the 
patch, everything is fine also on FreeBSD and OS X.

* PtyMockingExecTestBase is a base class where I prepare to replace the actual 
exec-call made by pty.spawn() to only run local python code. This makes it 
possible to test pty.spawn() in a portable, platform-independent manner (where 
platform-independent means posix-compatible).

* PtyWhiteBoxIntegrationPingPong1000Test exchanges a thousand Ping Pong 
Messages between master and the pty.spawn()ed slave.

* PtyWhiteBoxIntegrationReadSlaveTest tests that we read all data from the 
slave. This test is inspired by msg283912 and it shows that my naive patch in 
the beginning of issue29054 would lose data.

* PtyWhiteBoxIntegrationTermiosTest tests "advanced" features of terminals. The 
pty.spawn() function is the ultimate integration test setup for this.

Waiting for a review :-)

Added file:

Python tracker <>
Python-bugs-list mailing list

Reply via email to