112391Sjason@lowepower.comfrom pybind11_tests import iostream as m
212391Sjason@lowepower.comimport sys
312391Sjason@lowepower.com
412391Sjason@lowepower.comfrom contextlib import contextmanager
512391Sjason@lowepower.com
612391Sjason@lowepower.comtry:
712391Sjason@lowepower.com    # Python 3
812391Sjason@lowepower.com    from io import StringIO
912391Sjason@lowepower.comexcept ImportError:
1012391Sjason@lowepower.com    # Python 2
1112391Sjason@lowepower.com    try:
1212391Sjason@lowepower.com        from cStringIO import StringIO
1312391Sjason@lowepower.com    except ImportError:
1412391Sjason@lowepower.com        from StringIO import StringIO
1512391Sjason@lowepower.com
1612391Sjason@lowepower.comtry:
1712391Sjason@lowepower.com    # Python 3.4
1812391Sjason@lowepower.com    from contextlib import redirect_stdout
1912391Sjason@lowepower.comexcept ImportError:
2012391Sjason@lowepower.com    @contextmanager
2112391Sjason@lowepower.com    def redirect_stdout(target):
2212391Sjason@lowepower.com        original = sys.stdout
2312391Sjason@lowepower.com        sys.stdout = target
2412391Sjason@lowepower.com        yield
2512391Sjason@lowepower.com        sys.stdout = original
2612391Sjason@lowepower.com
2712391Sjason@lowepower.comtry:
2812391Sjason@lowepower.com    # Python 3.5
2912391Sjason@lowepower.com    from contextlib import redirect_stderr
3012391Sjason@lowepower.comexcept ImportError:
3112391Sjason@lowepower.com    @contextmanager
3212391Sjason@lowepower.com    def redirect_stderr(target):
3312391Sjason@lowepower.com        original = sys.stderr
3412391Sjason@lowepower.com        sys.stderr = target
3512391Sjason@lowepower.com        yield
3612391Sjason@lowepower.com        sys.stderr = original
3712391Sjason@lowepower.com
3812391Sjason@lowepower.com
3912391Sjason@lowepower.comdef test_captured(capsys):
4012391Sjason@lowepower.com    msg = "I've been redirected to Python, I hope!"
4112391Sjason@lowepower.com    m.captured_output(msg)
4212391Sjason@lowepower.com    stdout, stderr = capsys.readouterr()
4312391Sjason@lowepower.com    assert stdout == msg
4412391Sjason@lowepower.com    assert stderr == ''
4512391Sjason@lowepower.com
4612391Sjason@lowepower.com    m.captured_output_default(msg)
4712391Sjason@lowepower.com    stdout, stderr = capsys.readouterr()
4812391Sjason@lowepower.com    assert stdout == msg
4912391Sjason@lowepower.com    assert stderr == ''
5012391Sjason@lowepower.com
5112391Sjason@lowepower.com    m.captured_err(msg)
5212391Sjason@lowepower.com    stdout, stderr = capsys.readouterr()
5312391Sjason@lowepower.com    assert stdout == ''
5412391Sjason@lowepower.com    assert stderr == msg
5512391Sjason@lowepower.com
5612391Sjason@lowepower.com
5714299Sbbruce@ucdavis.edudef test_captured_large_string(capsys):
5814299Sbbruce@ucdavis.edu    # Make this bigger than the buffer used on the C++ side: 1024 chars
5914299Sbbruce@ucdavis.edu    msg = "I've been redirected to Python, I hope!"
6014299Sbbruce@ucdavis.edu    msg = msg * (1024 // len(msg) + 1)
6114299Sbbruce@ucdavis.edu
6214299Sbbruce@ucdavis.edu    m.captured_output_default(msg)
6314299Sbbruce@ucdavis.edu    stdout, stderr = capsys.readouterr()
6414299Sbbruce@ucdavis.edu    assert stdout == msg
6514299Sbbruce@ucdavis.edu    assert stderr == ''
6614299Sbbruce@ucdavis.edu
6714299Sbbruce@ucdavis.edu
6812391Sjason@lowepower.comdef test_guard_capture(capsys):
6912391Sjason@lowepower.com    msg = "I've been redirected to Python, I hope!"
7012391Sjason@lowepower.com    m.guard_output(msg)
7112391Sjason@lowepower.com    stdout, stderr = capsys.readouterr()
7212391Sjason@lowepower.com    assert stdout == msg
7312391Sjason@lowepower.com    assert stderr == ''
7412391Sjason@lowepower.com
7512391Sjason@lowepower.com
7612391Sjason@lowepower.comdef test_series_captured(capture):
7712391Sjason@lowepower.com    with capture:
7812391Sjason@lowepower.com        m.captured_output("a")
7912391Sjason@lowepower.com        m.captured_output("b")
8012391Sjason@lowepower.com    assert capture == "ab"
8112391Sjason@lowepower.com
8212391Sjason@lowepower.com
8312391Sjason@lowepower.comdef test_flush(capfd):
8412391Sjason@lowepower.com    msg = "(not flushed)"
8512391Sjason@lowepower.com    msg2 = "(flushed)"
8612391Sjason@lowepower.com
8712391Sjason@lowepower.com    with m.ostream_redirect():
8812391Sjason@lowepower.com        m.noisy_function(msg, flush=False)
8912391Sjason@lowepower.com        stdout, stderr = capfd.readouterr()
9012391Sjason@lowepower.com        assert stdout == ''
9112391Sjason@lowepower.com
9212391Sjason@lowepower.com        m.noisy_function(msg2, flush=True)
9312391Sjason@lowepower.com        stdout, stderr = capfd.readouterr()
9412391Sjason@lowepower.com        assert stdout == msg + msg2
9512391Sjason@lowepower.com
9612391Sjason@lowepower.com        m.noisy_function(msg, flush=False)
9712391Sjason@lowepower.com
9812391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
9912391Sjason@lowepower.com    assert stdout == msg
10012391Sjason@lowepower.com
10112391Sjason@lowepower.com
10212391Sjason@lowepower.comdef test_not_captured(capfd):
10312391Sjason@lowepower.com    msg = "Something that should not show up in log"
10412391Sjason@lowepower.com    stream = StringIO()
10512391Sjason@lowepower.com    with redirect_stdout(stream):
10612391Sjason@lowepower.com        m.raw_output(msg)
10712391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
10812391Sjason@lowepower.com    assert stdout == msg
10912391Sjason@lowepower.com    assert stderr == ''
11012391Sjason@lowepower.com    assert stream.getvalue() == ''
11112391Sjason@lowepower.com
11212391Sjason@lowepower.com    stream = StringIO()
11312391Sjason@lowepower.com    with redirect_stdout(stream):
11412391Sjason@lowepower.com        m.captured_output(msg)
11512391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
11612391Sjason@lowepower.com    assert stdout == ''
11712391Sjason@lowepower.com    assert stderr == ''
11812391Sjason@lowepower.com    assert stream.getvalue() == msg
11912391Sjason@lowepower.com
12012391Sjason@lowepower.com
12112391Sjason@lowepower.comdef test_err(capfd):
12212391Sjason@lowepower.com    msg = "Something that should not show up in log"
12312391Sjason@lowepower.com    stream = StringIO()
12412391Sjason@lowepower.com    with redirect_stderr(stream):
12512391Sjason@lowepower.com        m.raw_err(msg)
12612391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
12712391Sjason@lowepower.com    assert stdout == ''
12812391Sjason@lowepower.com    assert stderr == msg
12912391Sjason@lowepower.com    assert stream.getvalue() == ''
13012391Sjason@lowepower.com
13112391Sjason@lowepower.com    stream = StringIO()
13212391Sjason@lowepower.com    with redirect_stderr(stream):
13312391Sjason@lowepower.com        m.captured_err(msg)
13412391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
13512391Sjason@lowepower.com    assert stdout == ''
13612391Sjason@lowepower.com    assert stderr == ''
13712391Sjason@lowepower.com    assert stream.getvalue() == msg
13812391Sjason@lowepower.com
13912391Sjason@lowepower.com
14012391Sjason@lowepower.comdef test_multi_captured(capfd):
14112391Sjason@lowepower.com    stream = StringIO()
14212391Sjason@lowepower.com    with redirect_stdout(stream):
14312391Sjason@lowepower.com        m.captured_output("a")
14412391Sjason@lowepower.com        m.raw_output("b")
14512391Sjason@lowepower.com        m.captured_output("c")
14612391Sjason@lowepower.com        m.raw_output("d")
14712391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
14812391Sjason@lowepower.com    assert stdout == 'bd'
14912391Sjason@lowepower.com    assert stream.getvalue() == 'ac'
15012391Sjason@lowepower.com
15112391Sjason@lowepower.com
15212391Sjason@lowepower.comdef test_dual(capsys):
15312391Sjason@lowepower.com    m.captured_dual("a", "b")
15412391Sjason@lowepower.com    stdout, stderr = capsys.readouterr()
15512391Sjason@lowepower.com    assert stdout == "a"
15612391Sjason@lowepower.com    assert stderr == "b"
15712391Sjason@lowepower.com
15812391Sjason@lowepower.com
15912391Sjason@lowepower.comdef test_redirect(capfd):
16012391Sjason@lowepower.com    msg = "Should not be in log!"
16112391Sjason@lowepower.com    stream = StringIO()
16212391Sjason@lowepower.com    with redirect_stdout(stream):
16312391Sjason@lowepower.com        m.raw_output(msg)
16412391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
16512391Sjason@lowepower.com    assert stdout == msg
16612391Sjason@lowepower.com    assert stream.getvalue() == ''
16712391Sjason@lowepower.com
16812391Sjason@lowepower.com    stream = StringIO()
16912391Sjason@lowepower.com    with redirect_stdout(stream):
17012391Sjason@lowepower.com        with m.ostream_redirect():
17112391Sjason@lowepower.com            m.raw_output(msg)
17212391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
17312391Sjason@lowepower.com    assert stdout == ''
17412391Sjason@lowepower.com    assert stream.getvalue() == msg
17512391Sjason@lowepower.com
17612391Sjason@lowepower.com    stream = StringIO()
17712391Sjason@lowepower.com    with redirect_stdout(stream):
17812391Sjason@lowepower.com        m.raw_output(msg)
17912391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
18012391Sjason@lowepower.com    assert stdout == msg
18112391Sjason@lowepower.com    assert stream.getvalue() == ''
18212391Sjason@lowepower.com
18312391Sjason@lowepower.com
18412391Sjason@lowepower.comdef test_redirect_err(capfd):
18512391Sjason@lowepower.com    msg = "StdOut"
18612391Sjason@lowepower.com    msg2 = "StdErr"
18712391Sjason@lowepower.com
18812391Sjason@lowepower.com    stream = StringIO()
18912391Sjason@lowepower.com    with redirect_stderr(stream):
19012391Sjason@lowepower.com        with m.ostream_redirect(stdout=False):
19112391Sjason@lowepower.com            m.raw_output(msg)
19212391Sjason@lowepower.com            m.raw_err(msg2)
19312391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
19412391Sjason@lowepower.com    assert stdout == msg
19512391Sjason@lowepower.com    assert stderr == ''
19612391Sjason@lowepower.com    assert stream.getvalue() == msg2
19712391Sjason@lowepower.com
19812391Sjason@lowepower.com
19912391Sjason@lowepower.comdef test_redirect_both(capfd):
20012391Sjason@lowepower.com    msg = "StdOut"
20112391Sjason@lowepower.com    msg2 = "StdErr"
20212391Sjason@lowepower.com
20312391Sjason@lowepower.com    stream = StringIO()
20412391Sjason@lowepower.com    stream2 = StringIO()
20512391Sjason@lowepower.com    with redirect_stdout(stream):
20612391Sjason@lowepower.com        with redirect_stderr(stream2):
20712391Sjason@lowepower.com            with m.ostream_redirect():
20812391Sjason@lowepower.com                m.raw_output(msg)
20912391Sjason@lowepower.com                m.raw_err(msg2)
21012391Sjason@lowepower.com    stdout, stderr = capfd.readouterr()
21112391Sjason@lowepower.com    assert stdout == ''
21212391Sjason@lowepower.com    assert stderr == ''
21312391Sjason@lowepower.com    assert stream.getvalue() == msg
21412391Sjason@lowepower.com    assert stream2.getvalue() == msg2
215