32"""Unit test for the gtest_xml_output module"""
39from xml.dom
import minidom, Node
41import gtest_test_utils
42import gtest_xml_test_utils
44GTEST_FILTER_FLAG =
'--gtest_filter'
45GTEST_LIST_TESTS_FLAG =
'--gtest_list_tests'
46GTEST_OUTPUT_FLAG =
'--gtest_output'
47GTEST_DEFAULT_OUTPUT_FILE =
'test_detail.xml'
48GTEST_PROGRAM_NAME =
'gtest_xml_output_unittest_'
51NO_STACKTRACE_SUPPORT_FLAG =
'--no_stacktrace_support'
54TOTAL_SHARDS_ENV_VAR =
'GTEST_TOTAL_SHARDS'
55SHARD_INDEX_ENV_VAR =
'GTEST_SHARD_INDEX'
56SHARD_STATUS_FILE_ENV_VAR =
'GTEST_SHARD_STATUS_FILE'
58SUPPORTS_STACK_TRACES = NO_STACKTRACE_SUPPORT_FLAG
not in sys.argv
60if SUPPORTS_STACK_TRACES:
61 STACK_TRACE_TEMPLATE =
'\nStack trace:\n*'
63 STACK_TRACE_TEMPLATE =
''
65 sys.argv.remove(NO_STACKTRACE_SUPPORT_FLAG)
67EXPECTED_NON_EMPTY_XML =
"""<?xml version="1.0" encoding="UTF-8"?>
68<testsuites tests="26" failures="5" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
69 <testsuite name="SuccessfulTest" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
70 <testcase name=
"Succeeds" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"SuccessfulTest"/>
72 <testsuite name=
"FailedTest" tests=
"1" failures=
"1" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
73 <testcase name=
"Fails" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"FailedTest">
74 <failure message=
"gtest_xml_output_unittest_.cc:*
Expected equality of these values:
 1
 2" type=
""><![CDATA[gtest_xml_output_unittest_.cc:*
75Expected equality of these values:
77 2%(stack)s]]></failure>
80 <testsuite name=
"MixedResultTest" tests=
"3" failures=
"1" disabled=
"1" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
81 <testcase name=
"Succeeds" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"MixedResultTest"/>
82 <testcase name=
"Fails" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"MixedResultTest">
83 <failure message=
"gtest_xml_output_unittest_.cc:*
Expected equality of these values:
 1
 2" type=
""><![CDATA[gtest_xml_output_unittest_.cc:*
84Expected equality of these values:
86 2%(stack)s]]></failure>
87 <failure message=
"gtest_xml_output_unittest_.cc:*
Expected equality of these values:
 2
 3" type=
""><![CDATA[gtest_xml_output_unittest_.cc:*
88Expected equality of these values:
90 3%(stack)s]]></failure>
92 <testcase name=
"DISABLED_test" status=
"notrun" result=
"suppressed" time=
"*" timestamp=
"*" classname=
"MixedResultTest"/>
94 <testsuite name=
"XmlQuotingTest" tests=
"1" failures=
"1" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
95 <testcase name=
"OutputsCData" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"XmlQuotingTest">
96 <failure message=
"gtest_xml_output_unittest_.cc:*
Failed
XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]></top>" type=
""><![CDATA[gtest_xml_output_unittest_.cc:*
98XML output: <?xml encoding=
"utf-8"><top><![CDATA[cdata text]]>]]><![CDATA[</top>%(stack)s]]></failure>
101 <testsuite name=
"InvalidCharactersTest" tests=
"1" failures=
"1" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
102 <testcase name=
"InvalidCharactersInMessage" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"InvalidCharactersTest">
103 <failure message=
"gtest_xml_output_unittest_.cc:*
Failed
Invalid characters in brackets []" type=
""><![CDATA[gtest_xml_output_unittest_.cc:*
105Invalid characters
in brackets []%(stack)s]]></failure>
108 <testsuite name=
"DisabledTest" tests=
"1" failures=
"0" disabled=
"1" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
109 <testcase name=
"DISABLED_test_not_run" status=
"notrun" result=
"suppressed" time=
"*" timestamp=
"*" classname=
"DisabledTest"/>
111 <testsuite name=
"SkippedTest" tests=
"3" failures=
"1" disabled=
"0" skipped=
"2" errors=
"0" time=
"*" timestamp=
"*">
112 <testcase name=
"Skipped" status=
"run" result=
"skipped" time=
"*" timestamp=
"*" classname=
"SkippedTest">
113 <skipped message=
"gtest_xml_output_unittest_.cc:*
"><![CDATA[gtest_xml_output_unittest_.cc:*
114%(stack)s]]></skipped>
116 <testcase name=
"SkippedWithMessage" status=
"run" result=
"skipped" time=
"*" timestamp=
"*" classname=
"SkippedTest">
117 <skipped message=
"gtest_xml_output_unittest_.cc:*
It is good practice to tell why you skip a test."><![CDATA[gtest_xml_output_unittest_.cc:*
118It
is good practice to tell why you skip a test.%(stack)s]]></skipped>
120 <testcase name=
"SkippedAfterFailure" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"SkippedTest">
121 <failure message=
"gtest_xml_output_unittest_.cc:*
Expected equality of these values:
 1
 2" type=
""><![CDATA[gtest_xml_output_unittest_.cc:*
122Expected equality of these values:
124 2%(stack)s]]></failure>
125 <skipped message=
"gtest_xml_output_unittest_.cc:*
It is good practice to tell why you skip a test."><![CDATA[gtest_xml_output_unittest_.cc:*
126It
is good practice to tell why you skip a test.%(stack)s]]></skipped>
130 <testsuite name=
"PropertyRecordingTest" tests=
"4" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*" SetUpTestSuite=
"yes" TearDownTestSuite=
"aye">
131 <testcase name=
"OneProperty" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"PropertyRecordingTest">
133 <property name=
"key_1" value=
"1"/>
136 <testcase name=
"IntValuedProperty" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"PropertyRecordingTest">
138 <property name=
"key_int" value=
"1"/>
141 <testcase name=
"ThreeProperties" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"PropertyRecordingTest">
143 <property name=
"key_1" value=
"1"/>
144 <property name=
"key_2" value=
"2"/>
145 <property name=
"key_3" value=
"3"/>
148 <testcase name=
"TwoValuesForOneKeyUsesLastValue" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"PropertyRecordingTest">
150 <property name=
"key_1" value=
"2"/>
154 <testsuite name=
"NoFixtureTest" tests=
"3" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
155 <testcase name=
"RecordProperty" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"NoFixtureTest">
157 <property name=
"key" value=
"1"/>
160 <testcase name=
"ExternalUtilityThatCallsRecordIntValuedProperty" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"NoFixtureTest">
162 <property name=
"key_for_utility_int" value=
"1"/>
165 <testcase name=
"ExternalUtilityThatCallsRecordStringValuedProperty" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"NoFixtureTest">
167 <property name=
"key_for_utility_string" value=
"1"/>
171 <testsuite name=
"Single/ValueParamTest" tests=
"4" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
172 <testcase name=
"HasValueParamAttribute/0" value_param=
"33" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"Single/ValueParamTest" />
173 <testcase name=
"HasValueParamAttribute/1" value_param=
"42" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"Single/ValueParamTest" />
174 <testcase name=
"AnotherTestThatHasValueParamAttribute/0" value_param=
"33" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"Single/ValueParamTest" />
175 <testcase name=
"AnotherTestThatHasValueParamAttribute/1" value_param=
"42" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"Single/ValueParamTest" />
177 <testsuite name=
"TypedTest/0" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
178 <testcase name=
"HasTypeParamAttribute" type_param=
"*" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"TypedTest/0" />
180 <testsuite name=
"TypedTest/1" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
181 <testcase name=
"HasTypeParamAttribute" type_param=
"*" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"TypedTest/1" />
183 <testsuite name=
"Single/TypeParameterizedTestSuite/0" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
184 <testcase name=
"HasTypeParamAttribute" type_param=
"*" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"Single/TypeParameterizedTestSuite/0" />
186 <testsuite name=
"Single/TypeParameterizedTestSuite/1" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
187 <testcase name=
"HasTypeParamAttribute" type_param=
"*" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"Single/TypeParameterizedTestSuite/1" />
190 'stack': STACK_TRACE_TEMPLATE
193EXPECTED_FILTERED_TEST_XML =
"""<?xml version="1.0" encoding="UTF-8"?>
194<testsuites tests="1" failures="0" disabled="0" errors="0" time="*"
195 timestamp="*" name=
"AllTests" ad_hoc_property=
"42">
196 <testsuite name=
"SuccessfulTest" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0"
197 errors=
"0" time=
"*" timestamp=
"*">
198 <testcase name=
"Succeeds" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"SuccessfulTest"/>
202EXPECTED_SHARDED_TEST_XML = """<?xml version=
"1.0" encoding=
"UTF-8"?>
203<testsuites tests=
"3" failures=
"0" disabled=
"0" errors=
"0" time=
"*" timestamp=
"*" name=
"AllTests" ad_hoc_property=
"42">
204 <testsuite name=
"SuccessfulTest" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
205 <testcase name=
"Succeeds" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"SuccessfulTest"/>
207 <testsuite name=
"PropertyRecordingTest" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*" SetUpTestSuite=
"yes" TearDownTestSuite=
"aye">
208 <testcase name=
"IntValuedProperty" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"PropertyRecordingTest">
210 <property name=
"key_int" value=
"1"/>
214 <testsuite name=
"Single/ValueParamTest" tests=
"1" failures=
"0" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
215 <testcase name=
"HasValueParamAttribute/0" value_param=
"33" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"Single/ValueParamTest" />
219EXPECTED_NO_TEST_XML = """<?xml version=
"1.0" encoding=
"UTF-8"?>
220<testsuites tests=
"0" failures=
"0" disabled=
"0" errors=
"0" time=
"*"
221 timestamp=
"*" name=
"AllTests">
222 <testsuite name=
"NonTestSuiteFailure" tests=
"1" failures=
"1" disabled=
"0" skipped=
"0" errors=
"0" time=
"*" timestamp=
"*">
223 <testcase name=
"" status=
"run" result=
"completed" time=
"*" timestamp=
"*" classname=
"">
224 <failure message=
"gtest_no_test_unittest.cc:*
Expected equality of these values:
 1
 2" type=
""><![CDATA[gtest_no_test_unittest.cc:*
225Expected equality of these values:
227 2%(stack)s]]></failure>
231 'stack': STACK_TRACE_TEMPLATE
237 [GTEST_PROGRAM_PATH, GTEST_LIST_TESTS_FLAG], capture_stderr=
False).output
242 Unit test for Google Test
's XML output functionality.
247 if SUPPORTS_TYPED_TESTS:
250 Runs a test program that generates a non-empty XML output, and
251 tests that the XML output
is expected.
253 self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)
256 """Verifies XML output for a Google Test binary without actual tests.
258 Runs a test program that generates an XML output for a binary without tests,
259 and tests that the XML output
is expected.
262 self._TestXmlOutput('gtest_no_test_unittest', EXPECTED_NO_TEST_XML, 0)
265 """Checks whether the timestamp attribute in the XML output is valid.
267 Runs a test program that generates an empty XML output, and checks
if
268 the timestamp attribute
in the testsuites tag
is valid.
270 actual = self._GetXmlOutput('gtest_no_test_unittest', [], {}, 0)
271 date_time_str = actual.documentElement.getAttributeNode(
'timestamp').value
274 match = re.match(
r'(\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)', date_time_str)
277 'XML datettime string %s has incorrect format' % date_time_str)
278 date_time_from_xml = datetime.datetime(
279 year=int(match.group(1)), month=int(match.group(2)),
280 day=int(match.group(3)), hour=int(match.group(4)),
281 minute=int(match.group(5)), second=int(match.group(6)))
283 time_delta = abs(datetime.datetime.now() - date_time_from_xml)
285 self.assertTrue(time_delta < datetime.timedelta(seconds=600),
286 'time_delta is %s' % time_delta)
291 Confirms that Google Test produces an XML output file with the expected
292 default name
if no name
is explicitly specified.
295 GTEST_DEFAULT_OUTPUT_FILE)
297 'gtest_no_test_unittest')
299 os.remove(output_file)
301 e = sys.exc_info()[1]
302 if e.errno != errno.ENOENT:
306 [gtest_prog_path,
'%s=xml' % GTEST_OUTPUT_FLAG],
308 self.assert_(p.exited)
309 self.assertEquals(0, p.exit_code)
310 self.assert_(os.path.isfile(output_file))
314 Tests that no XML file is generated
if the default XML listener
is
315 shut down before RUN_ALL_TESTS
is invoked.
319 GTEST_PROGRAM_NAME + 'out.xml')
320 if os.path.isfile(xml_path):
323 command = [GTEST_PROGRAM_PATH,
324 '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path),
327 if p.terminated_by_signal:
330 p.terminated_by_signal,
331 '%s was killed by signal %d' % (GTEST_PROGRAM_NAME, p.signal))
333 self.assert_(p.exited)
334 self.assertEquals(1, p.exit_code,
335 "'%s' exited with code %s, which doesn't match "
336 'the expected exit code %s.'
337 % (command, p.exit_code, 1))
339 self.assert_(
not os.path.isfile(xml_path))
342 """Verifies XML output when a filter is applied.
344 Runs a test program that executes only some tests and verifies that
345 non-selected tests do
not show up
in the XML output.
348 self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_FILTERED_TEST_XML, 0,
349 extra_args=['%s=SuccessfulTest.*' % GTEST_FILTER_FLAG])
352 """Verifies XML output when run using multiple shards.
354 Runs a test program that executes only one shard and verifies that tests
355 from other shards do
not show up
in the XML output.
360 EXPECTED_SHARDED_TEST_XML,
362 extra_env={SHARD_INDEX_ENV_VAR: '0',
363 TOTAL_SHARDS_ENV_VAR:
'10'})
365 def _GetXmlOutput(self, gtest_prog_name, extra_args, extra_env,
368 Returns the xml output generated by running the program gtest_prog_name.
369 Furthermore, the program's exit code must be expected_exit_code.
372 gtest_prog_name + 'out.xml')
375 command = ([gtest_prog_path,
'%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path)] +
377 environ_copy = os.environ.copy()
379 environ_copy.update(extra_env)
382 if p.terminated_by_signal:
384 '%s was killed by signal %d' % (gtest_prog_name, p.signal))
386 self.assert_(p.exited)
387 self.assertEquals(expected_exit_code, p.exit_code,
388 "'%s' exited with code %s, which doesn't match "
389 'the expected exit code %s.'
390 % (command, p.exit_code, expected_exit_code))
391 actual = minidom.parse(xml_path)
394 def _TestXmlOutput(self, gtest_prog_name, expected_xml,
395 expected_exit_code, extra_args=None, extra_env=None):
397 Asserts that the XML document generated by running the program
398 gtest_prog_name matches expected_xml, a string containing another
399 XML document. Furthermore, the program's exit code must be
403 actual = self._GetXmlOutput(gtest_prog_name, extra_args or [],
404 extra_env
or {}, expected_exit_code)
405 expected = minidom.parseString(expected_xml)
408 actual.documentElement)
413if __name__ ==
'__main__':
414 os.environ[
'GTEST_STACK_TRACE_DEPTH'] =
'1'
def GetTestExecutablePath(executable_name, build_dir=None)
def testNoTestXmlOutput(self)
def testDefaultOutputFile(self)
def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code, extra_args=None, extra_env=None)
def testNonEmptyXmlOutput(self)
def testFilteredTestXmlOutput(self)
def testTimestampValue(self)
def testSuppressedXmlOutput(self)
def testShardedTestXmlOutput(self)
def _GetXmlOutput(self, gtest_prog_name, extra_args, extra_env, expected_exit_code)
def AssertEquivalentNodes(self, expected_node, actual_node)
def NormalizeXml(self, element)