1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#!/usr/bin/env python
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2005 Google Inc. All Rights Reserved.
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Unit test for Google Test test filters.
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleA user can specify which test(s) in a Google Test program to run via either
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillethe GTEST_FILTER environment variable or the --gtest_filter flag.
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleThis script tests such functionality by invoking
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillegtest_filter_unittest_ (a program written with Google Test) with different
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleenvironments and command line flags.
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleNote that test sharding may also influence which tests are filtered. Therefore,
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillewe test that here also.
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'wan@google.com (Zhanyong Wan)'
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport os
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport re
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sets
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport gtest_test_utils
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Constants.
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIS_WINDOWS = os.name == 'nt'
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The environment variable for specifying the test filters.
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFILTER_ENV_VAR = 'GTEST_FILTER'
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The environment variables for test sharding.
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The command line flag for specifying the test filters.
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleFILTER_FLAG = 'gtest_filter'
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The command line flag for including disabled tests.
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Command to run the gtest_filter_unittest_ program.
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Regex for determining whether parameterized tests are enabled in the binary.
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePARAM_TEST_REGEX = re.compile(r'/ParamTest')
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Regex for parsing test case names from Google Test's output.
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Regex for parsing test names from Google Test's output.
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Full names of all tests in gtest_filter_unittests_.
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePARAM_TESTS = [
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqP/ParamTest.TestX/0',
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqP/ParamTest.TestX/1',
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqP/ParamTest.TestY/0',
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqP/ParamTest.TestY/1',
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqQ/ParamTest.TestX/0',
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqQ/ParamTest.TestX/1',
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqQ/ParamTest.TestY/0',
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'SeqQ/ParamTest.TestY/1',
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ]
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleDISABLED_TESTS = [
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BarTest.DISABLED_TestFour',
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BarTest.DISABLED_TestFive',
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BazTest.DISABLED_TestC',
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'DISABLED_FoobarTest.Test1',
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'DISABLED_FoobarTest.DISABLED_Test2',
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'DISABLED_FoobarbazTest.TestA',
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ]
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# All the non-disabled tests.
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleACTIVE_TESTS = [
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'FooTest.Abc',
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'FooTest.Xyz',
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BarTest.TestOne',
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BarTest.TestTwo',
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BarTest.TestThree',
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BazTest.TestOne',
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BazTest.TestA',
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'BazTest.TestB',
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'HasDeathTest.Test1',
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    'HasDeathTest.Test2',
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ] + PARAM_TESTS
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleparam_tests_present = None
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Utilities.
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef SetEnvVar(env_var, value):
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Sets the env variable to 'value'; unsets it when 'value' is None."""
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if value is not None:
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    os.environ[env_var] = value
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  elif env_var in os.environ:
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    del os.environ[env_var]
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RunAndReturnOutput(args = None):
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Runs the test program and returns its output."""
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return gtest_test_utils.Subprocess([COMMAND] + (args or [])).output
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RunAndExtractTestList(args = None):
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Runs the test program and returns its exit code and a list of tests run."""
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  p = gtest_test_utils.Subprocess([COMMAND] + (args or []))
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  tests_run = []
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  test_case = ''
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  test = ''
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for line in p.output.split('\n'):
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    match = TEST_CASE_REGEX.match(line)
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if match is not None:
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      test_case = match.group(1)
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      match = TEST_REGEX.match(line)
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if match is not None:
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        test = match.group(1)
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        tests_run.append(test_case + '.' + test)
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return (tests_run, p.exit_code)
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Runs the given function and arguments in a modified environment."""
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  try:
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    original_env = os.environ.copy()
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    os.environ.update(extra_env)
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return function(*args, **kwargs)
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  finally:
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for key in extra_env.iterkeys():
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if key in original_env:
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        os.environ[key] = original_env[key]
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      else:
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        del os.environ[key]
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RunWithSharding(total_shards, shard_index, command):
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Runs a test program shard and returns exit code and a list of tests run."""
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The unit test.
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass GTestFilterUnitTest(gtest_test_utils.TestCase):
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """Tests GTEST_FILTER env variable or --gtest_filter flag to filter tests."""
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  # Utilities.
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def AssertSetEqual(self, lhs, rhs):
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Asserts that two sets are equal."""
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for elem in lhs:
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for elem in rhs:
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def AssertPartitionIsValid(self, set_var, list_of_sets):
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Asserts that list_of_sets is a valid partition of set_var."""
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    full_partition = []
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for slice_var in list_of_sets:
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      full_partition.extend(slice_var)
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(len(set_var), len(full_partition))
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def AdjustForParameterizedTests(self, tests_to_run):
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Adjust tests_to_run in case value parameterized tests are disabled."""
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    global param_tests_present
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if not param_tests_present:
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return tests_to_run
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def RunAndVerify(self, gtest_filter, tests_to_run):
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Checks that the binary runs correct set of tests for the given filter."""
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # First, tests using GTEST_FILTER.
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Windows removes empty variables from the environment when passing it
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # to a new process. This means it is impossible to pass an empty filter
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # into a process using the GTEST_FILTER environment variable. However,
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # we can still test the case when the variable is not supplied (i.e.,
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # gtest_filter is None).
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # pylint: disable-msg=C6403
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if not IS_WINDOWS or gtest_filter != '':
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      tests_run = RunAndExtractTestList()[0]
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      SetEnvVar(FILTER_ENV_VAR, None)
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.AssertSetEqual(tests_run, tests_to_run)
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # pylint: enable-msg=C6403
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Next, tests using --gtest_filter.
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if gtest_filter is None:
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      args = []
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests_run = RunAndExtractTestList(args)[0]
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.AssertSetEqual(tests_run, tests_to_run)
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               args=None, check_exit_0=False):
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Checks that binary runs correct tests for the given filter and shard.
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Runs all shards of gtest_filter_unittest_ with the given filter, and
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    verifies that the right set of tests were run. The union of tests run
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    on each shard should be identical to tests_to_run, without duplicates.
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      gtest_filter: A filter to apply to the tests.
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      total_shards: A total number of shards to split test run into.
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      tests_to_run: A set of tests expected to run.
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      args   :      Arguments to pass to the to the test binary.
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      check_exit_0: When set to a true value, make sure that all shards
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                    return 0.
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Windows removes empty variables from the environment when passing it
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # to a new process. This means it is impossible to pass an empty filter
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # into a process using the GTEST_FILTER environment variable. However,
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # we can still test the case when the variable is not supplied (i.e.,
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # gtest_filter is None).
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # pylint: disable-msg=C6403
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if not IS_WINDOWS or gtest_filter != '':
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      partition = []
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      for i in range(0, total_shards):
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if check_exit_0:
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          self.assertEqual(0, exit_code)
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        partition.append(tests_run)
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.AssertPartitionIsValid(tests_to_run, partition)
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      SetEnvVar(FILTER_ENV_VAR, None)
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # pylint: enable-msg=C6403
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Checks that the binary runs correct set of tests for the given filter.
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Runs gtest_filter_unittest_ with the given filter, and enables
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    disabled tests. Verifies that the right set of tests were run.
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Args:
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      gtest_filter: A filter to apply to the tests.
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      tests_to_run: A set of tests expected to run.
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Construct the command line.
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if gtest_filter is not None:
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests_run = RunAndExtractTestList(args)[0]
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.AssertSetEqual(tests_run, tests_to_run)
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def setUp(self):
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Sets up test case.
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Determines whether value-parameterized tests are enabled in the binary and
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    sets the flags accordingly.
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    global param_tests_present
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if param_tests_present is None:
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      param_tests_present = PARAM_TEST_REGEX.search(
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          RunAndReturnOutput()) is not None
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testDefaultBehavior(self):
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests the behavior of not specifying the filter."""
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify(None, ACTIVE_TESTS)
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testDefaultBehaviorWithShards(self):
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests the behavior without the filter, with sharding enabled."""
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testEmptyFilter(self):
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests an empty filter."""
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('', [])
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding('', 1, [])
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding('', 2, [])
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testBadFilter(self):
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests a filter that matches nothing."""
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('BadFilter', [])
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('BadFilter', [])
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testFullName(self):
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests filtering by full name."""
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testUniversalFilters(self):
349fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests filters that match everything."""
350fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
351fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*', ACTIVE_TESTS)
352fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*.*', ACTIVE_TESTS)
353fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
354fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testFilterByTestCase(self):
358fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests filtering by test case name."""
359fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
360fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
361fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
362fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
363fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('BazTest.*', BAZ_TESTS)
364fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('BazTest.*',
365fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
366fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
367fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testFilterByTest(self):
368fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests filtering by test name."""
369fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
370fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
371fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
372fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testFilterDisabledTests(self):
373fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Select only the disabled tests to run."""
374fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
375fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
376fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
377fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                      ['DISABLED_FoobarTest.Test1'])
378fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
379fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*DISABLED_*', [])
380fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
381fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
382fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*.DISABLED_*', [])
383fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
384fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.DISABLED_TestFour',
385fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.DISABLED_TestFive',
386fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.DISABLED_TestC',
387fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'DISABLED_FoobarTest.DISABLED_Test2',
388fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
389fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('DISABLED_*', [])
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
392fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'DISABLED_FoobarTest.Test1',
393fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'DISABLED_FoobarTest.DISABLED_Test2',
394fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'DISABLED_FoobarbazTest.TestA',
395fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
396fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
397fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testWildcardInTestCaseName(self):
398fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests using wildcard in the test case name."""
399fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
400fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*a*.*', [
401fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestOne',
402fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestTwo',
403fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestThree',
404fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
405fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestOne',
406fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestA',
407fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestB',
408fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
409fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'HasDeathTest.Test1',
410fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'HasDeathTest.Test2', ] + PARAM_TESTS)
411fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
412fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testWildcardInTestName(self):
413fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests using wildcard in the test name."""
414fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
415fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
416fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testFilterWithoutDot(self):
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests a filter that has no '.' in it."""
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*z*', [
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Xyz',
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestOne',
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestA',
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestB',
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testTwoPatterns(self):
429fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests filters that consist of two patterns."""
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
431fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('Foo*.*:*A*', [
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Abc',
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Xyz',
434fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
435fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestA',
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
437fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # An empty pattern + a non-empty one
439fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
440fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
441fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testThreePatterns(self):
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests filters that consist of three patterns."""
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
444fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*oo*:*A*:*One', [
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Abc',
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Xyz',
447fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
448fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestOne',
449fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestOne',
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestA',
452fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
454fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The 2nd pattern is empty.
455fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*oo*::*One', [
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Abc',
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Xyz',
458fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestOne',
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestOne',
462fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
463fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
464fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # The last 2 patterns are empty.
465fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*oo*::', [
466fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Abc',
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Xyz',
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
469fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
470fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNegativeFilters(self):
471fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*-HasDeathTest.Test1', [
472fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Abc',
473fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Xyz',
474fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestOne',
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestTwo',
477fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestThree',
478fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestOne',
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestA',
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestB',
482fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'HasDeathTest.Test2',
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ] + PARAM_TESTS)
485fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*-FooTest.Abc:HasDeathTest.*', [
487fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'FooTest.Xyz',
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestOne',
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestTwo',
491fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestThree',
492fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
493fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestOne',
494fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestA',
495fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestB',
496fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ] + PARAM_TESTS)
497fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
498fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
499fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestTwo',
500fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestThree',
501fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
502fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
503fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Tests without leading '*'.
504fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:HasDeathTest.*', [
505fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestOne',
506fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestTwo',
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BarTest.TestThree',
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestOne',
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestA',
511fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'BazTest.TestB',
512fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ] + PARAM_TESTS)
513fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
514fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Value parameterized tests.
515fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*/*', PARAM_TESTS)
516fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
517fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Value parameterized tests filtering by the sequence name.
518fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('SeqP/*', [
519fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestX/0',
520fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestX/1',
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestY/0',
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestY/1',
523fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
524fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    # Value parameterized tests filtering by the test name.
526fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.RunAndVerify('*/0', [
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestX/0',
528fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestY/0',
529fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqQ/ParamTest.TestX/0',
530fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqQ/ParamTest.TestY/0',
531fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ])
532fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
533fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testFlagOverridesEnvVar(self):
534fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests that the filter flag overrides the filtering env. variable."""
535fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
536fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
538fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests_run = RunAndExtractTestList(args)[0]
539fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    SetEnvVar(FILTER_ENV_VAR, None)
540fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
541fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
542fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testShardStatusFileIsCreated(self):
544fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests that the shard file is created if specified in the environment."""
545fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
546fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
547fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     'shard_status_file')
548fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assert_(not os.path.exists(shard_status_file))
549fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
550fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
551fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
552fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    finally:
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assert_(os.path.exists(shard_status_file))
555fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      os.remove(shard_status_file)
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
557fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testShardStatusFileIsCreatedWithListTests(self):
558fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests that the shard file is created with --gtest_list_tests."""
559fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
560fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
561fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                     'shard_status_file2')
562fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assert_(not os.path.exists(shard_status_file))
563fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
564fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
565fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
566fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      InvokeWithModifiedEnv(extra_env,
567fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            RunAndReturnOutput,
568fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            ['--gtest_list_tests'])
569fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    finally:
570fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assert_(os.path.exists(shard_status_file))
571fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      os.remove(shard_status_file)
572fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
573fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testShardingWorksWithDeathTests(self):
574fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """Tests integration with death tests and sharding."""
575fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    gtest_filter = 'HasDeathTest.*:SeqP/*'
576fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    expected_tests = [
577fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'HasDeathTest.Test1',
578fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'HasDeathTest.Test2',
579fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
580fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestX/0',
581fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestX/1',
582fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestY/0',
583fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        'SeqP/ParamTest.TestY/1',
584fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        ]
585fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    for flag in ['--gtest_death_test_style=threadsafe',
587fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                 '--gtest_death_test_style=fast']:
588fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                    check_exit_0=True, args=[flag])
590fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                    check_exit_0=True, args=[flag])
592fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
593fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__':
594fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  gtest_test_utils.Main()
595