Blame googletest/test/gtest_filter_unittest.py

Packit bd1cd8
#!/usr/bin/env python
Packit bd1cd8
#
Packit bd1cd8
# Copyright 2005 Google Inc. All Rights Reserved.
Packit bd1cd8
#
Packit bd1cd8
# Redistribution and use in source and binary forms, with or without
Packit bd1cd8
# modification, are permitted provided that the following conditions are
Packit bd1cd8
# met:
Packit bd1cd8
#
Packit bd1cd8
#     * Redistributions of source code must retain the above copyright
Packit bd1cd8
# notice, this list of conditions and the following disclaimer.
Packit bd1cd8
#     * Redistributions in binary form must reproduce the above
Packit bd1cd8
# copyright notice, this list of conditions and the following disclaimer
Packit bd1cd8
# in the documentation and/or other materials provided with the
Packit bd1cd8
# distribution.
Packit bd1cd8
#     * Neither the name of Google Inc. nor the names of its
Packit bd1cd8
# contributors may be used to endorse or promote products derived from
Packit bd1cd8
# this software without specific prior written permission.
Packit bd1cd8
#
Packit bd1cd8
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit bd1cd8
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit bd1cd8
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit bd1cd8
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit bd1cd8
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit bd1cd8
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit bd1cd8
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit bd1cd8
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit bd1cd8
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit bd1cd8
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit bd1cd8
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit bd1cd8
Packit bd1cd8
"""Unit test for Google Test test filters.
Packit bd1cd8
Packit bd1cd8
A user can specify which test(s) in a Google Test program to run via either
Packit bd1cd8
the GTEST_FILTER environment variable or the --gtest_filter flag.
Packit bd1cd8
This script tests such functionality by invoking
Packit bd1cd8
gtest_filter_unittest_ (a program written with Google Test) with different
Packit bd1cd8
environments and command line flags.
Packit bd1cd8
Packit bd1cd8
Note that test sharding may also influence which tests are filtered. Therefore,
Packit bd1cd8
we test that here also.
Packit bd1cd8
"""
Packit bd1cd8
Packit bd1cd8
__author__ = 'wan@google.com (Zhanyong Wan)'
Packit bd1cd8
Packit bd1cd8
import os
Packit bd1cd8
import re
Packit bd1cd8
try:
Packit bd1cd8
  from sets import Set as set  # For Python 2.3 compatibility
Packit bd1cd8
except ImportError:
Packit bd1cd8
  pass
Packit bd1cd8
import sys
Packit bd1cd8
Packit bd1cd8
import gtest_test_utils
Packit bd1cd8
Packit bd1cd8
# Constants.
Packit bd1cd8
Packit bd1cd8
# Checks if this platform can pass empty environment variables to child
Packit bd1cd8
# processes.  We set an env variable to an empty string and invoke a python
Packit bd1cd8
# script in a subprocess to print whether the variable is STILL in
Packit bd1cd8
# os.environ.  We then use 'eval' to parse the child's output so that an
Packit bd1cd8
# exception is thrown if the input is anything other than 'True' nor 'False'.
Packit bd1cd8
os.environ['EMPTY_VAR'] = ''
Packit bd1cd8
child = gtest_test_utils.Subprocess(
Packit bd1cd8
    [sys.executable, '-c', 'import os; print(\'EMPTY_VAR\' in os.environ)'])
Packit bd1cd8
CAN_PASS_EMPTY_ENV = eval(child.output)
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
# Check if this platform can unset environment variables in child processes.
Packit bd1cd8
# We set an env variable to a non-empty string, unset it, and invoke
Packit bd1cd8
# a python script in a subprocess to print whether the variable
Packit bd1cd8
# is NO LONGER in os.environ.
Packit bd1cd8
# We use 'eval' to parse the child's output so that an exception
Packit bd1cd8
# is thrown if the input is neither 'True' nor 'False'.
Packit bd1cd8
os.environ['UNSET_VAR'] = 'X'
Packit bd1cd8
del os.environ['UNSET_VAR']
Packit bd1cd8
child = gtest_test_utils.Subprocess(
Packit bd1cd8
    [sys.executable, '-c', 'import os; print(\'UNSET_VAR\' not in os.environ)'])
Packit bd1cd8
CAN_UNSET_ENV = eval(child.output)
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
# Checks if we should test with an empty filter. This doesn't
Packit bd1cd8
# make sense on platforms that cannot pass empty env variables (Win32)
Packit bd1cd8
# and on platforms that cannot unset variables (since we cannot tell
Packit bd1cd8
# the difference between "" and NULL -- Borland and Solaris < 5.10)
Packit bd1cd8
CAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
# The environment variable for specifying the test filters.
Packit bd1cd8
FILTER_ENV_VAR = 'GTEST_FILTER'
Packit bd1cd8
Packit bd1cd8
# The environment variables for test sharding.
Packit bd1cd8
TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
Packit bd1cd8
SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
Packit bd1cd8
SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
Packit bd1cd8
Packit bd1cd8
# The command line flag for specifying the test filters.
Packit bd1cd8
FILTER_FLAG = 'gtest_filter'
Packit bd1cd8
Packit bd1cd8
# The command line flag for including disabled tests.
Packit bd1cd8
ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
Packit bd1cd8
Packit bd1cd8
# Command to run the gtest_filter_unittest_ program.
Packit bd1cd8
COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
Packit bd1cd8
Packit bd1cd8
# Regex for determining whether parameterized tests are enabled in the binary.
Packit bd1cd8
PARAM_TEST_REGEX = re.compile(r'/ParamTest')
Packit bd1cd8
Packit bd1cd8
# Regex for parsing test case names from Google Test's output.
Packit bd1cd8
TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
Packit bd1cd8
Packit bd1cd8
# Regex for parsing test names from Google Test's output.
Packit bd1cd8
TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
Packit bd1cd8
Packit bd1cd8
# The command line flag to tell Google Test to output the list of tests it
Packit bd1cd8
# will run.
Packit bd1cd8
LIST_TESTS_FLAG = '--gtest_list_tests'
Packit bd1cd8
Packit bd1cd8
# Indicates whether Google Test supports death tests.
Packit bd1cd8
SUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(
Packit bd1cd8
    [COMMAND, LIST_TESTS_FLAG]).output
Packit bd1cd8
Packit bd1cd8
# Full names of all tests in gtest_filter_unittests_.
Packit bd1cd8
PARAM_TESTS = [
Packit bd1cd8
    'SeqP/ParamTest.TestX/0',
Packit bd1cd8
    'SeqP/ParamTest.TestX/1',
Packit bd1cd8
    'SeqP/ParamTest.TestY/0',
Packit bd1cd8
    'SeqP/ParamTest.TestY/1',
Packit bd1cd8
    'SeqQ/ParamTest.TestX/0',
Packit bd1cd8
    'SeqQ/ParamTest.TestX/1',
Packit bd1cd8
    'SeqQ/ParamTest.TestY/0',
Packit bd1cd8
    'SeqQ/ParamTest.TestY/1',
Packit bd1cd8
    ]
Packit bd1cd8
Packit bd1cd8
DISABLED_TESTS = [
Packit bd1cd8
    'BarTest.DISABLED_TestFour',
Packit bd1cd8
    'BarTest.DISABLED_TestFive',
Packit bd1cd8
    'BazTest.DISABLED_TestC',
Packit bd1cd8
    'DISABLED_FoobarTest.Test1',
Packit bd1cd8
    'DISABLED_FoobarTest.DISABLED_Test2',
Packit bd1cd8
    'DISABLED_FoobarbazTest.TestA',
Packit bd1cd8
    ]
Packit bd1cd8
Packit bd1cd8
if SUPPORTS_DEATH_TESTS:
Packit bd1cd8
  DEATH_TESTS = [
Packit bd1cd8
    'HasDeathTest.Test1',
Packit bd1cd8
    'HasDeathTest.Test2',
Packit bd1cd8
    ]
Packit bd1cd8
else:
Packit bd1cd8
  DEATH_TESTS = []
Packit bd1cd8
Packit bd1cd8
# All the non-disabled tests.
Packit bd1cd8
ACTIVE_TESTS = [
Packit bd1cd8
    'FooTest.Abc',
Packit bd1cd8
    'FooTest.Xyz',
Packit bd1cd8
Packit bd1cd8
    'BarTest.TestOne',
Packit bd1cd8
    'BarTest.TestTwo',
Packit bd1cd8
    'BarTest.TestThree',
Packit bd1cd8
Packit bd1cd8
    'BazTest.TestOne',
Packit bd1cd8
    'BazTest.TestA',
Packit bd1cd8
    'BazTest.TestB',
Packit bd1cd8
    ] + DEATH_TESTS + PARAM_TESTS
Packit bd1cd8
Packit bd1cd8
param_tests_present = None
Packit bd1cd8
Packit bd1cd8
# Utilities.
Packit bd1cd8
Packit bd1cd8
environ = os.environ.copy()
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
def SetEnvVar(env_var, value):
Packit bd1cd8
  """Sets the env variable to 'value'; unsets it when 'value' is None."""
Packit bd1cd8
Packit bd1cd8
  if value is not None:
Packit bd1cd8
    environ[env_var] = value
Packit bd1cd8
  elif env_var in environ:
Packit bd1cd8
    del environ[env_var]
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
def RunAndReturnOutput(args = None):
Packit bd1cd8
  """Runs the test program and returns its output."""
Packit bd1cd8
Packit bd1cd8
  return gtest_test_utils.Subprocess([COMMAND] + (args or []),
Packit bd1cd8
                                     env=environ).output
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
def RunAndExtractTestList(args = None):
Packit bd1cd8
  """Runs the test program and returns its exit code and a list of tests run."""
Packit bd1cd8
Packit bd1cd8
  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)
Packit bd1cd8
  tests_run = []
Packit bd1cd8
  test_case = ''
Packit bd1cd8
  test = ''
Packit bd1cd8
  for line in p.output.split('\n'):
Packit bd1cd8
    match = TEST_CASE_REGEX.match(line)
Packit bd1cd8
    if match is not None:
Packit bd1cd8
      test_case = match.group(1)
Packit bd1cd8
    else:
Packit bd1cd8
      match = TEST_REGEX.match(line)
Packit bd1cd8
      if match is not None:
Packit bd1cd8
        test = match.group(1)
Packit bd1cd8
        tests_run.append(test_case + '.' + test)
Packit bd1cd8
  return (tests_run, p.exit_code)
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
def InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
Packit bd1cd8
  """Runs the given function and arguments in a modified environment."""
Packit bd1cd8
  try:
Packit bd1cd8
    original_env = environ.copy()
Packit bd1cd8
    environ.update(extra_env)
Packit bd1cd8
    return function(*args, **kwargs)
Packit bd1cd8
  finally:
Packit bd1cd8
    environ.clear()
Packit bd1cd8
    environ.update(original_env)
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
def RunWithSharding(total_shards, shard_index, command):
Packit bd1cd8
  """Runs a test program shard and returns exit code and a list of tests run."""
Packit bd1cd8
Packit bd1cd8
  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
Packit bd1cd8
               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
Packit bd1cd8
  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
Packit bd1cd8
Packit bd1cd8
# The unit test.
Packit bd1cd8
Packit bd1cd8
Packit bd1cd8
class GTestFilterUnitTest(gtest_test_utils.TestCase):
Packit bd1cd8
  """Tests the env variable or the command line flag to filter tests."""
Packit bd1cd8
Packit bd1cd8
  # Utilities.
Packit bd1cd8
Packit bd1cd8
  def AssertSetEqual(self, lhs, rhs):
Packit bd1cd8
    """Asserts that two sets are equal."""
Packit bd1cd8
Packit bd1cd8
    for elem in lhs:
Packit bd1cd8
      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
Packit bd1cd8
Packit bd1cd8
    for elem in rhs:
Packit bd1cd8
      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
Packit bd1cd8
Packit bd1cd8
  def AssertPartitionIsValid(self, set_var, list_of_sets):
Packit bd1cd8
    """Asserts that list_of_sets is a valid partition of set_var."""
Packit bd1cd8
Packit bd1cd8
    full_partition = []
Packit bd1cd8
    for slice_var in list_of_sets:
Packit bd1cd8
      full_partition.extend(slice_var)
Packit bd1cd8
    self.assertEqual(len(set_var), len(full_partition))
Packit bd1cd8
    self.assertEqual(set(set_var), set(full_partition))
Packit bd1cd8
Packit bd1cd8
  def AdjustForParameterizedTests(self, tests_to_run):
Packit bd1cd8
    """Adjust tests_to_run in case value parameterized tests are disabled."""
Packit bd1cd8
Packit bd1cd8
    global param_tests_present
Packit bd1cd8
    if not param_tests_present:
Packit bd1cd8
      return list(set(tests_to_run) - set(PARAM_TESTS))
Packit bd1cd8
    else:
Packit bd1cd8
      return tests_to_run
Packit bd1cd8
Packit bd1cd8
  def RunAndVerify(self, gtest_filter, tests_to_run):
Packit bd1cd8
    """Checks that the binary runs correct set of tests for a given filter."""
Packit bd1cd8
Packit bd1cd8
    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
Packit bd1cd8
Packit bd1cd8
    # First, tests using the environment variable.
Packit bd1cd8
Packit bd1cd8
    # Windows removes empty variables from the environment when passing it
Packit bd1cd8
    # to a new process.  This means it is impossible to pass an empty filter
Packit bd1cd8
    # into a process using the environment variable.  However, we can still
Packit bd1cd8
    # test the case when the variable is not supplied (i.e., gtest_filter is
Packit bd1cd8
    # None).
Packit bd1cd8
    # pylint: disable-msg=C6403
Packit bd1cd8
    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
Packit bd1cd8
      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
Packit bd1cd8
      tests_run = RunAndExtractTestList()[0]
Packit bd1cd8
      SetEnvVar(FILTER_ENV_VAR, None)
Packit bd1cd8
      self.AssertSetEqual(tests_run, tests_to_run)
Packit bd1cd8
    # pylint: enable-msg=C6403
Packit bd1cd8
Packit bd1cd8
    # Next, tests using the command line flag.
Packit bd1cd8
Packit bd1cd8
    if gtest_filter is None:
Packit bd1cd8
      args = []
Packit bd1cd8
    else:
Packit bd1cd8
      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
Packit bd1cd8
Packit bd1cd8
    tests_run = RunAndExtractTestList(args)[0]
Packit bd1cd8
    self.AssertSetEqual(tests_run, tests_to_run)
Packit bd1cd8
Packit bd1cd8
  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
Packit bd1cd8
                               args=None, check_exit_0=False):
Packit bd1cd8
    """Checks that binary runs correct tests for the given filter and shard.
Packit bd1cd8
Packit bd1cd8
    Runs all shards of gtest_filter_unittest_ with the given filter, and
Packit bd1cd8
    verifies that the right set of tests were run. The union of tests run
Packit bd1cd8
    on each shard should be identical to tests_to_run, without duplicates.
Packit bd1cd8
Packit bd1cd8
    Args:
Packit bd1cd8
      gtest_filter: A filter to apply to the tests.
Packit bd1cd8
      total_shards: A total number of shards to split test run into.
Packit bd1cd8
      tests_to_run: A set of tests expected to run.
Packit bd1cd8
      args   :      Arguments to pass to the to the test binary.
Packit bd1cd8
      check_exit_0: When set to a true value, make sure that all shards
Packit bd1cd8
                    return 0.
Packit bd1cd8
    """
Packit bd1cd8
Packit bd1cd8
    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
Packit bd1cd8
Packit bd1cd8
    # Windows removes empty variables from the environment when passing it
Packit bd1cd8
    # to a new process.  This means it is impossible to pass an empty filter
Packit bd1cd8
    # into a process using the environment variable.  However, we can still
Packit bd1cd8
    # test the case when the variable is not supplied (i.e., gtest_filter is
Packit bd1cd8
    # None).
Packit bd1cd8
    # pylint: disable-msg=C6403
Packit bd1cd8
    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
Packit bd1cd8
      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
Packit bd1cd8
      partition = []
Packit bd1cd8
      for i in range(0, total_shards):
Packit bd1cd8
        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
Packit bd1cd8
        if check_exit_0:
Packit bd1cd8
          self.assertEqual(0, exit_code)
Packit bd1cd8
        partition.append(tests_run)
Packit bd1cd8
Packit bd1cd8
      self.AssertPartitionIsValid(tests_to_run, partition)
Packit bd1cd8
      SetEnvVar(FILTER_ENV_VAR, None)
Packit bd1cd8
    # pylint: enable-msg=C6403
Packit bd1cd8
Packit bd1cd8
  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
Packit bd1cd8
    """Checks that the binary runs correct set of tests for the given filter.
Packit bd1cd8
Packit bd1cd8
    Runs gtest_filter_unittest_ with the given filter, and enables
Packit bd1cd8
    disabled tests. Verifies that the right set of tests were run.
Packit bd1cd8
Packit bd1cd8
    Args:
Packit bd1cd8
      gtest_filter: A filter to apply to the tests.
Packit bd1cd8
      tests_to_run: A set of tests expected to run.
Packit bd1cd8
    """
Packit bd1cd8
Packit bd1cd8
    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
Packit bd1cd8
Packit bd1cd8
    # Construct the command line.
Packit bd1cd8
    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
Packit bd1cd8
    if gtest_filter is not None:
Packit bd1cd8
      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
Packit bd1cd8
Packit bd1cd8
    tests_run = RunAndExtractTestList(args)[0]
Packit bd1cd8
    self.AssertSetEqual(tests_run, tests_to_run)
Packit bd1cd8
Packit bd1cd8
  def setUp(self):
Packit bd1cd8
    """Sets up test case.
Packit bd1cd8
Packit bd1cd8
    Determines whether value-parameterized tests are enabled in the binary and
Packit bd1cd8
    sets the flags accordingly.
Packit bd1cd8
    """
Packit bd1cd8
Packit bd1cd8
    global param_tests_present
Packit bd1cd8
    if param_tests_present is None:
Packit bd1cd8
      param_tests_present = PARAM_TEST_REGEX.search(
Packit bd1cd8
          RunAndReturnOutput()) is not None
Packit bd1cd8
Packit bd1cd8
  def testDefaultBehavior(self):
Packit bd1cd8
    """Tests the behavior of not specifying the filter."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify(None, ACTIVE_TESTS)
Packit bd1cd8
Packit bd1cd8
  def testDefaultBehaviorWithShards(self):
Packit bd1cd8
    """Tests the behavior without the filter, with sharding enabled."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
Packit bd1cd8
    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
Packit bd1cd8
    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
Packit bd1cd8
    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
Packit bd1cd8
    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
Packit bd1cd8
Packit bd1cd8
  def testEmptyFilter(self):
Packit bd1cd8
    """Tests an empty filter."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('', [])
Packit bd1cd8
    self.RunAndVerifyWithSharding('', 1, [])
Packit bd1cd8
    self.RunAndVerifyWithSharding('', 2, [])
Packit bd1cd8
Packit bd1cd8
  def testBadFilter(self):
Packit bd1cd8
    """Tests a filter that matches nothing."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('BadFilter', [])
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('BadFilter', [])
Packit bd1cd8
Packit bd1cd8
  def testFullName(self):
Packit bd1cd8
    """Tests filtering by full name."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
Packit bd1cd8
    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
Packit bd1cd8
Packit bd1cd8
  def testUniversalFilters(self):
Packit bd1cd8
    """Tests filters that match everything."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*', ACTIVE_TESTS)
Packit bd1cd8
    self.RunAndVerify('*.*', ACTIVE_TESTS)
Packit bd1cd8
    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
Packit bd1cd8
Packit bd1cd8
  def testFilterByTestCase(self):
Packit bd1cd8
    """Tests filtering by test case name."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
Packit bd1cd8
Packit bd1cd8
    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
Packit bd1cd8
    self.RunAndVerify('BazTest.*', BAZ_TESTS)
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('BazTest.*',
Packit bd1cd8
                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
Packit bd1cd8
Packit bd1cd8
  def testFilterByTest(self):
Packit bd1cd8
    """Tests filtering by test name."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
Packit bd1cd8
Packit bd1cd8
  def testFilterDisabledTests(self):
Packit bd1cd8
    """Select only the disabled tests to run."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
Packit bd1cd8
                                      ['DISABLED_FoobarTest.Test1'])
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*DISABLED_*', [])
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*.DISABLED_*', [])
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
Packit bd1cd8
        'BarTest.DISABLED_TestFour',
Packit bd1cd8
        'BarTest.DISABLED_TestFive',
Packit bd1cd8
        'BazTest.DISABLED_TestC',
Packit bd1cd8
        'DISABLED_FoobarTest.DISABLED_Test2',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('DISABLED_*', [])
Packit bd1cd8
    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
Packit bd1cd8
        'DISABLED_FoobarTest.Test1',
Packit bd1cd8
        'DISABLED_FoobarTest.DISABLED_Test2',
Packit bd1cd8
        'DISABLED_FoobarbazTest.TestA',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
  def testWildcardInTestCaseName(self):
Packit bd1cd8
    """Tests using wildcard in the test case name."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*a*.*', [
Packit bd1cd8
        'BarTest.TestOne',
Packit bd1cd8
        'BarTest.TestTwo',
Packit bd1cd8
        'BarTest.TestThree',
Packit bd1cd8
Packit bd1cd8
        'BazTest.TestOne',
Packit bd1cd8
        'BazTest.TestA',
Packit bd1cd8
        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)
Packit bd1cd8
Packit bd1cd8
  def testWildcardInTestName(self):
Packit bd1cd8
    """Tests using wildcard in the test name."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
Packit bd1cd8
Packit bd1cd8
  def testFilterWithoutDot(self):
Packit bd1cd8
    """Tests a filter that has no '.' in it."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*z*', [
Packit bd1cd8
        'FooTest.Xyz',
Packit bd1cd8
Packit bd1cd8
        'BazTest.TestOne',
Packit bd1cd8
        'BazTest.TestA',
Packit bd1cd8
        'BazTest.TestB',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
  def testTwoPatterns(self):
Packit bd1cd8
    """Tests filters that consist of two patterns."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('Foo*.*:*A*', [
Packit bd1cd8
        'FooTest.Abc',
Packit bd1cd8
        'FooTest.Xyz',
Packit bd1cd8
Packit bd1cd8
        'BazTest.TestA',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
    # An empty pattern + a non-empty one
Packit bd1cd8
    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
Packit bd1cd8
Packit bd1cd8
  def testThreePatterns(self):
Packit bd1cd8
    """Tests filters that consist of three patterns."""
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*oo*:*A*:*One', [
Packit bd1cd8
        'FooTest.Abc',
Packit bd1cd8
        'FooTest.Xyz',
Packit bd1cd8
Packit bd1cd8
        'BarTest.TestOne',
Packit bd1cd8
Packit bd1cd8
        'BazTest.TestOne',
Packit bd1cd8
        'BazTest.TestA',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
    # The 2nd pattern is empty.
Packit bd1cd8
    self.RunAndVerify('*oo*::*One', [
Packit bd1cd8
        'FooTest.Abc',
Packit bd1cd8
        'FooTest.Xyz',
Packit bd1cd8
Packit bd1cd8
        'BarTest.TestOne',
Packit bd1cd8
Packit bd1cd8
        'BazTest.TestOne',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
    # The last 2 patterns are empty.
Packit bd1cd8
    self.RunAndVerify('*oo*::', [
Packit bd1cd8
        'FooTest.Abc',
Packit bd1cd8
        'FooTest.Xyz',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
  def testNegativeFilters(self):
Packit bd1cd8
    self.RunAndVerify('*-BazTest.TestOne', [
Packit bd1cd8
        'FooTest.Abc',
Packit bd1cd8
        'FooTest.Xyz',
Packit bd1cd8
Packit bd1cd8
        'BarTest.TestOne',
Packit bd1cd8
        'BarTest.TestTwo',
Packit bd1cd8
        'BarTest.TestThree',
Packit bd1cd8
Packit bd1cd8
        'BazTest.TestA',
Packit bd1cd8
        'BazTest.TestB',
Packit bd1cd8
        ] + DEATH_TESTS + PARAM_TESTS)
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
Packit bd1cd8
        'FooTest.Xyz',
Packit bd1cd8
Packit bd1cd8
        'BarTest.TestOne',
Packit bd1cd8
        'BarTest.TestTwo',
Packit bd1cd8
        'BarTest.TestThree',
Packit bd1cd8
        ] + DEATH_TESTS + PARAM_TESTS)
Packit bd1cd8
Packit bd1cd8
    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
Packit bd1cd8
        'BarTest.TestTwo',
Packit bd1cd8
        'BarTest.TestThree',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
    # Tests without leading '*'.
Packit bd1cd8
    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [
Packit bd1cd8
        'BarTest.TestOne',
Packit bd1cd8
        'BarTest.TestTwo',
Packit bd1cd8
        'BarTest.TestThree',
Packit bd1cd8
        ] + DEATH_TESTS + PARAM_TESTS)
Packit bd1cd8
Packit bd1cd8
    # Value parameterized tests.
Packit bd1cd8
    self.RunAndVerify('*/*', PARAM_TESTS)
Packit bd1cd8
Packit bd1cd8
    # Value parameterized tests filtering by the sequence name.
Packit bd1cd8
    self.RunAndVerify('SeqP/*', [
Packit bd1cd8
        'SeqP/ParamTest.TestX/0',
Packit bd1cd8
        'SeqP/ParamTest.TestX/1',
Packit bd1cd8
        'SeqP/ParamTest.TestY/0',
Packit bd1cd8
        'SeqP/ParamTest.TestY/1',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
    # Value parameterized tests filtering by the test name.
Packit bd1cd8
    self.RunAndVerify('*/0', [
Packit bd1cd8
        'SeqP/ParamTest.TestX/0',
Packit bd1cd8
        'SeqP/ParamTest.TestY/0',
Packit bd1cd8
        'SeqQ/ParamTest.TestX/0',
Packit bd1cd8
        'SeqQ/ParamTest.TestY/0',
Packit bd1cd8
        ])
Packit bd1cd8
Packit bd1cd8
  def testFlagOverridesEnvVar(self):
Packit bd1cd8
    """Tests that the filter flag overrides the filtering env. variable."""
Packit bd1cd8
Packit bd1cd8
    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
Packit bd1cd8
    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
Packit bd1cd8
    tests_run = RunAndExtractTestList(args)[0]
Packit bd1cd8
    SetEnvVar(FILTER_ENV_VAR, None)
Packit bd1cd8
Packit bd1cd8
    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
Packit bd1cd8
Packit bd1cd8
  def testShardStatusFileIsCreated(self):
Packit bd1cd8
    """Tests that the shard file is created if specified in the environment."""
Packit bd1cd8
Packit bd1cd8
    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
Packit bd1cd8
                                     'shard_status_file')
Packit bd1cd8
    self.assert_(not os.path.exists(shard_status_file))
Packit bd1cd8
Packit bd1cd8
    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
Packit bd1cd8
    try:
Packit bd1cd8
      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
Packit bd1cd8
    finally:
Packit bd1cd8
      self.assert_(os.path.exists(shard_status_file))
Packit bd1cd8
      os.remove(shard_status_file)
Packit bd1cd8
Packit bd1cd8
  def testShardStatusFileIsCreatedWithListTests(self):
Packit bd1cd8
    """Tests that the shard file is created with the "list_tests" flag."""
Packit bd1cd8
Packit bd1cd8
    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
Packit bd1cd8
                                     'shard_status_file2')
Packit bd1cd8
    self.assert_(not os.path.exists(shard_status_file))
Packit bd1cd8
Packit bd1cd8
    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
Packit bd1cd8
    try:
Packit bd1cd8
      output = InvokeWithModifiedEnv(extra_env,
Packit bd1cd8
                                     RunAndReturnOutput,
Packit bd1cd8
                                     [LIST_TESTS_FLAG])
Packit bd1cd8
    finally:
Packit bd1cd8
      # This assertion ensures that Google Test enumerated the tests as
Packit bd1cd8
      # opposed to running them.
Packit bd1cd8
      self.assert_('[==========]' not in output,
Packit bd1cd8
                   'Unexpected output during test enumeration.\n'
Packit bd1cd8
                   'Please ensure that LIST_TESTS_FLAG is assigned the\n'
Packit bd1cd8
                   'correct flag value for listing Google Test tests.')
Packit bd1cd8
Packit bd1cd8
      self.assert_(os.path.exists(shard_status_file))
Packit bd1cd8
      os.remove(shard_status_file)
Packit bd1cd8
Packit bd1cd8
  if SUPPORTS_DEATH_TESTS:
Packit bd1cd8
    def testShardingWorksWithDeathTests(self):
Packit bd1cd8
      """Tests integration with death tests and sharding."""
Packit bd1cd8
Packit bd1cd8
      gtest_filter = 'HasDeathTest.*:SeqP/*'
Packit bd1cd8
      expected_tests = [
Packit bd1cd8
          'HasDeathTest.Test1',
Packit bd1cd8
          'HasDeathTest.Test2',
Packit bd1cd8
Packit bd1cd8
          'SeqP/ParamTest.TestX/0',
Packit bd1cd8
          'SeqP/ParamTest.TestX/1',
Packit bd1cd8
          'SeqP/ParamTest.TestY/0',
Packit bd1cd8
          'SeqP/ParamTest.TestY/1',
Packit bd1cd8
          ]
Packit bd1cd8
Packit bd1cd8
      for flag in ['--gtest_death_test_style=threadsafe',
Packit bd1cd8
                   '--gtest_death_test_style=fast']:
Packit bd1cd8
        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
Packit bd1cd8
                                      check_exit_0=True, args=[flag])
Packit bd1cd8
        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
Packit bd1cd8
                                      check_exit_0=True, args=[flag])
Packit bd1cd8
Packit bd1cd8
if __name__ == '__main__':
Packit bd1cd8
  gtest_test_utils.Main()