From fc9fdba08b5ac46ffb8cdf34753624d6050d8052 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 20 Jan 2011 17:59:32 -0800 Subject: PtyEofTestCase: test unbuffered fdopen New development: It appears that array.fromfile() is usable with python3 as long as fdopen is called with a bufsize argument of 0. --- pym/portage/tests/ebuild/test_pty_eof.py | 16 ++++++++++++++-- pym/portage/util/_pty.py | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/pym/portage/tests/ebuild/test_pty_eof.py b/pym/portage/tests/ebuild/test_pty_eof.py index 042227b67..c4386e944 100644 --- a/pym/portage/tests/ebuild/test_pty_eof.py +++ b/pym/portage/tests/ebuild/test_pty_eof.py @@ -1,4 +1,4 @@ -# Copyright 2009-2010 Gentoo Foundation +# Copyright 2009-2011 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 from portage.tests import TestCase @@ -6,7 +6,7 @@ from portage.util._pty import _can_test_pty_eof, _test_pty_eof class PtyEofTestCase(TestCase): - def testPtyEof(self): + def testPtyEofFdopenBuffered(self): # This tests if the following python issue is fixed yet: # http://bugs.python.org/issue5380 # Since it might not be fixed, mark as todo. @@ -17,3 +17,15 @@ class PtyEofTestCase(TestCase): self.assertEqual(_test_pty_eof(), True) except EnvironmentError: pass + + def testPtyEofFdopenUnBuffered(self): + # New development: It appears that array.fromfile() is usable + # with python3 as long as fdopen is called with a bufsize + # argument of 0. + + # The result is only valid if openpty does not raise EnvironmentError. + if _can_test_pty_eof(): + try: + self.assertEqual(_test_pty_eof(fdopen_buffered=False), True) + except EnvironmentError: + pass diff --git a/pym/portage/util/_pty.py b/pym/portage/util/_pty.py index 877430e96..7e769d204 100644 --- a/pym/portage/util/_pty.py +++ b/pym/portage/util/_pty.py @@ -28,11 +28,19 @@ def _can_test_pty_eof(): """ return platform.system() in ("Linux",) -def _test_pty_eof(): +def _test_pty_eof(fdopen_buffered=True): """ Returns True if this issues is fixed for the currently running version of python: http://bugs.python.org/issue5380 Raises an EnvironmentError from openpty() if it fails. + + NOTE: This issue is only problematic when array.fromfile() + is used, rather than os.read(). However, array.fromfile() + is preferred since it is approximatly 10% faster. + + New development: It appears that array.fromfile() is usable + with python3 as long as fdopen is called with a bufsize + argument of 0. """ use_fork = False @@ -78,7 +86,10 @@ def _test_pty_eof(): if pid is not None: os.waitpid(pid, 0) - master_file = os.fdopen(master_fd, 'rb') + if fdopen_buffered: + master_file = os.fdopen(master_fd, 'rb') + else: + master_file = os.fdopen(master_fd, 'rb', 0) eof = False data = [] iwtd = [master_file] -- cgit v1.2.3-1-g7c22