diff -r 65a2b468fb3c Lib/test/test_faulthandler.py --- a/Lib/test/test_faulthandler.py Fri Mar 13 10:42:08 2015 -0400 +++ b/Lib/test/test_faulthandler.py Sat Mar 14 14:39:55 2015 +0800 @@ -221,20 +221,17 @@ 'Segmentation fault', filename=filename) - @unittest.skipIf(sys.platform == "win32", - "subprocess doesn't support pass_fds on Windows") def test_enable_fd(self): - with tempfile.TemporaryFile('wb+') as fp: - fd = fp.fileno() + with temporary_filename() as filename: self.check_fatal_error(""" import faulthandler - import sys - faulthandler.enable(%s) + output = open({filename}, 'wb') + faulthandler.enable(output.fileno()) faulthandler._sigsegv() - """ % fd, + """.format(filename=repr(filename)), 4, 'Segmentation fault', - fd=fd) + filename=filename) def test_enable_single_thread(self): self.check_fatal_error(""" @@ -329,42 +326,42 @@ """ code = """ import faulthandler + import sys filename = {filename!r} fd = {fd} + file = None + fp = None + if filename: + fp = open(filename, "wb") + file = fp + if fd: + if fp is None: + file = sys.stderr.fileno() + else: + file = file.fileno() def funcB(): - if filename: - with open(filename, "wb") as fp: - faulthandler.dump_traceback(fp, all_threads=False) - elif fd is not None: - faulthandler.dump_traceback(fd, - all_threads=False) - else: - faulthandler.dump_traceback(all_threads=False) + faulthandler.dump_traceback(file, all_threads=False) def funcA(): funcB() funcA() + if fp is not None: + fp.close() """ code = code.format( filename=filename, fd=fd, ) - if filename: - lineno = 9 - elif fd is not None: - lineno = 12 - else: - lineno = 14 expected = [ 'Stack (most recent call first):', - ' File "", line %s in funcB' % lineno, - ' File "", line 17 in funcA', - ' File "", line 19 in ' + ' File "", line 18 in funcB', + ' File "", line 21 in funcA', + ' File "", line 23 in ' ] - trace, exitcode = self.get_output(code, filename, fd) + trace, exitcode = self.get_output(code, filename) self.assertEqual(trace, expected) self.assertEqual(exitcode, 0) @@ -375,11 +372,9 @@ with temporary_filename() as filename: self.check_dump_traceback(filename=filename) - @unittest.skipIf(sys.platform == "win32", - "subprocess doesn't support pass_fds on Windows") def test_dump_traceback_fd(self): - with tempfile.TemporaryFile('wb+') as fp: - self.check_dump_traceback(fd=fp.fileno()) + with temporary_filename() as filename: + self.check_dump_traceback(filename=filename, fd=True) def test_truncate(self): maxlen = 500 @@ -504,15 +499,20 @@ time.sleep(timeout * 5) faulthandler.cancel_dump_traceback_later() + fp = None + file = None if filename: - file = open(filename, "wb") - elif fd is not None: - file = sys.stderr.fileno() - else: - file = None + fp = open(filename, "wb") + file = fp + if fd: + if fp is None: + file = sys.stderr.fileno() + else: + file = fp.fileno() + func(timeout, repeat, cancel, file, loops) - if filename: - file.close() + if fp is not None: + fp.close() """ code = code.format( timeout=TIMEOUT, @@ -530,7 +530,7 @@ if repeat: count *= 2 header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n' % timeout_str - regex = expected_traceback(17, 26, header, min_count=count) + regex = expected_traceback(17, 31, header, min_count=count) self.assertRegex(trace, regex) else: self.assertEqual(trace, '') @@ -549,11 +549,9 @@ with temporary_filename() as filename: self.check_dump_traceback_later(filename=filename) - @unittest.skipIf(sys.platform == "win32", - "subprocess doesn't support pass_fds on Windows") def test_dump_traceback_later_fd(self): - with tempfile.TemporaryFile('wb+') as fp: - self.check_dump_traceback_later(fd=fp.fileno()) + with temporary_filename() as filename: + self.check_dump_traceback_later(filename=filename, fd=True) def test_dump_traceback_later_twice(self): self.check_dump_traceback_later(loops=2) @@ -591,12 +589,16 @@ handler.called = True handler.called = False + file = None + fp = None if filename: - file = open(filename, "wb") - elif fd is not None: - file = sys.stderr.fileno() - else: - file = None + fp = open(filename, "wb") + file = fp + if fd: + if fp is None: + file = sys.stderr.fileno() + else: + file = fp.fileno() if chain: signal.signal(signum, handler) faulthandler.register(signum, file=file, @@ -613,8 +615,8 @@ exitcode = 1 else: exitcode = 0 - if filename: - file.close() + if fp is not None: + fp.close() sys.exit(exitcode) """ code = code.format( @@ -632,7 +634,7 @@ regex = 'Current thread XXX \(most recent call first\):\n' else: regex = 'Stack \(most recent call first\):\n' - regex = expected_traceback(14, 32, regex) + regex = expected_traceback(14, 36, regex) self.assertRegex(trace, regex) else: self.assertEqual(trace, '') @@ -651,11 +653,9 @@ with temporary_filename() as filename: self.check_register(filename=filename) - @unittest.skipIf(sys.platform == "win32", - "subprocess doesn't support pass_fds on Windows") def test_register_fd(self): - with tempfile.TemporaryFile('wb+') as fp: - self.check_register(fd=fp.fileno()) + with temporary_filename() as filename: + self.check_register(filename=filename, fd=True) def test_register_threads(self): self.check_register(all_threads=True)