aboutsummaryrefslogtreecommitdiffstats
path: root/tests/wpt/web-platform-tests/tools/pytest/testing/test_capture.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/wpt/web-platform-tests/tools/pytest/testing/test_capture.py')
-rw-r--r--tests/wpt/web-platform-tests/tools/pytest/testing/test_capture.py1068
1 files changed, 0 insertions, 1068 deletions
diff --git a/tests/wpt/web-platform-tests/tools/pytest/testing/test_capture.py b/tests/wpt/web-platform-tests/tools/pytest/testing/test_capture.py
deleted file mode 100644
index 73660692b8e..00000000000
--- a/tests/wpt/web-platform-tests/tools/pytest/testing/test_capture.py
+++ /dev/null
@@ -1,1068 +0,0 @@
-# note: py.io capture tests where copied from
-# pylib 1.4.20.dev2 (rev 13d9af95547e)
-from __future__ import with_statement
-import pickle
-import os
-import sys
-
-import _pytest._code
-import py
-import pytest
-import contextlib
-
-from _pytest import capture
-from _pytest.capture import CaptureManager
-from _pytest.main import EXIT_NOTESTSCOLLECTED
-from py.builtin import print_
-
-needsosdup = pytest.mark.xfail("not hasattr(os, 'dup')")
-
-if sys.version_info >= (3, 0):
- def tobytes(obj):
- if isinstance(obj, str):
- obj = obj.encode('UTF-8')
- assert isinstance(obj, bytes)
- return obj
-
- def totext(obj):
- if isinstance(obj, bytes):
- obj = str(obj, 'UTF-8')
- assert isinstance(obj, str)
- return obj
-else:
- def tobytes(obj):
- if isinstance(obj, unicode):
- obj = obj.encode('UTF-8')
- assert isinstance(obj, str)
- return obj
-
- def totext(obj):
- if isinstance(obj, str):
- obj = unicode(obj, 'UTF-8')
- assert isinstance(obj, unicode)
- return obj
-
-
-def oswritebytes(fd, obj):
- os.write(fd, tobytes(obj))
-
-
-
-def StdCaptureFD(out=True, err=True, in_=True):
- return capture.MultiCapture(out, err, in_, Capture=capture.FDCapture)
-
-def StdCapture(out=True, err=True, in_=True):
- return capture.MultiCapture(out, err, in_, Capture=capture.SysCapture)
-
-
-class TestCaptureManager:
- def test_getmethod_default_no_fd(self, monkeypatch):
- from _pytest.capture import pytest_addoption
- from _pytest.config import Parser
- parser = Parser()
- pytest_addoption(parser)
- default = parser._groups[0].options[0].default
- assert default == "fd" if hasattr(os, "dup") else "sys"
- parser = Parser()
- monkeypatch.delattr(os, 'dup', raising=False)
- pytest_addoption(parser)
- assert parser._groups[0].options[0].default == "sys"
-
- @needsosdup
- @pytest.mark.parametrize("method",
- ['no', 'sys', pytest.mark.skipif('not hasattr(os, "dup")', 'fd')])
- def test_capturing_basic_api(self, method):
- capouter = StdCaptureFD()
- old = sys.stdout, sys.stderr, sys.stdin
- try:
- capman = CaptureManager(method)
- capman.init_capturings()
- outerr = capman.suspendcapture()
- assert outerr == ("", "")
- outerr = capman.suspendcapture()
- assert outerr == ("", "")
- print ("hello")
- out, err = capman.suspendcapture()
- if method == "no":
- assert old == (sys.stdout, sys.stderr, sys.stdin)
- else:
- assert not out
- capman.resumecapture()
- print ("hello")
- out, err = capman.suspendcapture()
- if method != "no":
- assert out == "hello\n"
- capman.reset_capturings()
- finally:
- capouter.stop_capturing()
-
- @needsosdup
- def test_init_capturing(self):
- capouter = StdCaptureFD()
- try:
- capman = CaptureManager("fd")
- capman.init_capturings()
- pytest.raises(AssertionError, "capman.init_capturings()")
- capman.reset_capturings()
- finally:
- capouter.stop_capturing()
-
-
-@pytest.mark.parametrize("method", ['fd', 'sys'])
-def test_capturing_unicode(testdir, method):
- if hasattr(sys, "pypy_version_info") and sys.pypy_version_info < (2,2):
- pytest.xfail("does not work on pypy < 2.2")
- if sys.version_info >= (3, 0):
- obj = "'b\u00f6y'"
- else:
- obj = "u'\u00f6y'"
- testdir.makepyfile("""
- # coding=utf8
- # taken from issue 227 from nosetests
- def test_unicode():
- import sys
- print (sys.stdout)
- print (%s)
- """ % obj)
- result = testdir.runpytest("--capture=%s" % method)
- result.stdout.fnmatch_lines([
- "*1 passed*"
- ])
-
-
-@pytest.mark.parametrize("method", ['fd', 'sys'])
-def test_capturing_bytes_in_utf8_encoding(testdir, method):
- testdir.makepyfile("""
- def test_unicode():
- print ('b\\u00f6y')
- """)
- result = testdir.runpytest("--capture=%s" % method)
- result.stdout.fnmatch_lines([
- "*1 passed*"
- ])
-
-
-def test_collect_capturing(testdir):
- p = testdir.makepyfile("""
- print ("collect %s failure" % 13)
- import xyz42123
- """)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- "*Captured stdout*",
- "*collect 13 failure*",
- ])
-
-
-class TestPerTestCapturing:
- def test_capture_and_fixtures(self, testdir):
- p = testdir.makepyfile("""
- def setup_module(mod):
- print ("setup module")
- def setup_function(function):
- print ("setup " + function.__name__)
- def test_func1():
- print ("in func1")
- assert 0
- def test_func2():
- print ("in func2")
- assert 0
- """)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- "setup module*",
- "setup test_func1*",
- "in func1*",
- "setup test_func2*",
- "in func2*",
- ])
-
- @pytest.mark.xfail(reason="unimplemented feature")
- def test_capture_scope_cache(self, testdir):
- p = testdir.makepyfile("""
- import sys
- def setup_module(func):
- print ("module-setup")
- def setup_function(func):
- print ("function-setup")
- def test_func():
- print ("in function")
- assert 0
- def teardown_function(func):
- print ("in teardown")
- """)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- "*test_func():*",
- "*Captured stdout during setup*",
- "module-setup*",
- "function-setup*",
- "*Captured stdout*",
- "in teardown*",
- ])
-
- def test_no_carry_over(self, testdir):
- p = testdir.makepyfile("""
- def test_func1():
- print ("in func1")
- def test_func2():
- print ("in func2")
- assert 0
- """)
- result = testdir.runpytest(p)
- s = result.stdout.str()
- assert "in func1" not in s
- assert "in func2" in s
-
- def test_teardown_capturing(self, testdir):
- p = testdir.makepyfile("""
- def setup_function(function):
- print ("setup func1")
- def teardown_function(function):
- print ("teardown func1")
- assert 0
- def test_func1():
- print ("in func1")
- pass
- """)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- '*teardown_function*',
- '*Captured stdout*',
- "setup func1*",
- "in func1*",
- "teardown func1*",
- #"*1 fixture failure*"
- ])
-
- def test_teardown_capturing_final(self, testdir):
- p = testdir.makepyfile("""
- def teardown_module(mod):
- print ("teardown module")
- assert 0
- def test_func():
- pass
- """)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- "*def teardown_module(mod):*",
- "*Captured stdout*",
- "*teardown module*",
- "*1 error*",
- ])
-
- def test_capturing_outerr(self, testdir):
- p1 = testdir.makepyfile("""
- import sys
- def test_capturing():
- print (42)
- sys.stderr.write(str(23))
- def test_capturing_error():
- print (1)
- sys.stderr.write(str(2))
- raise ValueError
- """)
- result = testdir.runpytest(p1)
- result.stdout.fnmatch_lines([
- "*test_capturing_outerr.py .F",
- "====* FAILURES *====",
- "____*____",
- "*test_capturing_outerr.py:8: ValueError",
- "*--- Captured stdout *call*",
- "1",
- "*--- Captured stderr *call*",
- "2",
- ])
-
-
-class TestLoggingInteraction:
- def test_logging_stream_ownership(self, testdir):
- p = testdir.makepyfile("""
- def test_logging():
- import logging
- import pytest
- stream = capture.TextIO()
- logging.basicConfig(stream=stream)
- stream.close() # to free memory/release resources
- """)
- result = testdir.runpytest_subprocess(p)
- result.stderr.str().find("atexit") == -1
-
- def test_logging_and_immediate_setupteardown(self, testdir):
- p = testdir.makepyfile("""
- import logging
- def setup_function(function):
- logging.warn("hello1")
-
- def test_logging():
- logging.warn("hello2")
- assert 0
-
- def teardown_function(function):
- logging.warn("hello3")
- assert 0
- """)
- for optargs in (('--capture=sys',), ('--capture=fd',)):
- print (optargs)
- result = testdir.runpytest_subprocess(p, *optargs)
- s = result.stdout.str()
- result.stdout.fnmatch_lines([
- "*WARN*hello3", # errors show first!
- "*WARN*hello1",
- "*WARN*hello2",
- ])
- # verify proper termination
- assert "closed" not in s
-
- def test_logging_and_crossscope_fixtures(self, testdir):
- p = testdir.makepyfile("""
- import logging
- def setup_module(function):
- logging.warn("hello1")
-
- def test_logging():
- logging.warn("hello2")
- assert 0
-
- def teardown_module(function):
- logging.warn("hello3")
- assert 0
- """)
- for optargs in (('--capture=sys',), ('--capture=fd',)):
- print (optargs)
- result = testdir.runpytest_subprocess(p, *optargs)
- s = result.stdout.str()
- result.stdout.fnmatch_lines([
- "*WARN*hello3", # errors come first
- "*WARN*hello1",
- "*WARN*hello2",
- ])
- # verify proper termination
- assert "closed" not in s
-
- def test_logging_initialized_in_test(self, testdir):
- p = testdir.makepyfile("""
- import sys
- def test_something():
- # pytest does not import logging
- assert 'logging' not in sys.modules
- import logging
- logging.basicConfig()
- logging.warn("hello432")
- assert 0
- """)
- result = testdir.runpytest_subprocess(
- p, "--traceconfig",
- "-p", "no:capturelog")
- assert result.ret != 0
- result.stdout.fnmatch_lines([
- "*hello432*",
- ])
- assert 'operation on closed file' not in result.stderr.str()
-
- def test_conftestlogging_is_shown(self, testdir):
- testdir.makeconftest("""
- import logging
- logging.basicConfig()
- logging.warn("hello435")
- """)
- # make sure that logging is still captured in tests
- result = testdir.runpytest_subprocess("-s", "-p", "no:capturelog")
- assert result.ret == EXIT_NOTESTSCOLLECTED
- result.stderr.fnmatch_lines([
- "WARNING*hello435*",
- ])
- assert 'operation on closed file' not in result.stderr.str()
-
- def test_conftestlogging_and_test_logging(self, testdir):
- testdir.makeconftest("""
- import logging
- logging.basicConfig()
- """)
- # make sure that logging is still captured in tests
- p = testdir.makepyfile("""
- def test_hello():
- import logging
- logging.warn("hello433")
- assert 0
- """)
- result = testdir.runpytest_subprocess(p, "-p", "no:capturelog")
- assert result.ret != 0
- result.stdout.fnmatch_lines([
- "WARNING*hello433*",
- ])
- assert 'something' not in result.stderr.str()
- assert 'operation on closed file' not in result.stderr.str()
-
-
-class TestCaptureFixture:
- @pytest.mark.parametrize("opt", [[], ["-s"]])
- def test_std_functional(self, testdir, opt):
- reprec = testdir.inline_runsource("""
- def test_hello(capsys):
- print (42)
- out, err = capsys.readouterr()
- assert out.startswith("42")
- """, *opt)
- reprec.assertoutcome(passed=1)
-
- def test_capsyscapfd(self, testdir):
- p = testdir.makepyfile("""
- def test_one(capsys, capfd):
- pass
- def test_two(capfd, capsys):
- pass
- """)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- "*ERROR*setup*test_one*",
- "*capsys*capfd*same*time*",
- "*ERROR*setup*test_two*",
- "*capsys*capfd*same*time*",
- "*2 error*"])
-
- @pytest.mark.parametrize("method", ["sys", "fd"])
- def test_capture_is_represented_on_failure_issue128(self, testdir, method):
- p = testdir.makepyfile("""
- def test_hello(cap%s):
- print ("xxx42xxx")
- assert 0
- """ % method)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- "xxx42xxx",
- ])
-
- @needsosdup
- def test_stdfd_functional(self, testdir):
- reprec = testdir.inline_runsource("""
- def test_hello(capfd):
- import os
- os.write(1, "42".encode('ascii'))
- out, err = capfd.readouterr()
- assert out.startswith("42")
- capfd.close()
- """)
- reprec.assertoutcome(passed=1)
-
- def test_partial_setup_failure(self, testdir):
- p = testdir.makepyfile("""
- def test_hello(capsys, missingarg):
- pass
- """)
- result = testdir.runpytest(p)
- result.stdout.fnmatch_lines([
- "*test_partial_setup_failure*",
- "*1 error*",
- ])
-
- @needsosdup
- def test_keyboardinterrupt_disables_capturing(self, testdir):
- p = testdir.makepyfile("""
- def test_hello(capfd):
- import os
- os.write(1, str(42).encode('ascii'))
- raise KeyboardInterrupt()
- """)
- result = testdir.runpytest_subprocess(p)
- result.stdout.fnmatch_lines([
- "*KeyboardInterrupt*"
- ])
- assert result.ret == 2
-
- @pytest.mark.issue14
- def test_capture_and_logging(self, testdir):
- p = testdir.makepyfile("""
- import logging
- def test_log(capsys):
- logging.error('x')
- """)
- result = testdir.runpytest_subprocess(p)
- assert 'closed' not in result.stderr.str()
-
-
-def test_setup_failure_does_not_kill_capturing(testdir):
- sub1 = testdir.mkpydir("sub1")
- sub1.join("conftest.py").write(_pytest._code.Source("""
- def pytest_runtest_setup(item):
- raise ValueError(42)
- """))
- sub1.join("test_mod.py").write("def test_func1(): pass")
- result = testdir.runpytest(testdir.tmpdir, '--traceconfig')
- result.stdout.fnmatch_lines([
- "*ValueError(42)*",
- "*1 error*"
- ])
-
-
-def test_fdfuncarg_skips_on_no_osdup(testdir):
- testdir.makepyfile("""
- import os
- if hasattr(os, 'dup'):
- del os.dup
- def test_hello(capfd):
- pass
- """)
- result = testdir.runpytest_subprocess("--capture=no")
- result.stdout.fnmatch_lines([
- "*1 skipped*"
- ])
-
-
-def test_capture_conftest_runtest_setup(testdir):
- testdir.makeconftest("""
- def pytest_runtest_setup():
- print ("hello19")
- """)
- testdir.makepyfile("def test_func(): pass")
- result = testdir.runpytest()
- assert result.ret == 0
- assert 'hello19' not in result.stdout.str()
-
-
-def test_capture_badoutput_issue412(testdir):
- testdir.makepyfile("""
- import os
-
- def test_func():
- omg = bytearray([1,129,1])
- os.write(1, omg)
- assert 0
- """)
- result = testdir.runpytest('--cap=fd')
- result.stdout.fnmatch_lines('''
- *def test_func*
- *assert 0*
- *Captured*
- *1 failed*
- ''')
-
-
-def test_capture_early_option_parsing(testdir):
- testdir.makeconftest("""
- def pytest_runtest_setup():
- print ("hello19")
- """)
- testdir.makepyfile("def test_func(): pass")
- result = testdir.runpytest("-vs")
- assert result.ret == 0
- assert 'hello19' in result.stdout.str()
-
-
-def test_capture_binary_output(testdir):
- testdir.makepyfile(r"""
- import pytest
-
- def test_a():
- import sys
- import subprocess
- subprocess.call([sys.executable, __file__])
-
- def test_foo():
- import os;os.write(1, b'\xc3')
-
- if __name__ == '__main__':
- test_foo()
- """)
- result = testdir.runpytest('--assert=plain')
- result.assert_outcomes(passed=2)
-
-
-def test_error_during_readouterr(testdir):
- """Make sure we suspend capturing if errors occurr during readouterr"""
- testdir.makepyfile(pytest_xyz="""
- from _pytest.capture import FDCapture
- def bad_snap(self):
- raise Exception('boom')
- assert FDCapture.snap
- FDCapture.snap = bad_snap
- """)
- result = testdir.runpytest_subprocess(
- "-p", "pytest_xyz", "--version", syspathinsert=True
- )
- result.stderr.fnmatch_lines([
- "*in bad_snap",
- " raise Exception('boom')",
- "Exception: boom",
- ])
-
-
-class TestTextIO:
- def test_text(self):
- f = capture.TextIO()
- f.write("hello")
- s = f.getvalue()
- assert s == "hello"
- f.close()
-
- def test_unicode_and_str_mixture(self):
- f = capture.TextIO()
- if sys.version_info >= (3, 0):
- f.write("\u00f6")
- pytest.raises(TypeError, "f.write(bytes('hello', 'UTF-8'))")
- else:
- f.write(unicode("\u00f6", 'UTF-8'))
- f.write("hello") # bytes
- s = f.getvalue()
- f.close()
- assert isinstance(s, unicode)
-
-
-def test_bytes_io():
- f = py.io.BytesIO()
- f.write(tobytes("hello"))
- pytest.raises(TypeError, "f.write(totext('hello'))")
- s = f.getvalue()
- assert s == tobytes("hello")
-
-
-def test_dontreadfrominput():
- from _pytest.capture import DontReadFromInput
- f = DontReadFromInput()
- assert not f.isatty()
- pytest.raises(IOError, f.read)
- pytest.raises(IOError, f.readlines)
- pytest.raises(IOError, iter, f)
- pytest.raises(ValueError, f.fileno)
- f.close() # just for completeness
-
-
-@pytest.yield_fixture
-def tmpfile(testdir):
- f = testdir.makepyfile("").open('wb+')
- yield f
- if not f.closed:
- f.close()
-
-@needsosdup
-def test_dupfile(tmpfile):
- flist = []
- for i in range(5):
- nf = capture.safe_text_dupfile(tmpfile, "wb")
- assert nf != tmpfile
- assert nf.fileno() != tmpfile.fileno()
- assert nf not in flist
- print_(i, end="", file=nf)
- flist.append(nf)
- for i in range(5):
- f = flist[i]
- f.close()
- tmpfile.seek(0)
- s = tmpfile.read()
- assert "01234" in repr(s)
- tmpfile.close()
-
-def test_dupfile_on_bytesio():
- io = py.io.BytesIO()
- f = capture.safe_text_dupfile(io, "wb")
- f.write("hello")
- assert io.getvalue() == b"hello"
-
-def test_dupfile_on_textio():
- io = py.io.TextIO()
- f = capture.safe_text_dupfile(io, "wb")
- f.write("hello")
- assert io.getvalue() == "hello"
-
-
-@contextlib.contextmanager
-def lsof_check():
- pid = os.getpid()
- try:
- out = py.process.cmdexec("lsof -p %d" % pid)
- except (py.process.cmdexec.Error, UnicodeDecodeError):
- # about UnicodeDecodeError, see note on pytester
- pytest.skip("could not run 'lsof'")
- yield
- out2 = py.process.cmdexec("lsof -p %d" % pid)
- len1 = len([x for x in out.split("\n") if "REG" in x])
- len2 = len([x for x in out2.split("\n") if "REG" in x])
- assert len2 < len1 + 3, out2
-
-
-class TestFDCapture:
- pytestmark = needsosdup
-
- def test_simple(self, tmpfile):
- fd = tmpfile.fileno()
- cap = capture.FDCapture(fd)
- data = tobytes("hello")
- os.write(fd, data)
- s = cap.snap()
- cap.done()
- assert not s
- cap = capture.FDCapture(fd)
- cap.start()
- os.write(fd, data)
- s = cap.snap()
- cap.done()
- assert s == "hello"
-
- def test_simple_many(self, tmpfile):
- for i in range(10):
- self.test_simple(tmpfile)
-
- def test_simple_many_check_open_files(self, testdir):
- with lsof_check():
- with testdir.makepyfile("").open('wb+') as tmpfile:
- self.test_simple_many(tmpfile)
-
- def test_simple_fail_second_start(self, tmpfile):
- fd = tmpfile.fileno()
- cap = capture.FDCapture(fd)
- cap.done()
- pytest.raises(ValueError, cap.start)
-
- def test_stderr(self):
- cap = capture.FDCapture(2)
- cap.start()
- print_("hello", file=sys.stderr)
- s = cap.snap()
- cap.done()
- assert s == "hello\n"
-
- def test_stdin(self, tmpfile):
- cap = capture.FDCapture(0)
- cap.start()
- x = os.read(0, 100).strip()
- cap.done()
- assert x == tobytes('')
-
- def test_writeorg(self, tmpfile):
- data1, data2 = tobytes("foo"), tobytes("bar")
- cap = capture.FDCapture(tmpfile.fileno())
- cap.start()
- tmpfile.write(data1)
- tmpfile.flush()
- cap.writeorg(data2)
- scap = cap.snap()
- cap.done()
- assert scap == totext(data1)
- with open(tmpfile.name, 'rb') as stmp_file:
- stmp = stmp_file.read()
- assert stmp == data2
-
- def test_simple_resume_suspend(self, tmpfile):
- with saved_fd(1):
- cap = capture.FDCapture(1)
- cap.start()
- data = tobytes("hello")
- os.write(1, data)
- sys.stdout.write("whatever")
- s = cap.snap()
- assert s == "hellowhatever"
- cap.suspend()
- os.write(1, tobytes("world"))
- sys.stdout.write("qlwkej")
- assert not cap.snap()
- cap.resume()
- os.write(1, tobytes("but now"))
- sys.stdout.write(" yes\n")
- s = cap.snap()
- assert s == "but now yes\n"
- cap.suspend()
- cap.done()
- pytest.raises(AttributeError, cap.suspend)
-
-
-@contextlib.contextmanager
-def saved_fd(fd):
- new_fd = os.dup(fd)
- try:
- yield
- finally:
- os.dup2(new_fd, fd)
- os.close(new_fd)
-
-
-class TestStdCapture:
- captureclass = staticmethod(StdCapture)
-
- @contextlib.contextmanager
- def getcapture(self, **kw):
- cap = self.__class__.captureclass(**kw)
- cap.start_capturing()
- try:
- yield cap
- finally:
- cap.stop_capturing()
-
- def test_capturing_done_simple(self):
- with self.getcapture() as cap:
- sys.stdout.write("hello")
- sys.stderr.write("world")
- out, err = cap.readouterr()
- assert out == "hello"
- assert err == "world"
-
- def test_capturing_reset_simple(self):
- with self.getcapture() as cap:
- print("hello world")
- sys.stderr.write("hello error\n")
- out, err = cap.readouterr()
- assert out == "hello world\n"
- assert err == "hello error\n"
-
- def test_capturing_readouterr(self):
- with self.getcapture() as cap:
- print ("hello world")
- sys.stderr.write("hello error\n")
- out, err = cap.readouterr()
- assert out == "hello world\n"
- assert err == "hello error\n"
- sys.stderr.write("error2")
- out, err = cap.readouterr()
- assert err == "error2"
-
- def test_capturing_readouterr_unicode(self):
- with self.getcapture() as cap:
- print ("hx\xc4\x85\xc4\x87")
- out, err = cap.readouterr()
- assert out == py.builtin._totext("hx\xc4\x85\xc4\x87\n", "utf8")
-
- @pytest.mark.skipif('sys.version_info >= (3,)',
- reason='text output different for bytes on python3')
- def test_capturing_readouterr_decode_error_handling(self):
- with self.getcapture() as cap:
- # triggered a internal error in pytest
- print('\xa6')
- out, err = cap.readouterr()
- assert out == py.builtin._totext('\ufffd\n', 'unicode-escape')
-
- def test_reset_twice_error(self):
- with self.getcapture() as cap:
- print ("hello")
- out, err = cap.readouterr()
- pytest.raises(ValueError, cap.stop_capturing)
- assert out == "hello\n"
- assert not err
-
- def test_capturing_modify_sysouterr_in_between(self):
- oldout = sys.stdout
- olderr = sys.stderr
- with self.getcapture() as cap:
- sys.stdout.write("hello")
- sys.stderr.write("world")
- sys.stdout = capture.TextIO()
- sys.stderr = capture.TextIO()
- print ("not seen")
- sys.stderr.write("not seen\n")
- out, err = cap.readouterr()
- assert out == "hello"
- assert err == "world"
- assert sys.stdout == oldout
- assert sys.stderr == olderr
-
- def test_capturing_error_recursive(self):
- with self.getcapture() as cap1:
- print ("cap1")
- with self.getcapture() as cap2:
- print ("cap2")
- out2, err2 = cap2.readouterr()
- out1, err1 = cap1.readouterr()
- assert out1 == "cap1\n"
- assert out2 == "cap2\n"
-
- def test_just_out_capture(self):
- with self.getcapture(out=True, err=False) as cap:
- sys.stdout.write("hello")
- sys.stderr.write("world")
- out, err = cap.readouterr()
- assert out == "hello"
- assert not err
-
- def test_just_err_capture(self):
- with self.getcapture(out=False, err=True) as cap:
- sys.stdout.write("hello")
- sys.stderr.write("world")
- out, err = cap.readouterr()
- assert err == "world"
- assert not out
-
- def test_stdin_restored(self):
- old = sys.stdin
- with self.getcapture(in_=True):
- newstdin = sys.stdin
- assert newstdin != sys.stdin
- assert sys.stdin is old
-
- def test_stdin_nulled_by_default(self):
- print ("XXX this test may well hang instead of crashing")
- print ("XXX which indicates an error in the underlying capturing")
- print ("XXX mechanisms")
- with self.getcapture():
- pytest.raises(IOError, "sys.stdin.read()")
-
-
-class TestStdCaptureFD(TestStdCapture):
- pytestmark = needsosdup
- captureclass = staticmethod(StdCaptureFD)
-
- def test_simple_only_fd(self, testdir):
- testdir.makepyfile("""
- import os
- def test_x():
- os.write(1, "hello\\n".encode("ascii"))
- assert 0
- """)
- result = testdir.runpytest_subprocess()
- result.stdout.fnmatch_lines("""
- *test_x*
- *assert 0*
- *Captured stdout*
- """)
-
- def test_intermingling(self):
- with self.getcapture() as cap:
- oswritebytes(1, "1")
- sys.stdout.write(str(2))
- sys.stdout.flush()
- oswritebytes(1, "3")
- oswritebytes(2, "a")
- sys.stderr.write("b")
- sys.stderr.flush()
- oswritebytes(2, "c")
- out, err = cap.readouterr()
- assert out == "123"
- assert err == "abc"
-
- def test_many(self, capfd):
- with lsof_check():
- for i in range(10):
- cap = StdCaptureFD()
- cap.stop_capturing()
-
-
-class TestStdCaptureFDinvalidFD:
- pytestmark = needsosdup
-
- def test_stdcapture_fd_invalid_fd(self, testdir):
- testdir.makepyfile("""
- import os
- from _pytest import capture
- def StdCaptureFD(out=True, err=True, in_=True):
- return capture.MultiCapture(out, err, in_,
- Capture=capture.FDCapture)
- def test_stdout():
- os.close(1)
- cap = StdCaptureFD(out=True, err=False, in_=False)
- cap.stop_capturing()
- def test_stderr():
- os.close(2)
- cap = StdCaptureFD(out=False, err=True, in_=False)
- cap.stop_capturing()
- def test_stdin():
- os.close(0)
- cap = StdCaptureFD(out=False, err=False, in_=True)
- cap.stop_capturing()
- """)
- result = testdir.runpytest_subprocess("--capture=fd")
- assert result.ret == 0
- assert result.parseoutcomes()['passed'] == 3
-
-
-def test_capture_not_started_but_reset():
- capsys = StdCapture()
- capsys.stop_capturing()
-
-
-@needsosdup
-@pytest.mark.parametrize('use', [True, False])
-def test_fdcapture_tmpfile_remains_the_same(tmpfile, use):
- if not use:
- tmpfile = True
- cap = StdCaptureFD(out=False, err=tmpfile)
- try:
- cap.start_capturing()
- capfile = cap.err.tmpfile
- cap.readouterr()
- finally:
- cap.stop_capturing()
- capfile2 = cap.err.tmpfile
- assert capfile2 == capfile
-
-@needsosdup
-def test_close_and_capture_again(testdir):
- testdir.makepyfile("""
- import os
- def test_close():
- os.close(1)
- def test_capture_again():
- os.write(1, b"hello\\n")
- assert 0
- """)
- result = testdir.runpytest_subprocess()
- result.stdout.fnmatch_lines("""
- *test_capture_again*
- *assert 0*
- *stdout*
- *hello*
- """)
-
-
-
-@pytest.mark.parametrize('method', ['SysCapture', 'FDCapture'])
-def test_capturing_and_logging_fundamentals(testdir, method):
- if method == "StdCaptureFD" and not hasattr(os, 'dup'):
- pytest.skip("need os.dup")
- # here we check a fundamental feature
- p = testdir.makepyfile("""
- import sys, os
- import py, logging
- from _pytest import capture
- cap = capture.MultiCapture(out=False, in_=False,
- Capture=capture.%s)
- cap.start_capturing()
-
- logging.warn("hello1")
- outerr = cap.readouterr()
- print ("suspend, captured %%s" %%(outerr,))
- logging.warn("hello2")
-
- cap.pop_outerr_to_orig()
- logging.warn("hello3")
-
- outerr = cap.readouterr()
- print ("suspend2, captured %%s" %% (outerr,))
- """ % (method,))
- result = testdir.runpython(p)
- result.stdout.fnmatch_lines("""
- suspend, captured*hello1*
- suspend2, captured*WARNING:root:hello3*
- """)
- result.stderr.fnmatch_lines("""
- WARNING:root:hello2
- """)
- assert "atexit" not in result.stderr.str()
-
-
-def test_error_attribute_issue555(testdir):
- testdir.makepyfile("""
- import sys
- def test_capattr():
- assert sys.stdout.errors == "strict"
- assert sys.stderr.errors == "strict"
- """)
- reprec = testdir.inline_run()
- reprec.assertoutcome(passed=1)
-
-
-def test_dontreadfrominput_has_encoding(testdir):
- testdir.makepyfile("""
- import sys
- def test_capattr():
- # should not raise AttributeError
- assert sys.stdout.encoding
- assert sys.stderr.encoding
- """)
- reprec = testdir.inline_run()
- reprec.assertoutcome(passed=1)
-
-
-def test_pickling_and_unpickling_enocded_file():
- # See https://bitbucket.org/pytest-dev/pytest/pull-request/194
- # pickle.loads() raises infinite recursion if
- # EncodedFile.__getattr__ is not implemented properly
- ef = capture.EncodedFile(None, None)
- ef_as_str = pickle.dumps(ef)
- pickle.loads(ef_as_str)