Skip to content

Commit

Permalink
Merge pull request #5083 from blueyed/capture-_suspended
Browse files Browse the repository at this point in the history
capture: store _state
  • Loading branch information
blueyed committed Apr 19, 2019
2 parents 79d5fc3 + 698c4e7 commit e3e57a7
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 9 deletions.
37 changes: 33 additions & 4 deletions src/_pytest/capture.py
Original file line number Diff line number Diff line change
Expand Up @@ -456,6 +456,7 @@ def __getattr__(self, name):

class MultiCapture(object):
out = err = in_ = None
_state = None

def __init__(self, out=True, err=True, in_=True, Capture=None):
if in_:
Expand All @@ -466,9 +467,16 @@ def __init__(self, out=True, err=True, in_=True, Capture=None):
self.err = Capture(2)

def __repr__(self):
return "<MultiCapture out=%r err=%r in_=%r>" % (self.out, self.err, self.in_)
return "<MultiCapture out=%r err=%r in_=%r _state=%r _in_suspended=%r>" % (
self.out,
self.err,
self.in_,
self._state,
getattr(self, "_in_suspended", "<UNSET>"),
)

def start_capturing(self):
self._state = "started"
if self.in_:
self.in_.start()
if self.out:
Expand All @@ -486,6 +494,7 @@ def pop_outerr_to_orig(self):
return out, err

def suspend_capturing(self, in_=False):
self._state = "suspended"
if self.out:
self.out.suspend()
if self.err:
Expand All @@ -495,6 +504,7 @@ def suspend_capturing(self, in_=False):
self._in_suspended = True

def resume_capturing(self):
self._state = "resumed"
if self.out:
self.out.resume()
if self.err:
Expand All @@ -505,9 +515,9 @@ def resume_capturing(self):

def stop_capturing(self):
""" stop capturing and reset capturing streams """
if hasattr(self, "_reset"):
if self._state == "stopped":
raise ValueError("was already stopped")
self._reset = True
self._state = "stopped"
if self.out:
self.out.done()
if self.err:
Expand Down Expand Up @@ -535,6 +545,7 @@ class FDCaptureBinary(object):
"""

EMPTY_BUFFER = b""
_state = None

def __init__(self, targetfd, tmpfile=None):
self.targetfd = targetfd
Expand All @@ -561,9 +572,10 @@ def __init__(self, targetfd, tmpfile=None):
self.tmpfile_fd = tmpfile.fileno()

def __repr__(self):
return "<FDCapture %s oldfd=%s>" % (
return "<FDCapture %s oldfd=%s _state=%r>" % (
self.targetfd,
getattr(self, "targetfd_save", None),
self._state,
)

def start(self):
Expand All @@ -574,6 +586,7 @@ def start(self):
raise ValueError("saved filedescriptor not valid anymore")
os.dup2(self.tmpfile_fd, self.targetfd)
self.syscapture.start()
self._state = "started"

def snap(self):
self.tmpfile.seek(0)
Expand All @@ -590,14 +603,17 @@ def done(self):
os.close(targetfd_save)
self.syscapture.done()
_attempt_to_close_capture_file(self.tmpfile)
self._state = "done"

def suspend(self):
self.syscapture.suspend()
os.dup2(self.targetfd_save, self.targetfd)
self._state = "suspended"

def resume(self):
self.syscapture.resume()
os.dup2(self.tmpfile_fd, self.targetfd)
self._state = "resumed"

def writeorg(self, data):
""" write to original file descriptor. """
Expand Down Expand Up @@ -625,6 +641,7 @@ def snap(self):
class SysCapture(object):

EMPTY_BUFFER = str()
_state = None

def __init__(self, fd, tmpfile=None):
name = patchsysdict[fd]
Expand All @@ -637,8 +654,17 @@ def __init__(self, fd, tmpfile=None):
tmpfile = CaptureIO()
self.tmpfile = tmpfile

def __repr__(self):
return "<SysCapture %s _old=%r, tmpfile=%r _state=%r>" % (
self.name,
self._old,
self.tmpfile,
self._state,
)

def start(self):
setattr(sys, self.name, self.tmpfile)
self._state = "started"

def snap(self):
res = self.tmpfile.getvalue()
Expand All @@ -650,12 +676,15 @@ def done(self):
setattr(sys, self.name, self._old)
del self._old
_attempt_to_close_capture_file(self.tmpfile)
self._state = "done"

def suspend(self):
setattr(sys, self.name, self._old)
self._state = "suspended"

def resume(self):
setattr(sys, self.name, self.tmpfile)
self._state = "resumed"

def writeorg(self, data):
self._old.write(data)
Expand Down
9 changes: 4 additions & 5 deletions testing/test_capture.py
Original file line number Diff line number Diff line change
Expand Up @@ -1243,25 +1243,24 @@ def test_stdcapture_fd_invalid_fd(self, testdir):
from _pytest import capture
def StdCaptureFD(out=True, err=True, in_=True):
return capture.MultiCapture(out, err, in_,
Capture=capture.FDCapture)
return capture.MultiCapture(out, err, in_, Capture=capture.FDCapture)
def test_stdout():
os.close(1)
cap = StdCaptureFD(out=True, err=False, in_=False)
assert repr(cap.out) == "<FDCapture 1 oldfd=None>"
assert repr(cap.out) == "<FDCapture 1 oldfd=None _state=None>"
cap.stop_capturing()
def test_stderr():
os.close(2)
cap = StdCaptureFD(out=False, err=True, in_=False)
assert repr(cap.err) == "<FDCapture 2 oldfd=None>"
assert repr(cap.err) == "<FDCapture 2 oldfd=None _state=None>"
cap.stop_capturing()
def test_stdin():
os.close(0)
cap = StdCaptureFD(out=False, err=False, in_=True)
assert repr(cap.in_) == "<FDCapture 0 oldfd=None>"
assert repr(cap.in_) == "<FDCapture 0 oldfd=None _state=None>"
cap.stop_capturing()
"""
)
Expand Down

0 comments on commit e3e57a7

Please sign in to comment.