some special handling of stdin capturing, unification, un-xfail the win32 test

--HG--
branch : trunk
This commit is contained in:
holger krekel 2010-05-18 12:12:34 -07:00
parent 10296faff1
commit cf255cd643
2 changed files with 19 additions and 31 deletions

View File

@ -38,7 +38,7 @@ class FDCapture:
in text mode.
"""
self.targetfd = targetfd
if tmpfile is None:
if tmpfile is None and targetfd != 0:
f = tempfile.TemporaryFile('wb+')
tmpfile = dupfile(f, encoding="UTF-8")
f.close()
@ -55,16 +55,24 @@ class FDCapture:
except OSError:
raise ValueError("saved filedescriptor not valid, "
"did you call start() twice?")
os.dup2(self.tmpfile.fileno(), self.targetfd)
if hasattr(self, '_oldsys'):
setattr(sys, patchsysdict[self.targetfd], self.tmpfile)
if self.targetfd == 0 and not self.tmpfile:
fd = os.open(devnullpath, os.O_RDONLY)
os.dup2(fd, 0)
if hasattr(self, '_oldsys'):
setattr(sys, patchsysdict[self.targetfd], DontReadFromInput())
else:
fd = self.tmpfile.fileno()
os.dup2(self.tmpfile.fileno(), self.targetfd)
if hasattr(self, '_oldsys'):
setattr(sys, patchsysdict[self.targetfd], self.tmpfile)
def done(self):
""" unpatch and clean up, returns the self.tmpfile (file object)
"""
os.dup2(self._savefd, self.targetfd)
os.close(self._savefd)
self.tmpfile.seek(0)
if self.targetfd != 0:
self.tmpfile.seek(0)
if hasattr(self, '_oldsys'):
setattr(sys, patchsysdict[self.targetfd], self._oldsys)
return self.tmpfile
@ -184,15 +192,9 @@ class StdCaptureFD(Capture):
mixed = self._options['mixed']
patchsys = self._options['patchsys']
if in_:
if hasattr(in_, 'read'):
tmpfile = in_
else:
fd = os.open(devnullpath, os.O_RDONLY)
tmpfile = os.fdopen(fd)
try:
self.in_ = FDCapture(0, tmpfile=tmpfile, now=False,
self.in_ = FDCapture(0, tmpfile=None, now=False,
patchsys=patchsys)
self._options['in_'] = self.in_.tmpfile
except OSError:
pass
if out:
@ -222,14 +224,10 @@ class StdCaptureFD(Capture):
def startall(self):
if hasattr(self, 'in_'):
self.in_.start()
sys.stdin = DontReadFromInput()
out = getattr(self, 'out', None)
if out:
out.start()
err = getattr(self, 'err', None)
if err:
err.start()
if hasattr(self, 'out'):
self.out.start()
if hasattr(self, 'err'):
self.err.start()
def resume(self):
""" resume capturing with original temp files. """

View File

@ -372,15 +372,6 @@ class TestStdCaptureFDinvalidFD:
os.close(2)
cap = py.io.StdCaptureFD(out=False, err=True, in_=False)
cap.done()
""")
result = testdir.runpytest("--capture=fd")
assert result.ret == 0
assert result.parseoutcomes()['passed'] == 2
@py.test.mark.xfail("sys.platform == 'win32'", run=False)
def test_stdcapture_fd_invalid_fd_null(self, testdir):
testdir.makepyfile("""
import py, os
def test_stdin():
os.close(0)
cap = py.io.StdCaptureFD(out=False, err=False, in_=True)
@ -388,8 +379,7 @@ class TestStdCaptureFDinvalidFD:
""")
result = testdir.runpytest("--capture=fd")
assert result.ret == 0
assert result.parseoutcomes()['passed'] == 1
assert result.parseoutcomes()['passed'] == 3
def test_capture_not_started_but_reset():
capsys = py.io.StdCapture(now=False)