1b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard#!/usr/bin/env python 2b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard# Copyright (c) 2012 The LibYuv Project Authors. All rights reserved. 3b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard# 4b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard# Use of this source code is governed by a BSD-style license 5b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard# that can be found in the LICENSE file in the root of the source 6b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard# tree. An additional intellectual property rights grant can be found 7b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard# in the file PATENTS. All contributing project authors may 8b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard# be found in the AUTHORS file in the root of the source tree. 9b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 10b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard"""Runs various libyuv tests through valgrind_test.py. 11b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 12b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardThis script inherits the chrome_tests.py in Chrome, but allows running any test 13b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardinstead of only the hard-coded ones. It uses the -t cmdline flag to do this, and 14b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardonly supports specifying a single test for each run. 15b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 16b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSuppression files: 17b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardThe Chrome valgrind directory we use as a DEPS dependency contains the following 18b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardsuppression files: 19b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard valgrind/memcheck/suppressions.txt 20b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard valgrind/memcheck/suppressions_mac.txt 21b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard valgrind/tsan/suppressions.txt 22b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard valgrind/tsan/suppressions_mac.txt 23b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard valgrind/tsan/suppressions_win32.txt 24b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardSince they're referenced from the chrome_tests.py script, we have similar files 25b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardbelow the directory of this script. When executing, this script will setup both 26b83bb38f0a92bedeb52baa31e515220927ef53bbFrank BarchardChrome's suppression files and our own, so we can easily maintain libyuv 27b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardspecific suppressions in our own files. 28b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard""" 29b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 30b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardimport logging 31b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardimport optparse 32b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardimport os 33b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardimport sys 34b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 35b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardimport logging_utils 36b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardimport path_utils 37b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 38b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardimport chrome_tests 39b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 40b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 41b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardclass LibyuvTest(chrome_tests.ChromeTests): 42b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard """Class that handles setup of suppressions for libyuv. 43b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 44b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard Everything else is inherited from chrome_tests.ChromeTests. 45b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard """ 46b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 47b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard def _DefaultCommand(self, tool, exe=None, valgrind_test_args=None): 48b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard """Override command-building method so we can add more suppressions.""" 49b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard cmd = chrome_tests.ChromeTests._DefaultCommand(self, tool, exe, 50b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard valgrind_test_args) 51b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # When ChromeTests._DefaultCommand has executed, it has setup suppression 52b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # files based on what's found in the memcheck/ or tsan/ subdirectories of 53b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # this script's location. If Mac or Windows is executing, additional 54b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # platform specific files have also been added. 55b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # Since only the ones located below this directory is added, we must also 56b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # add the ones maintained by Chrome, located in ../../tools/valgrind. 57b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 58b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # The idea is to look for --suppression arguments in the cmd list and add a 59b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # modified copy of each suppression file, for the corresponding file in 60b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # ../../tools/valgrind. 61b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard script_dir = path_utils.ScriptDir() 62b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard old_base, _ = os.path.split(script_dir) 63b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 64b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard checkout_src = os.path.abspath(os.path.join(script_dir, os.pardir, 65b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard os.pardir)) 66b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard new_dir = os.path.join(checkout_src, 'tools', 'valgrind') 67b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard add_suppressions = [] 68b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard for token in cmd: 69b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard if '--suppressions' in token: 70b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard add_suppressions.append(token.replace(script_dir, new_dir)) 71b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard return add_suppressions + cmd 72b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 73b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 74b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barcharddef main(_): 75b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser = optparse.OptionParser('usage: %prog -b <dir> -t <test> <test args>') 76b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.disable_interspersed_args() 77b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('-b', '--build-dir', 78b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help=('Location of the compiler output. Can only be used ' 79b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 'when the test argument does not contain this path.')) 80b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option("--target", help="Debug or Release") 81b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('-t', '--test', help='Test to run.') 82b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('', '--baseline', action='store_true', default=False, 83b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help='Generate baseline data instead of validating') 84b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('', '--gtest_filter', 85b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help='Additional arguments to --gtest_filter') 86b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('', '--gtest_repeat', 87b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help='Argument for --gtest_repeat') 88b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option("--gtest_shuffle", action="store_true", default=False, 89b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help="Randomize tests' orders on every iteration.") 90b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option("--gtest_break_on_failure", action="store_true", 91b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard default=False, 92b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help="Drop in to debugger on assertion failure. Also " 93b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard "useful for forcing tests to exit with a stack dump " 94b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard "on the first assertion failure when running with " 95b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard "--gtest_repeat=-1") 96b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('-v', '--verbose', action='store_true', default=False, 97b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help='Verbose output - enable debug log messages') 98b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('', '--tool', dest='valgrind_tool', default='memcheck', 99b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help='Specify a valgrind tool to run the tests under') 100b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('', '--tool_flags', dest='valgrind_tool_flags', default='', 101b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help='Specify custom flags for the selected valgrind tool') 102b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option('', '--keep_logs', action='store_true', default=False, 103b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help=('Store memory tool logs in the <tool>.logs directory ' 104b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 'instead of /tmp.\nThis can be useful for tool ' 105b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 'developers/maintainers.\nPlease note that the <tool>' 106b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard '.logs directory will be clobbered on tool startup.')) 107b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option("--test-launcher-bot-mode", action="store_true", 108b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help="run the tests with --test-launcher-bot-mode") 109b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option("--test-launcher-total-shards", type=int, 110b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help="run the tests with --test-launcher-total-shards") 111b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.add_option("--test-launcher-shard-index", type=int, 112b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard help="run the tests with --test-launcher-shard-index") 113b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard options, args = parser.parse_args() 114b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 115b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard if options.verbose: 116b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard logging_utils.config_root(logging.DEBUG) 117b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard else: 118b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard logging_utils.config_root() 119b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 120b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard if not options.test: 121b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard parser.error('--test not specified') 122b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 123b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # Support build dir both with and without the target. 124b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard if (options.target and options.build_dir and 125b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard not options.build_dir.endswith(options.target)): 126b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard options.build_dir = os.path.join(options.build_dir, options.target) 127b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 128b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard # If --build_dir is provided, prepend it to the test executable if needed. 129b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard test_executable = options.test 130b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard if options.build_dir and not test_executable.startswith(options.build_dir): 131b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard test_executable = os.path.join(options.build_dir, test_executable) 132b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard args = [test_executable] + args 133b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 134b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard test = LibyuvTest(options, args, 'cmdline') 135b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard return test.Run() 136b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard 137b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchardif __name__ == '__main__': 138b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard return_code = main(sys.argv) 139b83bb38f0a92bedeb52baa31e515220927ef53bbFrank Barchard sys.exit(return_code) 140