Fixed #21122 -- Improved clean up of test temp directory on Windows

- Fixed test that didn't close the files it opened
- Caught and handled exception when temp directory cannot be removed
This commit is contained in:
Kevin Christopher Henry 2013-09-19 17:02:49 -04:00 committed by Tim Graham
parent 5381317fe3
commit 978e1351a6
2 changed files with 20 additions and 7 deletions

View File

@ -174,3 +174,6 @@ class FileMoveSafeTests(unittest.TestCase):
# should allow it and continue on if allow_overwrite is True # should allow it and continue on if allow_overwrite is True
self.assertIsNone(file_move_safe(self.file_a, self.file_b, allow_overwrite=True)) self.assertIsNone(file_move_safe(self.file_a, self.file_b, allow_overwrite=True))
os.close(handle_a)
os.close(handle_b)

View File

@ -9,6 +9,7 @@ import sys
import tempfile import tempfile
import warnings import warnings
def upath(path): def upath(path):
""" """
Separate version of django.utils._os.upath. The django.utils version isn't Separate version of django.utils._os.upath. The django.utils version isn't
@ -165,8 +166,8 @@ def setup(verbosity, test_labels):
module_found_in_labels = True module_found_in_labels = True
else: else:
match = lambda label: ( match = lambda label: (
module_label == label or # exact match module_label == label or # exact match
module_label.startswith(label + '.') # ancestor match module_label.startswith(label + '.') # ancestor match
) )
module_found_in_labels = any(match(l) for l in test_labels_set) module_found_in_labels = any(match(l) for l in test_labels_set)
@ -181,17 +182,24 @@ def setup(verbosity, test_labels):
return state return state
def teardown(state): def teardown(state):
from django.conf import settings from django.conf import settings
# Removing the temporary TEMP_DIR. Ensure we pass in unicode
# so that it will successfully remove temp trees containing try:
# non-ASCII filenames on Windows. (We're assuming the temp dir # Removing the temporary TEMP_DIR. Ensure we pass in unicode
# name itself does not contain non-ASCII characters.) # so that it will successfully remove temp trees containing
shutil.rmtree(six.text_type(TEMP_DIR)) # non-ASCII filenames on Windows. (We're assuming the temp dir
# name itself does not contain non-ASCII characters.)
shutil.rmtree(six.text_type(TEMP_DIR))
except OSError:
print('Failed to remove temp directory: %s' % TEMP_DIR)
# Restore the old settings. # Restore the old settings.
for key, value in state.items(): for key, value in state.items():
setattr(settings, key, value) setattr(settings, key, value)
def django_tests(verbosity, interactive, failfast, test_labels): def django_tests(verbosity, interactive, failfast, test_labels):
from django.conf import settings from django.conf import settings
state = setup(verbosity, test_labels) state = setup(verbosity, test_labels)
@ -280,6 +288,7 @@ def bisect_tests(bisection_label, options, test_labels):
print("***** Source of error: %s" % test_labels[0]) print("***** Source of error: %s" % test_labels[0])
teardown(state) teardown(state)
def paired_tests(paired_test, options, test_labels): def paired_tests(paired_test, options, test_labels):
state = setup(int(options.verbosity), test_labels) state = setup(int(options.verbosity), test_labels)
@ -315,6 +324,7 @@ def paired_tests(paired_test, options, test_labels):
print('***** No problem pair found') print('***** No problem pair found')
teardown(state) teardown(state)
if __name__ == "__main__": if __name__ == "__main__":
from optparse import OptionParser from optparse import OptionParser
usage = "%prog [options] [module module module ...]" usage = "%prog [options] [module module module ...]"