1735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#!/usr/bin/env python
2735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
3735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Copyright 2005 Google Inc. All Rights Reserved.
4735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
5735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Redistribution and use in source and binary forms, with or without
6735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# modification, are permitted provided that the following conditions are
7735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# met:
8735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
9735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#     * Redistributions of source code must retain the above copyright
10735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# notice, this list of conditions and the following disclaimer.
11735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#     * Redistributions in binary form must reproduce the above
12735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# copyright notice, this list of conditions and the following disclaimer
13735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# in the documentation and/or other materials provided with the
14735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# distribution.
15735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#     * Neither the name of Google Inc. nor the names of its
16735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# contributors may be used to endorse or promote products derived from
17735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# this software without specific prior written permission.
18735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
19735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
31735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner"""Unit test for Google Test test filters.
32735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
33735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerA user can specify which test(s) in a Google Test program to run via either
34735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerthe GTEST_FILTER environment variable or the --gtest_filter flag.
35735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerThis script tests such functionality by invoking
36735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnergtest_filter_unittest_ (a program written with Google Test) with different
37735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerenvironments and command line flags.
38735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
39735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerNote that test sharding may also influence which tests are filtered. Therefore,
40735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerwe test that here also.
41735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner"""
42735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
43735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner__author__ = 'wan@google.com (Zhanyong Wan)'
44735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
45735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerimport os
46735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerimport re
47735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerimport sets
48735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerimport sys
49735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
50735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerimport gtest_test_utils
51735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
52735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Constants.
53735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
54735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Checks if this platform can pass empty environment variables to child
55735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# processes.  We set an env variable to an empty string and invoke a python
56735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# script in a subprocess to print whether the variable is STILL in
57735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# os.environ.  We then use 'eval' to parse the child's output so that an
58735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# exception is thrown if the input is anything other than 'True' nor 'False'.
59735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turneros.environ['EMPTY_VAR'] = ''
60735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerchild = gtest_test_utils.Subprocess(
61735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ'])
62735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerCAN_PASS_EMPTY_ENV = eval(child.output)
63735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
64735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
65735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Check if this platform can unset environment variables in child processes.
66735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# We set an env variable to a non-empty string, unset it, and invoke
67735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# a python script in a subprocess to print whether the variable
68735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# is NO LONGER in os.environ.
69735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# We use 'eval' to parse the child's output so that an exception
70735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# is thrown if the input is neither 'True' nor 'False'.
71735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turneros.environ['UNSET_VAR'] = 'X'
72735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerdel os.environ['UNSET_VAR']
73735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerchild = gtest_test_utils.Subprocess(
74735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ'])
75735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerCAN_UNSET_ENV = eval(child.output)
76735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
77735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
78735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Checks if we should test with an empty filter. This doesn't
79735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# make sense on platforms that cannot pass empty env variables (Win32)
80735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# and on platforms that cannot unset variables (since we cannot tell
81735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# the difference between "" and NULL -- Borland and Solaris < 5.10)
82735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerCAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)
83735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
84735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
85735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# The environment variable for specifying the test filters.
86735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerFILTER_ENV_VAR = 'GTEST_FILTER'
87735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
88735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# The environment variables for test sharding.
89735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerTOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
90735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerSHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
91735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerSHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
92735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
93735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# The command line flag for specifying the test filters.
94735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerFILTER_FLAG = 'gtest_filter'
95735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
96735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# The command line flag for including disabled tests.
97735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
98735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
99735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Command to run the gtest_filter_unittest_ program.
100735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerCOMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
101735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
102735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Regex for determining whether parameterized tests are enabled in the binary.
103735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerPARAM_TEST_REGEX = re.compile(r'/ParamTest')
104735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
105735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Regex for parsing test case names from Google Test's output.
106735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerTEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
107735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
108735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Regex for parsing test names from Google Test's output.
109735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerTEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
110735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
111735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# The command line flag to tell Google Test to output the list of tests it
112735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# will run.
113735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerLIST_TESTS_FLAG = '--gtest_list_tests'
114735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
115735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Indicates whether Google Test supports death tests.
116735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerSUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(
117735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    [COMMAND, LIST_TESTS_FLAG]).output
118735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
119735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Full names of all tests in gtest_filter_unittests_.
120735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerPARAM_TESTS = [
121735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqP/ParamTest.TestX/0',
122735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqP/ParamTest.TestX/1',
123735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqP/ParamTest.TestY/0',
124735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqP/ParamTest.TestY/1',
125735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqQ/ParamTest.TestX/0',
126735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqQ/ParamTest.TestX/1',
127735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqQ/ParamTest.TestY/0',
128735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'SeqQ/ParamTest.TestY/1',
129735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    ]
130735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
131735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerDISABLED_TESTS = [
132735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BarTest.DISABLED_TestFour',
133735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BarTest.DISABLED_TestFive',
134735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BazTest.DISABLED_TestC',
135735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'DISABLED_FoobarTest.Test1',
136735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'DISABLED_FoobarTest.DISABLED_Test2',
137735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'DISABLED_FoobarbazTest.TestA',
138735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    ]
139735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
140735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerif SUPPORTS_DEATH_TESTS:
141735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  DEATH_TESTS = [
142735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'HasDeathTest.Test1',
143735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'HasDeathTest.Test2',
144735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    ]
145735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerelse:
146735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  DEATH_TESTS = []
147735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
148735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# All the non-disabled tests.
149735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerACTIVE_TESTS = [
150735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'FooTest.Abc',
151735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'FooTest.Xyz',
152735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
153735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BarTest.TestOne',
154735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BarTest.TestTwo',
155735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BarTest.TestThree',
156735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
157735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BazTest.TestOne',
158735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BazTest.TestA',
159735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'BazTest.TestB',
160735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    ] + DEATH_TESTS + PARAM_TESTS
161735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
162735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerparam_tests_present = None
163735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
164735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Utilities.
165735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
166735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerenviron = os.environ.copy()
167735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
168735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
169735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerdef SetEnvVar(env_var, value):
170735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """Sets the env variable to 'value'; unsets it when 'value' is None."""
171735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
172735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  if value is not None:
173735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    environ[env_var] = value
174735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  elif env_var in environ:
175735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    del environ[env_var]
176735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
177735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
178735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerdef RunAndReturnOutput(args = None):
179735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """Runs the test program and returns its output."""
180735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
181735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  return gtest_test_utils.Subprocess([COMMAND] + (args or []),
182735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                     env=environ).output
183735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
184735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
185735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerdef RunAndExtractTestList(args = None):
186735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """Runs the test program and returns its exit code and a list of tests run."""
187735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
188735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)
189735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  tests_run = []
190735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  test_case = ''
191735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  test = ''
192735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  for line in p.output.split('\n'):
193735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    match = TEST_CASE_REGEX.match(line)
194735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    if match is not None:
195735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      test_case = match.group(1)
196735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    else:
197735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      match = TEST_REGEX.match(line)
198735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      if match is not None:
199735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        test = match.group(1)
200735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        tests_run.append(test_case + '.' + test)
201735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  return (tests_run, p.exit_code)
202735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
203735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
204735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerdef InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
205735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """Runs the given function and arguments in a modified environment."""
206735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  try:
207735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    original_env = environ.copy()
208735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    environ.update(extra_env)
209735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    return function(*args, **kwargs)
210735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  finally:
211735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    environ.clear()
212735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    environ.update(original_env)
213735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
214735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
215735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerdef RunWithSharding(total_shards, shard_index, command):
216735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """Runs a test program shard and returns exit code and a list of tests run."""
217735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
218735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
219735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
220735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
221735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
222735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# The unit test.
223735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
224735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
225735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerclass GTestFilterUnitTest(gtest_test_utils.TestCase):
226735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """Tests the env variable or the command line flag to filter tests."""
227735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
228735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  # Utilities.
229735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
230735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def AssertSetEqual(self, lhs, rhs):
231735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Asserts that two sets are equal."""
232735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
233735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    for elem in lhs:
234735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
235735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
236735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    for elem in rhs:
237735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
238735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
239735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def AssertPartitionIsValid(self, set_var, list_of_sets):
240735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Asserts that list_of_sets is a valid partition of set_var."""
241735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
242735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    full_partition = []
243735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    for slice_var in list_of_sets:
244735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      full_partition.extend(slice_var)
245735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assertEqual(len(set_var), len(full_partition))
246735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
247735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
248735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def AdjustForParameterizedTests(self, tests_to_run):
249735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Adjust tests_to_run in case value parameterized tests are disabled."""
250735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
251735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    global param_tests_present
252735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    if not param_tests_present:
253735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
254735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    else:
255735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      return tests_to_run
256735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
257735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def RunAndVerify(self, gtest_filter, tests_to_run):
258735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Checks that the binary runs correct set of tests for a given filter."""
259735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
260735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
261735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
262735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # First, tests using the environment variable.
263735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
264735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Windows removes empty variables from the environment when passing it
265735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # to a new process.  This means it is impossible to pass an empty filter
266735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # into a process using the environment variable.  However, we can still
267735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # test the case when the variable is not supplied (i.e., gtest_filter is
268735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # None).
269735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # pylint: disable-msg=C6403
270735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
271735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
272735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      tests_run = RunAndExtractTestList()[0]
273735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      SetEnvVar(FILTER_ENV_VAR, None)
274735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.AssertSetEqual(tests_run, tests_to_run)
275735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # pylint: enable-msg=C6403
276735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
277735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Next, tests using the command line flag.
278735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
279735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    if gtest_filter is None:
280735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      args = []
281735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    else:
282735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
283735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
284735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    tests_run = RunAndExtractTestList(args)[0]
285735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.AssertSetEqual(tests_run, tests_to_run)
286735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
287735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
288735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                               args=None, check_exit_0=False):
289735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Checks that binary runs correct tests for the given filter and shard.
290735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
291735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    Runs all shards of gtest_filter_unittest_ with the given filter, and
292735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    verifies that the right set of tests were run. The union of tests run
293735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    on each shard should be identical to tests_to_run, without duplicates.
294735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
295735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    Args:
296735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      gtest_filter: A filter to apply to the tests.
297735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      total_shards: A total number of shards to split test run into.
298735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      tests_to_run: A set of tests expected to run.
299735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      args   :      Arguments to pass to the to the test binary.
300735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      check_exit_0: When set to a true value, make sure that all shards
301735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                    return 0.
302735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """
303735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
304735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
305735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
306735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Windows removes empty variables from the environment when passing it
307735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # to a new process.  This means it is impossible to pass an empty filter
308735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # into a process using the environment variable.  However, we can still
309735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # test the case when the variable is not supplied (i.e., gtest_filter is
310735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # None).
311735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # pylint: disable-msg=C6403
312735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
313735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
314735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      partition = []
315735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      for i in range(0, total_shards):
316735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
317735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        if check_exit_0:
318735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          self.assertEqual(0, exit_code)
319735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        partition.append(tests_run)
320735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
321735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.AssertPartitionIsValid(tests_to_run, partition)
322735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      SetEnvVar(FILTER_ENV_VAR, None)
323735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # pylint: enable-msg=C6403
324735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
325735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
326735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Checks that the binary runs correct set of tests for the given filter.
327735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
328735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    Runs gtest_filter_unittest_ with the given filter, and enables
329735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    disabled tests. Verifies that the right set of tests were run.
330735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
331735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    Args:
332735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      gtest_filter: A filter to apply to the tests.
333735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      tests_to_run: A set of tests expected to run.
334735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """
335735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
336735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
337735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
338735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Construct the command line.
339735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
340735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    if gtest_filter is not None:
341735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
342735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
343735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    tests_run = RunAndExtractTestList(args)[0]
344735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.AssertSetEqual(tests_run, tests_to_run)
345735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
346735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def setUp(self):
347735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Sets up test case.
348735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
349735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    Determines whether value-parameterized tests are enabled in the binary and
350735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    sets the flags accordingly.
351735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """
352735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
353735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    global param_tests_present
354735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    if param_tests_present is None:
355735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      param_tests_present = PARAM_TEST_REGEX.search(
356735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          RunAndReturnOutput()) is not None
357735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
358735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testDefaultBehavior(self):
359735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests the behavior of not specifying the filter."""
360735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
361735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify(None, ACTIVE_TESTS)
362735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
363735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testDefaultBehaviorWithShards(self):
364735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests the behavior without the filter, with sharding enabled."""
365735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
366735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
367735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
368735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
369735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
370735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
371735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
372735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testEmptyFilter(self):
373735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests an empty filter."""
374735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
375735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('', [])
376735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding('', 1, [])
377735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding('', 2, [])
378735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
379735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testBadFilter(self):
380735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests a filter that matches nothing."""
381735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
382735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('BadFilter', [])
383735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('BadFilter', [])
384735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
385735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testFullName(self):
386735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests filtering by full name."""
387735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
388735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
389735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
390735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
391735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
392735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testUniversalFilters(self):
393735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests filters that match everything."""
394735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
395735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*', ACTIVE_TESTS)
396735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*.*', ACTIVE_TESTS)
397735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
398735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
399735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
400735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
401735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testFilterByTestCase(self):
402735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests filtering by test case name."""
403735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
404735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
405735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
406735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
407735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('BazTest.*', BAZ_TESTS)
408735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('BazTest.*',
409735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
410735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
411735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testFilterByTest(self):
412735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests filtering by test name."""
413735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
414735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
415735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
416735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testFilterDisabledTests(self):
417735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Select only the disabled tests to run."""
418735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
419735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
420735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
421735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                      ['DISABLED_FoobarTest.Test1'])
422735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
423735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*DISABLED_*', [])
424735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
425735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
426735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*.DISABLED_*', [])
427735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
428735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.DISABLED_TestFour',
429735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.DISABLED_TestFive',
430735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.DISABLED_TestC',
431735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'DISABLED_FoobarTest.DISABLED_Test2',
432735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
433735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
434735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('DISABLED_*', [])
435735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
436735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'DISABLED_FoobarTest.Test1',
437735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'DISABLED_FoobarTest.DISABLED_Test2',
438735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'DISABLED_FoobarbazTest.TestA',
439735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
440735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
441735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testWildcardInTestCaseName(self):
442735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests using wildcard in the test case name."""
443735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
444735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*a*.*', [
445735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestOne',
446735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestTwo',
447735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestThree',
448735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
449735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestOne',
450735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestA',
451735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)
452735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
453735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testWildcardInTestName(self):
454735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests using wildcard in the test name."""
455735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
456735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
457735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
458735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testFilterWithoutDot(self):
459735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests a filter that has no '.' in it."""
460735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
461735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*z*', [
462735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Xyz',
463735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
464735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestOne',
465735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestA',
466735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestB',
467735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
468735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
469735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testTwoPatterns(self):
470735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests filters that consist of two patterns."""
471735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
472735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('Foo*.*:*A*', [
473735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Abc',
474735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Xyz',
475735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
476735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestA',
477735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
478735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
479735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # An empty pattern + a non-empty one
480735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
481735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
482735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testThreePatterns(self):
483735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests filters that consist of three patterns."""
484735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
485735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*oo*:*A*:*One', [
486735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Abc',
487735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Xyz',
488735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
489735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestOne',
490735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
491735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestOne',
492735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestA',
493735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
494735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
495735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # The 2nd pattern is empty.
496735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*oo*::*One', [
497735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Abc',
498735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Xyz',
499735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
500735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestOne',
501735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
502735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestOne',
503735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
504735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
505735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # The last 2 patterns are empty.
506735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*oo*::', [
507735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Abc',
508735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Xyz',
509735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
510735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
511735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testNegativeFilters(self):
512735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*-BazTest.TestOne', [
513735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Abc',
514735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Xyz',
515735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
516735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestOne',
517735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestTwo',
518735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestThree',
519735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
520735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestA',
521735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BazTest.TestB',
522735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ] + DEATH_TESTS + PARAM_TESTS)
523735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
524735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
525735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'FooTest.Xyz',
526735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
527735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestOne',
528735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestTwo',
529735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestThree',
530735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ] + DEATH_TESTS + PARAM_TESTS)
531735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
532735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
533735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestTwo',
534735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestThree',
535735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
536735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
537735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Tests without leading '*'.
538735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [
539735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestOne',
540735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestTwo',
541735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'BarTest.TestThree',
542735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ] + DEATH_TESTS + PARAM_TESTS)
543735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
544735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Value parameterized tests.
545735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*/*', PARAM_TESTS)
546735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
547735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Value parameterized tests filtering by the sequence name.
548735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('SeqP/*', [
549735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqP/ParamTest.TestX/0',
550735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqP/ParamTest.TestX/1',
551735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqP/ParamTest.TestY/0',
552735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqP/ParamTest.TestY/1',
553735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
554735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
555735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Value parameterized tests filtering by the test name.
556735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.RunAndVerify('*/0', [
557735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqP/ParamTest.TestX/0',
558735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqP/ParamTest.TestY/0',
559735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqQ/ParamTest.TestX/0',
560735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        'SeqQ/ParamTest.TestY/0',
561735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        ])
562735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
563735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testFlagOverridesEnvVar(self):
564735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests that the filter flag overrides the filtering env. variable."""
565735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
566735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
567735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
568735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    tests_run = RunAndExtractTestList(args)[0]
569735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    SetEnvVar(FILTER_ENV_VAR, None)
570735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
571735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
572735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
573735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testShardStatusFileIsCreated(self):
574735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests that the shard file is created if specified in the environment."""
575735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
576735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
577735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                     'shard_status_file')
578735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_(not os.path.exists(shard_status_file))
579735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
580735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
581735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    try:
582735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
583735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    finally:
584735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_(os.path.exists(shard_status_file))
585735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      os.remove(shard_status_file)
586735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
587735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testShardStatusFileIsCreatedWithListTests(self):
588735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests that the shard file is created with the "list_tests" flag."""
589735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
590735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
591735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                     'shard_status_file2')
592735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_(not os.path.exists(shard_status_file))
593735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
594735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
595735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    try:
596735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      output = InvokeWithModifiedEnv(extra_env,
597735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                     RunAndReturnOutput,
598735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                     [LIST_TESTS_FLAG])
599735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    finally:
600735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      # This assertion ensures that Google Test enumerated the tests as
601735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      # opposed to running them.
602735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('[==========]' not in output,
603735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   'Unexpected output during test enumeration.\n'
604735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   'Please ensure that LIST_TESTS_FLAG is assigned the\n'
605735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   'correct flag value for listing Google Test tests.')
606735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
607735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_(os.path.exists(shard_status_file))
608735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      os.remove(shard_status_file)
609735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
610735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  if SUPPORTS_DEATH_TESTS:
611735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    def testShardingWorksWithDeathTests(self):
612735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      """Tests integration with death tests and sharding."""
613735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
614735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      gtest_filter = 'HasDeathTest.*:SeqP/*'
615735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      expected_tests = [
616735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          'HasDeathTest.Test1',
617735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          'HasDeathTest.Test2',
618735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
619735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          'SeqP/ParamTest.TestX/0',
620735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          'SeqP/ParamTest.TestX/1',
621735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          'SeqP/ParamTest.TestY/0',
622735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          'SeqP/ParamTest.TestY/1',
623735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner          ]
624735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
625735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      for flag in ['--gtest_death_test_style=threadsafe',
626735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   '--gtest_death_test_style=fast']:
627735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
628735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                      check_exit_0=True, args=[flag])
629735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
630735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                                      check_exit_0=True, args=[flag])
631735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
632735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerif __name__ == '__main__':
633735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  gtest_test_utils.Main()
634