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