113481Sgiacomo.travaglini@arm.com#!/usr/bin/env python 213481Sgiacomo.travaglini@arm.com# 313481Sgiacomo.travaglini@arm.com# Copyright 2008, Google Inc. 413481Sgiacomo.travaglini@arm.com# All rights reserved. 513481Sgiacomo.travaglini@arm.com# 613481Sgiacomo.travaglini@arm.com# Redistribution and use in source and binary forms, with or without 713481Sgiacomo.travaglini@arm.com# modification, are permitted provided that the following conditions are 813481Sgiacomo.travaglini@arm.com# met: 913481Sgiacomo.travaglini@arm.com# 1013481Sgiacomo.travaglini@arm.com# * Redistributions of source code must retain the above copyright 1113481Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer. 1213481Sgiacomo.travaglini@arm.com# * Redistributions in binary form must reproduce the above 1313481Sgiacomo.travaglini@arm.com# copyright notice, this list of conditions and the following disclaimer 1413481Sgiacomo.travaglini@arm.com# in the documentation and/or other materials provided with the 1513481Sgiacomo.travaglini@arm.com# distribution. 1613481Sgiacomo.travaglini@arm.com# * Neither the name of Google Inc. nor the names of its 1713481Sgiacomo.travaglini@arm.com# contributors may be used to endorse or promote products derived from 1813481Sgiacomo.travaglini@arm.com# this software without specific prior written permission. 1913481Sgiacomo.travaglini@arm.com# 2013481Sgiacomo.travaglini@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2113481Sgiacomo.travaglini@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2213481Sgiacomo.travaglini@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2313481Sgiacomo.travaglini@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2413481Sgiacomo.travaglini@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2513481Sgiacomo.travaglini@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2613481Sgiacomo.travaglini@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2713481Sgiacomo.travaglini@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2813481Sgiacomo.travaglini@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2913481Sgiacomo.travaglini@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3013481Sgiacomo.travaglini@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3113481Sgiacomo.travaglini@arm.com 3213481Sgiacomo.travaglini@arm.com"""Tests the text output of Google C++ Testing Framework. 3313481Sgiacomo.travaglini@arm.com 3413481Sgiacomo.travaglini@arm.comSYNOPSIS 3513481Sgiacomo.travaglini@arm.com gtest_output_test.py --build_dir=BUILD/DIR --gengolden 3613481Sgiacomo.travaglini@arm.com # where BUILD/DIR contains the built gtest_output_test_ file. 3713481Sgiacomo.travaglini@arm.com gtest_output_test.py --gengolden 3813481Sgiacomo.travaglini@arm.com gtest_output_test.py 3913481Sgiacomo.travaglini@arm.com""" 4013481Sgiacomo.travaglini@arm.com 4113481Sgiacomo.travaglini@arm.com__author__ = 'wan@google.com (Zhanyong Wan)' 4213481Sgiacomo.travaglini@arm.com 4313481Sgiacomo.travaglini@arm.comimport difflib 4413481Sgiacomo.travaglini@arm.comimport os 4513481Sgiacomo.travaglini@arm.comimport re 4613481Sgiacomo.travaglini@arm.comimport sys 4713481Sgiacomo.travaglini@arm.comimport gtest_test_utils 4813481Sgiacomo.travaglini@arm.com 4913481Sgiacomo.travaglini@arm.com 5013481Sgiacomo.travaglini@arm.com# The flag for generating the golden file 5113481Sgiacomo.travaglini@arm.comGENGOLDEN_FLAG = '--gengolden' 5213481Sgiacomo.travaglini@arm.comCATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS' 5313481Sgiacomo.travaglini@arm.com 5413481Sgiacomo.travaglini@arm.comIS_WINDOWS = os.name == 'nt' 5513481Sgiacomo.travaglini@arm.com 5613481Sgiacomo.travaglini@arm.com# TODO(vladl@google.com): remove the _lin suffix. 5713481Sgiacomo.travaglini@arm.comGOLDEN_NAME = 'gtest_output_test_golden_lin.txt' 5813481Sgiacomo.travaglini@arm.com 5913481Sgiacomo.travaglini@arm.comPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_') 6013481Sgiacomo.travaglini@arm.com 6113481Sgiacomo.travaglini@arm.com# At least one command we exercise must not have the 6213481Sgiacomo.travaglini@arm.com# 'internal_skip_environment_and_ad_hoc_tests' argument. 6313481Sgiacomo.travaglini@arm.comCOMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests']) 6413481Sgiacomo.travaglini@arm.comCOMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes']) 6513481Sgiacomo.travaglini@arm.comCOMMAND_WITH_TIME = ({}, [PROGRAM_PATH, 6613481Sgiacomo.travaglini@arm.com '--gtest_print_time', 6713481Sgiacomo.travaglini@arm.com 'internal_skip_environment_and_ad_hoc_tests', 6813481Sgiacomo.travaglini@arm.com '--gtest_filter=FatalFailureTest.*:LoggingTest.*']) 6913481Sgiacomo.travaglini@arm.comCOMMAND_WITH_DISABLED = ( 7013481Sgiacomo.travaglini@arm.com {}, [PROGRAM_PATH, 7113481Sgiacomo.travaglini@arm.com '--gtest_also_run_disabled_tests', 7213481Sgiacomo.travaglini@arm.com 'internal_skip_environment_and_ad_hoc_tests', 7313481Sgiacomo.travaglini@arm.com '--gtest_filter=*DISABLED_*']) 7413481Sgiacomo.travaglini@arm.comCOMMAND_WITH_SHARDING = ( 7513481Sgiacomo.travaglini@arm.com {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'}, 7613481Sgiacomo.travaglini@arm.com [PROGRAM_PATH, 7713481Sgiacomo.travaglini@arm.com 'internal_skip_environment_and_ad_hoc_tests', 7813481Sgiacomo.travaglini@arm.com '--gtest_filter=PassingTest.*']) 7913481Sgiacomo.travaglini@arm.com 8013481Sgiacomo.travaglini@arm.comGOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME) 8113481Sgiacomo.travaglini@arm.com 8213481Sgiacomo.travaglini@arm.com 8313481Sgiacomo.travaglini@arm.comdef ToUnixLineEnding(s): 8413481Sgiacomo.travaglini@arm.com """Changes all Windows/Mac line endings in s to UNIX line endings.""" 8513481Sgiacomo.travaglini@arm.com 8613481Sgiacomo.travaglini@arm.com return s.replace('\r\n', '\n').replace('\r', '\n') 8713481Sgiacomo.travaglini@arm.com 8813481Sgiacomo.travaglini@arm.com 8913481Sgiacomo.travaglini@arm.comdef RemoveLocations(test_output): 9013481Sgiacomo.travaglini@arm.com """Removes all file location info from a Google Test program's output. 9113481Sgiacomo.travaglini@arm.com 9213481Sgiacomo.travaglini@arm.com Args: 9313481Sgiacomo.travaglini@arm.com test_output: the output of a Google Test program. 9413481Sgiacomo.travaglini@arm.com 9513481Sgiacomo.travaglini@arm.com Returns: 9613481Sgiacomo.travaglini@arm.com output with all file location info (in the form of 9713481Sgiacomo.travaglini@arm.com 'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or 9813481Sgiacomo.travaglini@arm.com 'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by 9913481Sgiacomo.travaglini@arm.com 'FILE_NAME:#: '. 10013481Sgiacomo.travaglini@arm.com """ 10113481Sgiacomo.travaglini@arm.com 10213481Sgiacomo.travaglini@arm.com return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output) 10313481Sgiacomo.travaglini@arm.com 10413481Sgiacomo.travaglini@arm.com 10513481Sgiacomo.travaglini@arm.comdef RemoveStackTraceDetails(output): 10613481Sgiacomo.travaglini@arm.com """Removes all stack traces from a Google Test program's output.""" 10713481Sgiacomo.travaglini@arm.com 10813481Sgiacomo.travaglini@arm.com # *? means "find the shortest string that matches". 10913481Sgiacomo.travaglini@arm.com return re.sub(r'Stack trace:(.|\n)*?\n\n', 11013481Sgiacomo.travaglini@arm.com 'Stack trace: (omitted)\n\n', output) 11113481Sgiacomo.travaglini@arm.com 11213481Sgiacomo.travaglini@arm.com 11313481Sgiacomo.travaglini@arm.comdef RemoveStackTraces(output): 11413481Sgiacomo.travaglini@arm.com """Removes all traces of stack traces from a Google Test program's output.""" 11513481Sgiacomo.travaglini@arm.com 11613481Sgiacomo.travaglini@arm.com # *? means "find the shortest string that matches". 11713481Sgiacomo.travaglini@arm.com return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output) 11813481Sgiacomo.travaglini@arm.com 11913481Sgiacomo.travaglini@arm.com 12013481Sgiacomo.travaglini@arm.comdef RemoveTime(output): 12113481Sgiacomo.travaglini@arm.com """Removes all time information from a Google Test program's output.""" 12213481Sgiacomo.travaglini@arm.com 12313481Sgiacomo.travaglini@arm.com return re.sub(r'\(\d+ ms', '(? ms', output) 12413481Sgiacomo.travaglini@arm.com 12513481Sgiacomo.travaglini@arm.com 12613481Sgiacomo.travaglini@arm.comdef RemoveTypeInfoDetails(test_output): 12713481Sgiacomo.travaglini@arm.com """Removes compiler-specific type info from Google Test program's output. 12813481Sgiacomo.travaglini@arm.com 12913481Sgiacomo.travaglini@arm.com Args: 13013481Sgiacomo.travaglini@arm.com test_output: the output of a Google Test program. 13113481Sgiacomo.travaglini@arm.com 13213481Sgiacomo.travaglini@arm.com Returns: 13313481Sgiacomo.travaglini@arm.com output with type information normalized to canonical form. 13413481Sgiacomo.travaglini@arm.com """ 13513481Sgiacomo.travaglini@arm.com 13613481Sgiacomo.travaglini@arm.com # some compilers output the name of type 'unsigned int' as 'unsigned' 13713481Sgiacomo.travaglini@arm.com return re.sub(r'unsigned int', 'unsigned', test_output) 13813481Sgiacomo.travaglini@arm.com 13913481Sgiacomo.travaglini@arm.com 14013481Sgiacomo.travaglini@arm.comdef NormalizeToCurrentPlatform(test_output): 14113481Sgiacomo.travaglini@arm.com """Normalizes platform specific output details for easier comparison.""" 14213481Sgiacomo.travaglini@arm.com 14313481Sgiacomo.travaglini@arm.com if IS_WINDOWS: 14413481Sgiacomo.travaglini@arm.com # Removes the color information that is not present on Windows. 14513481Sgiacomo.travaglini@arm.com test_output = re.sub('\x1b\\[(0;3\d)?m', '', test_output) 14613481Sgiacomo.travaglini@arm.com # Changes failure message headers into the Windows format. 14713481Sgiacomo.travaglini@arm.com test_output = re.sub(r': Failure\n', r': error: ', test_output) 14813481Sgiacomo.travaglini@arm.com # Changes file(line_number) to file:line_number. 14913481Sgiacomo.travaglini@arm.com test_output = re.sub(r'((\w|\.)+)\((\d+)\):', r'\1:\3:', test_output) 15013481Sgiacomo.travaglini@arm.com 15113481Sgiacomo.travaglini@arm.com return test_output 15213481Sgiacomo.travaglini@arm.com 15313481Sgiacomo.travaglini@arm.com 15413481Sgiacomo.travaglini@arm.comdef RemoveTestCounts(output): 15513481Sgiacomo.travaglini@arm.com """Removes test counts from a Google Test program's output.""" 15613481Sgiacomo.travaglini@arm.com 15713481Sgiacomo.travaglini@arm.com output = re.sub(r'\d+ tests?, listed below', 15813481Sgiacomo.travaglini@arm.com '? tests, listed below', output) 15913481Sgiacomo.travaglini@arm.com output = re.sub(r'\d+ FAILED TESTS', 16013481Sgiacomo.travaglini@arm.com '? FAILED TESTS', output) 16113481Sgiacomo.travaglini@arm.com output = re.sub(r'\d+ tests? from \d+ test cases?', 16213481Sgiacomo.travaglini@arm.com '? tests from ? test cases', output) 16313481Sgiacomo.travaglini@arm.com output = re.sub(r'\d+ tests? from ([a-zA-Z_])', 16413481Sgiacomo.travaglini@arm.com r'? tests from \1', output) 16513481Sgiacomo.travaglini@arm.com return re.sub(r'\d+ tests?\.', '? tests.', output) 16613481Sgiacomo.travaglini@arm.com 16713481Sgiacomo.travaglini@arm.com 16813481Sgiacomo.travaglini@arm.comdef RemoveMatchingTests(test_output, pattern): 16913481Sgiacomo.travaglini@arm.com """Removes output of specified tests from a Google Test program's output. 17013481Sgiacomo.travaglini@arm.com 17113481Sgiacomo.travaglini@arm.com This function strips not only the beginning and the end of a test but also 17213481Sgiacomo.travaglini@arm.com all output in between. 17313481Sgiacomo.travaglini@arm.com 17413481Sgiacomo.travaglini@arm.com Args: 17513481Sgiacomo.travaglini@arm.com test_output: A string containing the test output. 17613481Sgiacomo.travaglini@arm.com pattern: A regex string that matches names of test cases or 17713481Sgiacomo.travaglini@arm.com tests to remove. 17813481Sgiacomo.travaglini@arm.com 17913481Sgiacomo.travaglini@arm.com Returns: 18013481Sgiacomo.travaglini@arm.com Contents of test_output with tests whose names match pattern removed. 18113481Sgiacomo.travaglini@arm.com """ 18213481Sgiacomo.travaglini@arm.com 18313481Sgiacomo.travaglini@arm.com test_output = re.sub( 18413481Sgiacomo.travaglini@arm.com r'.*\[ RUN \] .*%s(.|\n)*?\[( FAILED | OK )\] .*%s.*\n' % ( 18513481Sgiacomo.travaglini@arm.com pattern, pattern), 18613481Sgiacomo.travaglini@arm.com '', 18713481Sgiacomo.travaglini@arm.com test_output) 18813481Sgiacomo.travaglini@arm.com return re.sub(r'.*%s.*\n' % pattern, '', test_output) 18913481Sgiacomo.travaglini@arm.com 19013481Sgiacomo.travaglini@arm.com 19113481Sgiacomo.travaglini@arm.comdef NormalizeOutput(output): 19213481Sgiacomo.travaglini@arm.com """Normalizes output (the output of gtest_output_test_.exe).""" 19313481Sgiacomo.travaglini@arm.com 19413481Sgiacomo.travaglini@arm.com output = ToUnixLineEnding(output) 19513481Sgiacomo.travaglini@arm.com output = RemoveLocations(output) 19613481Sgiacomo.travaglini@arm.com output = RemoveStackTraceDetails(output) 19713481Sgiacomo.travaglini@arm.com output = RemoveTime(output) 19813481Sgiacomo.travaglini@arm.com return output 19913481Sgiacomo.travaglini@arm.com 20013481Sgiacomo.travaglini@arm.com 20113481Sgiacomo.travaglini@arm.comdef GetShellCommandOutput(env_cmd): 20213481Sgiacomo.travaglini@arm.com """Runs a command in a sub-process, and returns its output in a string. 20313481Sgiacomo.travaglini@arm.com 20413481Sgiacomo.travaglini@arm.com Args: 20513481Sgiacomo.travaglini@arm.com env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra 20613481Sgiacomo.travaglini@arm.com environment variables to set, and element 1 is a string with 20713481Sgiacomo.travaglini@arm.com the command and any flags. 20813481Sgiacomo.travaglini@arm.com 20913481Sgiacomo.travaglini@arm.com Returns: 21013481Sgiacomo.travaglini@arm.com A string with the command's combined standard and diagnostic output. 21113481Sgiacomo.travaglini@arm.com """ 21213481Sgiacomo.travaglini@arm.com 21313481Sgiacomo.travaglini@arm.com # Spawns cmd in a sub-process, and gets its standard I/O file objects. 21413481Sgiacomo.travaglini@arm.com # Set and save the environment properly. 21513481Sgiacomo.travaglini@arm.com environ = os.environ.copy() 21613481Sgiacomo.travaglini@arm.com environ.update(env_cmd[0]) 21713481Sgiacomo.travaglini@arm.com p = gtest_test_utils.Subprocess(env_cmd[1], env=environ) 21813481Sgiacomo.travaglini@arm.com 21913481Sgiacomo.travaglini@arm.com return p.output 22013481Sgiacomo.travaglini@arm.com 22113481Sgiacomo.travaglini@arm.com 22213481Sgiacomo.travaglini@arm.comdef GetCommandOutput(env_cmd): 22313481Sgiacomo.travaglini@arm.com """Runs a command and returns its output with all file location 22413481Sgiacomo.travaglini@arm.com info stripped off. 22513481Sgiacomo.travaglini@arm.com 22613481Sgiacomo.travaglini@arm.com Args: 22713481Sgiacomo.travaglini@arm.com env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra 22813481Sgiacomo.travaglini@arm.com environment variables to set, and element 1 is a string with 22913481Sgiacomo.travaglini@arm.com the command and any flags. 23013481Sgiacomo.travaglini@arm.com """ 23113481Sgiacomo.travaglini@arm.com 23213481Sgiacomo.travaglini@arm.com # Disables exception pop-ups on Windows. 23313481Sgiacomo.travaglini@arm.com environ, cmdline = env_cmd 23413481Sgiacomo.travaglini@arm.com environ = dict(environ) # Ensures we are modifying a copy. 23513481Sgiacomo.travaglini@arm.com environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1' 23613481Sgiacomo.travaglini@arm.com return NormalizeOutput(GetShellCommandOutput((environ, cmdline))) 23713481Sgiacomo.travaglini@arm.com 23813481Sgiacomo.travaglini@arm.com 23913481Sgiacomo.travaglini@arm.comdef GetOutputOfAllCommands(): 24013481Sgiacomo.travaglini@arm.com """Returns concatenated output from several representative commands.""" 24113481Sgiacomo.travaglini@arm.com 24213481Sgiacomo.travaglini@arm.com return (GetCommandOutput(COMMAND_WITH_COLOR) + 24313481Sgiacomo.travaglini@arm.com GetCommandOutput(COMMAND_WITH_TIME) + 24413481Sgiacomo.travaglini@arm.com GetCommandOutput(COMMAND_WITH_DISABLED) + 24513481Sgiacomo.travaglini@arm.com GetCommandOutput(COMMAND_WITH_SHARDING)) 24613481Sgiacomo.travaglini@arm.com 24713481Sgiacomo.travaglini@arm.com 24813481Sgiacomo.travaglini@arm.comtest_list = GetShellCommandOutput(COMMAND_LIST_TESTS) 24913481Sgiacomo.travaglini@arm.comSUPPORTS_DEATH_TESTS = 'DeathTest' in test_list 25013481Sgiacomo.travaglini@arm.comSUPPORTS_TYPED_TESTS = 'TypedTest' in test_list 25113481Sgiacomo.travaglini@arm.comSUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list 25213481Sgiacomo.travaglini@arm.comSUPPORTS_STACK_TRACES = False 25313481Sgiacomo.travaglini@arm.com 25413481Sgiacomo.travaglini@arm.comCAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and 25513481Sgiacomo.travaglini@arm.com SUPPORTS_TYPED_TESTS and 25613481Sgiacomo.travaglini@arm.com SUPPORTS_THREADS and 25713481Sgiacomo.travaglini@arm.com not IS_WINDOWS) 25813481Sgiacomo.travaglini@arm.com 25913481Sgiacomo.travaglini@arm.comclass GTestOutputTest(gtest_test_utils.TestCase): 26013481Sgiacomo.travaglini@arm.com def RemoveUnsupportedTests(self, test_output): 26113481Sgiacomo.travaglini@arm.com if not SUPPORTS_DEATH_TESTS: 26213481Sgiacomo.travaglini@arm.com test_output = RemoveMatchingTests(test_output, 'DeathTest') 26313481Sgiacomo.travaglini@arm.com if not SUPPORTS_TYPED_TESTS: 26413481Sgiacomo.travaglini@arm.com test_output = RemoveMatchingTests(test_output, 'TypedTest') 26513481Sgiacomo.travaglini@arm.com test_output = RemoveMatchingTests(test_output, 'TypedDeathTest') 26613481Sgiacomo.travaglini@arm.com test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest') 26713481Sgiacomo.travaglini@arm.com if not SUPPORTS_THREADS: 26813481Sgiacomo.travaglini@arm.com test_output = RemoveMatchingTests(test_output, 26913481Sgiacomo.travaglini@arm.com 'ExpectFailureWithThreadsTest') 27013481Sgiacomo.travaglini@arm.com test_output = RemoveMatchingTests(test_output, 27113481Sgiacomo.travaglini@arm.com 'ScopedFakeTestPartResultReporterTest') 27213481Sgiacomo.travaglini@arm.com test_output = RemoveMatchingTests(test_output, 27313481Sgiacomo.travaglini@arm.com 'WorksConcurrently') 27413481Sgiacomo.travaglini@arm.com if not SUPPORTS_STACK_TRACES: 27513481Sgiacomo.travaglini@arm.com test_output = RemoveStackTraces(test_output) 27613481Sgiacomo.travaglini@arm.com 27713481Sgiacomo.travaglini@arm.com return test_output 27813481Sgiacomo.travaglini@arm.com 27913481Sgiacomo.travaglini@arm.com def testOutput(self): 28013481Sgiacomo.travaglini@arm.com output = GetOutputOfAllCommands() 28113481Sgiacomo.travaglini@arm.com 28213481Sgiacomo.travaglini@arm.com golden_file = open(GOLDEN_PATH, 'r') 28313481Sgiacomo.travaglini@arm.com # A mis-configured source control system can cause \r appear in EOL 28413481Sgiacomo.travaglini@arm.com # sequences when we read the golden file irrespective of an operating 28513481Sgiacomo.travaglini@arm.com # system used. Therefore, we need to strip those \r's from newlines 28613481Sgiacomo.travaglini@arm.com # unconditionally. 28713481Sgiacomo.travaglini@arm.com golden = ToUnixLineEnding(golden_file.read()) 28813481Sgiacomo.travaglini@arm.com golden_file.close() 28913481Sgiacomo.travaglini@arm.com 29013481Sgiacomo.travaglini@arm.com # We want the test to pass regardless of certain features being 29113481Sgiacomo.travaglini@arm.com # supported or not. 29213481Sgiacomo.travaglini@arm.com 29313481Sgiacomo.travaglini@arm.com # We still have to remove type name specifics in all cases. 29413481Sgiacomo.travaglini@arm.com normalized_actual = RemoveTypeInfoDetails(output) 29513481Sgiacomo.travaglini@arm.com normalized_golden = RemoveTypeInfoDetails(golden) 29613481Sgiacomo.travaglini@arm.com 29713481Sgiacomo.travaglini@arm.com if CAN_GENERATE_GOLDEN_FILE: 29813481Sgiacomo.travaglini@arm.com self.assertEqual(normalized_golden, normalized_actual, 29913481Sgiacomo.travaglini@arm.com '\n'.join(difflib.unified_diff( 30013481Sgiacomo.travaglini@arm.com normalized_golden.split('\n'), 30113481Sgiacomo.travaglini@arm.com normalized_actual.split('\n'), 30213481Sgiacomo.travaglini@arm.com 'golden', 'actual'))) 30313481Sgiacomo.travaglini@arm.com else: 30413481Sgiacomo.travaglini@arm.com normalized_actual = NormalizeToCurrentPlatform( 30513481Sgiacomo.travaglini@arm.com RemoveTestCounts(normalized_actual)) 30613481Sgiacomo.travaglini@arm.com normalized_golden = NormalizeToCurrentPlatform( 30713481Sgiacomo.travaglini@arm.com RemoveTestCounts(self.RemoveUnsupportedTests(normalized_golden))) 30813481Sgiacomo.travaglini@arm.com 30913481Sgiacomo.travaglini@arm.com # This code is very handy when debugging golden file differences: 31013481Sgiacomo.travaglini@arm.com if os.getenv('DEBUG_GTEST_OUTPUT_TEST'): 31113481Sgiacomo.travaglini@arm.com open(os.path.join( 31213481Sgiacomo.travaglini@arm.com gtest_test_utils.GetSourceDir(), 31313481Sgiacomo.travaglini@arm.com '_gtest_output_test_normalized_actual.txt'), 'wb').write( 31413481Sgiacomo.travaglini@arm.com normalized_actual) 31513481Sgiacomo.travaglini@arm.com open(os.path.join( 31613481Sgiacomo.travaglini@arm.com gtest_test_utils.GetSourceDir(), 31713481Sgiacomo.travaglini@arm.com '_gtest_output_test_normalized_golden.txt'), 'wb').write( 31813481Sgiacomo.travaglini@arm.com normalized_golden) 31913481Sgiacomo.travaglini@arm.com 32013481Sgiacomo.travaglini@arm.com self.assertEqual(normalized_golden, normalized_actual) 32113481Sgiacomo.travaglini@arm.com 32213481Sgiacomo.travaglini@arm.com 32313481Sgiacomo.travaglini@arm.comif __name__ == '__main__': 32413481Sgiacomo.travaglini@arm.com if sys.argv[1:] == [GENGOLDEN_FLAG]: 32513481Sgiacomo.travaglini@arm.com if CAN_GENERATE_GOLDEN_FILE: 32613481Sgiacomo.travaglini@arm.com output = GetOutputOfAllCommands() 32713481Sgiacomo.travaglini@arm.com golden_file = open(GOLDEN_PATH, 'wb') 32813481Sgiacomo.travaglini@arm.com golden_file.write(output) 32913481Sgiacomo.travaglini@arm.com golden_file.close() 33013481Sgiacomo.travaglini@arm.com else: 33113481Sgiacomo.travaglini@arm.com message = ( 33213481Sgiacomo.travaglini@arm.com """Unable to write a golden file when compiled in an environment 33313481Sgiacomo.travaglini@arm.comthat does not support all the required features (death tests, typed tests, 33413481Sgiacomo.travaglini@arm.comand multiple threads). Please generate the golden file using a binary built 33513481Sgiacomo.travaglini@arm.comwith those features enabled.""") 33613481Sgiacomo.travaglini@arm.com 33713481Sgiacomo.travaglini@arm.com sys.stderr.write(message) 33813481Sgiacomo.travaglini@arm.com sys.exit(1) 33913481Sgiacomo.travaglini@arm.com else: 34013481Sgiacomo.travaglini@arm.com gtest_test_utils.Main() 341