10ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#!/usr/bin/env python
20ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
30ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# Copyright 2009 Google Inc. All Rights Reserved.
40ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
50ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# Redistribution and use in source and binary forms, with or without
60ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# modification, are permitted provided that the following conditions are
70ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# met:
80ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
90ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#     * Redistributions of source code must retain the above copyright
100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# notice, this list of conditions and the following disclaimer.
110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#     * Redistributions in binary form must reproduce the above
120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# copyright notice, this list of conditions and the following disclaimer
130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# in the documentation and/or other materials provided with the
140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# distribution.
150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#     * Neither the name of Google Inc. nor the names of its
160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# contributors may be used to endorse or promote products derived from
170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# this software without specific prior written permission.
180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson#
190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson"""Tests for run_tests_util.py test runner script."""
320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson__author__ = 'vladl@google.com (Vlad Losev)'
340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonimport os
360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonimport re
370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonimport sets
380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonimport unittest
390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonimport run_tests_util
410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_DBG_DIR = 'scons/build/dbg/gtest/scons'
440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_OPT_DIR = 'scons/build/opt/gtest/scons'
450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff DavidsonGTEST_OTHER_DIR = 'scons/build/other/gtest/scons'
460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsondef AddExeExtension(path):
490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  """Appends .exe to the path on Windows or Cygwin."""
500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN:
520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return path + '.exe'
530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  else:
540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return path
550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass FakePath(object):
580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  """A fake os.path module for testing."""
590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def __init__(self, current_dir=os.getcwd(), known_paths=None):
610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.current_dir = current_dir
620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.tree = {}
630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.path_separator = os.sep
640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # known_paths contains either absolute or relative paths. Relative paths
660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # are absolutized with self.current_dir.
670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if known_paths:
680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      self._AddPaths(known_paths)
690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def _AddPath(self, path):
710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    ends_with_slash = path.endswith('/')
720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    path = self.abspath(path)
730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if ends_with_slash:
740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      path += self.path_separator
750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    name_list = path.split(self.path_separator)
760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    tree = self.tree
770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for name in name_list[:-1]:
780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if not name:
790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        continue
800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if name in tree:
810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        tree = tree[name]
820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      else:
830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        tree[name] = {}
840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        tree = tree[name]
850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    name = name_list[-1]
870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    if name:
880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if name in tree:
890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        assert tree[name] == 1
900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      else:
910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        tree[name] = 1
920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def _AddPaths(self, paths):
940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for path in paths:
950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      self._AddPath(path)
960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def PathElement(self, path):
980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Returns an internal representation of directory tree entry for path."""
990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    tree = self.tree
1000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    name_list = self.abspath(path).split(self.path_separator)
1010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    for name in name_list:
1020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if not name:
1030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        continue
1040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      tree = tree.get(name, None)
1050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if tree is None:
1060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        break
1070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return tree
1090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  # Silences pylint warning about using standard names.
1110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  # pylint: disable-msg=C6409
1120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def normpath(self, path):
1130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return os.path.normpath(path)
1140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def abspath(self, path):
1160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return self.normpath(os.path.join(self.current_dir, path))
1170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def isfile(self, path):
1190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return self.PathElement(self.abspath(path)) == 1
1200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def isdir(self, path):
1220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return type(self.PathElement(self.abspath(path))) == type(dict())
1230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def basename(self, path):
1250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return os.path.basename(path)
1260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def dirname(self, path):
1280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return os.path.dirname(path)
1290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def join(self, *kargs):
1310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return os.path.join(*kargs)
1320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass FakeOs(object):
1350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  """A fake os module for testing."""
1360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  P_WAIT = os.P_WAIT
1370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def __init__(self, fake_path_module):
1390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.path = fake_path_module
1400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Some methods/attributes are delegated to the real os module.
1420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.environ = os.environ
1430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  # pylint: disable-msg=C6409
1450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def listdir(self, path):
1460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    assert self.path.isdir(path)
1470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return self.path.PathElement(path).iterkeys()
1480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def spawnv(self, wait, executable, *kargs):
1500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    assert wait == FakeOs.P_WAIT
1510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return self.spawn_impl(executable, kargs)
1520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass GetTestsToRunTest(unittest.TestCase):
1550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  """Exercises TestRunner.GetTestsToRun."""
1560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def NormalizeGetTestsToRunResults(self, results):
1580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Normalizes path data returned from GetTestsToRun for comparison."""
1590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    def NormalizePythonTestPair(pair):
1610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      """Normalizes path data in the (directory, python_script) pair."""
1620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return (os.path.normpath(pair[0]), os.path.normpath(pair[1]))
1640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    def NormalizeBinaryTestPair(pair):
1660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      """Normalizes path data in the (directory, binary_executable) pair."""
1670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      directory, executable = map(os.path.normpath, pair)
1690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      # On Windows and Cygwin, the test file names have the .exe extension, but
1710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      # they can be invoked either by name or by name+extension. Our test must
1720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      # accommodate both situations.
1730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN:
1740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        executable = re.sub(r'\.exe$', '', executable)
1750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      return (directory, executable)
1760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    python_tests = sets.Set(map(NormalizePythonTestPair, results[0]))
1780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    binary_tests = sets.Set(map(NormalizeBinaryTestPair, results[1]))
1790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return (python_tests, binary_tests)
1800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def AssertResultsEqual(self, results, expected):
1820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Asserts results returned by GetTestsToRun equal to expected results."""
1830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(self.NormalizeGetTestsToRunResults(results),
1850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     self.NormalizeGetTestsToRunResults(expected),
1860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     'Incorrect set of tests returned:\n%s\nexpected:\n%s' %
1870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     (results, expected))
1880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
1890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def setUp(self):
1900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os = FakeOs(FakePath(
1910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),
1920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        known_paths=[AddExeExtension(GTEST_DBG_DIR + '/gtest_unittest'),
1930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     AddExeExtension(GTEST_OPT_DIR + '/gtest_unittest'),
1940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     'test/gtest_color_test.py']))
1950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_configurations = ['dbg', 'opt']
1960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.test_runner = run_tests_util.TestRunner(script_dir='.',
1970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 injected_os=self.fake_os,
1980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 injected_subprocess=None)
1990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testBinaryTestsOnly(self):
2010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises GetTestsToRun with parameters designating binary tests only."""
2020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A default build.
2040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest'],
2070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
2080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
2090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))
2120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # An explicitly specified directory.
2140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'gtest_unittest'],
2170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
2180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
2190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))
2220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A particular configuration.
2240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest'],
2270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'other',
2280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
2290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_OTHER_DIR, GTEST_OTHER_DIR + '/gtest_unittest')]))
2320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # All available configurations
2340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest'],
2370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'all',
2380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
2390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),
2420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))
2430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # All built configurations (unbuilt don't cause failure).
2450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest'],
2480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
2490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            True,
2500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations + ['unbuilt']),
2510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),
2530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))
2540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A combination of an explicit directory and a configuration.
2560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'gtest_unittest'],
2590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'opt',
2600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
2610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),
2640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))
2650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Same test specified in an explicit directory and via a configuration.
2670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'gtest_unittest'],
2700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'dbg',
2710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
2720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))
2750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # All built configurations + explicit directory + explicit configuration.
2770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'gtest_unittest'],
2800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'opt',
2810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            True,
2820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
2840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'),
2850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')]))
2860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testPythonTestsOnly(self):
2880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises GetTestsToRun with parameters designating Python tests only."""
2890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
2900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A default build.
2910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
2920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
2930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_color_test.py'],
2940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
2950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
2960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
2970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
2980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
2990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # An explicitly specified directory.
3010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'test/gtest_color_test.py'],
3040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
3050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
3060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
3080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
3090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A particular configuration.
3110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_color_test.py'],
3140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'other',
3150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
3160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_OTHER_DIR, 'test/gtest_color_test.py')],
3180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
3190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # All available configurations
3210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['test/gtest_color_test.py'],
3240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'all',
3250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
3260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),
3280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],
3290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
3300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # All built configurations (unbuilt don't cause failure).
3320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_color_test.py'],
3350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
3360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            True,
3370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations + ['unbuilt']),
3380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),
3390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],
3400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
3410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A combination of an explicit directory and a configuration.
3430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'gtest_color_test.py'],
3460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'opt',
3470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
3480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),
3500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],
3510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
3520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Same test specified in an explicit directory and via a configuration.
3540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'gtest_color_test.py'],
3570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'dbg',
3580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
3590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
3610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
3620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # All built configurations + explicit directory + explicit configuration.
3640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [GTEST_DBG_DIR, 'gtest_color_test.py'],
3670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'opt',
3680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            True,
3690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'),
3710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          (GTEST_OPT_DIR, 'test/gtest_color_test.py')],
3720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
3730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testCombinationOfBinaryAndPythonTests(self):
3750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises GetTestsToRun with mixed binary/Python tests."""
3760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Use only default configuration for this test.
3780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Neither binary nor Python tests are specified so find all.
3800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [],
3830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
3840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
3850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
3870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))
3880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Specifying both binary and Python tests.
3900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
3910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
3920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest', 'gtest_color_test.py'],
3930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
3940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
3950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
3960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
3970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))
3980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
3990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Specifying binary tests suppresses Python tests.
4000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
4010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
4020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest'],
4030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
4040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
4050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
4060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
4070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]))
4080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson   # Specifying Python tests suppresses binary tests.
4100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
4110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
4120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_color_test.py'],
4130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
4140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
4150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
4160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
4170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         []))
4180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testIgnoresNonTestFiles(self):
4200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Verifies that GetTestsToRun ignores non-test files in the filesystem."""
4210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os = FakeOs(FakePath(
4230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),
4240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        known_paths=[AddExeExtension(GTEST_DBG_DIR + '/gtest_nontest'),
4250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                     'test/']))
4260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.test_runner = run_tests_util.TestRunner(script_dir='.',
4270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 injected_os=self.fake_os,
4280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 injected_subprocess=None)
4290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
4300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
4310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [],
4320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
4330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            True,
4340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
4350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([], []))
4360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testWorksFromDifferentDir(self):
4380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises GetTestsToRun from a directory different from run_test.py's."""
4390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Here we simulate an test script in directory /d/ called from the
4410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # directory /a/b/c/.
4420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os = FakeOs(FakePath(
4430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        current_dir=os.path.abspath('/a/b/c'),
4440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        known_paths=[
4450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '/a/b/c/',
4460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            AddExeExtension('/d/' + GTEST_DBG_DIR + '/gtest_unittest'),
4470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            AddExeExtension('/d/' + GTEST_OPT_DIR + '/gtest_unittest'),
4480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '/d/test/gtest_color_test.py']))
4490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_configurations = ['dbg', 'opt']
4500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.test_runner = run_tests_util.TestRunner(script_dir='/d/',
4510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 injected_os=self.fake_os,
4520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                 injected_subprocess=None)
4530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A binary test.
4540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
4550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
4560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest'],
4570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
4580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
4590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
4600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([],
4610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson         [('/d/' + GTEST_DBG_DIR, '/d/' + GTEST_DBG_DIR + '/gtest_unittest')]))
4620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # A Python test.
4640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.AssertResultsEqual(
4650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.GetTestsToRun(
4660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_color_test.py'],
4670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
4680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
4690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations),
4700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        ([('/d/' + GTEST_DBG_DIR, '/d/test/gtest_color_test.py')], []))
4710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testNonTestBinary(self):
4730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises GetTestsToRun with a non-test parameter."""
4740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assert_(
4760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        not self.test_runner.GetTestsToRun(
4770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['gtest_unittest_not_really'],
4780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
4790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
4800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations))
4810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testNonExistingPythonTest(self):
4830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises GetTestsToRun with a non-existent Python test parameter."""
4840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assert_(
4860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        not self.test_runner.GetTestsToRun(
4870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            ['nonexistent_test.py'],
4880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            '',
4890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            False,
4900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            available_configurations=self.fake_configurations))
4910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN:
4930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    def testDoesNotPickNonExeFilesOnWindows(self):
4950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      """Verifies that GetTestsToRun does not find _test files on Windows."""
4960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
4970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      self.fake_os = FakeOs(FakePath(
4980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),
4990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          known_paths=['/d/' + GTEST_DBG_DIR + '/gtest_test', 'test/']))
5000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      self.test_runner = run_tests_util.TestRunner(script_dir='.',
5010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                   injected_os=self.fake_os,
5020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson                                                   injected_subprocess=None)
5030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      self.AssertResultsEqual(
5040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          self.test_runner.GetTestsToRun(
5050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              [],
5060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              '',
5070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              True,
5080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson              available_configurations=self.fake_configurations),
5090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson          ([], []))
5100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass RunTestsTest(unittest.TestCase):
5130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  """Exercises TestRunner.RunTests."""
5140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def SpawnSuccess(self, unused_executable, unused_argv):
5160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Fakes test success by returning 0 as an exit code."""
5170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.num_spawn_calls += 1
5190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 0
5200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def SpawnFailure(self, unused_executable, unused_argv):
5220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Fakes test success by returning 1 as an exit code."""
5230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.num_spawn_calls += 1
5250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    return 1
5260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def setUp(self):
5280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os = FakeOs(FakePath(
5290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)),
5300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        known_paths=[
5310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            AddExeExtension(GTEST_DBG_DIR + '/gtest_unittest'),
5320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            AddExeExtension(GTEST_OPT_DIR + '/gtest_unittest'),
5330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            'test/gtest_color_test.py']))
5340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_configurations = ['dbg', 'opt']
5350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.test_runner = run_tests_util.TestRunner(
5360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        script_dir=os.path.dirname(__file__) or '.',
5370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        injected_os=self.fake_os,
5380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        injected_subprocess=None)
5390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.num_spawn_calls = 0  # A number of calls to spawn.
5400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testRunPythonTestSuccess(self):
5420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises RunTests to handle a Python test success."""
5430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os.spawn_impl = self.SpawnSuccess
5450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(
5460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.RunTests(
5470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
5480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            []),
5490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        0)
5500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(self.num_spawn_calls, 1)
5510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testRunBinaryTestSuccess(self):
5530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises RunTests to handle a binary test success."""
5540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os.spawn_impl = self.SpawnSuccess
5560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(
5570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.RunTests(
5580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [],
5590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),
5600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        0)
5610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(self.num_spawn_calls, 1)
5620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testRunPythonTestFauilure(self):
5640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises RunTests to handle a Python test failure."""
5650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os.spawn_impl = self.SpawnFailure
5670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(
5680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.RunTests(
5690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, 'test/gtest_color_test.py')],
5700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            []),
5710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        1)
5720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(self.num_spawn_calls, 1)
5730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testRunBinaryTestFailure(self):
5750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises RunTests to handle a binary test failure."""
5760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5770ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os.spawn_impl = self.SpawnFailure
5780ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(
5790ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.RunTests(
5800ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [],
5810ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),
5820ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        1)
5830ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(self.num_spawn_calls, 1)
5840ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5850ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testCombinedTestSuccess(self):
5860ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises RunTests to handle a success of both Python and binary test."""
5870ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5880ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os.spawn_impl = self.SpawnSuccess
5890ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(
5900ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.RunTests(
5910ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')],
5920ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),
5930ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        0)
5940ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(self.num_spawn_calls, 2)
5950ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5960ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testCombinedTestSuccessAndFailure(self):
5970ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    """Exercises RunTests to handle a success of both Python and binary test."""
5980ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
5990ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    def SpawnImpl(executable, argv):
6000ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      self.num_spawn_calls += 1
6010ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      # Simulates failure of a Python test and success of a binary test.
6020ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      if '.py' in executable or '.py' in argv[0]:
6030ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        return 1
6040ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      else:
6050ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        return 0
6060ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6070ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.fake_os.spawn_impl = SpawnImpl
6080ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(
6090ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        self.test_runner.RunTests(
6100ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')],
6110ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson            [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]),
6120ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        0)
6130ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(self.num_spawn_calls, 2)
6140ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6150ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6160ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonclass ParseArgsTest(unittest.TestCase):
6170ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  """Exercises ParseArgs."""
6180ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6190ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testNoOptions(self):
6200ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    options, args = run_tests_util.ParseArgs('gtest', argv=['script.py'])
6210ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(args, ['script.py'])
6220ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assert_(options.configurations is None)
6230ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertFalse(options.built_configurations)
6240ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6250ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testOptionC(self):
6260ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    options, args = run_tests_util.ParseArgs(
6270ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        'gtest', argv=['script.py', '-c', 'dbg'])
6280ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(args, ['script.py'])
6290ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(options.configurations, 'dbg')
6300ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertFalse(options.built_configurations)
6310ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6320ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testOptionA(self):
6330ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    options, args = run_tests_util.ParseArgs('gtest', argv=['script.py', '-a'])
6340ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(args, ['script.py'])
6350ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(options.configurations, 'all')
6360ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertFalse(options.built_configurations)
6370ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6380ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testOptionB(self):
6390ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    options, args = run_tests_util.ParseArgs('gtest', argv=['script.py', '-b'])
6400ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(args, ['script.py'])
6410ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assert_(options.configurations is None)
6420ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertTrue(options.built_configurations)
6430ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6440ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testOptionCAndOptionB(self):
6450ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    options, args = run_tests_util.ParseArgs(
6460ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        'gtest', argv=['script.py', '-c', 'dbg', '-b'])
6470ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(args, ['script.py'])
6480ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(options.configurations, 'dbg')
6490ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertTrue(options.built_configurations)
6500ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6510ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  def testOptionH(self):
6520ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    help_called = [False]
6530ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6540ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Suppresses lint warning on unused arguments.  These arguments are
6550ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # required by optparse, even though they are unused.
6560ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # pylint: disable-msg=W0613
6570ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    def VerifyHelp(option, opt, value, parser):
6580ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson      help_called[0] = True
6590ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6600ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Verifies that -h causes the help callback to be called.
6610ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    help_called[0] = False
6620ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    _, args = run_tests_util.ParseArgs(
6630ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        'gtest', argv=['script.py', '-h'], help_callback=VerifyHelp)
6640ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(args, ['script.py'])
6650ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertTrue(help_called[0])
6660ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6670ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    # Verifies that --help causes the help callback to be called.
6680ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    help_called[0] = False
6690ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    _, args = run_tests_util.ParseArgs(
6700ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson        'gtest', argv=['script.py', '--help'], help_callback=VerifyHelp)
6710ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertEqual(args, ['script.py'])
6720ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson    self.assertTrue(help_called[0])
6730ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6740ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson
6750ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidsonif __name__ == '__main__':
6760ddac1f3791efefb2cffdb425f0c600feb7a47e6Jeff Davidson  unittest.main()
677