1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#!/usr/bin/env python 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008, Google Inc. 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# All rights reserved. 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met: 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions of source code must retain the above copyright 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer. 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions in binary form must reproduce the above 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution. 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Neither the name of Google Inc. nor the names of its 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission. 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Tests the text output of Google C++ Testing Framework. 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSYNOPSIS 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville gtest_output_test.py --gtest_build_dir=BUILD/DIR --gengolden 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # where BUILD/DIR contains the built gtest_output_test_ file. 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville gtest_output_test.py --gengolden 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville gtest_output_test.py 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'wan@google.com (Zhanyong Wan)' 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport os 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport re 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport gtest_test_utils 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The flag for generating the golden file 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGENGOLDEN_FLAG = '--gengolden' 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleIS_WINDOWS = os.name == 'nt' 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif IS_WINDOWS: 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOLDEN_NAME = 'gtest_output_test_golden_win.txt' 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleelse: 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GOLDEN_NAME = 'gtest_output_test_golden_lin.txt' 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavillePROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_') 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# At least one command we exercise must not have the 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# --gtest_internal_skip_environment_and_ad_hoc_tests flag. 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCOMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests']) 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCOMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes']) 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCOMMAND_WITH_TIME = ({}, [PROGRAM_PATH, 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_print_time', 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_internal_skip_environment_and_ad_hoc_tests', 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_filter=FatalFailureTest.*:LoggingTest.*']) 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCOMMAND_WITH_DISABLED = ( 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville {}, [PROGRAM_PATH, 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_also_run_disabled_tests', 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_internal_skip_environment_and_ad_hoc_tests', 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_filter=*DISABLED_*']) 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCOMMAND_WITH_SHARDING = ( 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'}, 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville [PROGRAM_PATH, 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_internal_skip_environment_and_ad_hoc_tests', 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '--gtest_filter=PassingTest.*']) 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME) 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef ToUnixLineEnding(s): 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Changes all Windows/Mac line endings in s to UNIX line endings.""" 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return s.replace('\r\n', '\n').replace('\r', '\n') 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RemoveLocations(test_output): 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Removes all file location info from a Google Test program's output. 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Args: 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output: the output of a Google Test program. 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Returns: 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output with all file location info (in the form of 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'FILE_NAME:#: '. 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output) 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RemoveStackTraceDetails(output): 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Removes all stack traces from a Google Test program's output.""" 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # *? means "find the shortest string that matches". 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return re.sub(r'Stack trace:(.|\n)*?\n\n', 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'Stack trace: (omitted)\n\n', output) 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RemoveStackTraces(output): 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Removes all traces of stack traces from a Google Test program's output.""" 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # *? means "find the shortest string that matches". 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output) 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RemoveTime(output): 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Removes all time information from a Google Test program's output.""" 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return re.sub(r'\(\d+ ms', '(? ms', output) 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RemoveTestCounts(output): 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Removes test counts from a Google Test program's output.""" 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = re.sub(r'\d+ tests, listed below', 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '? tests, listed below', output) 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = re.sub(r'\d+ FAILED TESTS', 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '? FAILED TESTS', output) 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = re.sub(r'\d+ tests from \d+ test cases', 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '? tests from ? test cases', output) 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = re.sub(r'\d+ tests from ([a-zA-Z_])', 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville r'? tests from \1', output) 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return re.sub(r'\d+ tests\.', '? tests.', output) 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef RemoveMatchingTests(test_output, pattern): 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Removes output of specified tests from a Google Test program's output. 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville This function strips not only the beginning and the end of a test but also 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville all output in between. 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Args: 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output: A string containing the test output. 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pattern: A regex string that matches names of test cases or 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville tests to remove. 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Returns: 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Contents of test_output with tests whose names match pattern removed. 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output = re.sub( 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville r'.*\[ RUN \] .*%s(.|\n)*?\[( FAILED | OK )\] .*%s.*\n' % ( 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville pattern, pattern), 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville '', 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output) 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return re.sub(r'.*%s.*\n' % pattern, '', test_output) 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef NormalizeOutput(output): 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Normalizes output (the output of gtest_output_test_.exe).""" 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = ToUnixLineEnding(output) 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = RemoveLocations(output) 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = RemoveStackTraceDetails(output) 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = RemoveTime(output) 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return output 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef GetShellCommandOutput(env_cmd): 174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Runs a command in a sub-process, and returns its output in a string. 175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Args: 177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra 178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville environment variables to set, and element 1 is a string with 179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville the command and any flags. 180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Returns: 182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville A string with the command's combined standard and diagnostic output. 183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Spawns cmd in a sub-process, and gets its standard I/O file objects. 186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Set and save the environment properly. 187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville old_env_vars = dict(os.environ) 188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville os.environ.update(env_cmd[0]) 189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville p = gtest_test_utils.Subprocess(env_cmd[1]) 190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Changes made by os.environ.clear are not inheritable by child processes 192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # until Python 2.6. To produce inheritable changes we have to delete 193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # environment items with the del statement. 194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville for key in os.environ.keys(): 195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del os.environ[key] 196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville os.environ.update(old_env_vars) 197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return p.output 199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef GetCommandOutput(env_cmd): 202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Runs a command and returns its output with all file location 203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville info stripped off. 204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Args: 206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra 207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville environment variables to set, and element 1 is a string with 208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville the command and any flags. 209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # Disables exception pop-ups on Windows. 212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville os.environ['GTEST_CATCH_EXCEPTIONS'] = '1' 213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return NormalizeOutput(GetShellCommandOutput(env_cmd)) 214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef GetOutputOfAllCommands(): 217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Returns concatenated output from several representative commands.""" 218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return (GetCommandOutput(COMMAND_WITH_COLOR) + 220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetCommandOutput(COMMAND_WITH_TIME) + 221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetCommandOutput(COMMAND_WITH_DISABLED) + 222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville GetCommandOutput(COMMAND_WITH_SHARDING)) 223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilletest_list = GetShellCommandOutput(COMMAND_LIST_TESTS) 226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSUPPORTS_DEATH_TESTS = 'DeathTest' in test_list 227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSUPPORTS_TYPED_TESTS = 'TypedTest' in test_list 228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list 229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSUPPORTS_STACK_TRACES = False 230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleCAN_GENERATE_GOLDEN_FILE = SUPPORTS_DEATH_TESTS and SUPPORTS_TYPED_TESTS 232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass GTestOutputTest(gtest_test_utils.TestCase): 235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def RemoveUnsupportedTests(self, test_output): 236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if not SUPPORTS_DEATH_TESTS: 237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output = RemoveMatchingTests(test_output, 'DeathTest') 238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if not SUPPORTS_TYPED_TESTS: 239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output = RemoveMatchingTests(test_output, 'TypedTest') 240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if not SUPPORTS_THREADS: 241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output = RemoveMatchingTests(test_output, 242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'ExpectFailureWithThreadsTest') 243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output = RemoveMatchingTests(test_output, 244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'ScopedFakeTestPartResultReporterTest') 245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output = RemoveMatchingTests(test_output, 246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'WorksConcurrently') 247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if not SUPPORTS_STACK_TRACES: 248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville test_output = RemoveStackTraces(test_output) 249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return test_output 251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testOutput(self): 253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = GetOutputOfAllCommands() 254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville golden_file = open(GOLDEN_PATH, 'rb') 256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # A mis-configured source control system can cause \r appear in EOL 257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # sequences when we read the golden file irrespective of an operating 258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # system used. Therefore, we need to strip those \r's from newlines 259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # unconditionally. 260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville golden = ToUnixLineEnding(golden_file.read()) 261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville golden_file.close() 262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # We want the test to pass regardless of certain features being 264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # supported or not. 265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if CAN_GENERATE_GOLDEN_FILE: 266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assert_(golden == output) 267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville normalized_actual = RemoveTestCounts(output) 269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville normalized_golden = RemoveTestCounts(self.RemoveUnsupportedTests(golden)) 270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # This code is very handy when debugging test differences so I left it 272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # here, commented. 273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # open(os.path.join( 274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # gtest_test_utils.GetSourceDir(), 275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # '_gtest_output_test_normalized_actual.txt'), 'wb').write( 276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # normalized_actual) 277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # open(os.path.join( 278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # gtest_test_utils.GetSourceDir(), 279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # '_gtest_output_test_normalized_golden.txt'), 'wb').write( 280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # normalized_golden) 281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assert_(normalized_golden == normalized_actual) 283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__': 286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if sys.argv[1:] == [GENGOLDEN_FLAG]: 287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if CAN_GENERATE_GOLDEN_FILE: 288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville output = GetOutputOfAllCommands() 289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville golden_file = open(GOLDEN_PATH, 'wb') 290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville golden_file.write(output) 291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville golden_file.close() 292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message = ( 294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Unable to write a golden file when compiled in an environment 295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillethat does not support all the required features (death tests""") 296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if IS_WINDOWS: 297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message += ( 298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """\nand typed tests). Please check that you are using VC++ 8.0 SP1 299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleor higher as your compiler.""") 300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message += """\nand typed tests). Please generate the golden file 302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing a binary built with those features enabled.""" 303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sys.stderr.write(message) 305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville sys.exit(1) 306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville gtest_test_utils.Main() 308