blob: 27095b2705981596f136460d3b1517285be4c81c [file] [log] [blame]
Henry Schreiner8b405052017-08-24 17:12:43 -07001from pybind11_tests import iostream as m
2import sys
3
4from contextlib import contextmanager
5
6try:
7 # Python 3
8 from io import StringIO
9except ImportError:
10 # Python 2
11 try:
12 from cStringIO import StringIO
13 except ImportError:
14 from StringIO import StringIO
15
16try:
17 # Python 3.4
18 from contextlib import redirect_stdout
19except ImportError:
20 @contextmanager
21 def redirect_stdout(target):
22 original = sys.stdout
23 sys.stdout = target
24 yield
25 sys.stdout = original
26
27try:
28 # Python 3.5
29 from contextlib import redirect_stderr
30except ImportError:
31 @contextmanager
32 def redirect_stderr(target):
33 original = sys.stderr
34 sys.stderr = target
35 yield
36 sys.stderr = original
37
38
39def test_captured(capsys):
40 msg = "I've been redirected to Python, I hope!"
41 m.captured_output(msg)
42 stdout, stderr = capsys.readouterr()
43 assert stdout == msg
44 assert stderr == ''
45
46 m.captured_output_default(msg)
47 stdout, stderr = capsys.readouterr()
48 assert stdout == msg
49 assert stderr == ''
50
51 m.captured_err(msg)
52 stdout, stderr = capsys.readouterr()
53 assert stdout == ''
54 assert stderr == msg
55
Wenzel Jakobe0f3a762018-08-29 12:10:48 +020056
Justin Bassett2cbafb02018-08-29 02:48:30 -070057def test_captured_large_string(capsys):
58 # Make this bigger than the buffer used on the C++ side: 1024 chars
59 msg = "I've been redirected to Python, I hope!"
60 msg = msg * (1024 // len(msg) + 1)
61
62 m.captured_output_default(msg)
63 stdout, stderr = capsys.readouterr()
64 assert stdout == msg
65 assert stderr == ''
66
Henry Schreiner8b405052017-08-24 17:12:43 -070067
68def test_guard_capture(capsys):
69 msg = "I've been redirected to Python, I hope!"
70 m.guard_output(msg)
71 stdout, stderr = capsys.readouterr()
72 assert stdout == msg
73 assert stderr == ''
74
75
76def test_series_captured(capture):
77 with capture:
78 m.captured_output("a")
79 m.captured_output("b")
80 assert capture == "ab"
81
82
83def test_flush(capfd):
84 msg = "(not flushed)"
85 msg2 = "(flushed)"
86
87 with m.ostream_redirect():
88 m.noisy_function(msg, flush=False)
89 stdout, stderr = capfd.readouterr()
90 assert stdout == ''
91
92 m.noisy_function(msg2, flush=True)
93 stdout, stderr = capfd.readouterr()
94 assert stdout == msg + msg2
95
96 m.noisy_function(msg, flush=False)
97
98 stdout, stderr = capfd.readouterr()
99 assert stdout == msg
100
101
102def test_not_captured(capfd):
103 msg = "Something that should not show up in log"
104 stream = StringIO()
105 with redirect_stdout(stream):
106 m.raw_output(msg)
107 stdout, stderr = capfd.readouterr()
108 assert stdout == msg
109 assert stderr == ''
110 assert stream.getvalue() == ''
111
112 stream = StringIO()
113 with redirect_stdout(stream):
114 m.captured_output(msg)
115 stdout, stderr = capfd.readouterr()
116 assert stdout == ''
117 assert stderr == ''
118 assert stream.getvalue() == msg
119
120
121def test_err(capfd):
122 msg = "Something that should not show up in log"
123 stream = StringIO()
124 with redirect_stderr(stream):
125 m.raw_err(msg)
126 stdout, stderr = capfd.readouterr()
127 assert stdout == ''
128 assert stderr == msg
129 assert stream.getvalue() == ''
130
131 stream = StringIO()
132 with redirect_stderr(stream):
133 m.captured_err(msg)
134 stdout, stderr = capfd.readouterr()
135 assert stdout == ''
136 assert stderr == ''
137 assert stream.getvalue() == msg
138
139
140def test_multi_captured(capfd):
141 stream = StringIO()
142 with redirect_stdout(stream):
143 m.captured_output("a")
144 m.raw_output("b")
145 m.captured_output("c")
146 m.raw_output("d")
147 stdout, stderr = capfd.readouterr()
148 assert stdout == 'bd'
149 assert stream.getvalue() == 'ac'
150
151
152def test_dual(capsys):
153 m.captured_dual("a", "b")
154 stdout, stderr = capsys.readouterr()
155 assert stdout == "a"
156 assert stderr == "b"
157
158
159def test_redirect(capfd):
160 msg = "Should not be in log!"
161 stream = StringIO()
162 with redirect_stdout(stream):
163 m.raw_output(msg)
164 stdout, stderr = capfd.readouterr()
165 assert stdout == msg
166 assert stream.getvalue() == ''
167
168 stream = StringIO()
169 with redirect_stdout(stream):
170 with m.ostream_redirect():
171 m.raw_output(msg)
172 stdout, stderr = capfd.readouterr()
173 assert stdout == ''
174 assert stream.getvalue() == msg
175
176 stream = StringIO()
177 with redirect_stdout(stream):
178 m.raw_output(msg)
179 stdout, stderr = capfd.readouterr()
180 assert stdout == msg
181 assert stream.getvalue() == ''
182
183
184def test_redirect_err(capfd):
185 msg = "StdOut"
186 msg2 = "StdErr"
187
188 stream = StringIO()
189 with redirect_stderr(stream):
190 with m.ostream_redirect(stdout=False):
191 m.raw_output(msg)
192 m.raw_err(msg2)
193 stdout, stderr = capfd.readouterr()
194 assert stdout == msg
195 assert stderr == ''
196 assert stream.getvalue() == msg2
197
198
199def test_redirect_both(capfd):
200 msg = "StdOut"
201 msg2 = "StdErr"
202
203 stream = StringIO()
204 stream2 = StringIO()
205 with redirect_stdout(stream):
206 with redirect_stderr(stream2):
207 with m.ostream_redirect():
208 m.raw_output(msg)
209 m.raw_err(msg2)
210 stdout, stderr = capfd.readouterr()
211 assert stdout == ''
212 assert stderr == ''
213 assert stream.getvalue() == msg
214 assert stream2.getvalue() == msg2