Commit 31f8c53f authored by Stefan Behnel's avatar Stefan Behnel

run gc after running a test, prevent the test runner from dead-locking on broken tests

parent 2a5e66ae
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import os import os
import sys import sys
import re import re
import gc
import codecs import codecs
import shutil import shutil
import unittest import unittest
...@@ -396,6 +397,7 @@ class CythonRunTestCase(CythonCompileTestCase): ...@@ -396,6 +397,7 @@ class CythonRunTestCase(CythonCompileTestCase):
def run_doctests(self, module_name, result): def run_doctests(self, module_name, result):
if sys.version_info[0] >= 3 or not hasattr(os, 'fork') or not self.fork: if sys.version_info[0] >= 3 or not hasattr(os, 'fork') or not self.fork:
doctest.DocTestSuite(module_name).run(result) doctest.DocTestSuite(module_name).run(result)
gc.collect()
return return
# fork to make sure we do not keep the tested module loaded # fork to make sure we do not keep the tested module loaded
...@@ -410,11 +412,13 @@ class CythonRunTestCase(CythonCompileTestCase): ...@@ -410,11 +412,13 @@ class CythonRunTestCase(CythonCompileTestCase):
partial_result = PartialTestResult(result) partial_result = PartialTestResult(result)
tests = doctest.DocTestSuite(module_name) tests = doctest.DocTestSuite(module_name)
tests.run(partial_result) tests.run(partial_result)
gc.collect()
except Exception: except Exception:
if tests is None: if tests is None:
# importing failed, try to fake a test class # importing failed, try to fake a test class
tests = _FakeClass( tests = _FakeClass(
failureException=None, failureException=None,
shortDescription = self.shortDescription,
**{module_name: None}) **{module_name: None})
partial_result.addError(tests, sys.exc_info()) partial_result.addError(tests, sys.exc_info())
result_code = 1 result_code = 1
...@@ -424,9 +428,13 @@ class CythonRunTestCase(CythonCompileTestCase): ...@@ -424,9 +428,13 @@ class CythonRunTestCase(CythonCompileTestCase):
except: pass except: pass
os._exit(result_code) os._exit(result_code)
input = os.fdopen(input, 'rb')
PartialTestResult.join_results(result, pickle.load(input))
cid, result_code = os.waitpid(child_id, 0) cid, result_code = os.waitpid(child_id, 0)
if result_code in (0,1):
input = os.fdopen(input, 'rb')
try:
PartialTestResult.join_results(result, pickle.load(input))
finally:
input.close()
if result_code: if result_code:
raise Exception("Tests in module '%s' exited with status %d" % raise Exception("Tests in module '%s' exited with status %d" %
(module_name, result_code >> 8)) (module_name, result_code >> 8))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment