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

Unified Diff: au_test_harness/cros_au_test_harness.py

Issue 6825062: Fix bug where multiprocessing.Queue hangs on large outputs. (Closed) Base URL: http://git.chromium.org/git/crostestutils.git@master
Patch Set: Fix test Created 9 years, 8 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 | « no previous file | au_test_harness/parallel_test_job.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: au_test_harness/cros_au_test_harness.py
diff --git a/au_test_harness/cros_au_test_harness.py b/au_test_harness/cros_au_test_harness.py
index 9b7be822c833f1d505dc51015a4819249c78f1b3..f082f9e6b1b3c8d67e63d621f3ca866dafee5491 100755
--- a/au_test_harness/cros_au_test_harness.py
+++ b/au_test_harness/cros_au_test_harness.py
@@ -29,6 +29,7 @@ import dummy_au_worker
import dev_server_wrapper
import parallel_test_job
import public_key_manager
+import tempfile
import update_exception
def _PrepareTestSuite(options, use_dummy_worker=False):
@@ -51,8 +52,8 @@ def _PregenerateUpdates(options):
Raises:
update_exception.UpdateException if we fail to generate an update.
"""
- def _GenerateVMUpdate(target, src, private_key_path):
- """Generates an update using the devserver."""
+ def _GenerateVMUpdate(target, src, private_key_path, log_file):
+ """Returns the error code from generating an update using the devserver."""
command = ['sudo',
'start_devserver',
'--pregenerate_update',
@@ -67,10 +68,41 @@ def _PregenerateUpdates(options):
command.append('--private_key=%s' %
cros_lib.ReinterpretPathForChroot(private_key_path))
- return cros_lib.RunCommandCaptureOutput(command, combine_stdout_stderr=True,
- enter_chroot=True,
- print_cmd=True,
- cwd=cros_lib.GetCrosUtilsPath())
+ return cros_lib.RunCommand(command, enter_chroot=True, print_cmd=True,
+ cwd=cros_lib.GetCrosUtilsPath(),
+ log_to_file=log_file, error_ok=True,
+ exit_code=True)
+
+ def _ProcessGeneratorOutputs(log_files, return_codes):
+ """Processes results from the log files of GenerateVMUpdate calls.
+
+ Returns an array of cache entries from the log files.
+ """
+ return_array = []
+ for log_file, return_code in map(lambda x, y: (x, y), log_files,
+ return_codes):
dgarrett 2011/04/12 02:01:52 off by one indention.
sosa 2011/04/12 02:09:50 Done.
+ log_file_handle = open(log_file)
+ output = log_file_handle.read()
+ log_file_handle.close()
+
+ # Looking for this line in the output.
+ key_line_re = re.compile('^PREGENERATED_UPDATE=([\w/.]+)')
dgarrett 2011/04/12 02:01:52 Can do this outside the outer for loop and not reg
sosa 2011/04/12 02:09:50 Done.
+ if return_code != 0:
dgarrett 2011/04/12 02:01:52 Seems like this line should be the first line afte
sosa 2011/04/12 02:09:50 I actually want to print out the output from a fai
+ cros_lib.Warning(output)
+ raise update_exception.UpdateException(return_code,
+ 'Failed to generate update.')
+ else:
+ for line in output.splitlines():
+ match = key_line_re.search(line)
+ if match:
+ # Convert blah/blah/update.gz -> update/blah/blah.
+ path_to_update_gz = match.group(1).rstrip()
+ (path_to_update_dir, _, _) = path_to_update_gz.rpartition(
+ '/update.gz')
+ return_array.append('/'.join(['update', path_to_update_dir]))
+
+ assert len(return_array) == len(log_files), 'Return result size mismatch.'
+ return return_array
# Use dummy class to mock out updates that would be run as part of a test.
test_suite = _PrepareTestSuite(options, use_dummy_worker=True)
@@ -83,10 +115,12 @@ def _PregenerateUpdates(options):
update_ids = []
jobs = []
args = []
+ log_files = []
modified_images = set()
for target, srcs in dummy_au_worker.DummyAUWorker.delta_list.items():
modified_images.add(target)
for src_key in srcs:
+ log_file = tempfile.mktemp('GenerateVMUpdate')
(src, _ , key) = src_key.partition('+')
if src: modified_images.add(src)
# TODO(sosa): Add private key as part of caching name once devserver can
@@ -95,7 +129,8 @@ def _PregenerateUpdates(options):
print >> sys.stderr, 'AU: %s' % update_id
update_ids.append(update_id)
jobs.append(_GenerateVMUpdate)
- args.append((target, src, key))
+ args.append((target, src, key, log_file))
+ log_files.append(log_file)
# Always add the base image path. This is only useful for non-delta updates.
modified_images.add(options.base_image)
@@ -108,33 +143,8 @@ def _PregenerateUpdates(options):
manager.AddKeyToImage()
au_test.AUTest.public_key_managers.append(manager)
- raw_results = parallel_test_job.RunParallelJobs(options.jobs, jobs, args,
- print_status=True)
- results = []
-
- # Looking for this line in the output.
- key_line_re = re.compile('^PREGENERATED_UPDATE=([\w/.]+)')
- for result in raw_results:
- (return_code, output, _) = result
- if return_code != 0:
- cros_lib.Warning(output)
- raise update_exception.UpdateException(return_code,
- 'Failed to generate all updates.')
- else:
- for line in output.splitlines():
- match = key_line_re.search(line)
- if match:
- # Convert blah/blah/update.gz -> update/blah/blah.
- path_to_update_gz = match.group(1).rstrip()
- (path_to_update_dir, _, _) = path_to_update_gz.rpartition(
- '/update.gz')
- results.append('/'.join(['update', path_to_update_dir]))
- break
-
- # Make sure all generation of updates returned cached locations.
- if len(raw_results) != len(results):
- raise update_exception.UpdateException(
- 1, 'Insufficient number cache directories returned.')
+ error_codes = parallel_test_job.RunParallelJobs(options.jobs, jobs, args)
+ results = _ProcessGeneratorOutputs(log_files, error_codes)
# Build the dictionary from our id's and returned cache paths.
cache_dictionary = {}
@@ -155,8 +165,7 @@ def _RunTestsInParallel(options):
threads.append(unittest.TextTestRunner(verbosity=2).run)
args.append(test_case)
- results = parallel_test_job.RunParallelJobs(options.jobs, threads, args,
- print_status=False)
+ results = parallel_test_job.RunParallelJobs(options.jobs, threads, args)
for test_result in results:
if not test_result.wasSuccessful():
cros_lib.Die('Test harness was not successful')
« no previous file with comments | « no previous file | au_test_harness/parallel_test_job.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698