diff --git a/_pytest/capture.py b/_pytest/capture.py index 797b4970a..2ce6fae7f 100644 --- a/_pytest/capture.py +++ b/_pytest/capture.py @@ -126,13 +126,11 @@ class CaptureManager: def _getcapture(self, method): if method == "fd": return StdCaptureFD( - now=False, out=self._maketempfile(), err=self._maketempfile(), ) elif method == "sys": return StdCapture( - now=False, out=self._makestringio(), err=self._makestringio(), ) @@ -283,7 +281,7 @@ def pytest_funcarg__capfd(request): class CaptureFixture: def __init__(self, captureclass): - self._capture = captureclass(now=False) + self._capture = captureclass() def _start(self): self._capture.startall() @@ -307,7 +305,7 @@ class CaptureFixture: class FDCapture: """ Capture IO to/from a given os-level filedescriptor. """ - def __init__(self, targetfd, tmpfile=None, now=True, patchsys=False): + def __init__(self, targetfd, tmpfile=None, patchsys=False): """ save targetfd descriptor, and open a new temporary file there. If no tmpfile is specified a tempfile.Tempfile() will be opened @@ -322,8 +320,6 @@ class FDCapture: self._savefd = os.dup(self.targetfd) if patchsys: self._oldsys = getattr(sys, patchsysdict[targetfd]) - if now: - self.start() def start(self): try: @@ -421,6 +417,7 @@ class Capture(object): and capture output/error during its execution. """ so = cls() + so.startall() try: res = func(*args, **kwargs) finally: @@ -457,18 +454,15 @@ class StdCaptureFD(Capture): is invalid it will not be captured. """ def __init__(self, out=True, err=True, mixed=False, - in_=True, patchsys=True, now=True): + in_=True, patchsys=True): self._options = { "out": out, "err": err, "mixed": mixed, "in_": in_, "patchsys": patchsys, - "now": now, } self._save() - if now: - self.startall() def _save(self): in_ = self._options['in_'] @@ -479,7 +473,7 @@ class StdCaptureFD(Capture): if in_: try: self.in_ = FDCapture( - 0, tmpfile=None, now=False, + 0, tmpfile=None, patchsys=patchsys) except OSError: pass @@ -490,7 +484,7 @@ class StdCaptureFD(Capture): try: self.out = FDCapture( 1, tmpfile=tmpfile, - now=False, patchsys=patchsys) + patchsys=patchsys) self._options['out'] = self.out.tmpfile except OSError: pass @@ -504,7 +498,7 @@ class StdCaptureFD(Capture): try: self.err = FDCapture( 2, tmpfile=tmpfile, - now=False, patchsys=patchsys) + patchsys=patchsys) self._options['err'] = self.err.tmpfile except OSError: pass @@ -562,7 +556,7 @@ class StdCapture(Capture): modifies sys.stdout|stderr|stdin attributes and does not touch underlying File Descriptors (use StdCaptureFD for that). """ - def __init__(self, out=True, err=True, in_=True, mixed=False, now=True): + def __init__(self, out=True, err=True, in_=True, mixed=False): self._oldout = sys.stdout self._olderr = sys.stderr self._oldin = sys.stdin @@ -576,8 +570,6 @@ class StdCapture(Capture): err = TextIO() self.err = err self.in_ = in_ - if now: - self.startall() def startall(self): if self.out: diff --git a/testing/test_capture.py b/testing/test_capture.py index cdc8f5295..24b71b07a 100644 --- a/testing/test_capture.py +++ b/testing/test_capture.py @@ -661,21 +661,6 @@ def lsof_check(func): class TestFDCapture: pytestmark = needsosdup - def test_not_now(self, tmpfile): - fd = tmpfile.fileno() - cap = capture.FDCapture(fd, now=False) - data = tobytes("hello") - os.write(fd, data) - f = cap.done() - s = f.read() - assert not s - cap = capture.FDCapture(fd, now=False) - cap.start() - os.write(fd, data) - f = cap.done() - s = f.read() - assert s == "hello" - def test_simple(self, tmpfile): fd = tmpfile.fileno() cap = capture.FDCapture(fd) @@ -683,8 +668,13 @@ class TestFDCapture: os.write(fd, data) f = cap.done() s = f.read() + assert not s + cap = capture.FDCapture(fd) + cap.start() + os.write(fd, data) + f = cap.done() + s = f.read() assert s == "hello" - f.close() def test_simple_many(self, tmpfile): for i in range(10): @@ -702,6 +692,7 @@ class TestFDCapture: def test_stderr(self): cap = capture.FDCapture(2, patchsys=True) + cap.start() print_("hello", file=sys.stderr) f = cap.done() s = f.read() @@ -711,6 +702,7 @@ class TestFDCapture: tmpfile.write(tobytes("3")) tmpfile.seek(0) cap = capture.FDCapture(0, tmpfile=tmpfile) + cap.start() # check with os.read() directly instead of raw_input(), because # sys.stdin itself may be redirected (as pytest now does by default) x = os.read(0, 100).strip() @@ -721,6 +713,7 @@ class TestFDCapture: data1, data2 = tobytes("foo"), tobytes("bar") try: cap = capture.FDCapture(tmpfile.fileno()) + cap.start() tmpfile.write(data1) cap.writeorg(data2) finally: @@ -734,7 +727,9 @@ class TestFDCapture: class TestStdCapture: def getcapture(self, **kw): - return capture.StdCapture(**kw) + cap = capture.StdCapture(**kw) + cap.startall() + return cap def test_capturing_done_simple(self): cap = self.getcapture() @@ -879,19 +874,13 @@ class TestStdCapture: assert not err -class TestStdCaptureNotNow(TestStdCapture): - def getcapture(self, **kw): - kw['now'] = False - cap = capture.StdCapture(**kw) - cap.startall() - return cap - - class TestStdCaptureFD(TestStdCapture): pytestmark = needsosdup def getcapture(self, **kw): - return capture.StdCaptureFD(**kw) + cap = capture.StdCaptureFD(**kw) + cap.startall() + return cap def test_intermingling(self): cap = self.getcapture() @@ -926,15 +915,6 @@ class TestStdCaptureFD(TestStdCapture): lsof_check(f) -class TestStdCaptureFDNotNow(TestStdCaptureFD): - pytestmark = needsosdup - - def getcapture(self, **kw): - kw['now'] = False - cap = capture.StdCaptureFD(**kw) - cap.startall() - return cap - @needsosdup def test_stdcapture_fd_tmpfile(tmpfile): @@ -974,7 +954,7 @@ class TestStdCaptureFDinvalidFD: def test_capture_not_started_but_reset(): - capsys = capture.StdCapture(now=False) + capsys = capture.StdCapture() capsys.done() capsys.done() capsys.reset() @@ -985,6 +965,7 @@ def test_capture_no_sys(): capsys = capture.StdCapture() try: cap = capture.StdCaptureFD(patchsys=False) + cap.startall() sys.stdout.write("hello") sys.stderr.write("world") oswritebytes(1, "1") @@ -1006,6 +987,7 @@ def test_callcapture_nofd(): return 42 capfd = capture.StdCaptureFD(patchsys=False) + capfd.startall() try: res, out, err = capture.StdCapture.call(func, 3, y=4) finally: @@ -1020,7 +1002,7 @@ def test_callcapture_nofd(): def test_fdcapture_tmpfile_remains_the_same(tmpfile, use): if not use: tmpfile = True - cap = capture.StdCaptureFD(out=False, err=tmpfile, now=False) + cap = capture.StdCaptureFD(out=False, err=tmpfile) try: cap.startall() capfile = cap.err.tmpfile @@ -1042,6 +1024,7 @@ def test_capturing_and_logging_fundamentals(testdir, method): import py, logging from _pytest import capture cap = capture.%s(out=False, in_=False) + cap.startall() logging.warn("hello1") outerr = cap.suspend()