32022c6fb1
Reason: Turns out this does not solve the problem as the buildbots run into another error later on during collecting gtest output. The problem is solved by excluding these bots from flakiness dashboard data instead, in https://codereview.chromium.org/705913002/ > Fix memcheck and dr memory after flakiness dashboard deployment. > > I deployed buildbot configuration for uploading data to the > flakiness dashboard but I didn't predict our Dr Memory and > Memcheck bots would fail due to the new flag passed to the test. > Adding the --gtest_output flag to the script will avoid the build > to fail as a workaround. > > TBR=andrew@webrtc.org > TESTED=Passing test run using: > src/tools/valgrind-webrtc/webrtc_tests.sh --test audio_decoder_unittests --tool memcheck --target Release --build-dir src/out --gtest_output=xml:audio_decoder_unittests.xml > > BUG= > > Review URL: https://webrtc-codereview.appspot.com/28999004 TBR=kjellander@webrtc.org Review URL: https://webrtc-codereview.appspot.com/31969004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7643 4adac7df-926f-26a2-2b94-8c16560cd09d
145 lines
6.3 KiB
Python
Executable File
145 lines
6.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
|
|
#
|
|
# Use of this source code is governed by a BSD-style license
|
|
# that can be found in the LICENSE file in the root of the source
|
|
# tree. An additional intellectual property rights grant can be found
|
|
# in the file PATENTS. All contributing project authors may
|
|
# be found in the AUTHORS file in the root of the source tree.
|
|
|
|
"""Runs various WebRTC tests through valgrind_test.py.
|
|
|
|
This script inherits the chrome_tests.py in Chrome, but allows running any test
|
|
instead of only the hard-coded ones. It uses the -t cmdline flag to do this, and
|
|
only supports specifying a single test for each run.
|
|
|
|
Suppression files:
|
|
The Chrome valgrind directory we use as a DEPS dependency contains the following
|
|
suppression files:
|
|
valgrind/memcheck/suppressions.txt
|
|
valgrind/memcheck/suppressions_mac.txt
|
|
Since they're referenced from the chrome_tests.py script, we have similar files
|
|
below the directory of this script. When executing, this script will setup both
|
|
Chrome's suppression files and our own, so we can easily maintain WebRTC
|
|
specific suppressions in our own files.
|
|
"""
|
|
|
|
import logging
|
|
import optparse
|
|
import os
|
|
import sys
|
|
|
|
import logging_utils
|
|
import path_utils
|
|
|
|
import chrome_tests
|
|
|
|
|
|
class WebRTCTest(chrome_tests.ChromeTests):
|
|
"""Class that handles setup of suppressions for WebRTC.
|
|
|
|
Everything else is inherited from chrome_tests.ChromeTests.
|
|
"""
|
|
|
|
def __init__(self, test_name, options, args, test_in_chrome_tests):
|
|
"""Create a WebRTC test.
|
|
Args:
|
|
test_name: Short name for the test executable (no path).
|
|
options: options to pass to ChromeTests.
|
|
args: args to pass to ChromeTests.
|
|
test_in_chrome_tests: The name of the test configuration in ChromeTests.
|
|
"""
|
|
self._test_name = test_name
|
|
chrome_tests.ChromeTests.__init__(self, options, args, test_in_chrome_tests)
|
|
|
|
def _DefaultCommand(self, tool, exe=None, valgrind_test_args=None):
|
|
"""Override command-building method so we can add more suppressions."""
|
|
cmd = chrome_tests.ChromeTests._DefaultCommand(self, tool, exe,
|
|
valgrind_test_args)
|
|
|
|
# Add gtest filters, if found.
|
|
chrome_tests.ChromeTests._AppendGtestFilter(self, tool, self._test_name,
|
|
cmd)
|
|
|
|
# When ChromeTests._DefaultCommand has executed, it has setup suppression
|
|
# files based on what's found in the memcheck/ subdirectory of
|
|
# this script's location. If Mac or Windows is executing, additional
|
|
# platform specific files have also been added.
|
|
# Since only the ones located below this directory are added, we must also
|
|
# add the ones maintained by Chrome, located in ../valgrind.
|
|
|
|
# The idea is to look for --suppression arguments in the cmd list and add a
|
|
# modified copy of each suppression file, for the corresponding file in
|
|
# ../valgrind. If we would simply replace 'valgrind-webrtc' with 'valgrind'
|
|
# we may produce invalid paths if other parts of the path contain that
|
|
# string. That's why the code below only replaces the end of the path.
|
|
script_dir = path_utils.ScriptDir()
|
|
old_base, _ = os.path.split(script_dir)
|
|
new_dir = os.path.join(old_base, 'valgrind')
|
|
add_suppressions = []
|
|
for token in cmd:
|
|
if '--suppressions' in token:
|
|
add_suppressions.append(token.replace(script_dir, new_dir))
|
|
return add_suppressions + cmd
|
|
|
|
|
|
def main(_):
|
|
parser = optparse.OptionParser(
|
|
'usage: %prog -b <dir> -t <test> -- <test args>')
|
|
parser.disable_interspersed_args()
|
|
parser.add_option('-b', '--build-dir',
|
|
help=('Location of the compiler output. Can only be used '
|
|
'when the test argument does not contain this path.'))
|
|
parser.add_option("--target", help="Debug or Release")
|
|
parser.add_option('-t', '--test', help='Test to run.')
|
|
parser.add_option('', '--baseline', action='store_true', default=False,
|
|
help='Generate baseline data instead of validating')
|
|
parser.add_option('', '--gtest_filter',
|
|
help='Additional arguments to --gtest_filter')
|
|
parser.add_option('', '--gtest_repeat',
|
|
help='Argument for --gtest_repeat')
|
|
parser.add_option("--gtest_shuffle", action="store_true", default=False,
|
|
help="Randomize tests' orders on every iteration.")
|
|
parser.add_option('-v', '--verbose', action='store_true', default=False,
|
|
help='Verbose output - enable debug log messages')
|
|
parser.add_option('', '--tool', dest='valgrind_tool', default='memcheck',
|
|
help='Specify a valgrind tool to run the tests under')
|
|
parser.add_option('', '--tool_flags', dest='valgrind_tool_flags', default='',
|
|
help='Specify custom flags for the selected valgrind tool')
|
|
parser.add_option('', '--keep_logs', action='store_true', default=False,
|
|
help=('Store memory tool logs in the <tool>.logs directory '
|
|
'instead of /tmp.\nThis can be useful for tool '
|
|
'developers/maintainers.\nPlease note that the <tool>'
|
|
'.logs directory will be clobbered on tool startup.'))
|
|
parser.add_option("--brave-new-test-launcher", action="store_true",
|
|
help="run the tests with --brave-new-test-launcher")
|
|
parser.add_option("--test-launcher-bot-mode", action="store_true",
|
|
help="run the tests with --test-launcher-bot-mode")
|
|
options, args = parser.parse_args()
|
|
|
|
if options.verbose:
|
|
logging_utils.config_root(logging.DEBUG)
|
|
else:
|
|
logging_utils.config_root()
|
|
|
|
if not options.test:
|
|
parser.error('--test not specified')
|
|
|
|
# Support build dir both with and without the target.
|
|
if (options.target and options.build_dir and
|
|
not options.build_dir.endswith(options.target)):
|
|
options.build_dir = os.path.join(options.build_dir, options.target)
|
|
|
|
# If --build_dir is provided, prepend it to the test executable if needed.
|
|
test_executable = options.test
|
|
if options.build_dir and not test_executable.startswith(options.build_dir):
|
|
test_executable = os.path.join(options.build_dir, test_executable)
|
|
args = [test_executable] + args
|
|
|
|
test = WebRTCTest(options.test, options, args, 'cmdline')
|
|
return test.Run()
|
|
|
|
if __name__ == '__main__':
|
|
return_code = main(sys.argv)
|
|
sys.exit(return_code)
|