Mercurial > hg
comparison tests/test-stdio.py @ 45096:e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
The original motivation was that creating PTYs on Windows is not possible, but
`NUL` is recognized as a TTY, so we can have at least some test coverage for
the TTY case. I think it doesn’t hurt to run the test cases on all systems.
author | Manuel Jacob <me@manueljacob.de> |
---|---|
date | Thu, 09 Jul 2020 12:52:42 +0200 |
parents | 8e04607023e5 |
children | dff208398ede |
comparison
equal
deleted
inserted
replaced
45095:8e04607023e5 | 45096:e9e452eafbfb |
---|---|
53 for fd in fds: | 53 for fd in fds: |
54 try: | 54 try: |
55 os.close(fd) | 55 os.close(fd) |
56 except EnvironmentError: | 56 except EnvironmentError: |
57 pass | 57 pass |
58 | |
59 | |
60 @contextlib.contextmanager | |
61 def _devnull(): | |
62 devnull = os.open(os.devnull, os.O_WRONLY) | |
63 with _closing([devnull]): | |
64 yield (None, devnull) | |
58 | 65 |
59 | 66 |
60 @contextlib.contextmanager | 67 @contextlib.contextmanager |
61 def _pipes(): | 68 def _pipes(): |
62 rwpair = os.pipe() | 69 rwpair = os.pipe() |
113 stdout=child_stream if stream == 'stdout' else None, | 120 stdout=child_stream if stream == 'stdout' else None, |
114 stderr=child_stream if stream == 'stderr' else None, | 121 stderr=child_stream if stream == 'stderr' else None, |
115 ) | 122 ) |
116 try: | 123 try: |
117 os.close(child_stream) | 124 os.close(child_stream) |
118 check_output(stream_receiver, proc) | 125 if stream_receiver is not None: |
126 check_output(stream_receiver, proc) | |
119 except: # re-raises | 127 except: # re-raises |
120 proc.terminate() | 128 proc.terminate() |
121 raise | 129 raise |
122 finally: | 130 finally: |
123 retcode = proc.wait() | 131 retcode = proc.wait() |
135 rwpair_generator, | 143 rwpair_generator, |
136 check_output, | 144 check_output, |
137 python_args, | 145 python_args, |
138 ) | 146 ) |
139 | 147 |
148 def test_buffering_stdout_devnull(self): | |
149 self._test_buffering('stdout', _devnull, None) | |
150 | |
140 def test_buffering_stdout_pipes(self): | 151 def test_buffering_stdout_pipes(self): |
141 self._test_buffering('stdout', _pipes, FULLY_BUFFERED) | 152 self._test_buffering('stdout', _pipes, FULLY_BUFFERED) |
142 | 153 |
143 def test_buffering_stdout_ptys(self): | 154 def test_buffering_stdout_ptys(self): |
144 self._test_buffering('stdout', _ptys, LINE_BUFFERED) | 155 self._test_buffering('stdout', _ptys, LINE_BUFFERED) |
156 | |
157 def test_buffering_stdout_devnull_unbuffered(self): | |
158 self._test_buffering('stdout', _devnull, None, python_args=['-u']) | |
145 | 159 |
146 def test_buffering_stdout_pipes_unbuffered(self): | 160 def test_buffering_stdout_pipes_unbuffered(self): |
147 self._test_buffering('stdout', _pipes, UNBUFFERED, python_args=['-u']) | 161 self._test_buffering('stdout', _pipes, UNBUFFERED, python_args=['-u']) |
148 | 162 |
149 def test_buffering_stdout_ptys_unbuffered(self): | 163 def test_buffering_stdout_ptys_unbuffered(self): |
186 rwpair_generator, | 200 rwpair_generator, |
187 check_output, | 201 check_output, |
188 python_args, | 202 python_args, |
189 ) | 203 ) |
190 | 204 |
205 def test_large_write_stdout_devnull(self): | |
206 self._test_large_write('stdout', _devnull) | |
207 | |
191 def test_large_write_stdout_pipes(self): | 208 def test_large_write_stdout_pipes(self): |
192 self._test_large_write('stdout', _pipes) | 209 self._test_large_write('stdout', _pipes) |
193 | 210 |
194 def test_large_write_stdout_ptys(self): | 211 def test_large_write_stdout_ptys(self): |
195 self._test_large_write('stdout', _ptys) | 212 self._test_large_write('stdout', _ptys) |
196 | 213 |
214 def test_large_write_stdout_devnull_unbuffered(self): | |
215 self._test_large_write('stdout', _devnull, python_args=['-u']) | |
216 | |
197 def test_large_write_stdout_pipes_unbuffered(self): | 217 def test_large_write_stdout_pipes_unbuffered(self): |
198 self._test_large_write('stdout', _pipes, python_args=['-u']) | 218 self._test_large_write('stdout', _pipes, python_args=['-u']) |
199 | 219 |
200 def test_large_write_stdout_ptys_unbuffered(self): | 220 def test_large_write_stdout_ptys_unbuffered(self): |
201 self._test_large_write('stdout', _ptys, python_args=['-u']) | 221 self._test_large_write('stdout', _ptys, python_args=['-u']) |
202 | 222 |
223 def test_large_write_stderr_devnull(self): | |
224 self._test_large_write('stderr', _devnull) | |
225 | |
203 def test_large_write_stderr_pipes(self): | 226 def test_large_write_stderr_pipes(self): |
204 self._test_large_write('stderr', _pipes) | 227 self._test_large_write('stderr', _pipes) |
205 | 228 |
206 def test_large_write_stderr_ptys(self): | 229 def test_large_write_stderr_ptys(self): |
207 self._test_large_write('stderr', _ptys) | 230 self._test_large_write('stderr', _ptys) |
208 | 231 |
232 def test_large_write_stderr_devnull_unbuffered(self): | |
233 self._test_large_write('stderr', _devnull, python_args=['-u']) | |
234 | |
209 def test_large_write_stderr_pipes_unbuffered(self): | 235 def test_large_write_stderr_pipes_unbuffered(self): |
210 self._test_large_write('stderr', _pipes, python_args=['-u']) | 236 self._test_large_write('stderr', _pipes, python_args=['-u']) |
211 | 237 |
212 def test_large_write_stderr_ptys_unbuffered(self): | 238 def test_large_write_stderr_ptys_unbuffered(self): |
213 self._test_large_write('stderr', _ptys, python_args=['-u']) | 239 self._test_large_write('stderr', _ptys, python_args=['-u']) |