Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1170)

Unified Diff: Tools/Scripts/webkitpy/bindings/main.py

Issue 179253002: Fix resource leak (temporary files and directories) in run-bindings-tests (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Tools/Scripts/run-bindings-tests ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Tools/Scripts/webkitpy/bindings/main.py
diff --git a/Tools/Scripts/webkitpy/bindings/main.py b/Tools/Scripts/webkitpy/bindings/main.py
index 7396fa3ee3ee29a4dbcbbd9b304c67fcd3d6d5d6..9bfed180baed71ead798e6fc0920f50883cf8113 100644
--- a/Tools/Scripts/webkitpy/bindings/main.py
+++ b/Tools/Scripts/webkitpy/bindings/main.py
@@ -25,9 +25,11 @@
import fnmatch
import os
import cPickle as pickle
-from shutil import rmtree
+import shutil
import tempfile
+
from webkitpy.common.checkout.scm.detection import detect_scm_system
+from webkitpy.common.system import executive
from webkitpy.common.system.executive import ScriptError
PASS_MESSAGE = 'All tests PASS!'
@@ -62,43 +64,51 @@ reference_event_names_filename = os.path.join(reference_directory, 'EventInterfa
class ScopedTempFileProvider(object):
def __init__(self):
- self.files = []
- self.directories = []
-
- def __del__(self):
- for filename in self.files:
- os.remove(filename)
- for directory in self.directories:
- rmtree(directory)
-
- def newtempfile(self):
- file_handle, path = tempfile.mkstemp()
- self.files.append(path)
- return file_handle, path
-
- def newtempdir(self):
- path = tempfile.mkdtemp()
- self.directories.append(path)
- return path
-
-provider = ScopedTempFileProvider()
+ self.file_handles = []
+ self.file_paths = []
+ self.dir_paths = []
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ for file_handle in self.file_handles:
+ os.close(file_handle)
+ for file_path in self.file_paths:
+ os.remove(file_path)
+ for dir_path in self.dir_paths:
+ # Temporary directories are used as output directories, so they
+ # contains unknown files (they aren't empty), hence use rmtree
+ shutil.rmtree(dir_path)
+
+ def new_temp_file(self):
+ file_handle, file_path = tempfile.mkstemp()
+ self.file_handles.append(file_handle)
+ self.file_paths.append(file_path)
+ return file_handle, file_path
+
+ def new_temp_dir(self):
+ dir_path = tempfile.mkdtemp()
+ self.dir_paths.append(dir_path)
+ return dir_path
class BindingsTests(object):
- def __init__(self, reset_results, test_python, verbose, executive):
+ def __init__(self, reset_results, test_python, verbose, provider):
self.reset_results = reset_results
self.test_python = test_python
self.verbose = verbose
- self.executive = executive
- _, self.interface_dependencies_filename = provider.newtempfile()
- _, self.interfaces_info_filename = provider.newtempfile()
+ self.executive = executive.Executive()
+ self.provider = provider
+ _, self.interface_dependencies_filename = provider.new_temp_file()
+ _, self.interfaces_info_filename = provider.new_temp_file()
# Generate output into the reference directory if resetting results, or
# a temp directory if not.
if reset_results:
self.output_directory = reference_directory
else:
- self.output_directory = provider.newtempdir()
- self.output_directory_py = provider.newtempdir()
+ self.output_directory = provider.new_temp_dir()
+ self.output_directory_py = provider.new_temp_dir()
self.event_names_filename = os.path.join(self.output_directory, 'EventInterfaces.in')
def run_command(self, cmd):
@@ -156,7 +166,7 @@ class BindingsTests(object):
return idl_paths
def write_list_file(idl_paths):
- list_file, list_filename = provider.newtempfile()
+ list_file, list_filename = self.provider.new_temp_file()
list_contents = ''.join(idl_path + '\n'
for idl_path in idl_paths)
os.write(list_file, list_contents)
@@ -165,11 +175,11 @@ class BindingsTests(object):
def compute_interfaces_info(idl_files_list_filename,
event_names_filename):
# Dummy files, required by compute_interfaces_info but not checked
- _, window_constructors_file = provider.newtempfile()
- _, workerglobalscope_constructors_file = provider.newtempfile()
- _, sharedworkerglobalscope_constructors_file = provider.newtempfile()
- _, dedicatedworkerglobalscope_constructors_file = provider.newtempfile()
- _, serviceworkersglobalscope_constructors_file = provider.newtempfile()
+ _, window_constructors_file = self.provider.new_temp_file()
+ _, workerglobalscope_constructors_file = self.provider.new_temp_file()
+ _, sharedworkerglobalscope_constructors_file = self.provider.new_temp_file()
+ _, dedicatedworkerglobalscope_constructors_file = self.provider.new_temp_file()
+ _, serviceworkersglobalscope_constructors_file = self.provider.new_temp_file()
cmd = ['python',
'bindings/scripts/compute_interfaces_info.py',
'--idl-files-list', idl_files_list_filename,
@@ -206,7 +216,7 @@ class BindingsTests(object):
# computing dependencies for the real Node.idl file.
#
# Don't overwrite the event names file generated for testing IDLs
- _, dummy_event_names_filename = provider.newtempfile()
+ _, dummy_event_names_filename = self.provider.new_temp_file()
compute_interfaces_info(all_idl_files_list_filename,
dummy_event_names_filename)
except ScriptError, e:
@@ -310,3 +320,8 @@ class BindingsTests(object):
print
print FAIL_MESSAGE
return -1
+
+
+def run_bindings_tests(reset_results, test_python, verbose):
+ with ScopedTempFileProvider() as provider:
+ return BindingsTests(reset_results, test_python, verbose, provider).main()
« no previous file with comments | « Tools/Scripts/run-bindings-tests ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698