11be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania#!/usr/bin/env python 21be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# 31be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# Copyright 2008, Google Inc. 41be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# All rights reserved. 51be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# 61be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# Redistribution and use in source and binary forms, with or without 71be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# modification, are permitted provided that the following conditions are 81be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# met: 91be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# 101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# * Redistributions of source code must retain the above copyright 111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# notice, this list of conditions and the following disclaimer. 121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# * Redistributions in binary form must reproduce the above 131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# copyright notice, this list of conditions and the following disclaimer 141be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# in the documentation and/or other materials provided with the 151be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# distribution. 161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# * Neither the name of Google Inc. nor the names of its 171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# contributors may be used to endorse or promote products derived from 181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# this software without specific prior written permission. 191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# 201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 321be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania"""Tests the text output of Google C++ Testing Framework. 331be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 341be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaSYNOPSIS 3541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot gtest_output_test.py --build_dir=BUILD/DIR --gengolden 361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania # where BUILD/DIR contains the built gtest_output_test_ file. 371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania gtest_output_test.py --gengolden 381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania gtest_output_test.py 391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania""" 401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania__author__ = 'wan@google.com (Zhanyong Wan)' 421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaimport os 441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaimport re 451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaimport sys 461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaimport gtest_test_utils 471be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 481be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 491be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# The flag for generating the golden file 501be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaGENGOLDEN_FLAG = '--gengolden' 5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotCATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS' 521be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 531be2c9def7187e4e643c00a31dd9986395795d7dNicolas CataniaIS_WINDOWS = os.name == 'nt' 541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# TODO(vladl@google.com): remove the _lin suffix. 5641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGOLDEN_NAME = 'gtest_output_test_golden_lin.txt' 571be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_') 591be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 601be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# At least one command we exercise must not have the 611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania# --gtest_internal_skip_environment_and_ad_hoc_tests flag. 6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotCOMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests']) 6341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotCOMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes']) 6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotCOMMAND_WITH_TIME = ({}, [PROGRAM_PATH, 6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_print_time', 6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_internal_skip_environment_and_ad_hoc_tests', 6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_filter=FatalFailureTest.*:LoggingTest.*']) 6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotCOMMAND_WITH_DISABLED = ( 6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot {}, [PROGRAM_PATH, 7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_also_run_disabled_tests', 7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_internal_skip_environment_and_ad_hoc_tests', 7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_filter=*DISABLED_*']) 7341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotCOMMAND_WITH_SHARDING = ( 7441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'}, 7541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot [PROGRAM_PATH, 7641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_internal_skip_environment_and_ad_hoc_tests', 7741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '--gtest_filter=PassingTest.*']) 7841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 7941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME) 801be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 821be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniadef ToUnixLineEnding(s): 831be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Changes all Windows/Mac line endings in s to UNIX line endings.""" 841be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 851be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return s.replace('\r\n', '\n').replace('\r', '\n') 861be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 8841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotdef RemoveLocations(test_output): 891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Removes all file location info from a Google Test program's output. 901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Args: 9241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output: the output of a Google Test program. 931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Returns: 951be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania output with all file location info (in the form of 961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or 971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by 981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 'FILE_NAME:#: '. 991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """ 1001be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output) 1021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotdef RemoveStackTraceDetails(output): 1051be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Removes all stack traces from a Google Test program's output.""" 1061be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania # *? means "find the shortest string that matches". 1081be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return re.sub(r'Stack trace:(.|\n)*?\n\n', 1091be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 'Stack trace: (omitted)\n\n', output) 1101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 11241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotdef RemoveStackTraces(output): 11341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """Removes all traces of stack traces from a Google Test program's output.""" 11441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 11541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # *? means "find the shortest string that matches". 11641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output) 11741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 11841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniadef RemoveTime(output): 1201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Removes all time information from a Google Test program's output.""" 1211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return re.sub(r'\(\d+ ms', '(? ms', output) 1231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 12541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotdef RemoveTypeInfoDetails(test_output): 12641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """Removes compiler-specific type info from Google Test program's output. 12741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Args: 12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output: the output of a Google Test program. 13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 13141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Returns: 13241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot output with type information normalized to canonical form. 13341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """ 13441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 13541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # some compilers output the name of type 'unsigned int' as 'unsigned' 13641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return re.sub(r'unsigned int', 'unsigned', test_output) 13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotdef NormalizeToCurrentPlatform(test_output): 14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """Normalizes platform specific output details for easier comparison.""" 14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if IS_WINDOWS: 14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # Removes the color information that is not present on Windows. 14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = re.sub('\x1b\\[(0;3\d)?m', '', test_output) 14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # Changes failure message headers into the Windows format. 14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = re.sub(r': Failure\n', r': error: ', test_output) 14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # Changes file(line_number) to file:line_number. 14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = re.sub(r'((\w|\.)+)\((\d+)\):', r'\1:\3:', test_output) 14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 15041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return test_output 15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1531be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniadef RemoveTestCounts(output): 1541be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Removes test counts from a Google Test program's output.""" 1551be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot output = re.sub(r'\d+ tests?, listed below', 15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '? tests, listed below', output) 15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot output = re.sub(r'\d+ FAILED TESTS', 15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '? FAILED TESTS', output) 16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot output = re.sub(r'\d+ tests? from \d+ test cases?', 1611be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania '? tests from ? test cases', output) 16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot output = re.sub(r'\d+ tests? from ([a-zA-Z_])', 16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot r'? tests from \1', output) 16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return re.sub(r'\d+ tests?\.', '? tests.', output) 16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 1661be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotdef RemoveMatchingTests(test_output, pattern): 16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """Removes output of specified tests from a Google Test program's output. 1691be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot This function strips not only the beginning and the end of a test but also 17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot all output in between. 1721be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Args: 17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output: A string containing the test output. 17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pattern: A regex string that matches names of test cases or 17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot tests to remove. 17741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Returns: 17941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Contents of test_output with tests whose names match pattern removed. 18041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """ 18141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = re.sub( 18341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot r'.*\[ RUN \] .*%s(.|\n)*?\[( FAILED | OK )\] .*%s.*\n' % ( 18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot pattern, pattern), 18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '', 18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output) 18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return re.sub(r'.*%s.*\n' % pattern, '', test_output) 1881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1891be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniadef NormalizeOutput(output): 1911be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Normalizes output (the output of gtest_output_test_.exe).""" 1921be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1931be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania output = ToUnixLineEnding(output) 1941be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania output = RemoveLocations(output) 19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot output = RemoveStackTraceDetails(output) 1961be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania output = RemoveTime(output) 1971be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return output 1981be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 1991be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotdef GetShellCommandOutput(env_cmd): 20141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """Runs a command in a sub-process, and returns its output in a string. 2021be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2031be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Args: 20441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra 20541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot environment variables to set, and element 1 is a string with 20641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot the command and any flags. 2071be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 20841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot Returns: 20941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot A string with the command's combined standard and diagnostic output. 2101be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """ 2111be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2121be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania # Spawns cmd in a sub-process, and gets its standard I/O file objects. 2131be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania # Set and save the environment properly. 21441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot environ = os.environ.copy() 21541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot environ.update(env_cmd[0]) 21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot p = gtest_test_utils.Subprocess(env_cmd[1], env=environ) 2171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return p.output 2191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2201be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2211be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniadef GetCommandOutput(env_cmd): 2221be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Runs a command and returns its output with all file location 2231be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania info stripped off. 2241be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2251be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania Args: 2261be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra 2271be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania environment variables to set, and element 1 is a string with 2281be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania the command and any flags. 2291be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """ 2301be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2311be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania # Disables exception pop-ups on Windows. 23241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot environ, cmdline = env_cmd 23341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot environ = dict(environ) # Ensures we are modifying a copy. 23441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1' 23541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return NormalizeOutput(GetShellCommandOutput((environ, cmdline))) 2361be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2371be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2381be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniadef GetOutputOfAllCommands(): 2391be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania """Returns concatenated output from several representative commands.""" 2401be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2411be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania return (GetCommandOutput(COMMAND_WITH_COLOR) + 2421be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GetCommandOutput(COMMAND_WITH_TIME) + 2431be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GetCommandOutput(COMMAND_WITH_DISABLED) + 2441be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania GetCommandOutput(COMMAND_WITH_SHARDING)) 2451be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 2461be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 24741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabottest_list = GetShellCommandOutput(COMMAND_LIST_TESTS) 24841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotSUPPORTS_DEATH_TESTS = 'DeathTest' in test_list 24941d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotSUPPORTS_TYPED_TESTS = 'TypedTest' in test_list 25041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotSUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list 25141d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotSUPPORTS_STACK_TRACES = False 25241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 25341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotCAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and 25441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot SUPPORTS_TYPED_TESTS and 25541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot SUPPORTS_THREADS) 25641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 25741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 25841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass GTestOutputTest(gtest_test_utils.TestCase): 25941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot def RemoveUnsupportedTests(self, test_output): 26041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if not SUPPORTS_DEATH_TESTS: 26141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveMatchingTests(test_output, 'DeathTest') 26241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if not SUPPORTS_TYPED_TESTS: 26341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveMatchingTests(test_output, 'TypedTest') 26441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveMatchingTests(test_output, 'TypedDeathTest') 26541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest') 26641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if not SUPPORTS_THREADS: 26741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveMatchingTests(test_output, 26841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 'ExpectFailureWithThreadsTest') 26941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveMatchingTests(test_output, 27041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 'ScopedFakeTestPartResultReporterTest') 27141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveMatchingTests(test_output, 27241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 'WorksConcurrently') 27341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if not SUPPORTS_STACK_TRACES: 27441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot test_output = RemoveStackTraces(test_output) 27541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 27641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot return test_output 27741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 2781be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania def testOutput(self): 2791be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania output = GetOutputOfAllCommands() 28041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 2811be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania golden_file = open(GOLDEN_PATH, 'rb') 28241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # A mis-configured source control system can cause \r appear in EOL 28341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # sequences when we read the golden file irrespective of an operating 28441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # system used. Therefore, we need to strip those \r's from newlines 28541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # unconditionally. 28641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot golden = ToUnixLineEnding(golden_file.read()) 2871be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania golden_file.close() 2881be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 28941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # We want the test to pass regardless of certain features being 2901be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania # supported or not. 29141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 29241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # We still have to remove type name specifics in all cases. 29341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot normalized_actual = RemoveTypeInfoDetails(output) 29441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot normalized_golden = RemoveTypeInfoDetails(golden) 29541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 29641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if CAN_GENERATE_GOLDEN_FILE: 29741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot self.assertEqual(normalized_golden, normalized_actual) 29841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot else: 29941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot normalized_actual = NormalizeToCurrentPlatform( 30041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot RemoveTestCounts(normalized_actual)) 30141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot normalized_golden = NormalizeToCurrentPlatform( 30241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot RemoveTestCounts(self.RemoveUnsupportedTests(normalized_golden))) 30341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 30441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot # This code is very handy when debugging golden file differences: 30541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if os.getenv('DEBUG_GTEST_OUTPUT_TEST'): 30641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot open(os.path.join( 30741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot gtest_test_utils.GetSourceDir(), 30841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '_gtest_output_test_normalized_actual.txt'), 'wb').write( 30941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot normalized_actual) 31041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot open(os.path.join( 31141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot gtest_test_utils.GetSourceDir(), 31241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot '_gtest_output_test_normalized_golden.txt'), 'wb').write( 31341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot normalized_golden) 31441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 31541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot self.assertEqual(normalized_golden, normalized_actual) 3161be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3171be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania 3181be2c9def7187e4e643c00a31dd9986395795d7dNicolas Cataniaif __name__ == '__main__': 3191be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania if sys.argv[1:] == [GENGOLDEN_FLAG]: 32041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot if CAN_GENERATE_GOLDEN_FILE: 32141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot output = GetOutputOfAllCommands() 32241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot golden_file = open(GOLDEN_PATH, 'wb') 32341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot golden_file.write(output) 32441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot golden_file.close() 32541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot else: 32641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot message = ( 32741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot """Unable to write a golden file when compiled in an environment 32841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotthat does not support all the required features (death tests, typed tests, 32941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotand multiple threads). Please generate the golden file using a binary built 33041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotwith those features enabled.""") 33141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot 33241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot sys.stderr.write(message) 33341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot sys.exit(1) 3341be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania else: 3351be2c9def7187e4e643c00a31dd9986395795d7dNicolas Catania gtest_test_utils.Main() 336