[py-svn] r15369 - in py/dist/py/misc: . testing
hpk at codespeak.net
hpk at codespeak.net
Fri Jul 29 20:23:02 CEST 2005
Author: hpk
Date: Fri Jul 29 20:23:01 2005
New Revision: 15369
Added:
py/dist/py/misc/capture.py
Modified:
py/dist/py/misc/testing/test_simplecapture.py
Log:
- add another capturing based on FDs
just want to get this version in.
- there definitely needs to be quite some
cleanup with all the different ways
of capturing stdout/stderr
Added: py/dist/py/misc/capture.py
==============================================================================
--- (empty file)
+++ py/dist/py/misc/capture.py Fri Jul 29 20:23:01 2005
@@ -0,0 +1,44 @@
+
+import os, sys
+
+class FDCapture:
+ def __init__(self, targetfd, sysattr=None):
+ self.targetfd = targetfd
+ self.tmpfile = self.maketmpfile()
+ self._savefd = os.dup(targetfd)
+ os.dup2(self.tmpfile.fileno(), targetfd)
+ if sysattr is not None:
+ self._reset = (lambda oldval=getattr(sys, sysattr):
+ setattr(sys, sysattr, oldval))
+ setattr(sys, sysattr, self.tmpfile)
+
+ def done(self):
+ os.dup2(self._savefd, self.targetfd)
+ if hasattr(self, '_reset'):
+ self._reset()
+ del self._reset
+ os.close(self._savefd)
+ f = self.tmpfile
+ f.seek(0)
+ del self._savefd
+ del self.tmpfile
+ return f
+
+ def maketmpfile(self):
+ return os.tmpfile()
+
+class Capture:
+ def __init__(self):
+ self._out = FDCapture(1, 'stdout')
+ self._oldsysout = sys.stdout
+ sys.stdout = self._out.tmpfile
+
+ self._err = FDCapture(2, 'stderr')
+ self._olderrout = sys.stderr
+ sys.stderr = self._err.tmpfile
+
+ def reset(self):
+ outfile = self._out.done()
+ errfile = self._err.done()
+ return outfile.read(), errfile.read()
+
Modified: py/dist/py/misc/testing/test_simplecapture.py
==============================================================================
--- py/dist/py/misc/testing/test_simplecapture.py (original)
+++ py/dist/py/misc/testing/test_simplecapture.py Fri Jul 29 20:23:01 2005
@@ -1,43 +1,67 @@
-import sys
+import os, sys
import py
from py.__.misc.simplecapture import SimpleOutErrCapture, callcapture
+from py.__.misc.capture import Capture, FDCapture
-def test_capturing_simple():
- cap = SimpleOutErrCapture()
- print "hello world"
- print >>sys.stderr, "hello error"
- out, err = cap.reset()
- assert out == "hello world\n"
- assert err == "hello error\n"
-
-def test_capturing_twice_error():
- cap = SimpleOutErrCapture()
- print "hello"
- cap.reset()
- py.test.raises(AttributeError, "cap.reset()")
-
-def test_capturing_modify_sysouterr_in_between():
- oldout = sys.stdout
- olderr = sys.stderr
- cap = SimpleOutErrCapture()
- print "hello",
- print >>sys.stderr, "world",
- sys.stdout = py.std.StringIO.StringIO()
- sys.stderr = py.std.StringIO.StringIO()
- print "not seen"
- print >>sys.stderr, "not seen"
- out, err = cap.reset()
- assert out == "hello"
- assert err == "world"
- assert sys.stdout == oldout
- assert sys.stderr == olderr
-
-def test_capturing_error_recursive():
- cap = SimpleOutErrCapture()
- cap2 = SimpleOutErrCapture()
- print "hello"
- cap2.reset()
- py.test.raises(AttributeError, "cap2.reset()")
+class TestFDCapture:
+ def test_basic(self):
+ tmpfile = py.std.os.tmpfile()
+ fd = tmpfile.fileno()
+ cap = FDCapture(fd)
+ os.write(fd, "hello")
+ f = cap.done()
+ s = f.read()
+ assert s == "hello"
+
+ def test_stderr(self):
+ cap = FDCapture(2, 'stderr')
+ print >>sys.stderr, "hello"
+ f = cap.done()
+ s = f.read()
+ assert s == "hello\n"
+
+class TestCapturingOnSys:
+
+ def getcapture(self):
+ return SimpleOutErrCapture()
+
+ def test_capturing_simple(self):
+ cap = self.getcapture()
+ print "hello world"
+ print >>sys.stderr, "hello error"
+ out, err = cap.reset()
+ assert out == "hello world\n"
+ assert err == "hello error\n"
+
+ def test_capturing_twice_error(self):
+ cap = self.getcapture()
+ print "hello"
+ cap.reset()
+ py.test.raises(AttributeError, "cap.reset()")
+
+ def test_capturing_modify_sysouterr_in_between(self):
+ oldout = sys.stdout
+ olderr = sys.stderr
+ cap = self.getcapture()
+ print "hello",
+ print >>sys.stderr, "world",
+ sys.stdout = py.std.StringIO.StringIO()
+ sys.stderr = py.std.StringIO.StringIO()
+ print "not seen"
+ print >>sys.stderr, "not seen"
+ out, err = cap.reset()
+ assert out == "hello"
+ assert err == "world"
+ assert sys.stdout == oldout
+ assert sys.stderr == olderr
+
+ def test_capturing_error_recursive(self):
+ cap = self.getcapture()
+ cap2 = self.getcapture()
+ print "hello"
+ cap2.reset()
+ py.test.raises(AttributeError, "cap2.reset()")
+ cap.reset()
def test_callcapture():
def func(x, y):
@@ -49,4 +73,7 @@
assert res == 42
assert out.startswith("3")
assert err.startswith("4")
-
+
+class TestCapturingOnFDs(TestCapturingOnSys):
+ def getcapture(self):
+ return Capture()
More information about the pytest-commit
mailing list