chrome_tests.py revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#!/usr/bin/env python
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)# found in the LICENSE file.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)''' Runs various chrome tests through valgrind_test.py.'''
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import glob
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import logging
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import multiprocessing
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import optparse
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import os
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import stat
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import sys
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import logging_utils
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import path_utils
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import common
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)import valgrind_test
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TestNotFound(Exception): pass
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class MultipleGTestFiltersSpecified(Exception): pass
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class BuildDirNotFound(Exception): pass
27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class BuildDirAmbiguous(Exception): pass
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
30a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class ChromeTests:
3119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)  SLOW_TOOLS = ["memcheck", "tsan", "tsan_rv", "drmemory"]
3251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)  LAYOUT_TESTS_DEFAULT_CHUNK_SIZE = 300
331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
347757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch  def __init__(self, options, args, test):
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if ':' in test:
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      (self._test, self._gtest_filter) = test.split(':', 1)
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else:
38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)      self._test = test
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      self._gtest_filter = options.gtest_filter
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._test not in self._test_list:
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      raise TestNotFound("Unknown test: %s" % test)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if options.gtest_filter and options.gtest_filter != self._gtest_filter:
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      raise MultipleGTestFiltersSpecified("Can not specify both --gtest_filter "
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                          "and --test %s" % test)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self._options = options
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self._args = args
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    script_dir = path_utils.ScriptDir()
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Compute the top of the tree (the "source dir") from the script dir (where
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # this script lives).  We assume that the script dir is in tools/valgrind/
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # relative to the top of the tree.
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self._source_dir = os.path.dirname(os.path.dirname(script_dir))
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # since this path is used for string matching, make sure it's always
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # an absolute Unix-style path
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self._source_dir = os.path.abspath(self._source_dir).replace('\\', '/')
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    valgrind_test_script = os.path.join(script_dir, "valgrind_test.py")
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self._command_preamble = ["--source-dir=%s" % (self._source_dir)]
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if not self._options.build_dir:
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      dirs = [
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.path.join(self._source_dir, "xcodebuild", "Debug"),
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.path.join(self._source_dir, "out", "Debug"),
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.path.join(self._source_dir, "build", "Debug"),
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      ]
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      build_dir = [d for d in dirs if os.path.isdir(d)]
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if len(build_dir) > 1:
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        raise BuildDirAmbiguous("Found more than one suitable build dir:\n"
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                "%s\nPlease specify just one "
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                "using --build-dir" % ", ".join(build_dir))
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      elif build_dir:
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self._options.build_dir = build_dir[0]
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else:
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        self._options.build_dir = None
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.build_dir:
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      build_dir = os.path.abspath(self._options.build_dir)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      self._command_preamble += ["--build-dir=%s" % (self._options.build_dir)]
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def _EnsureBuildDirFound(self):
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if not self._options.build_dir:
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      raise BuildDirNotFound("Oops, couldn't find a build dir, please "
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             "specify it manually using --build-dir")
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def _DefaultCommand(self, tool, exe=None, valgrind_test_args=None):
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '''Generates the default command array that most tests will use.'''
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if exe and common.IsWindows():
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      exe += '.exe'
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd = list(self._command_preamble)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Find all suppressions matching the following pattern:
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # tools/valgrind/TOOL/suppressions[_PLATFORM].txt
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # and list them with --suppressions= prefix.
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    script_dir = path_utils.ScriptDir()
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tool_name = tool.ToolName();
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    suppression_file = os.path.join(script_dir, tool_name, "suppressions.txt")
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if os.path.exists(suppression_file):
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--suppressions=%s" % suppression_file)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Platform-specific suppression
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for platform in common.PlatformNames():
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      platform_suppression_file = \
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          os.path.join(script_dir, tool_name, 'suppressions_%s.txt' % platform)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if os.path.exists(platform_suppression_file):
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cmd.append("--suppressions=%s" % platform_suppression_file)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.valgrind_tool_flags:
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd += self._options.valgrind_tool_flags.split(" ")
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.keep_logs:
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd += ["--keep_logs"]
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if valgrind_test_args != None:
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      for arg in valgrind_test_args:
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cmd.append(arg)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if exe:
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      self._EnsureBuildDirFound()
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append(os.path.join(self._options.build_dir, exe))
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # Valgrind runs tests slowly, so slow tests hurt more; show elapased time
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # so we can find the slowpokes.
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--gtest_print_time")
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # Built-in test launcher for gtest-based executables runs tests using
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # multiple process by default. Force the single-process mode back.
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--single-process-tests")
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.gtest_repeat:
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--gtest_repeat=%s" % self._options.gtest_repeat)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.gtest_shuffle:
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--gtest_shuffle")
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.brave_new_test_launcher:
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--brave-new-test-launcher")
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.test_launcher_bot_mode:
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--test-launcher-bot-mode")
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return cmd
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def Run(self):
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ''' Runs the test specified by command-line argument --test '''
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    logging.info("running test %s" % (self._test))
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self._test_list[self._test](self)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def _AppendGtestFilter(self, tool, name, cmd):
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '''Append an appropriate --gtest_filter flag to the googletest binary
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       invocation.
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       If the user passed his own filter mentioning only one test, just use it.
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       Othewise, filter out tests listed in the appropriate gtest_exclude files.
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    '''
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (self._gtest_filter and
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ":" not in self._gtest_filter and
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        "?" not in self._gtest_filter and
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        "*" not in self._gtest_filter):
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--gtest_filter=%s" % self._gtest_filter)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filters = []
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gtest_files_dir = os.path.join(path_utils.ScriptDir(), "gtest_exclude")
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gtest_filter_files = [
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.path.join(gtest_files_dir, name + ".gtest-%s.txt" % tool.ToolName())]
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Use ".gtest.txt" files only for slow tools, as they now contain
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Valgrind- and Dr.Memory-specific filters.
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # TODO(glider): rename the files to ".gtest_slow.txt"
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if tool.ToolName() in ChromeTests.SLOW_TOOLS:
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gtest_filter_files += [os.path.join(gtest_files_dir, name + ".gtest.txt")]
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for platform_suffix in common.PlatformNames():
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gtest_filter_files += [
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.path.join(gtest_files_dir, name + ".gtest_%s.txt" % platform_suffix),
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.path.join(gtest_files_dir, name + ".gtest-%s_%s.txt" % \
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            (tool.ToolName(), platform_suffix))]
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    logging.info("Reading gtest exclude filter files:")
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for filename in gtest_filter_files:
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # strip the leading absolute path (may be very long on the bot)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      # and the following / or \.
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      readable_filename = filename.replace("\\", "/")  # '\' on Windows
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      readable_filename = readable_filename.replace(self._source_dir, "")[1:]
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if not os.path.exists(filename):
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        logging.info("  \"%s\" - not found" % readable_filename)
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        continue
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      logging.info("  \"%s\" - OK" % readable_filename)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      f = open(filename, 'r')
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      for line in f.readlines():
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if line.startswith("#") or line.startswith("//") or line.isspace():
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          continue
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        line = line.rstrip()
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        test_prefixes = ["FLAKY", "FAILS"]
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for p in test_prefixes:
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # Strip prefixes from the test names.
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          line = line.replace(".%s_" % p, ".")
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        # Exclude the original test name.
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        filters.append(line)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if line[-2:] != ".*":
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          # List all possible prefixes if line doesn't end with ".*".
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          for p in test_prefixes:
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            filters.append(line.replace(".", ".%s_" % p))
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Get rid of duplicates.
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    filters = set(filters)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    gtest_filter = self._gtest_filter
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if len(filters):
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if gtest_filter:
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gtest_filter += ":"
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if gtest_filter.find("-") < 0:
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)          gtest_filter += "-"
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else:
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        gtest_filter = "-"
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      gtest_filter += ":".join(filters)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if gtest_filter:
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.append("--gtest_filter=%s" % gtest_filter)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  @staticmethod
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def ShowTests():
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    test_to_names = {}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for name, test_function in ChromeTests._test_list.iteritems():
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      test_to_names.setdefault(test_function, []).append(name)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    name_to_aliases = {}
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for names in test_to_names.itervalues():
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      names.sort(key=lambda name: len(name))
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      name_to_aliases[names[0]] = names[1:]
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print "Available tests:"
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    print "----------------"
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for name, aliases in sorted(name_to_aliases.iteritems()):
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      if aliases:
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        print "   {} (aka {})".format(name, ', '.join(aliases))
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else:
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        print "   {}".format(name)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def SetupLdPath(self, requires_build_dir):
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if requires_build_dir:
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      self._EnsureBuildDirFound()
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    elif not self._options.build_dir:
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Append build_dir to LD_LIBRARY_PATH so external libraries can be loaded.
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (os.getenv("LD_LIBRARY_PATH")):
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      os.putenv("LD_LIBRARY_PATH", "%s:%s" % (os.getenv("LD_LIBRARY_PATH"),
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                              self._options.build_dir))
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else:
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      os.putenv("LD_LIBRARY_PATH", self._options.build_dir)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def SimpleTest(self, module, name, valgrind_test_args=None, cmd_args=None):
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tool = valgrind_test.CreateTool(self._options.valgrind_tool)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd = self._DefaultCommand(tool, name, valgrind_test_args)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self._AppendGtestFilter(tool, name, cmd)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd.extend(['--test-tiny-timeout=1000'])
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if cmd_args:
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      cmd.extend(cmd_args)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self.SetupLdPath(True)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return tool.Run(cmd, module)
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def RunCmdLine(self):
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tool = valgrind_test.CreateTool(self._options.valgrind_tool)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd = self._DefaultCommand(tool, None, self._args)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self.SetupLdPath(False)
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return tool.Run(cmd, None)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestAccessibility(self):
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("accessibility", "accessibility_unittests")
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestAddressInput(self):
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("addressinput", "libaddressinput_unittests")
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestAngle(self):
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("angle", "angle_unittests")
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestAppList(self):
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("app_list", "app_list_unittests")
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestAsh(self):
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("ash", "ash_unittests")
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestAshShell(self):
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("ash_shelf", "ash_shell_unittests")
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestAura(self):
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("aura", "aura_unittests")
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestBase(self):
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("base", "base_unittests")
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestBlinkHeap(self):
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("blink_heap", "blink_heap_unittests")
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestBlinkPlatform(self):
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("blink_platform", "blink_platform_unittests")
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestCacheInvalidation(self):
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("cacheinvalidation", "cacheinvalidation_unittests")
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestCast(self):
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "cast_unittests")
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestCC(self):
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("cc", "cc_unittests")
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestChromeApp(self):
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome_app", "chrome_app_unittests")
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestChromeElf(self):
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome_elf", "chrome_elf_unittests")
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestChromeDriver(self):
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chromedriver", "chromedriver_unittests")
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestChromeOS(self):
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chromeos", "chromeos_unittests")
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestCloudPrint(self):
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("cloud_print", "cloud_print_unittests")
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestComponents(self):
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("components", "components_unittests")
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestCompositor(self):
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("compositor", "compositor_unittests")
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestContent(self):
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("content", "content_unittests")
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestCourgette(self):
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("courgette", "courgette_unittests")
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestCrypto(self):
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("crypto", "crypto_unittests")
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestDevice(self):
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("device", "device_unittests")
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestDisplay(self):
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("display", "display_unittests")
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestEvents(self):
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("events", "events_unittests")
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestExtensions(self):
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("extensions", "extensions_unittests")
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestFFmpeg(self):
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "ffmpeg_unittests")
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestFFmpegRegressions(self):
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "ffmpeg_regression_tests")
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestGCM(self):
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("gcm", "gcm_unit_tests")
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestGfx(self):
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("gfx", "gfx_unittests")
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestGin(self):
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("gin", "gin_unittests")
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestGoogleApis(self):
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("google_apis", "google_apis_unittests")
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestGPU(self):
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("gpu", "gpu_unittests")
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestIpc(self):
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("ipc", "ipc_tests",
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           valgrind_test_args=["--trace_children"])
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestInstallerUtil(self):
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("installer_util", "installer_util_unittests")
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestJingle(self):
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "jingle_unittests")
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestKeyboard(self):
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("keyboard", "keyboard_unittests")
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMedia(self):
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "media_unittests")
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMessageCenter(self):
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("message_center", "message_center_unittests")
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoAppsJS(self):
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_apps_js", "mojo_apps_js_unittests")
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoCommon(self):
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_common", "mojo_common_unittests")
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoJS(self):
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_js", "mojo_js_unittests")
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoPublicBindings(self):
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_public_bindings",
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           "mojo_public_bindings_unittests")
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoPublicEnv(self):
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_public_env",
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           "mojo_public_environment_unittests")
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoPublicSystem(self):
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_public_system",
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           "mojo_public_system_unittests")
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoPublicSysPerf(self):
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_public_sysperf",
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           "mojo_public_system_perftests")
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoPublicUtility(self):
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_public_utility",
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           "mojo_public_utility_unittests")
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoApplicationManager(self):
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_application_manager",
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           "mojo_application_manager_unittests")
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoSystem(self):
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_system", "mojo_system_unittests")
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestMojoViewManager(self):
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("mojo_view_manager", "mojo_view_manager_unittests")
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
417a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)  def TestNet(self):
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("net", "net_unittests")
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestNetPerf(self):
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("net", "net_perftests")
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestPhoneNumber(self):
424a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return self.SimpleTest("phonenumber", "libphonenumber_unittests")
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestPPAPI(self):
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "ppapi_unittests")
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestPrinting(self):
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "printing_unittests")
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestRemoting(self):
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "remoting_unittests",
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           cmd_args=[
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                               "--ui-test-action-timeout=60000",
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                               "--ui-test-action-max-timeout=150000"])
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
438a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)  def TestSql(self):
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "sql_unittests")
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestSync(self):
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "sync_unit_tests")
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestLinuxSandbox(self):
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("sandbox", "sandbox_linux_unittests")
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestUnit(self):
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # http://crbug.com/51716
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Disabling all unit tests
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Problems reappeared after r119922
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if common.IsMac() and (self._options.valgrind_tool == "memcheck"):
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      logging.warning("unit_tests are disabled for memcheck on MacOS.")
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      return 0;
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "unit_tests")
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestUIUnit(self):
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "ui_unittests")
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestURL(self):
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "url_unittests")
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestViews(self):
463a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return self.SimpleTest("views", "views_unittests")
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # Valgrind timeouts are in seconds.
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  UI_VALGRIND_ARGS = ["--timeout=14400", "--trace_children", "--indirect"]
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # UI test timeouts are in milliseconds.
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  UI_TEST_ARGS = ["--ui-test-action-timeout=60000",
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--ui-test-action-max-timeout=150000",
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--no-sandbox"]
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # TODO(thestig) fine-tune these values.
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # Valgrind timeouts are in seconds.
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  BROWSER_VALGRIND_ARGS = ["--timeout=50000", "--trace_children", "--indirect"]
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  # Browser test timeouts are in milliseconds.
477a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)  BROWSER_TEST_ARGS = ["--ui-test-action-timeout=400000",
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       "--ui-test-action-max-timeout=800000",
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       "--no-sandbox"]
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestBrowser(self):
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "browser_tests",
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           valgrind_test_args=self.BROWSER_VALGRIND_ARGS,
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           cmd_args=self.BROWSER_TEST_ARGS)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestContentBrowser(self):
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("content", "content_browsertests",
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           valgrind_test_args=self.BROWSER_VALGRIND_ARGS,
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           cmd_args=self.BROWSER_TEST_ARGS)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestInteractiveUI(self):
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "interactive_ui_tests",
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           valgrind_test_args=self.UI_VALGRIND_ARGS,
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           cmd_args=self.UI_TEST_ARGS)
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestSafeBrowsing(self):
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "safe_browsing_tests",
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           valgrind_test_args=self.UI_VALGRIND_ARGS,
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           cmd_args=(["--ui-test-action-max-timeout=450000"]))
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestSyncIntegration(self):
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return self.SimpleTest("chrome", "sync_integration_tests",
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           valgrind_test_args=self.UI_VALGRIND_ARGS,
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           cmd_args=(["--ui-test-action-max-timeout=450000"]))
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)  def TestLayoutChunk(self, chunk_num, chunk_size):
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Run tests [chunk_num*chunk_size .. (chunk_num+1)*chunk_size) from the
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # list of tests.  Wrap around to beginning of list at end.
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # If chunk_size is zero, run all tests in the list once.
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # If a text file is given as argument, it is used as the list of tests.
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    assert((chunk_size == 0) != (len(self._args) == 0))
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Build the ginormous commandline in 'cmd'.
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # It's going to be roughly
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    #  python valgrind_test.py ... python run_webkit_tests.py ...
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # but we'll use the --indirect flag to valgrind_test.py
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # to avoid valgrinding python.
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Start by building the valgrind_test.py commandline.
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    tool = valgrind_test.CreateTool(self._options.valgrind_tool)
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd = self._DefaultCommand(tool)
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd.append("--trace_children")
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd.append("--indirect_webkit_layout")
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd.append("--ignore_exit_code")
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Now build script_cmd, the run_webkits_tests.py commandline
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Store each chunk in its own directory so that we can find the data later
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    chunk_dir = os.path.join("layout", "chunk_%05d" % chunk_num)
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    out_dir = os.path.join(path_utils.ScriptDir(), "latest")
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    out_dir = os.path.join(out_dir, chunk_dir)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if os.path.exists(out_dir):
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      old_files = glob.glob(os.path.join(out_dir, "*.txt"))
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      for f in old_files:
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        os.remove(f)
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else:
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      os.makedirs(out_dir)
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    script = os.path.join(self._source_dir, "webkit", "tools", "layout_tests",
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          "run_webkit_tests.py")
536926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    # http://crbug.com/260627: After the switch to content_shell from DRT, each
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # test now brings up 3 processes.  Under Valgrind, they become memory bound
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # and can eventually OOM if we don't reduce the total count.
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # It'd be nice if content_shell automatically throttled the startup of new
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # tests if we're low on memory.
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jobs = max(1, int(multiprocessing.cpu_count() * 0.3))
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    script_cmd = ["python", script, "-v",
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  # run a separate DumpRenderTree for each test
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--batch-size=1",
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--fully-parallel",
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--child-processes=%d" % jobs,
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--time-out-ms=800000",
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--no-retry-failures",  # retrying takes too much time
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  # http://crbug.com/176908: Don't launch a browser when done.
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--no-show-results",
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                  "--nocheck-sys-deps"]
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Pass build mode to run_webkit_tests.py.  We aren't passed it directly,
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # so parse it out of build_dir.  run_webkit_tests.py can only handle
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # the two values "Release" and "Debug".
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # TODO(Hercules): unify how all our scripts pass around build mode
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # (--mode / --target / --build-dir / --debug)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if self._options.build_dir:
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      build_root, mode = os.path.split(self._options.build_dir)
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      script_cmd.extend(["--build-directory", build_root, "--target", mode])
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (chunk_size > 0):
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      script_cmd.append("--run-chunk=%d:%d" % (chunk_num, chunk_size))
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if len(self._args):
56310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch      # if the arg is a txt file, then treat it as a list of tests
56410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch      if os.path.isfile(self._args[0]) and self._args[0][-4:] == ".txt":
56510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        script_cmd.append("--test-list=%s" % self._args[0])
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)      else:
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        script_cmd.extend(self._args)
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    self._AppendGtestFilter(tool, "layout", script_cmd)
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Now run script_cmd with the wrapper in cmd
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd.extend(["--"])
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    cmd.extend(script_cmd)
572c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    # Layout tests often times fail quickly, but the buildbot remains green.
574    # Detect this situation when running with the default chunk size.
575    if chunk_size == self.LAYOUT_TESTS_DEFAULT_CHUNK_SIZE:
576      min_runtime_in_seconds=120
577    else:
578      min_runtime_in_seconds=0
579    ret = tool.Run(cmd, "layout", min_runtime_in_seconds=min_runtime_in_seconds)
580    return ret
581
582
583  def TestLayout(self):
584    # A "chunk file" is maintained in the local directory so that each test
585    # runs a slice of the layout tests of size chunk_size that increments with
586    # each run.  Since tests can be added and removed from the layout tests at
587    # any time, this is not going to give exact coverage, but it will allow us
588    # to continuously run small slices of the layout tests under valgrind rather
589    # than having to run all of them in one shot.
590    chunk_size = self._options.num_tests
591    if chunk_size == 0 or len(self._args):
592      return self.TestLayoutChunk(0, 0)
593    chunk_num = 0
594    chunk_file = os.path.join("valgrind_layout_chunk.txt")
595    logging.info("Reading state from " + chunk_file)
596    try:
597      f = open(chunk_file)
598      if f:
599        chunk_str = f.read()
600        if len(chunk_str):
601          chunk_num = int(chunk_str)
602        # This should be enough so that we have a couple of complete runs
603        # of test data stored in the archive (although note that when we loop
604        # that we almost guaranteed won't be at the end of the test list)
605        if chunk_num > 10000:
606          chunk_num = 0
607        f.close()
608    except IOError, (errno, strerror):
609      logging.error("error reading from file %s (%d, %s)" % (chunk_file,
610                    errno, strerror))
611    # Save the new chunk size before running the tests. Otherwise if a
612    # particular chunk hangs the bot, the chunk number will never get
613    # incremented and the bot will be wedged.
614    logging.info("Saving state to " + chunk_file)
615    try:
616      f = open(chunk_file, "w")
617      chunk_num += 1
618      f.write("%d" % chunk_num)
619      f.close()
620    except IOError, (errno, strerror):
621      logging.error("error writing to file %s (%d, %s)" % (chunk_file, errno,
622                    strerror))
623    # Since we're running small chunks of the layout tests, it's important to
624    # mark the ones that have errors in them.  These won't be visible in the
625    # summary list for long, but will be useful for someone reviewing this bot.
626    return self.TestLayoutChunk(chunk_num, chunk_size)
627
628  # The known list of tests.
629  # Recognise the original abbreviations as well as full executable names.
630  _test_list = {
631    "cmdline" : RunCmdLine,
632    "addressinput": TestAddressInput,
633    "libaddressinput_unittests": TestAddressInput,
634    "accessibility": TestAccessibility,
635    "angle": TestAngle,          "angle_unittests": TestAngle,
636    "app_list": TestAppList,     "app_list_unittests": TestAppList,
637    "ash": TestAsh,              "ash_unittests": TestAsh,
638    "ash_shell": TestAshShell,   "ash_shell_unittests": TestAshShell,
639    "aura": TestAura,            "aura_unittests": TestAura,
640    "base": TestBase,            "base_unittests": TestBase,
641    "blink_heap": TestBlinkHeap,
642    "blink_platform": TestBlinkPlatform,
643    "browser": TestBrowser,      "browser_tests": TestBrowser,
644    "cacheinvalidation": TestCacheInvalidation,
645    "cacheinvalidation_unittests": TestCacheInvalidation,
646    "cast": TestCast,            "cast_unittests": TestCast,
647    "cc": TestCC,                "cc_unittests": TestCC,
648    "chrome_app": TestChromeApp,
649    "chrome_elf": TestChromeElf,
650    "chromedriver": TestChromeDriver,
651    "chromeos": TestChromeOS,    "chromeos_unittests": TestChromeOS,
652    "cloud_print": TestCloudPrint,
653    "cloud_print_unittests": TestCloudPrint,
654    "components": TestComponents,"components_unittests": TestComponents,
655    "compositor": TestCompositor,"compositor_unittests": TestCompositor,
656    "content": TestContent,      "content_unittests": TestContent,
657    "content_browsertests": TestContentBrowser,
658    "courgette": TestCourgette,  "courgette_unittests": TestCourgette,
659    "crypto": TestCrypto,        "crypto_unittests": TestCrypto,
660    "device": TestDevice,        "device_unittests": TestDevice,
661    "display": TestDisplay,      "display_unittests": TestDisplay,
662    "events": TestEvents,        "events_unittests": TestEvents,
663    "extensions": TestExtensions, "extensions_unittests": TestExtensions,
664    "ffmpeg": TestFFmpeg,        "ffmpeg_unittests": TestFFmpeg,
665    "ffmpeg_regression_tests": TestFFmpegRegressions,
666    "gcm": TestGCM,              "gcm_unit_tests": TestGCM,
667    "gin": TestGin,              "gin_unittests": TestGin,
668    "gfx": TestGfx,              "gfx_unittests": TestGfx,
669    "google_apis": TestGoogleApis,
670    "gpu": TestGPU,              "gpu_unittests": TestGPU,
671    "ipc": TestIpc,              "ipc_tests": TestIpc,
672    "installer_util": TestInstallerUtil,
673    "interactive_ui": TestInteractiveUI,
674    "jingle": TestJingle,        "jingle_unittests": TestJingle,
675    "keyboard": TestKeyboard,    "keyboard_unittests": TestKeyboard,
676    "layout": TestLayout,        "layout_tests": TestLayout,
677    "media": TestMedia,          "media_unittests": TestMedia,
678    "message_center": TestMessageCenter,
679    "message_center_unittests" : TestMessageCenter,
680    "mojo_apps_js": TestMojoAppsJS,
681    "mojo_common": TestMojoCommon,
682    "mojo_js": TestMojoJS,
683    "mojo_system": TestMojoSystem,
684    "mojo_public_system": TestMojoPublicSystem,
685    "mojo_public_utility": TestMojoPublicUtility,
686    "mojo_public_bindings": TestMojoPublicBindings,
687    "mojo_public_env": TestMojoPublicEnv,
688    "mojo_public_sysperf": TestMojoPublicSysPerf,
689    "mojo_application_manager": TestMojoApplicationManager,
690    "mojo_view_manager": TestMojoViewManager,
691    "net": TestNet,              "net_unittests": TestNet,
692    "net_perf": TestNetPerf,     "net_perftests": TestNetPerf,
693    "phonenumber": TestPhoneNumber,
694    "libphonenumber_unittests": TestPhoneNumber,
695    "ppapi": TestPPAPI,          "ppapi_unittests": TestPPAPI,
696    "printing": TestPrinting,    "printing_unittests": TestPrinting,
697    "remoting": TestRemoting,    "remoting_unittests": TestRemoting,
698    "safe_browsing": TestSafeBrowsing, "safe_browsing_tests": TestSafeBrowsing,
699    "sandbox": TestLinuxSandbox, "sandbox_linux_unittests": TestLinuxSandbox,
700    "sql": TestSql,              "sql_unittests": TestSql,
701    "sync": TestSync,            "sync_unit_tests": TestSync,
702    "sync_integration_tests": TestSyncIntegration,
703    "sync_integration": TestSyncIntegration,
704    "ui_unit": TestUIUnit,       "ui_unittests": TestUIUnit,
705    "unit": TestUnit,            "unit_tests": TestUnit,
706    "url": TestURL,              "url_unittests": TestURL,
707    "views": TestViews,          "views_unittests": TestViews,
708    "webkit": TestLayout,
709  }
710
711
712def _main():
713  parser = optparse.OptionParser("usage: %prog -b <dir> -t <test> "
714                                 "[-t <test> ...]")
715
716  parser.add_option("--help-tests", dest="help_tests", action="store_true",
717                    default=False, help="List all available tests")
718  parser.add_option("-b", "--build-dir",
719                    help="the location of the compiler output")
720  parser.add_option("--target", help="Debug or Release")
721  parser.add_option("-t", "--test", action="append", default=[],
722                    help="which test to run, supports test:gtest_filter format "
723                         "as well.")
724  parser.add_option("--baseline", action="store_true", default=False,
725                    help="generate baseline data instead of validating")
726  parser.add_option("--gtest_filter",
727                    help="additional arguments to --gtest_filter")
728  parser.add_option("--gtest_repeat", help="argument for --gtest_repeat")
729  parser.add_option("--gtest_shuffle", action="store_true", default=False,
730                    help="Randomize tests' orders on every iteration.")
731  parser.add_option("-v", "--verbose", action="store_true", default=False,
732                    help="verbose output - enable debug log messages")
733  parser.add_option("--tool", dest="valgrind_tool", default="memcheck",
734                    help="specify a valgrind tool to run the tests under")
735  parser.add_option("--tool_flags", dest="valgrind_tool_flags", default="",
736                    help="specify custom flags for the selected valgrind tool")
737  parser.add_option("--keep_logs", action="store_true", default=False,
738                    help="store memory tool logs in the <tool>.logs directory "
739                         "instead of /tmp.\nThis can be useful for tool "
740                         "developers/maintainers.\nPlease note that the <tool>"
741                         ".logs directory will be clobbered on tool startup.")
742  parser.add_option("-n", "--num_tests", type="int",
743                    default=ChromeTests.LAYOUT_TESTS_DEFAULT_CHUNK_SIZE,
744                    help="for layout tests: # of subtests per run.  0 for all.")
745  # TODO(thestig) Remove this if we can.
746  parser.add_option("--gtest_color", dest="gtest_color", default="no",
747                    help="dummy compatibility flag for sharding_supervisor.")
748  parser.add_option("--brave-new-test-launcher", action="store_true",
749                    help="run the tests with --brave-new-test-launcher")
750  parser.add_option("--test-launcher-bot-mode", action="store_true",
751                    help="run the tests with --test-launcher-bot-mode")
752
753  options, args = parser.parse_args()
754
755  # Bake target into build_dir.
756  if options.target and options.build_dir:
757    assert (options.target !=
758            os.path.basename(os.path.dirname(options.build_dir)))
759    options.build_dir = os.path.join(os.path.abspath(options.build_dir),
760                                     options.target)
761
762  if options.verbose:
763    logging_utils.config_root(logging.DEBUG)
764  else:
765    logging_utils.config_root()
766
767  if options.help_tests:
768    ChromeTests.ShowTests()
769    return 0
770
771  if not options.test:
772    parser.error("--test not specified")
773
774  if len(options.test) != 1 and options.gtest_filter:
775    parser.error("--gtest_filter and multiple tests don't make sense together")
776
777  for t in options.test:
778    tests = ChromeTests(options, args, t)
779    ret = tests.Run()
780    if ret: return ret
781  return 0
782
783
784if __name__ == "__main__":
785  sys.exit(_main())
786