Mercurial > public > mercurial-scm > hg-stable
annotate tests/test-stdio.py @ 48961:df56e6bd37f6
py3: use pickle directly
pycompat.pickle abstracted over the different pickle modules in
Python 2 and 3. Now that we're Python 3 only, it is safe to use the
`pickle` module directly. So this commit does that.
As part of this we remove the rules from check-code.py that were
forbidden direct pickle module use.
We retain the `util.pickle` symbol for backwards compatibility, just
in case some extensions were using it.
Differential Revision: https://phab.mercurial-scm.org/D12249
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 01 Mar 2022 20:29:03 -0800 |
parents | 23f5ed6dbcb1 |
children | 6000f5b25c9b |
rev | line source |
---|---|
47505
23f5ed6dbcb1
run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45849
diff
changeset
|
1 #!/usr/bin/env python |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
2 """ |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
3 Tests the buffering behavior of stdio streams in `mercurial.utils.procutil`. |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
4 """ |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
5 from __future__ import absolute_import |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
6 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
7 import contextlib |
45069
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
8 import errno |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
9 import os |
48961
df56e6bd37f6
py3: use pickle directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
47505
diff
changeset
|
10 import pickle |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
11 import signal |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
12 import subprocess |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
13 import sys |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
14 import tempfile |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
15 import unittest |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
16 |
45148
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
17 from mercurial import pycompat, util |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
18 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
19 |
45147
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
20 if pycompat.ispy3: |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
21 |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
22 def set_noninheritable(fd): |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
23 # On Python 3, file descriptors are non-inheritable by default. |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
24 pass |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
25 |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
26 |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
27 else: |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
28 if pycompat.iswindows: |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
29 # unused |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
30 set_noninheritable = None |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
31 else: |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
32 import fcntl |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
33 |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
34 def set_noninheritable(fd): |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
35 old = fcntl.fcntl(fd, fcntl.F_GETFD) |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
36 fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC) |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
37 |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
38 |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
39 TEST_BUFFERING_CHILD_SCRIPT = r''' |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
40 import os |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
41 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
42 from mercurial import dispatch |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
43 from mercurial.utils import procutil |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
44 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
45 dispatch.initstdio() |
45047
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
46 procutil.{stream}.write(b'aaa') |
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
47 os.write(procutil.{stream}.fileno(), b'[written aaa]') |
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
48 procutil.{stream}.write(b'bbb\n') |
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
49 os.write(procutil.{stream}.fileno(), b'[written bbb\\n]') |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
50 ''' |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
51 UNBUFFERED = b'aaa[written aaa]bbb\n[written bbb\\n]' |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
52 LINE_BUFFERED = b'[written aaa]aaabbb\n[written bbb\\n]' |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
53 FULLY_BUFFERED = b'[written aaa][written bbb\\n]aaabbb\n' |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
54 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
55 |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
56 TEST_LARGE_WRITE_CHILD_SCRIPT = r''' |
45104
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
57 import os |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
58 import signal |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
59 import sys |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
60 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
61 from mercurial import dispatch |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
62 from mercurial.utils import procutil |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
63 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
64 signal.signal(signal.SIGINT, lambda *x: None) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
65 dispatch.initstdio() |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
66 write_result = procutil.{stream}.write(b'x' * 1048576) |
45104
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
67 with os.fdopen( |
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
68 os.open({write_result_fn!r}, os.O_WRONLY | getattr(os, 'O_TEMPORARY', 0)), |
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
69 'w', |
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
70 ) as write_result_f: |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
71 write_result_f.write(str(write_result)) |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
72 ''' |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
73 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
74 |
45148
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
75 TEST_BROKEN_PIPE_CHILD_SCRIPT = r''' |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
76 import os |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
77 import pickle |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
78 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
79 from mercurial import dispatch |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
80 from mercurial.utils import procutil |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
81 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
82 dispatch.initstdio() |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
83 procutil.stdin.read(1) # wait until parent process closed pipe |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
84 try: |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
85 procutil.{stream}.write(b'test') |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
86 procutil.{stream}.flush() |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
87 except EnvironmentError as e: |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
88 with os.fdopen( |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
89 os.open( |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
90 {err_fn!r}, |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
91 os.O_WRONLY |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
92 | getattr(os, 'O_BINARY', 0) |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
93 | getattr(os, 'O_TEMPORARY', 0), |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
94 ), |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
95 'wb', |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
96 ) as err_f: |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
97 pickle.dump(e, err_f) |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
98 # Exit early to suppress further broken pipe errors at interpreter shutdown. |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
99 os._exit(0) |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
100 ''' |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
101 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
102 |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
103 @contextlib.contextmanager |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
104 def _closing(fds): |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
105 try: |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
106 yield |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
107 finally: |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
108 for fd in fds: |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
109 try: |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
110 os.close(fd) |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
111 except EnvironmentError: |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
112 pass |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
113 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
114 |
45147
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
115 # In the following, we set the FDs non-inheritable mainly to make it possible |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
116 # for tests to close the receiving end of the pipe / PTYs. |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
117 |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
118 |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
119 @contextlib.contextmanager |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
120 def _devnull(): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
121 devnull = os.open(os.devnull, os.O_WRONLY) |
45147
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
122 # We don't have a receiving end, so it's not worth the effort on Python 2 |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
123 # on Windows to make the FD non-inheritable. |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
124 with _closing([devnull]): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
125 yield (None, devnull) |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
126 |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
127 |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
128 @contextlib.contextmanager |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
129 def _pipes(): |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
130 rwpair = os.pipe() |
45147
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
131 # Pipes are already non-inheritable on Windows. |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
132 if not pycompat.iswindows: |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
133 set_noninheritable(rwpair[0]) |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
134 set_noninheritable(rwpair[1]) |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
135 with _closing(rwpair): |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
136 yield rwpair |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
137 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
138 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
139 @contextlib.contextmanager |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
140 def _ptys(): |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
141 if pycompat.iswindows: |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
142 raise unittest.SkipTest("PTYs are not supported on Windows") |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
143 import pty |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
144 import tty |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
145 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
146 rwpair = pty.openpty() |
45147
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
147 set_noninheritable(rwpair[0]) |
c2c862b9b544
tests: make pipes / PTYs non-inheritable in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45104
diff
changeset
|
148 set_noninheritable(rwpair[1]) |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
149 with _closing(rwpair): |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
150 tty.setraw(rwpair[0]) |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
151 yield rwpair |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
152 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
153 |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
154 def _readall(fd, buffer_size, initial_buf=None): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
155 buf = initial_buf or [] |
45069
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
156 while True: |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
157 try: |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
158 s = os.read(fd, buffer_size) |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
159 except OSError as e: |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
160 if e.errno == errno.EIO: |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
161 # If the child-facing PTY got closed, reading from the |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
162 # parent-facing PTY raises EIO. |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
163 break |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
164 raise |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
165 if not s: |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
166 break |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
167 buf.append(s) |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
168 return b''.join(buf) |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
169 |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
170 |
45047
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
171 class TestStdio(unittest.TestCase): |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
172 def _test( |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
173 self, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
174 child_script, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
175 stream, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
176 rwpair_generator, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
177 check_output, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
178 python_args=[], |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
179 post_child_check=None, |
45148
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
180 stdin_generator=None, |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
181 ): |
45047
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
182 assert stream in ('stdout', 'stderr') |
45148
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
183 if stdin_generator is None: |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
184 stdin_generator = open(os.devnull, 'rb') |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
185 with rwpair_generator() as ( |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
186 stream_receiver, |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
187 child_stream, |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
188 ), stdin_generator as child_stdin: |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
189 proc = subprocess.Popen( |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
190 [sys.executable] + python_args + ['-c', child_script], |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
191 stdin=child_stdin, |
45047
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
192 stdout=child_stream if stream == 'stdout' else None, |
359884685eab
tests: generalize common test case code in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45046
diff
changeset
|
193 stderr=child_stream if stream == 'stderr' else None, |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
194 ) |
45069
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
195 try: |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
196 os.close(child_stream) |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
197 if stream_receiver is not None: |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
198 check_output(stream_receiver, proc) |
45070
9172fd511999
tests: terminate subprocess in test-stdio.py in case of exception
Manuel Jacob <me@manueljacob.de>
parents:
45069
diff
changeset
|
199 except: # re-raises |
9172fd511999
tests: terminate subprocess in test-stdio.py in case of exception
Manuel Jacob <me@manueljacob.de>
parents:
45069
diff
changeset
|
200 proc.terminate() |
9172fd511999
tests: terminate subprocess in test-stdio.py in case of exception
Manuel Jacob <me@manueljacob.de>
parents:
45069
diff
changeset
|
201 raise |
45069
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
202 finally: |
8cd18aba5e6c
tests: proof test-stdio.py against buffer fill-up
Manuel Jacob <me@manueljacob.de>
parents:
45048
diff
changeset
|
203 retcode = proc.wait() |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
204 self.assertEqual(retcode, 0) |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
205 if post_child_check is not None: |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
206 post_child_check() |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
207 |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
208 def _test_buffering( |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
209 self, stream, rwpair_generator, expected_output, python_args=[] |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
210 ): |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
211 def check_output(stream_receiver, proc): |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
212 self.assertEqual(_readall(stream_receiver, 1024), expected_output) |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
213 |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
214 self._test( |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
215 TEST_BUFFERING_CHILD_SCRIPT.format(stream=stream), |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
216 stream, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
217 rwpair_generator, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
218 check_output, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
219 python_args, |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
220 ) |
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
221 |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
222 def test_buffering_stdout_devnull(self): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
223 self._test_buffering('stdout', _devnull, None) |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
224 |
45071
bc05c13e246f
tests: make names in test-stdio.py more distinctive
Manuel Jacob <me@manueljacob.de>
parents:
45070
diff
changeset
|
225 def test_buffering_stdout_pipes(self): |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
226 self._test_buffering('stdout', _pipes, FULLY_BUFFERED) |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
227 |
45071
bc05c13e246f
tests: make names in test-stdio.py more distinctive
Manuel Jacob <me@manueljacob.de>
parents:
45070
diff
changeset
|
228 def test_buffering_stdout_ptys(self): |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
229 self._test_buffering('stdout', _ptys, LINE_BUFFERED) |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
230 |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
231 def test_buffering_stdout_devnull_unbuffered(self): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
232 self._test_buffering('stdout', _devnull, None, python_args=['-u']) |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
233 |
45071
bc05c13e246f
tests: make names in test-stdio.py more distinctive
Manuel Jacob <me@manueljacob.de>
parents:
45070
diff
changeset
|
234 def test_buffering_stdout_pipes_unbuffered(self): |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
235 self._test_buffering('stdout', _pipes, UNBUFFERED, python_args=['-u']) |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
236 |
45071
bc05c13e246f
tests: make names in test-stdio.py more distinctive
Manuel Jacob <me@manueljacob.de>
parents:
45070
diff
changeset
|
237 def test_buffering_stdout_ptys_unbuffered(self): |
45079
a59aab6078eb
tests: make subprocess handling reusable for different tests in test-stdio.py
Manuel Jacob <me@manueljacob.de>
parents:
45078
diff
changeset
|
238 self._test_buffering('stdout', _ptys, UNBUFFERED, python_args=['-u']) |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
239 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
240 if not pycompat.ispy3 and not pycompat.iswindows: |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
241 # On Python 2 on non-Windows, we manually open stdout in line-buffered |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
242 # mode if connected to a TTY. We should check if Python was configured |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
243 # to use unbuffered stdout, but it's hard to do that. |
45071
bc05c13e246f
tests: make names in test-stdio.py more distinctive
Manuel Jacob <me@manueljacob.de>
parents:
45070
diff
changeset
|
244 test_buffering_stdout_ptys_unbuffered = unittest.expectedFailure( |
bc05c13e246f
tests: make names in test-stdio.py more distinctive
Manuel Jacob <me@manueljacob.de>
parents:
45070
diff
changeset
|
245 test_buffering_stdout_ptys_unbuffered |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
246 ) |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
247 |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
248 def _test_large_write(self, stream, rwpair_generator, python_args=[]): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
249 if not pycompat.ispy3 and pycompat.isdarwin: |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
250 # Python 2 doesn't always retry on EINTR, but the libc might retry. |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
251 # So far, it was observed only on macOS that EINTR is raised at the |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
252 # Python level. As Python 2 support will be dropped soon-ish, we |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
253 # won't attempt to fix it. |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
254 raise unittest.SkipTest("raises EINTR on macOS") |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
255 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
256 def check_output(stream_receiver, proc): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
257 if not pycompat.iswindows: |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
258 # On Unix, we can provoke a partial write() by interrupting it |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
259 # by a signal handler as soon as a bit of data was written. |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
260 # We test that write() is called until all data is written. |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
261 buf = [os.read(stream_receiver, 1)] |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
262 proc.send_signal(signal.SIGINT) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
263 else: |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
264 # On Windows, there doesn't seem to be a way to cause partial |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
265 # writes. |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
266 buf = [] |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
267 self.assertEqual( |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
268 _readall(stream_receiver, 131072, buf), b'x' * 1048576 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
269 ) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
270 |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
271 def post_child_check(): |
45104
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
272 write_result_str = write_result_f.read() |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
273 if pycompat.ispy3: |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
274 # On Python 3, we test that the correct number of bytes is |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
275 # claimed to have been written. |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
276 expected_write_result_str = '1048576' |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
277 else: |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
278 # On Python 2, we only check that the large write does not |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
279 # crash. |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
280 expected_write_result_str = 'None' |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
281 self.assertEqual(write_result_str, expected_write_result_str) |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
282 |
45104
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
283 with tempfile.NamedTemporaryFile('r') as write_result_f: |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
284 self._test( |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
285 TEST_LARGE_WRITE_CHILD_SCRIPT.format( |
45104
eb26a9cf7821
procutil: avoid use of deprecated tempfile.mktemp()
Manuel Jacob <me@manueljacob.de>
parents:
45097
diff
changeset
|
286 stream=stream, write_result_fn=write_result_f.name |
45097
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
287 ), |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
288 stream, |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
289 rwpair_generator, |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
290 check_output, |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
291 python_args, |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
292 post_child_check=post_child_check, |
dff208398ede
tests: check that procutil.std{out,err}.write() returns correct result
Manuel Jacob <me@manueljacob.de>
parents:
45096
diff
changeset
|
293 ) |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
294 |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
295 def test_large_write_stdout_devnull(self): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
296 self._test_large_write('stdout', _devnull) |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
297 |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
298 def test_large_write_stdout_pipes(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
299 self._test_large_write('stdout', _pipes) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
300 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
301 def test_large_write_stdout_ptys(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
302 self._test_large_write('stdout', _ptys) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
303 |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
304 def test_large_write_stdout_devnull_unbuffered(self): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
305 self._test_large_write('stdout', _devnull, python_args=['-u']) |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
306 |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
307 def test_large_write_stdout_pipes_unbuffered(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
308 self._test_large_write('stdout', _pipes, python_args=['-u']) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
309 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
310 def test_large_write_stdout_ptys_unbuffered(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
311 self._test_large_write('stdout', _ptys, python_args=['-u']) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
312 |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
313 def test_large_write_stderr_devnull(self): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
314 self._test_large_write('stderr', _devnull) |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
315 |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
316 def test_large_write_stderr_pipes(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
317 self._test_large_write('stderr', _pipes) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
318 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
319 def test_large_write_stderr_ptys(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
320 self._test_large_write('stderr', _ptys) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
321 |
45096
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
322 def test_large_write_stderr_devnull_unbuffered(self): |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
323 self._test_large_write('stderr', _devnull, python_args=['-u']) |
e9e452eafbfb
tests: add tests for when stdout or stderr is connected to `os.devnull`
Manuel Jacob <me@manueljacob.de>
parents:
45095
diff
changeset
|
324 |
45095
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
325 def test_large_write_stderr_pipes_unbuffered(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
326 self._test_large_write('stderr', _pipes, python_args=['-u']) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
327 |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
328 def test_large_write_stderr_ptys_unbuffered(self): |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
329 self._test_large_write('stderr', _ptys, python_args=['-u']) |
8e04607023e5
procutil: ensure that procutil.std{out,err}.write() writes all bytes
Manuel Jacob <me@manueljacob.de>
parents:
45079
diff
changeset
|
330 |
45148
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
331 def _test_broken_pipe(self, stream): |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
332 assert stream in ('stdout', 'stderr') |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
333 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
334 def check_output(stream_receiver, proc): |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
335 os.close(stream_receiver) |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
336 proc.stdin.write(b'x') |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
337 proc.stdin.close() |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
338 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
339 def post_child_check(): |
48961
df56e6bd37f6
py3: use pickle directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
47505
diff
changeset
|
340 err = pickle.load(err_f) |
45148
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
341 self.assertEqual(err.errno, errno.EPIPE) |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
342 self.assertEqual(err.strerror, "Broken pipe") |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
343 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
344 with tempfile.NamedTemporaryFile('rb') as err_f: |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
345 self._test( |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
346 TEST_BROKEN_PIPE_CHILD_SCRIPT.format( |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
347 stream=stream, err_fn=err_f.name |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
348 ), |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
349 stream, |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
350 _pipes, |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
351 check_output, |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
352 post_child_check=post_child_check, |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
353 stdin_generator=util.nullcontextmanager(subprocess.PIPE), |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
354 ) |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
355 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
356 def test_broken_pipe_stdout(self): |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
357 self._test_broken_pipe('stdout') |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
358 |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
359 def test_broken_pipe_stderr(self): |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
360 self._test_broken_pipe('stderr') |
a37f290a7124
windows: always work around EINVAL in case of broken pipe for stdout / stderr
Manuel Jacob <me@manueljacob.de>
parents:
45147
diff
changeset
|
361 |
45041
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
362 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
363 if __name__ == '__main__': |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
364 import silenttestrunner |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
365 |
c7d109c400a4
tests: add tests for buffering behavior of mercurial.utils.procutil.stdout
Manuel Jacob <me@manueljacob.de>
parents:
diff
changeset
|
366 silenttestrunner.main(__name__) |