| Index: swarm_client/googletest/isolate_test_cases.py
|
| ===================================================================
|
| --- swarm_client/googletest/isolate_test_cases.py (revision 235167)
|
| +++ swarm_client/googletest/isolate_test_cases.py (working copy)
|
| @@ -1,175 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright 2013 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -"""Traces each test cases of a google-test executable individually and generates
|
| -or updates an .isolate file.
|
| -
|
| -If the trace hangs up, you can still take advantage of the traces up to the
|
| -points it got to by Ctrl-C'ing out, then running isolate.py merge -r
|
| -out/release/foo_test.isolated. the reason it works is because both isolate.py
|
| -and isolate_test_cases.py uses the same filename for the trace by default.
|
| -"""
|
| -
|
| -import logging
|
| -import os
|
| -import subprocess
|
| -import sys
|
| -
|
| -ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
| -if not ROOT_DIR in sys.path:
|
| - sys.path.insert(0, ROOT_DIR)
|
| -
|
| -import isolate
|
| -import run_test_cases
|
| -import trace_inputs
|
| -import trace_test_cases
|
| -
|
| -from utils import tools
|
| -
|
| -
|
| -def isolate_test_cases(
|
| - cmd, test_cases, jobs, isolated_file, isolate_file,
|
| - root_dir, reldir, variables, trace_blacklist):
|
| - assert os.path.isabs(root_dir) and os.path.isdir(root_dir), root_dir
|
| -
|
| - logname = isolated_file + '.log'
|
| - basename = isolated_file.rsplit('.', 1)[0]
|
| - cwd_dir = os.path.join(root_dir, reldir)
|
| - # Do the actual tracing.
|
| - results = trace_test_cases.trace_test_cases(
|
| - cmd, cwd_dir, test_cases, jobs, logname)
|
| - api = trace_inputs.get_api()
|
| - blacklist = trace_inputs.gen_blacklist(trace_blacklist)
|
| - logs = dict(
|
| - (i.pop('trace'), i) for i in api.parse_log(logname, blacklist, None))
|
| - exception = None
|
| - try:
|
| - inputs = []
|
| - for items in results:
|
| - item = items[-1]
|
| - assert item['valid']
|
| - # Load the results;
|
| - log_dict = logs[item['tracename']]
|
| - if log_dict.get('exception'):
|
| - exception = exception or log_dict['exception']
|
| - logging.error('Got exception: %s', exception)
|
| - continue
|
| - files = log_dict['results'].strip_root(root_dir).files
|
| - tracked, touched = isolate.split_touched(files)
|
| - value = isolate.generate_isolate(
|
| - tracked,
|
| - [],
|
| - touched,
|
| - root_dir,
|
| - variables,
|
| - reldir,
|
| - blacklist)
|
| - # item['test_case'] could be an invalid file name.
|
| - out = basename + '.' + item['tracename'] + '.isolate'
|
| - with open(out, 'w') as f:
|
| - isolate.pretty_print(value, f)
|
| - inputs.append(out)
|
| -
|
| - # Merges back. Note that it is possible to blow up the command line
|
| - # argument length here but writing the files is still useful. Convert to
|
| - # importing the module instead if necessary.
|
| - merge_cmd = [
|
| - sys.executable,
|
| - os.path.join(ROOT_DIR, 'isolate_merge.py'),
|
| - isolate_file,
|
| - '-o', isolate_file,
|
| - ]
|
| - merge_cmd.extend(inputs)
|
| - logging.info(merge_cmd)
|
| - proc = subprocess.Popen(merge_cmd)
|
| - proc.communicate()
|
| - return proc.returncode
|
| - finally:
|
| - if exception:
|
| - raise exception[0], exception[1], exception[2]
|
| -
|
| -
|
| -def test_xvfb(command, rel_dir):
|
| - """Calls back ourself if not running inside Xvfb and it's on the command line
|
| - to run.
|
| -
|
| - Otherwise the X session will die while trying to start too many Xvfb
|
| - instances.
|
| - """
|
| - if os.environ.get('_CHROMIUM_INSIDE_XVFB') == '1':
|
| - return
|
| - for index, item in enumerate(command):
|
| - if item.endswith('xvfb.py'):
|
| - # Note this has inside knowledge about src/testing/xvfb.py.
|
| - print('Restarting itself under Xvfb')
|
| - prefix = command[index:index+2]
|
| - prefix[0] = os.path.normpath(os.path.join(rel_dir, prefix[0]))
|
| - prefix[1] = os.path.normpath(os.path.join(rel_dir, prefix[1]))
|
| - cmd = tools.fix_python_path(prefix + sys.argv)
|
| - sys.exit(subprocess.call(cmd))
|
| -
|
| -
|
| -def safely_load_isolated(parser, options):
|
| - """Loads a .isolated.state to extract the executable information.
|
| -
|
| - Returns the CompleteState instance, the command and the list of test cases.
|
| - """
|
| - config = isolate.CompleteState.load_files(options.isolated)
|
| - logging.debug(
|
| - 'root_dir: %s relative_cwd: %s isolated: %s',
|
| - config.root_dir, config.saved_state.relative_cwd, options.isolated)
|
| - reldir = os.path.join(config.root_dir, config.saved_state.relative_cwd)
|
| - command = config.saved_state.command
|
| - test_cases = []
|
| - if command:
|
| - command = tools.fix_python_path(command)
|
| - test_xvfb(command, reldir)
|
| - test_cases = parser.process_gtest_options(command, reldir, options)
|
| - return config, command, test_cases
|
| -
|
| -
|
| -def main():
|
| - """CLI frontend to validate arguments."""
|
| - tools.disable_buffering()
|
| - parser = run_test_cases.OptionParserTestCases(
|
| - usage='%prog <options> --isolated <.isolated>')
|
| - parser.format_description = lambda *_: parser.description
|
| - isolate.add_variable_option(parser)
|
| - isolate.add_trace_option(parser)
|
| -
|
| - # TODO(maruel): Add support for options.timeout.
|
| - parser.remove_option('--timeout')
|
| -
|
| - options, args = parser.parse_args()
|
| - if args:
|
| - parser.error('Unsupported arg: %s' % args)
|
| - isolate.parse_isolated_option(parser, options, os.getcwd(), True)
|
| - isolate.parse_variable_option(options)
|
| -
|
| - try:
|
| - config, command, test_cases = safely_load_isolated(parser, options)
|
| - if not command:
|
| - parser.error('A command must be defined')
|
| - if not test_cases:
|
| - parser.error('No test case to run with command: %s' % ' '.join(command))
|
| -
|
| - config.saved_state.variables.update(options.variables)
|
| - return isolate_test_cases(
|
| - command,
|
| - test_cases,
|
| - options.jobs,
|
| - config.isolated_filepath,
|
| - config.saved_state.isolate_filepath,
|
| - config.root_dir,
|
| - config.saved_state.relative_cwd,
|
| - config.saved_state.variables,
|
| - options.trace_blacklist)
|
| - except isolate.ExecutionError, e:
|
| - print >> sys.stderr, str(e)
|
| - return 1
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - sys.exit(main())
|
|
|