Index: tools/isolate/strace_inputs.py |
diff --git a/tools/isolate/strace_inputs.py b/tools/isolate/strace_inputs.py |
deleted file mode 100755 |
index cdb34f4aa35a2e08c2739ff66b13f19b82baf39d..0000000000000000000000000000000000000000 |
--- a/tools/isolate/strace_inputs.py |
+++ /dev/null |
@@ -1,162 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2012 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. |
- |
-"""Runs strace on a test and processes the logs to extract the dependencies from |
-the source tree. |
- |
-Automatically extracts directories where all the files are used to make the |
-dependencies list more compact. |
-""" |
- |
-import os |
-import re |
-import subprocess |
-import sys |
- |
- |
-BASE_DIR = os.path.dirname(os.path.abspath(__file__)) |
-ROOT_DIR = os.path.dirname(os.path.dirname(BASE_DIR)) |
- |
-IGNORED = ( |
- '/dev', |
- '/etc', |
- '/home', |
- '/lib', |
- '/proc', |
- '/sys', |
- '/tmp', |
- '/usr', |
- '/var', |
-) |
- |
- |
-def gen_trace(cmd, cwd, logname, silent): |
- """Runs strace on an executable.""" |
- strace = ['strace', '-f', '-e', 'trace=open', '-o', logname] |
- stdout = stderr = None |
- if silent: |
- stdout = subprocess.PIPE |
- stderr = subprocess.PIPE |
- |
- cmd = [os.path.normpath(os.path.join(cwd, c)) for c in cmd] |
- p = subprocess.Popen( |
- strace + cmd, cwd=cwd, stdout=stdout, stderr=stderr) |
- out, err = p.communicate() |
- if p.returncode != 0: |
- print 'Failure: %d' % p.returncode |
- # pylint: disable=E1103 |
- print ''.join(out.splitlines(True)[-100:]) |
- print ''.join(err.splitlines(True)[-100:]) |
- return p.returncode |
- |
- |
-def parse_log(filename, blacklist): |
- """Processes a strace log and returns the files opened and the files that do |
- not exist. |
- |
- Most of the time, files that do not exist are temporary test files that should |
- be put in /tmp instead. See http://crbug.com/116251 |
- |
- TODO(maruel): Process chdir() calls so relative paths can be processed. |
- """ |
- files = set() |
- non_existent = set() |
- for line in open(filename): |
- # 1=pid, 2=filepath, 3=mode, 4=result |
- m = re.match(r'^(\d+)\s+open\("([^"]+)", ([^\)]+)\)\s+= (.+)$', line) |
- if not m: |
- continue |
- if m.group(4).startswith('-1') or 'O_DIRECTORY' in m.group(3): |
- # Not present or a directory. |
- continue |
- filepath = m.group(2) |
- if blacklist(filepath): |
- continue |
- if not os.path.isfile(filepath): |
- non_existent.add(filepath) |
- else: |
- files.add(filepath) |
- return files, non_existent |
- |
- |
-def relevant_files(files, root): |
- """Trims the list of files to keep the expected files and unexpected files. |
- |
- Unexpected files are files that are not based inside the |root| directory. |
- """ |
- expected = [] |
- unexpected = [] |
- for f in files: |
- if f.startswith(root): |
- expected.append(f[len(root):]) |
- else: |
- unexpected.append(f) |
- return sorted(set(expected)), sorted(set(unexpected)) |
- |
- |
-def extract_directories(files, root): |
- """Detects if all the files in a directory were loaded and if so, replace the |
- individual files by the directory entry. |
- """ |
- directories = set(os.path.dirname(f) for f in files) |
- files = set(files) |
- for directory in sorted(directories, reverse=True): |
- actual = set( |
- os.path.join(directory, f) for f in |
- os.listdir(os.path.join(root, directory)) |
- if not f.endswith(('.svn', '.pyc')) |
- ) |
- if not (actual - files): |
- files -= actual |
- files.add(directory + '/') |
- return sorted(files) |
- |
- |
-def strace_inputs(unittest, cmd): |
- """Tries to load the logs if available. If not, strace the test.""" |
- logname = os.path.join(BASE_DIR, os.path.basename(unittest)) |
- if not os.path.isfile(logname): |
- returncode = gen_trace(cmd, ROOT_DIR, logname, True) |
- if returncode: |
- return returncode |
- |
- def blacklist(f): |
- """Strips ignored paths.""" |
- return f.startswith(IGNORED) or f.endswith('.pyc') |
- |
- files, non_existent = parse_log(logname, blacklist) |
- print('Total: %d' % len(files)) |
- print('Non existent: %d' % len(non_existent)) |
- for f in non_existent: |
- print(' %s' % f) |
- |
- expected, unexpected = relevant_files(files, ROOT_DIR + '/') |
- if unexpected: |
- print('Unexpected: %d' % len(unexpected)) |
- for f in unexpected: |
- print(' %s' % f) |
- |
- simplified = extract_directories(expected, ROOT_DIR) |
- print('Interesting: %d reduced to %d' % (len(expected), len(simplified))) |
- for f in simplified: |
- print(' %s' % f) |
- |
- return 0 |
- |
- |
-def main(): |
- if len(sys.argv) < 3: |
- print >> sys.stderr, ( |
- 'Usage: strace_inputs.py [testname] [cmd line...]\n' |
- '\n' |
- 'Example:\n' |
- ' ./strace_inputs.py base_unittests testing/xvfb.py out/Release ' |
- 'out/Release/base_unittests') |
- return 1 |
- return strace_inputs(sys.argv[1], sys.argv[2:]) |
- |
- |
-if __name__ == '__main__': |
- sys.exit(main()) |