1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#!/usr/bin/env python
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Copyright 2005 Google Inc. All Rights Reserved.
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Redistribution and use in source and binary forms, with or without
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# modification, are permitted provided that the following conditions are
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# met:
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#     * Redistributions of source code must retain the above copyright
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# notice, this list of conditions and the following disclaimer.
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#     * Redistributions in binary form must reproduce the above
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# copyright notice, this list of conditions and the following disclaimer
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# in the documentation and/or other materials provided with the
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# distribution.
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#     * Neither the name of Google Inc. nor the names of its
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# contributors may be used to endorse or promote products derived from
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# this software without specific prior written permission.
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter"""Unit test for Google Test test filters.
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterA user can specify which test(s) in a Google Test program to run via either
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterthe GTEST_FILTER environment variable or the --gtest_filter flag.
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterThis script tests such functionality by invoking
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtergtest_filter_unittest_ (a program written with Google Test) with different
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterenvironments and command line flags.
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterNote that test sharding may also influence which tests are filtered. Therefore,
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterwe test that here also.
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter"""
42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter__author__ = 'wan@google.com (Zhanyong Wan)'
44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterimport os
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterimport re
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterimport sets
4846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanimport sys
4946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterimport gtest_test_utils
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Constants.
53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
5446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# Checks if this platform can pass empty environment variables to child
5546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# processes.  We set an env variable to an empty string and invoke a python
5646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# script in a subprocess to print whether the variable is STILL in
5746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# os.environ.  We then use 'eval' to parse the child's output so that an
5846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# exception is thrown if the input is anything other than 'True' nor 'False'.
5946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanos.environ['EMPTY_VAR'] = ''
6046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanchild = gtest_test_utils.Subprocess(
6146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ'])
6246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanCAN_PASS_EMPTY_ENV = eval(child.output)
6346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
6446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
6546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# Check if this platform can unset environment variables in child processes.
6646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# We set an env variable to a non-empty string, unset it, and invoke
6746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# a python script in a subprocess to print whether the variable
6846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# is NO LONGER in os.environ.
6946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# We use 'eval' to parse the child's output so that an exception
7046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# is thrown if the input is neither 'True' nor 'False'.
7146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanos.environ['UNSET_VAR'] = 'X'
7246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chandel os.environ['UNSET_VAR']
7346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanchild = gtest_test_utils.Subprocess(
7446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ'])
7546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanCAN_UNSET_ENV = eval(child.output)
7646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
7746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
7846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# Checks if we should test with an empty filter. This doesn't
7946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# make sense on platforms that cannot pass empty env variables (Win32)
8046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# and on platforms that cannot unset variables (since we cannot tell
8146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# the difference between "" and NULL -- Borland and Solaris < 5.10)
8246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanCAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)
8346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# The environment variable for specifying the test filters.
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterFILTER_ENV_VAR = 'GTEST_FILTER'
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# The environment variables for test sharding.
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterSHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# The command line flag for specifying the test filters.
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterFILTER_FLAG = 'gtest_filter'
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# The command line flag for including disabled tests.
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Command to run the gtest_filter_unittest_ program.
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Regex for determining whether parameterized tests are enabled in the binary.
103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterPARAM_TEST_REGEX = re.compile(r'/ParamTest')
104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Regex for parsing test case names from Google Test's output.
106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Regex for parsing test names from Google Test's output.
109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
11146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# The command line flag to tell Google Test to output the list of tests it
11246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# will run.
11346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanLIST_TESTS_FLAG = '--gtest_list_tests'
11446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
11546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# Indicates whether Google Test supports death tests.
11646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanSUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(
11746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    [COMMAND, LIST_TESTS_FLAG]).output
11846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Full names of all tests in gtest_filter_unittests_.
120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterPARAM_TESTS = [
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqP/ParamTest.TestX/0',
122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqP/ParamTest.TestX/1',
123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqP/ParamTest.TestY/0',
124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqP/ParamTest.TestY/1',
125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqQ/ParamTest.TestX/0',
126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqQ/ParamTest.TestX/1',
127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqQ/ParamTest.TestY/0',
128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'SeqQ/ParamTest.TestY/1',
129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ]
130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterDISABLED_TESTS = [
132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BarTest.DISABLED_TestFour',
133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BarTest.DISABLED_TestFive',
134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BazTest.DISABLED_TestC',
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'DISABLED_FoobarTest.Test1',
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'DISABLED_FoobarTest.DISABLED_Test2',
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'DISABLED_FoobarbazTest.TestA',
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ]
139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
14046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanif SUPPORTS_DEATH_TESTS:
14146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  DEATH_TESTS = [
14246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    'HasDeathTest.Test1',
14346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    'HasDeathTest.Test2',
14446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    ]
14546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanelse:
14646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  DEATH_TESTS = []
14746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# All the non-disabled tests.
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterACTIVE_TESTS = [
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'FooTest.Abc',
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'FooTest.Xyz',
152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BarTest.TestOne',
154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BarTest.TestTwo',
155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BarTest.TestThree',
156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BazTest.TestOne',
158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BazTest.TestA',
159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    'BazTest.TestB',
16046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    ] + DEATH_TESTS + PARAM_TESTS
161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterparam_tests_present = None
163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Utilities.
165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
16646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanenviron = os.environ.copy()
16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterdef SetEnvVar(env_var, value):
170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  """Sets the env variable to 'value'; unsets it when 'value' is None."""
171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  if value is not None:
17346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    environ[env_var] = value
17446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  elif env_var in environ:
17546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    del environ[env_var]
17646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
17846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chandef RunAndReturnOutput(args = None):
17946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  """Runs the test program and returns its output."""
180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
18146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return gtest_test_utils.Subprocess([COMMAND] + (args or []),
18246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                     env=environ).output
183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
18446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
18546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chandef RunAndExtractTestList(args = None):
18646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  """Runs the test program and returns its exit code and a list of tests run."""
18746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
18846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)
189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  tests_run = []
190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  test_case = ''
191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  test = ''
19246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  for line in p.output.split('\n'):
193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    match = TEST_CASE_REGEX.match(line)
194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if match is not None:
195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      test_case = match.group(1)
196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    else:
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      match = TEST_REGEX.match(line)
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      if match is not None:
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        test = match.group(1)
20046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        tests_run.append(test_case + '.' + test)
20146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return (tests_run, p.exit_code)
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterdef InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  """Runs the given function and arguments in a modified environment."""
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  try:
20746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    original_env = environ.copy()
20846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    environ.update(extra_env)
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return function(*args, **kwargs)
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  finally:
21146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    environ.clear()
21246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    environ.update(original_env)
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterdef RunWithSharding(total_shards, shard_index, command):
216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  """Runs a test program shard and returns exit code and a list of tests run."""
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
22046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# The unit test.
223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass GTestFilterUnitTest(gtest_test_utils.TestCase):
22646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  """Tests the env variable or the command line flag to filter tests."""
227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  # Utilities.
229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def AssertSetEqual(self, lhs, rhs):
231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Asserts that two sets are equal."""
232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for elem in lhs:
234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for elem in rhs:
237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def AssertPartitionIsValid(self, set_var, list_of_sets):
240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Asserts that list_of_sets is a valid partition of set_var."""
241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    full_partition = []
243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    for slice_var in list_of_sets:
244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      full_partition.extend(slice_var)
245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.assertEqual(len(set_var), len(full_partition))
246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def AdjustForParameterizedTests(self, tests_to_run):
249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Adjust tests_to_run in case value parameterized tests are disabled."""
250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    global param_tests_present
252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if not param_tests_present:
253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    else:
255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      return tests_to_run
256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def RunAndVerify(self, gtest_filter, tests_to_run):
25846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    """Checks that the binary runs correct set of tests for a given filter."""
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
26246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # First, tests using the environment variable.
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # Windows removes empty variables from the environment when passing it
26546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # to a new process.  This means it is impossible to pass an empty filter
26646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # into a process using the environment variable.  However, we can still
26746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # test the case when the variable is not supplied (i.e., gtest_filter is
26846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # None).
269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # pylint: disable-msg=C6403
27046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
27246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      tests_run = RunAndExtractTestList()[0]
273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      SetEnvVar(FILTER_ENV_VAR, None)
274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      self.AssertSetEqual(tests_run, tests_to_run)
275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # pylint: enable-msg=C6403
276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
27746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # Next, tests using the command line flag.
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if gtest_filter is None:
28046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      args = []
281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    else:
28246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
28446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    tests_run = RunAndExtractTestList(args)[0]
285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.AssertSetEqual(tests_run, tests_to_run)
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
28846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                               args=None, check_exit_0=False):
289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Checks that binary runs correct tests for the given filter and shard.
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Runs all shards of gtest_filter_unittest_ with the given filter, and
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    verifies that the right set of tests were run. The union of tests run
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    on each shard should be identical to tests_to_run, without duplicates.
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Args:
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gtest_filter: A filter to apply to the tests.
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      total_shards: A total number of shards to split test run into.
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      tests_to_run: A set of tests expected to run.
29946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      args   :      Arguments to pass to the to the test binary.
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      check_exit_0: When set to a true value, make sure that all shards
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                    return 0.
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """
303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # Windows removes empty variables from the environment when passing it
30746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # to a new process.  This means it is impossible to pass an empty filter
30846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # into a process using the environment variable.  However, we can still
30946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # test the case when the variable is not supplied (i.e., gtest_filter is
31046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    # None).
311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # pylint: disable-msg=C6403
31246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      partition = []
315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      for i in range(0, total_shards):
31646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        if check_exit_0:
31846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          self.assertEqual(0, exit_code)
319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        partition.append(tests_run)
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      self.AssertPartitionIsValid(tests_to_run, partition)
322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      SetEnvVar(FILTER_ENV_VAR, None)
323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # pylint: enable-msg=C6403
324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Checks that the binary runs correct set of tests for the given filter.
327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Runs gtest_filter_unittest_ with the given filter, and enables
329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    disabled tests. Verifies that the right set of tests were run.
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Args:
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      gtest_filter: A filter to apply to the tests.
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      tests_to_run: A set of tests expected to run.
334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """
335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # Construct the command line.
33946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if gtest_filter is not None:
34146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
34346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    tests_run = RunAndExtractTestList(args)[0]
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.AssertSetEqual(tests_run, tests_to_run)
345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def setUp(self):
347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Sets up test case.
348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    Determines whether value-parameterized tests are enabled in the binary and
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    sets the flags accordingly.
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    global param_tests_present
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if param_tests_present is None:
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      param_tests_present = PARAM_TEST_REGEX.search(
35646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          RunAndReturnOutput()) is not None
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testDefaultBehavior(self):
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests the behavior of not specifying the filter."""
360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify(None, ACTIVE_TESTS)
362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testDefaultBehaviorWithShards(self):
364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests the behavior without the filter, with sharding enabled."""
365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testEmptyFilter(self):
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests an empty filter."""
374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('', [])
376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding('', 1, [])
377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding('', 2, [])
378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testBadFilter(self):
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests a filter that matches nothing."""
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('BadFilter', [])
383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('BadFilter', [])
384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testFullName(self):
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests filtering by full name."""
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testUniversalFilters(self):
393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests filters that match everything."""
394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*', ACTIVE_TESTS)
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*.*', ACTIVE_TESTS)
397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testFilterByTestCase(self):
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests filtering by test case name."""
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('BazTest.*', BAZ_TESTS)
408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('BazTest.*',
409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testFilterByTest(self):
412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests filtering by test name."""
413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testFilterDisabledTests(self):
417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Select only the disabled tests to run."""
418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                      ['DISABLED_FoobarTest.Test1'])
422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*DISABLED_*', [])
424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*.DISABLED_*', [])
427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.DISABLED_TestFour',
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.DISABLED_TestFive',
430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.DISABLED_TestC',
431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'DISABLED_FoobarTest.DISABLED_Test2',
432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('DISABLED_*', [])
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'DISABLED_FoobarTest.Test1',
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'DISABLED_FoobarTest.DISABLED_Test2',
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'DISABLED_FoobarbazTest.TestA',
439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testWildcardInTestCaseName(self):
442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests using wildcard in the test case name."""
443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*a*.*', [
445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestOne',
446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestTwo',
447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestThree',
448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestOne',
450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestA',
45146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)
452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testWildcardInTestName(self):
454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests using wildcard in the test name."""
455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testFilterWithoutDot(self):
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests a filter that has no '.' in it."""
460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*z*', [
462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Xyz',
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestOne',
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestA',
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestB',
467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testTwoPatterns(self):
470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests filters that consist of two patterns."""
471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('Foo*.*:*A*', [
473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Abc',
474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Xyz',
475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestA',
477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # An empty pattern + a non-empty one
480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testThreePatterns(self):
483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests filters that consist of three patterns."""
484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*oo*:*A*:*One', [
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Abc',
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Xyz',
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestOne',
490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestOne',
492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestA',
493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # The 2nd pattern is empty.
496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*oo*::*One', [
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Abc',
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Xyz',
499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestOne',
501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestOne',
503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # The last 2 patterns are empty.
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*oo*::', [
507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Abc',
508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Xyz',
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testNegativeFilters(self):
51246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.RunAndVerify('*-BazTest.TestOne', [
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Abc',
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Xyz',
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestOne',
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestTwo',
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestThree',
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestA',
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BazTest.TestB',
52246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        ] + DEATH_TESTS + PARAM_TESTS)
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
52446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'FooTest.Xyz',
526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestOne',
528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestTwo',
529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestThree',
53046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        ] + DEATH_TESTS + PARAM_TESTS)
531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestTwo',
534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestThree',
535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # Tests without leading '*'.
53846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [
539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestOne',
540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestTwo',
541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'BarTest.TestThree',
54246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        ] + DEATH_TESTS + PARAM_TESTS)
543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # Value parameterized tests.
545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*/*', PARAM_TESTS)
546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # Value parameterized tests filtering by the sequence name.
548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('SeqP/*', [
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqP/ParamTest.TestX/0',
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqP/ParamTest.TestX/1',
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqP/ParamTest.TestY/0',
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqP/ParamTest.TestY/1',
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    # Value parameterized tests filtering by the test name.
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.RunAndVerify('*/0', [
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqP/ParamTest.TestX/0',
558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqP/ParamTest.TestY/0',
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqQ/ParamTest.TestX/0',
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        'SeqQ/ParamTest.TestY/0',
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        ])
562dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testFlagOverridesEnvVar(self):
564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests that the filter flag overrides the filtering env. variable."""
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
56746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
56846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    tests_run = RunAndExtractTestList(args)[0]
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    SetEnvVar(FILTER_ENV_VAR, None)
570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testShardStatusFileIsCreated(self):
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Tests that the shard file is created if specified in the environment."""
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                     'shard_status_file')
578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.assert_(not os.path.exists(shard_status_file))
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    try:
58246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    finally:
584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      self.assert_(os.path.exists(shard_status_file))
585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      os.remove(shard_status_file)
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testShardStatusFileIsCreatedWithListTests(self):
58846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    """Tests that the shard file is created with the "list_tests" flag."""
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                     'shard_status_file2')
592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.assert_(not os.path.exists(shard_status_file))
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    try:
59646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      output = InvokeWithModifiedEnv(extra_env,
59746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                     RunAndReturnOutput,
59846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                     [LIST_TESTS_FLAG])
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    finally:
60046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      # This assertion ensures that Google Test enumerated the tests as
60146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      # opposed to running them.
60246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      self.assert_('[==========]' not in output,
60346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                   'Unexpected output during test enumeration.\n'
60446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                   'Please ensure that LIST_TESTS_FLAG is assigned the\n'
60546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                   'correct flag value for listing Google Test tests.')
60646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      self.assert_(os.path.exists(shard_status_file))
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      os.remove(shard_status_file)
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
61046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  if SUPPORTS_DEATH_TESTS:
61146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    def testShardingWorksWithDeathTests(self):
61246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      """Tests integration with death tests and sharding."""
61346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
61446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      gtest_filter = 'HasDeathTest.*:SeqP/*'
61546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      expected_tests = [
61646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          'HasDeathTest.Test1',
61746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          'HasDeathTest.Test2',
61846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
61946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          'SeqP/ParamTest.TestX/0',
62046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          'SeqP/ParamTest.TestX/1',
62146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          'SeqP/ParamTest.TestY/0',
62246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          'SeqP/ParamTest.TestY/1',
62346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan          ]
62446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
62546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      for flag in ['--gtest_death_test_style=threadsafe',
62646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                   '--gtest_death_test_style=fast']:
62746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
62846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                      check_exit_0=True, args=[flag])
62946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
63046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                      check_exit_0=True, args=[flag])
631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterif __name__ == '__main__':
633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  gtest_test_utils.Main()
634