32r"""Tests the text output of Google C++ Testing and Mocking Framework.
34To update the golden file:
35googletest_output_test.py --build_dir=BUILD/DIR --gengolden
36where BUILD/DIR contains the built googletest-output-test_ file.
37googletest_output_test.py --gengolden
38googletest_output_test.py
45import gtest_test_utils
49GENGOLDEN_FLAG =
'--gengolden'
50CATCH_EXCEPTIONS_ENV_VAR_NAME =
'GTEST_CATCH_EXCEPTIONS'
53NO_STACKTRACE_SUPPORT_FLAG =
'--no_stacktrace_support'
55IS_LINUX = os.name ==
'posix' and os.uname()[0] ==
'Linux'
56IS_WINDOWS = os.name ==
'nt'
58GOLDEN_NAME =
'googletest-output-test-golden-lin.txt'
64COMMAND_LIST_TESTS = ({}, [PROGRAM_PATH,
'--gtest_list_tests'])
65COMMAND_WITH_COLOR = ({}, [PROGRAM_PATH,
'--gtest_color=yes'])
66COMMAND_WITH_TIME = ({}, [PROGRAM_PATH,
68 'internal_skip_environment_and_ad_hoc_tests',
69 '--gtest_filter=FatalFailureTest.*:LoggingTest.*'])
70COMMAND_WITH_DISABLED = (
72 '--gtest_also_run_disabled_tests',
73 'internal_skip_environment_and_ad_hoc_tests',
74 '--gtest_filter=*DISABLED_*'])
75COMMAND_WITH_SHARDING = (
76 {
'GTEST_SHARD_INDEX':
'1',
'GTEST_TOTAL_SHARDS':
'2'},
78 'internal_skip_environment_and_ad_hoc_tests',
79 '--gtest_filter=PassingTest.*'])
85 """Changes all Windows/Mac line endings in s to UNIX line endings."""
87 return s.replace(
'\r\n',
'\n').replace(
'\r',
'\n')
91 """Removes all file location info from a Google Test program's output.
94 test_output: the output of a Google Test program.
97 output with all file location info (
in the form of
98 'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or
99 'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by
103 return re.sub(
r'.*[/\\]((googletest-output-test_|gtest).cc)(\:\d+|\(\d+\))\: ',
104 r'\1:#: ', test_output)
108 """Removes all stack traces from a Google Test program's output."""
111 return re.sub(
r'Stack trace:(.|\n)*?\n\n',
112 'Stack trace: (omitted)\n\n', output)
116 """Removes all traces of stack traces from a Google Test program's output."""
119 return re.sub(
r'Stack trace:(.|\n)*?\n\n',
'', output)
123 """Removes all time information from a Google Test program's output."""
125 return re.sub(
r'\(\d+ ms',
'(? ms', output)
129 """Removes compiler-specific type info from Google Test program's output.
132 test_output: the output of a Google Test program.
135 output with type information normalized to canonical form.
139 return re.sub(
r'unsigned int',
'unsigned', test_output)
143 """Normalizes platform specific output details for easier comparison."""
147 test_output = re.sub(
'\x1b\\[(0;3\d)?m',
'', test_output)
149 test_output = re.sub(
r': Failure\n',
r': error: ', test_output)
151 test_output = re.sub(
r'((\w|\.)+)\((\d+)\):',
r'\1:\3:', test_output)
157 """Removes test counts from a Google Test program's output."""
159 output = re.sub(
r'\d+ tests?, listed below',
160 '? tests, listed below', output)
161 output = re.sub(
r'\d+ FAILED TESTS',
162 '? FAILED TESTS', output)
163 output = re.sub(
r'\d+ tests? from \d+ test cases?',
164 '? tests from ? test cases', output)
165 output = re.sub(
r'\d+ tests? from ([a-zA-Z_])',
166 r'? tests from \1', output)
167 return re.sub(
r'\d+ tests?\.',
'? tests.', output)
171 """Removes output of specified tests from a Google Test program's output.
173 This function strips not only the beginning
and the end of a test but also
174 all output
in between.
177 test_output: A string containing the test output.
178 pattern: A regex string that matches names of test cases
or
182 Contents of test_output
with tests whose names match pattern removed.
185 test_output = re.sub(
186 r'.*\[ RUN \] .*%s(.|\n)*?\[( FAILED | OK )\] .*%s.*\n' % (
190 return re.sub(
r'.*%s.*\n' % pattern,
'', test_output)
194 """Normalizes output (the output of googletest-output-test_.exe)."""
204 """Runs a command in a sub-process, and returns its output in a string.
207 env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra
208 environment variables to set,
and element 1
is a string
with
209 the command
and any flags.
212 A string
with the command
's combined standard and diagnostic output.
217 environ = os.environ.copy()
218 environ.update(env_cmd[0])
225 """Runs a command and returns its output with all file location
229 env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra
230 environment variables to set,
and element 1
is a string
with
231 the command
and any flags.
235 environ, cmdline = env_cmd
236 environ = dict(environ)
237 environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] =
'1'
242 """Returns concatenated output from several representative commands."""
251SUPPORTS_DEATH_TESTS =
'DeathTest' in test_list
252SUPPORTS_TYPED_TESTS =
'TypedTest' in test_list
253SUPPORTS_THREADS =
'ExpectFailureWithThreadsTest' in test_list
254SUPPORTS_STACK_TRACES = NO_STACKTRACE_SUPPORT_FLAG
not in sys.argv
256CAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS
and
257 SUPPORTS_TYPED_TESTS
and
259 SUPPORTS_STACK_TRACES)
263 if not SUPPORTS_DEATH_TESTS:
265 if not SUPPORTS_TYPED_TESTS:
269 if not SUPPORTS_THREADS:
271 'ExpectFailureWithThreadsTest')
273 'ScopedFakeTestPartResultReporterTest')
276 if not SUPPORTS_STACK_TRACES:
284 golden_file = open(GOLDEN_PATH,
'rb')
299 if CAN_GENERATE_GOLDEN_FILE:
300 self.assertEqual(normalized_golden, normalized_actual,
301 '\n'.join(difflib.unified_diff(
302 normalized_golden.split(
'\n'),
303 normalized_actual.split(
'\n'),
304 'golden',
'actual')))
312 if os.getenv(
'DEBUG_GTEST_OUTPUT_TEST'):
315 '_googletest-output-test_normalized_actual.txt'),
'wb').write(
319 '_googletest-output-test_normalized_golden.txt'),
'wb').write(
322 self.assertEqual(normalized_golden, normalized_actual)
325if __name__ ==
'__main__':
326 if NO_STACKTRACE_SUPPORT_FLAG
in sys.argv:
328 sys.argv.remove(NO_STACKTRACE_SUPPORT_FLAG)
330 if GENGOLDEN_FLAG
in sys.argv:
331 if CAN_GENERATE_GOLDEN_FILE:
333 golden_file = open(GOLDEN_PATH,
'wb')
334 golden_file.write(output.encode())
338 """Unable to write a golden file when compiled in an environment
339that does not support all the required features (death tests,
340typed tests, stack traces, and multiple threads).
341Please build this test and generate the golden file using Blaze on Linux.""")
343 sys.stderr.write(message)
def RemoveStackTraces(output)
def RemoveTypeInfoDetails(test_output)
def RemoveMatchingTests(test_output, pattern)
def NormalizeOutput(output)
def RemoveLocations(test_output)
def GetOutputOfAllCommands()
def NormalizeToCurrentPlatform(test_output)
def RemoveTestCounts(output)
def GetCommandOutput(env_cmd)
def GetShellCommandOutput(env_cmd)
def RemoveStackTraceDetails(output)
def GetTestExecutablePath(executable_name, build_dir=None)
def RemoveUnsupportedTests(self, test_output)