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