[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