13cf6e7c1a085f5456998f15f8308261c6fe096a
3 from pathlib
import Path
4 from pytest_output_to_files
import _DEFAULT_LINE_LIMIT
7 def test_help_message(testdir
):
8 # type: (pytest.Testdir) -> None
9 result
= testdir
.runpytest(
12 # fnmatch_lines does an assertion internally
13 result
.stdout
.fnmatch_lines([
15 '*--shorten-output-dir=DIR*',
16 '*shorten test outputs by storing them in files in DIR and*',
17 '*returning just the first/last few lines. disable by*',
18 '*using --shorten-output-dir=""*',
22 def do_stdout_stderr_check(testdir
, additional_args
, stdout_lines
,
23 stderr_lines
, enabled
):
24 # type: (pytest.Testdir, list[str], int, int, bool) -> pytest.RunResult
25 testdir
.makepyfile(test_print
=f
"""
29 for i in range({stdout_lines}):
30 print(f'in stdout {{i}}')
31 for i in range({stderr_lines}):
32 print(f'in stderr {{i}}', file=sys.stderr)
36 full_stdout
= ''.join(f
'in stdout {i}\n' for i
in range(stdout_lines
))
37 full_stderr
= ''.join(f
'in stderr {i}\n' for i
in range(stderr_lines
))
39 result
= testdir
.runpytest('-v', *additional_args
)
41 test_out_path
= Path(testdir
.tmpdir
)
42 test_out_path
/= "test-out"
43 test_print_path
= test_out_path
/ "test_print_py"
44 test_print_path
/= "test_print"
45 call_stdout_path
= test_print_path
/ "call-stdout.txt"
46 call_stderr_path
= test_print_path
/ "call-stderr.txt"
48 lines
= ['*--- Captured stdout call ---*']
50 if enabled
and stdout_lines
>= 2 * _DEFAULT_LINE_LIMIT
:
51 trimmed_msg
= ("Output Trimmed, Full output in: "
52 "test-out/test_print_py/test_print/call-stdout.txt")
53 lines
.append(trimmed_msg
)
55 for i
in range(_DEFAULT_LINE_LIMIT
):
56 lines
.append(f
'in stdout {i}')
58 lines
.append(trimmed_msg
)
60 for i
in range(stdout_lines
- _DEFAULT_LINE_LIMIT
, stdout_lines
):
61 lines
.append(f
'in stdout {i}')
63 lines
.append(trimmed_msg
)
65 for i
in range(stdout_lines
):
66 lines
.append(f
'in stdout {i}')
67 lines
.append('*--- Captured stderr call ---*')
68 if enabled
and stderr_lines
>= 2 * _DEFAULT_LINE_LIMIT
:
69 trimmed_msg
= ("Output Trimmed, Full output in: "
70 "test-out/test_print_py/test_print/call-stderr.txt")
71 lines
.append(trimmed_msg
)
73 for i
in range(_DEFAULT_LINE_LIMIT
):
74 lines
.append(f
'in stderr {i}')
76 lines
.append(trimmed_msg
)
78 for i
in range(stderr_lines
- _DEFAULT_LINE_LIMIT
, stderr_lines
):
79 lines
.append(f
'in stderr {i}')
81 lines
.append(trimmed_msg
)
83 for i
in range(stderr_lines
):
84 lines
.append(f
'in stderr {i}')
85 lines
.append("*====*")
87 result
.stdout
.fnmatch_lines(lines
, consecutive
=True)
89 result
.stdout
.fnmatch_lines([
90 'FAILED test_print.py::test_print *',
94 for empty_file
in ("setup-stdout.txt", "setup-stderr.txt",
95 "teardown-stdout.txt", "teardown-stderr.txt"):
96 assert (test_print_path
/ empty_file
).read_text("utf-8") == ""
97 assert call_stdout_path
.read_text("utf-8") == full_stdout
98 assert call_stderr_path
.read_text("utf-8") == full_stderr
99 call_stdout_path
.unlink() # remove big files
100 call_stderr_path
.unlink() # remove big files
102 assert not test_out_path
.exists()
103 assert result
.ret
!= 0
108 def test_ini_setting(testdir
):
109 # type: (pytest.Testdir) -> None
112 shorten-output-dir = test-out
115 do_stdout_stderr_check(testdir
, [], 1, 1, True)
118 def test_nothing(testdir
):
119 # type: (pytest.Testdir) -> None
120 do_stdout_stderr_check(testdir
, [], 1, 1, False)
123 def test_arg(testdir
):
124 # type: (pytest.Testdir) -> None
125 do_stdout_stderr_check(
126 testdir
, ["--shorten-output-dir=test-out"], 1, 1, True)
129 def test_arg_override_ini(testdir
):
130 # type: (pytest.Testdir) -> None
133 shorten-output-dir = test-out
136 do_stdout_stderr_check(
137 testdir
, ["--shorten-output-dir="], 1, 1, False)
140 def test_disable_capture(testdir
):
141 # type: (pytest.Testdir) -> None
144 shorten-output-dir = test-out
147 testdir
.makepyfile(test_print
=f
"""
152 print(f'in stderr', file=sys.stderr)
156 result
= testdir
.runpytest('-v', '-s')
158 test_out_path
= Path(testdir
.tmpdir
)
159 test_out_path
/= "test-out"
161 assert not test_out_path
.exists()
163 result
.stdout
.fnmatch_lines(['test_print.py::test_print*in stdout'])
164 result
.stderr
.fnmatch_lines(['in stderr'])
166 assert result
.ret
!= 0
169 def test_20k_disabled(testdir
):
170 # type: (pytest.Testdir) -> None
171 do_stdout_stderr_check(testdir
, [], 20000, 20000, False)
174 def test_20k(testdir
):
175 # type: (pytest.Testdir) -> None
176 do_stdout_stderr_check(
177 testdir
, ["--shorten-output-dir=test-out"], 20000, 20000, True)
180 def test_21k(testdir
):
181 # type: (pytest.Testdir) -> None
182 do_stdout_stderr_check(
183 testdir
, ["--shorten-output-dir=test-out"], 21000, 21000, True)
186 def test_22k(testdir
):
187 # type: (pytest.Testdir) -> None
188 do_stdout_stderr_check(
189 testdir
, ["--shorten-output-dir=test-out"], 22000, 22000, True)
192 def test_1x(testdir
):
193 # type: (pytest.Testdir) -> None
194 lines
= _DEFAULT_LINE_LIMIT
195 do_stdout_stderr_check(
196 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
199 def test_50_percent_more(testdir
):
200 # type: (pytest.Testdir) -> None
201 lines
= _DEFAULT_LINE_LIMIT
+ _DEFAULT_LINE_LIMIT
// 2
202 do_stdout_stderr_check(
203 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
206 def test_2x_minus_two(testdir
):
207 # type: (pytest.Testdir) -> None
208 lines
= _DEFAULT_LINE_LIMIT
* 2 - 2
209 do_stdout_stderr_check(
210 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
213 def test_2x_minus_one(testdir
):
214 # type: (pytest.Testdir) -> None
215 lines
= _DEFAULT_LINE_LIMIT
* 2 - 1
216 do_stdout_stderr_check(
217 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
220 def test_2x(testdir
):
221 # type: (pytest.Testdir) -> None
222 lines
= _DEFAULT_LINE_LIMIT
* 2
223 do_stdout_stderr_check(
224 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
227 def test_2x_plus_one(testdir
):
228 # type: (pytest.Testdir) -> None
229 lines
= _DEFAULT_LINE_LIMIT
* 2 + 1
230 do_stdout_stderr_check(
231 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
234 def test_2x_plus_two(testdir
):
235 # type: (pytest.Testdir) -> None
236 lines
= _DEFAULT_LINE_LIMIT
* 2 + 2
237 do_stdout_stderr_check(
238 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
241 def test_1M(testdir
):
242 # type: (pytest.Testdir) -> None
244 do_stdout_stderr_check(
245 testdir
, ["--shorten-output-dir=test-out"], lines
, lines
, True)
248 if __name__
== "__main__":
249 sys
.exit(pytest
.main())