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'])