kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python |
turaj@webrtc.org | 799980f | 2012-05-11 00:41:48 +0000 | [diff] [blame] | 2 | # Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 3 | # |
| 4 | # Use of this source code is governed by a BSD-style license |
| 5 | # that can be found in the LICENSE file in the root of the source |
| 6 | # tree. An additional intellectual property rights grant can be found |
| 7 | # in the file PATENTS. All contributing project authors may |
| 8 | # be found in the AUTHORS file in the root of the source tree. |
| 9 | |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 10 | """Runs various WebRTC tests through valgrind_test.py. |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 11 | |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 12 | This script inherits the chrome_tests.py in Chrome, but allows running any test |
| 13 | instead of only the hard-coded ones. It uses the -t cmdline flag to do this, and |
| 14 | only supports specifying a single test for each run. |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 15 | |
| 16 | Suppression files: |
| 17 | The Chrome valgrind directory we use as a DEPS dependency contains the following |
| 18 | suppression files: |
| 19 | valgrind/memcheck/suppressions.txt |
| 20 | valgrind/memcheck/suppressions_mac.txt |
| 21 | valgrind/tsan/suppressions.txt |
| 22 | valgrind/tsan/suppressions_mac.txt |
| 23 | valgrind/tsan/suppressions_win32.txt |
| 24 | Since they're referenced from the chrome_tests.py script, we have similar files |
| 25 | below the directory of this script. When executing, this script will setup both |
| 26 | Chrome's suppression files and our own, so we can easily maintain WebRTC |
| 27 | specific suppressions in our own files. |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 28 | """ |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 29 | |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 30 | import logging |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 31 | import optparse |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 32 | import os |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 33 | import sys |
| 34 | |
| 35 | import logging_utils |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 36 | import path_utils |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 37 | |
| 38 | import chrome_tests |
| 39 | |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 40 | |
| 41 | class WebRTCTest(chrome_tests.ChromeTests): |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 42 | """Class that handles setup of suppressions for WebRTC. |
| 43 | |
| 44 | Everything else is inherited from chrome_tests.ChromeTests. |
| 45 | """ |
| 46 | |
kjellander@webrtc.org | 6d6d95e | 2013-06-11 06:03:32 +0000 | [diff] [blame] | 47 | def __init__(self, test_name, options, args, test_in_chrome_tests): |
| 48 | """Create a WebRTC test. |
| 49 | Args: |
| 50 | test_name: Short name for the test executable (no path). |
| 51 | options: options to pass to ChromeTests. |
| 52 | args: args to pass to ChromeTests. |
| 53 | test_in_chrome_tests: The name of the test configuration in ChromeTests. |
| 54 | """ |
| 55 | self._test_name = test_name |
| 56 | chrome_tests.ChromeTests.__init__(self, options, args, test_in_chrome_tests) |
| 57 | |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 58 | def _DefaultCommand(self, tool, exe=None, valgrind_test_args=None): |
| 59 | """Override command-building method so we can add more suppressions.""" |
| 60 | cmd = chrome_tests.ChromeTests._DefaultCommand(self, tool, exe, |
| 61 | valgrind_test_args) |
kjellander@webrtc.org | 6d6d95e | 2013-06-11 06:03:32 +0000 | [diff] [blame] | 62 | |
| 63 | # Add gtest filters, if found. |
| 64 | chrome_tests.ChromeTests._AppendGtestFilter(self, tool, self._test_name, |
| 65 | cmd) |
| 66 | |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 67 | # When ChromeTests._DefaultCommand has executed, it has setup suppression |
| 68 | # files based on what's found in the memcheck/ or tsan/ subdirectories of |
| 69 | # this script's location. If Mac or Windows is executing, additional |
| 70 | # platform specific files have also been added. |
kjellander@webrtc.org | 6d6d95e | 2013-06-11 06:03:32 +0000 | [diff] [blame] | 71 | # Since only the ones located below this directory are added, we must also |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 72 | # add the ones maintained by Chrome, located in ../valgrind. |
| 73 | |
| 74 | # The idea is to look for --suppression arguments in the cmd list and add a |
| 75 | # modified copy of each suppression file, for the corresponding file in |
| 76 | # ../valgrind. If we would simply replace 'valgrind-webrtc' with 'valgrind' |
| 77 | # we may produce invalid paths if other parts of the path contain that |
| 78 | # string. That's why the code below only replaces the end of the path. |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 79 | script_dir = path_utils.ScriptDir() |
| 80 | old_base, _ = os.path.split(script_dir) |
| 81 | new_dir = os.path.join(old_base, 'valgrind') |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 82 | add_suppressions = [] |
| 83 | for token in cmd: |
| 84 | if '--suppressions' in token: |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 85 | add_suppressions.append(token.replace(script_dir, new_dir)) |
kjellander@webrtc.org | b6e4cc7 | 2012-05-27 20:59:35 +0000 | [diff] [blame] | 86 | return add_suppressions + cmd |
| 87 | |
| 88 | |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 89 | def main(_): |
phoglund@webrtc.org | 02421fc | 2013-08-27 14:00:10 +0000 | [diff] [blame^] | 90 | parser = optparse.OptionParser( |
| 91 | 'usage: %prog -b <dir> -t <test> -- <test args>') |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 92 | parser.disable_interspersed_args() |
| 93 | parser.add_option('-b', '--build_dir', |
| 94 | help=('Location of the compiler output. Can only be used ' |
| 95 | 'when the test argument does not contain this path.')) |
| 96 | parser.add_option('-t', '--test', help='Test to run.') |
| 97 | parser.add_option('', '--baseline', action='store_true', default=False, |
| 98 | help='Generate baseline data instead of validating') |
| 99 | parser.add_option('', '--gtest_filter', |
| 100 | help='Additional arguments to --gtest_filter') |
| 101 | parser.add_option('', '--gtest_repeat', |
| 102 | help='Argument for --gtest_repeat') |
| 103 | parser.add_option('-v', '--verbose', action='store_true', default=False, |
| 104 | help='Verbose output - enable debug log messages') |
| 105 | parser.add_option('', '--tool', dest='valgrind_tool', default='memcheck', |
| 106 | help='Specify a valgrind tool to run the tests under') |
| 107 | parser.add_option('', '--tool_flags', dest='valgrind_tool_flags', default='', |
| 108 | help='Specify custom flags for the selected valgrind tool') |
| 109 | parser.add_option('', '--keep_logs', action='store_true', default=False, |
| 110 | help=('Store memory tool logs in the <tool>.logs directory ' |
| 111 | 'instead of /tmp.\nThis can be useful for tool ' |
| 112 | 'developers/maintainers.\nPlease note that the <tool>' |
| 113 | '.logs directory will be clobbered on tool startup.')) |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 114 | options, args = parser.parse_args() |
| 115 | |
| 116 | if options.verbose: |
| 117 | logging_utils.config_root(logging.DEBUG) |
| 118 | else: |
| 119 | logging_utils.config_root() |
| 120 | |
| 121 | if not options.test: |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 122 | parser.error('--test not specified') |
kjellander@webrtc.org | b5b155b | 2011-12-20 08:53:41 +0000 | [diff] [blame] | 123 | |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 124 | # If --build_dir is provided, prepend it to the test executable if needed. |
kjellander@webrtc.org | dc6fa02 | 2013-01-10 10:06:15 +0000 | [diff] [blame] | 125 | test_executable = options.test |
| 126 | if options.build_dir and not test_executable.startswith(options.build_dir): |
| 127 | test_executable = os.path.join(options.build_dir, test_executable) |
| 128 | args = [test_executable] + args |
kjellander@webrtc.org | b43f85f | 2012-09-11 11:22:45 +0000 | [diff] [blame] | 129 | |
kjellander@webrtc.org | 6d6d95e | 2013-06-11 06:03:32 +0000 | [diff] [blame] | 130 | test = WebRTCTest(options.test, options, args, 'cmdline') |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 131 | return test.Run() |
turaj@webrtc.org | 799980f | 2012-05-11 00:41:48 +0000 | [diff] [blame] | 132 | |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 133 | if __name__ == '__main__': |
kjellander@webrtc.org | 8f13810 | 2013-01-10 08:13:52 +0000 | [diff] [blame] | 134 | return_code = main(sys.argv) |
| 135 | sys.exit(return_code) |