Skip to content

Commit 1987fb2

Browse files
Add tests for warnings and simplify for print
- also add checks of exit code
1 parent 97e0b2e commit 1987fb2

File tree

1 file changed

+69
-26
lines changed

1 file changed

+69
-26
lines changed

Lib/test/test_sys_getattr.py

Lines changed: 69 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ class PySysGetAttrTest(unittest.TestCase):
1313

1414
common_faulthandler_code = textwrap.dedent('''
1515
from contextlib import redirect_stderr
16+
from faulthandler import dump_traceback, enable, dump_traceback_later
1617
from threading import Thread
1718
import time
18-
from faulthandler import dump_traceback, enable, dump_traceback_later
1919
2020
class FakeFile:
2121
def __init__(self):
@@ -42,41 +42,63 @@ def main():
4242
4343
if __name__ == "__main__":
4444
main()
45+
exit(0)
46+
''')
47+
48+
common_warnings_code = textwrap.dedent('''
49+
from io import StringIO
50+
import sys
51+
import warnings
52+
53+
class Foo:
54+
def __init__(self):
55+
self.x = sys.stderr
56+
setattr(sys, "stderr", StringIO())
57+
58+
def __repr__(self):
59+
x = sys.stderr
60+
setattr(sys, "stderr", self.x)
61+
del x
62+
return "Foo"
63+
64+
def main():
65+
del warnings._showwarnmsg
66+
{0}
67+
68+
if __name__ == "__main__":
69+
main()
70+
exit(0)
4571
''')
4672

4773

4874
def test_print_deleted_stdout(self):
4975
# print should use strong reference to the stdout.
5076
code = textwrap.dedent('''
51-
# from https://gist.github.com/colesbury/c48f50e95d5d68e24814a56e2664e587
52-
from contextlib import redirect_stdout
5377
from io import StringIO
54-
from threading import Thread
55-
import time
78+
import sys
5679
57-
class Foo:
58-
def __repr__(self):
59-
time.sleep(0.2)
60-
return "Foo"
80+
class Bar:
81+
def __init__(self):
82+
self.x = sys.stdout
83+
setattr(sys, "stdout", StringIO())
6184
62-
def thread1():
63-
text = StringIO()
64-
with redirect_stdout(text):
65-
time.sleep(0.2)
85+
def __repr__(self):
86+
x = sys.stdout
87+
setattr(sys, "stdout", self.x)
88+
del x
89+
return "Bar"
6690
6791
def main():
68-
t1 = Thread(target=thread1, args=())
69-
t1.start()
70-
time.sleep(0.1)
71-
print(Foo())
72-
92+
print(Bar())
7393
7494
if __name__ == "__main__":
7595
main()
96+
exit(0)
7697
''')
7798
rc, out, err = assert_python_ok('-c', code)
78-
self.assertEqual(out, b"")
79-
self.assertEqual(err, b"")
99+
self.assertEqual(rc, 0)
100+
self.assertNotIn(b"Segmentation fault", err)
101+
self.assertNotIn(b"access violation", err)
80102

81103
def test_faulthandler_enable_deleted_stderr(self):
82104
# faulthandler should use strong reference to the stderr
@@ -87,8 +109,9 @@ def test_faulthandler_enable_deleted_stderr(self):
87109
"enable(None, True)"
88110
)
89111
rc, out, err = assert_python_ok('-c', test_code)
90-
self.assertEqual(out, b"")
91-
self.assertEqual(err, b"")
112+
self.assertEqual(rc, 0)
113+
self.assertNotIn(b"Segmentation fault", err)
114+
self.assertNotIn(b"access violation", err)
92115

93116
def test_faulthandler_dump_traceback_deleted_stderr(self):
94117
# faulthandler should use strong reference to the stderr
@@ -99,8 +122,9 @@ def test_faulthandler_dump_traceback_deleted_stderr(self):
99122
"dump_traceback(None, False)"
100123
)
101124
rc, out, err = assert_python_ok('-c', test_code)
102-
self.assertEqual(out, b"")
103-
self.assertEqual(err, b"")
125+
self.assertEqual(rc, 0)
126+
self.assertNotIn(b"Segmentation fault", err)
127+
self.assertNotIn(b"access violation", err)
104128

105129
def test_faulthandler_dump_traceback_later_deleted_stderr(self):
106130
# faulthandler should use strong reference to the stderr
@@ -111,8 +135,27 @@ def test_faulthandler_dump_traceback_later_deleted_stderr(self):
111135
"dump_traceback_later(0.1, True, None, False)"
112136
)
113137
rc, out, err = assert_python_ok('-c', test_code)
114-
self.assertEqual(out, b"")
115-
self.assertEqual(err, b"")
138+
self.assertEqual(rc, 0)
139+
self.assertNotIn(b"Segmentation fault", err)
140+
self.assertNotIn(b"access violation", err)
141+
142+
def test_warnings_warn(self):
143+
test_code = self.common_warnings_code.format(
144+
"warnings.warn(Foo())"
145+
)
146+
rc, _, err = assert_python_ok('-c', test_code)
147+
self.assertEqual(rc, 0)
148+
self.assertNotIn(b"Segmentation fault", err)
149+
self.assertNotIn(b"access violation", err)
150+
151+
def test_warnings_warn_explicit(self):
152+
test_code = self.common_warnings_code.format(
153+
"warnings.warn_explicit(Foo(), UserWarning, 'filename', 0)"
154+
)
155+
rc, _, err = assert_python_ok('-c', test_code)
156+
self.assertEqual(rc, 0)
157+
self.assertNotIn(b"Segmentation fault", err)
158+
self.assertNotIn(b"access violation", err)
116159

117160
if __name__ == "__main__":
118161
unittest.main()

0 commit comments

Comments
 (0)