Implements the timestamp attribute for the testsuites element in the output XML (external contribution by Dirk Meister).
This commit is contained in:
@@ -39,8 +39,8 @@ from xml.dom import minidom, Node
|
||||
import gtest_test_utils
|
||||
|
||||
|
||||
GTEST_OUTPUT_FLAG = "--gtest_output"
|
||||
GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
|
||||
GTEST_OUTPUT_FLAG = '--gtest_output'
|
||||
GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'
|
||||
|
||||
class GTestXMLTestCase(gtest_test_utils.TestCase):
|
||||
"""
|
||||
@@ -80,23 +80,23 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
||||
actual_attributes = actual_node .attributes
|
||||
self.assertEquals(
|
||||
expected_attributes.length, actual_attributes.length,
|
||||
"attribute numbers differ in element " + actual_node.tagName)
|
||||
'attribute numbers differ in element ' + actual_node.tagName)
|
||||
for i in range(expected_attributes.length):
|
||||
expected_attr = expected_attributes.item(i)
|
||||
actual_attr = actual_attributes.get(expected_attr.name)
|
||||
self.assert_(
|
||||
actual_attr is not None,
|
||||
"expected attribute %s not found in element %s" %
|
||||
'expected attribute %s not found in element %s' %
|
||||
(expected_attr.name, actual_node.tagName))
|
||||
self.assertEquals(expected_attr.value, actual_attr.value,
|
||||
" values of attribute %s in element %s differ" %
|
||||
' values of attribute %s in element %s differ' %
|
||||
(expected_attr.name, actual_node.tagName))
|
||||
|
||||
expected_children = self._GetChildren(expected_node)
|
||||
actual_children = self._GetChildren(actual_node)
|
||||
self.assertEquals(
|
||||
len(expected_children), len(actual_children),
|
||||
"number of child elements differ in element " + actual_node.tagName)
|
||||
'number of child elements differ in element ' + actual_node.tagName)
|
||||
for child_id, child in expected_children.iteritems():
|
||||
self.assert_(child_id in actual_children,
|
||||
'<%s> is not in <%s> (in element %s)' %
|
||||
@@ -104,10 +104,10 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
||||
self.AssertEquivalentNodes(child, actual_children[child_id])
|
||||
|
||||
identifying_attribute = {
|
||||
"testsuites": "name",
|
||||
"testsuite": "name",
|
||||
"testcase": "name",
|
||||
"failure": "message",
|
||||
'testsuites': 'name',
|
||||
'testsuite': 'name',
|
||||
'testcase': 'name',
|
||||
'failure': 'message',
|
||||
}
|
||||
|
||||
def _GetChildren(self, element):
|
||||
@@ -127,20 +127,20 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
||||
for child in element.childNodes:
|
||||
if child.nodeType == Node.ELEMENT_NODE:
|
||||
self.assert_(child.tagName in self.identifying_attribute,
|
||||
"Encountered unknown element <%s>" % child.tagName)
|
||||
'Encountered unknown element <%s>' % child.tagName)
|
||||
childID = child.getAttribute(self.identifying_attribute[child.tagName])
|
||||
self.assert_(childID not in children)
|
||||
children[childID] = child
|
||||
elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
|
||||
if "detail" not in children:
|
||||
if 'detail' not in children:
|
||||
if (child.nodeType == Node.CDATA_SECTION_NODE or
|
||||
not child.nodeValue.isspace()):
|
||||
children["detail"] = child.ownerDocument.createCDATASection(
|
||||
children['detail'] = child.ownerDocument.createCDATASection(
|
||||
child.nodeValue)
|
||||
else:
|
||||
children["detail"].nodeValue += child.nodeValue
|
||||
children['detail'].nodeValue += child.nodeValue
|
||||
else:
|
||||
self.fail("Encountered unexpected node type %d" % child.nodeType)
|
||||
self.fail('Encountered unexpected node type %d' % child.nodeType)
|
||||
return children
|
||||
|
||||
def NormalizeXml(self, element):
|
||||
@@ -151,6 +151,8 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
||||
* The "time" attribute of <testsuites>, <testsuite> and <testcase>
|
||||
elements is replaced with a single asterisk, if it contains
|
||||
only digit characters.
|
||||
* The "timestamp" attribute of <testsuites> elements is replaced with a
|
||||
single asterisk, if it contains a valid ISO8601 datetime value.
|
||||
* The "type_param" attribute of <testcase> elements is replaced with a
|
||||
single asterisk (if it sn non-empty) as it is the type name returned
|
||||
by the compiler and is platform dependent.
|
||||
@@ -160,20 +162,24 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
|
||||
* The stack traces are removed.
|
||||
"""
|
||||
|
||||
if element.tagName in ("testsuites", "testsuite", "testcase"):
|
||||
time = element.getAttributeNode("time")
|
||||
time.value = re.sub(r"^\d+(\.\d+)?$", "*", time.value)
|
||||
type_param = element.getAttributeNode("type_param")
|
||||
if element.tagName == 'testsuites':
|
||||
timestamp = element.getAttributeNode('timestamp')
|
||||
timestamp.value = re.sub(r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d$',
|
||||
'*', timestamp.value)
|
||||
if element.tagName in ('testsuites', 'testsuite', 'testcase'):
|
||||
time = element.getAttributeNode('time')
|
||||
time.value = re.sub(r'^\d+(\.\d+)?$', '*', time.value)
|
||||
type_param = element.getAttributeNode('type_param')
|
||||
if type_param and type_param.value:
|
||||
type_param.value = "*"
|
||||
elif element.tagName == "failure":
|
||||
type_param.value = '*'
|
||||
elif element.tagName == 'failure':
|
||||
for child in element.childNodes:
|
||||
if child.nodeType == Node.CDATA_SECTION_NODE:
|
||||
# Removes the source line number.
|
||||
cdata = re.sub(r"^.*[/\\](.*:)\d+\n", "\\1*\n", child.nodeValue)
|
||||
cdata = re.sub(r'^.*[/\\](.*:)\d+\n', '\\1*\n', child.nodeValue)
|
||||
# Removes the actual stack trace.
|
||||
child.nodeValue = re.sub(r"\nStack trace:\n(.|\n)*",
|
||||
"", cdata)
|
||||
child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
|
||||
'', cdata)
|
||||
for child in element.childNodes:
|
||||
if child.nodeType == Node.ELEMENT_NODE:
|
||||
self.NormalizeXml(child)
|
||||
|
||||
Reference in New Issue
Block a user