@@ -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
117160if __name__ == "__main__" :
118161 unittest .main ()
0 commit comments