commit
						8526762ad7
					
				@ -3448,6 +3448,11 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {
 | 
			
		||||
  // to delimit this attribute from prior attributes.
 | 
			
		||||
  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
 | 
			
		||||
 | 
			
		||||
  // Streams an XML representation of the test properties of a TestResult
 | 
			
		||||
  // object.
 | 
			
		||||
  static void OutputXmlTestProperties(std::ostream* stream,
 | 
			
		||||
                                      const TestResult& result);
 | 
			
		||||
 | 
			
		||||
  // The output file.
 | 
			
		||||
  const std::string output_file_;
 | 
			
		||||
 | 
			
		||||
@ -3659,6 +3664,10 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
 | 
			
		||||
  const TestResult& result = *test_info.result();
 | 
			
		||||
  const std::string kTestcase = "testcase";
 | 
			
		||||
 | 
			
		||||
  if (test_info.is_in_another_shard()) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  *stream << "    <testcase";
 | 
			
		||||
  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
 | 
			
		||||
 | 
			
		||||
@ -3675,7 +3684,6 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
 | 
			
		||||
  OutputXmlAttribute(stream, kTestcase, "time",
 | 
			
		||||
                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
 | 
			
		||||
  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
 | 
			
		||||
  *stream << TestPropertiesAsXmlAttributes(result);
 | 
			
		||||
 | 
			
		||||
  int failures = 0;
 | 
			
		||||
  for (int i = 0; i < result.total_part_count(); ++i) {
 | 
			
		||||
@ -3697,10 +3705,15 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (failures == 0)
 | 
			
		||||
  if (failures == 0 && result.test_property_count() == 0) {
 | 
			
		||||
    *stream << " />\n";
 | 
			
		||||
  else
 | 
			
		||||
  } else {
 | 
			
		||||
    if (failures == 0) {
 | 
			
		||||
      *stream << ">\n";
 | 
			
		||||
    }
 | 
			
		||||
    OutputXmlTestProperties(stream, result);
 | 
			
		||||
    *stream << "    </testcase>\n";
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Prints an XML representation of a TestCase object
 | 
			
		||||
@ -3780,6 +3793,26 @@ std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
 | 
			
		||||
  return attributes.GetString();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void XmlUnitTestResultPrinter::OutputXmlTestProperties(
 | 
			
		||||
    std::ostream* stream, const TestResult& result) {
 | 
			
		||||
  const std::string kProperties = "properties";
 | 
			
		||||
  const std::string kProperty = "property";
 | 
			
		||||
 | 
			
		||||
  if (result.test_property_count() <= 0) {
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  *stream << "<" << kProperties << ">\n";
 | 
			
		||||
  for (int i = 0; i < result.test_property_count(); ++i) {
 | 
			
		||||
    const TestProperty& property = result.GetTestProperty(i);
 | 
			
		||||
    *stream << "<" << kProperty;
 | 
			
		||||
    *stream << " name=\"" << EscapeXmlAttribute(property.key()) << "\"";
 | 
			
		||||
    *stream << " value=\"" << EscapeXmlAttribute(property.value()) << "\"";
 | 
			
		||||
    *stream << "/>\n";
 | 
			
		||||
  }
 | 
			
		||||
  *stream << "</" << kProperties << ">\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// End XmlUnitTestResultPrinter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -43,7 +43,13 @@ GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
 | 
			
		||||
EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
 | 
			
		||||
  <testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
 | 
			
		||||
    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne">
 | 
			
		||||
      <properties>
 | 
			
		||||
        <property name="SetUpProp" value="1"/>
 | 
			
		||||
        <property name="TestSomeProperty" value="1"/>
 | 
			
		||||
        <property name="TearDownProp" value="1"/>
 | 
			
		||||
      </properties>
 | 
			
		||||
    </testcase>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
</testsuites>
 | 
			
		||||
"""
 | 
			
		||||
@ -51,7 +57,13 @@ EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
 | 
			
		||||
  <testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
 | 
			
		||||
    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo">
 | 
			
		||||
      <properties>
 | 
			
		||||
        <property name="SetUpProp" value="2"/>
 | 
			
		||||
        <property name="TestSomeProperty" value="2"/>
 | 
			
		||||
        <property name="TearDownProp" value="2"/>
 | 
			
		||||
      </properties>
 | 
			
		||||
    </testcase>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
</testsuites>
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
@ -104,15 +104,45 @@ Invalid characters in brackets []%(stack)s]]></failure>
 | 
			
		||||
    <testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
  <testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
 | 
			
		||||
    <testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest" key_1="1"/>
 | 
			
		||||
    <testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest" key_int="1"/>
 | 
			
		||||
    <testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest" key_1="1" key_2="2" key_3="3"/>
 | 
			
		||||
    <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest" key_1="2"/>
 | 
			
		||||
    <testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest">
 | 
			
		||||
      <properties>
 | 
			
		||||
        <property name="key_1" value="1"/>
 | 
			
		||||
      </properties>
 | 
			
		||||
    </testcase>
 | 
			
		||||
    <testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest">
 | 
			
		||||
      <properties>
 | 
			
		||||
        <property name="key_int" value="1"/>
 | 
			
		||||
      </properties>
 | 
			
		||||
    </testcase>
 | 
			
		||||
    <testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest">
 | 
			
		||||
      <properties>
 | 
			
		||||
        <property name="key_1" value="1"/>
 | 
			
		||||
        <property name="key_2" value="2"/>
 | 
			
		||||
        <property name="key_3" value="3"/>
 | 
			
		||||
      </properties>
 | 
			
		||||
    </testcase>
 | 
			
		||||
    <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest">
 | 
			
		||||
      <properties>
 | 
			
		||||
        <property name="key_1" value="2"/>
 | 
			
		||||
      </properties>
 | 
			
		||||
    </testcase>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
  <testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
 | 
			
		||||
     <testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_int="1"/>
 | 
			
		||||
     <testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_string="1"/>
 | 
			
		||||
     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest">
 | 
			
		||||
       <properties>
 | 
			
		||||
         <property name="key" value="1"/>
 | 
			
		||||
       </properties>
 | 
			
		||||
     </testcase>
 | 
			
		||||
     <testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest">
 | 
			
		||||
       <properties>
 | 
			
		||||
         <property name="key_for_utility_int" value="1"/>
 | 
			
		||||
       </properties>
 | 
			
		||||
     </testcase>
 | 
			
		||||
     <testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest">
 | 
			
		||||
       <properties>
 | 
			
		||||
         <property name="key_for_utility_string" value="1"/>
 | 
			
		||||
       </properties>
 | 
			
		||||
     </testcase>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
  <testsuite name="Single/ValueParamTest" tests="4" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
    <testcase name="HasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
 | 
			
		||||
@ -149,7 +179,11 @@ EXPECTED_SHARDED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
  <testsuite name="NoFixtureTest" tests="1" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
 | 
			
		||||
     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest">
 | 
			
		||||
       <properties>
 | 
			
		||||
         <property name="key" value="1"/>
 | 
			
		||||
       </properties>
 | 
			
		||||
     </testcase>
 | 
			
		||||
  </testsuite>
 | 
			
		||||
  <testsuite name="Single/ValueParamTest" tests="1" failures="0" disabled="0" errors="0" time="*">
 | 
			
		||||
    <testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
 | 
			
		||||
 | 
			
		||||
@ -101,19 +101,22 @@ 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',
 | 
			
		||||
      'property': 'name',
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  def _GetChildren(self, element):
 | 
			
		||||
    """
 | 
			
		||||
    Fetches all of the child nodes of element, a DOM Element object.
 | 
			
		||||
    Returns them as the values of a dictionary keyed by the IDs of the
 | 
			
		||||
    children.  For <testsuites>, <testsuite> and <testcase> elements, the ID
 | 
			
		||||
    is the value of their "name" attribute; for <failure> elements, it is
 | 
			
		||||
    the value of the "message" attribute; CDATA sections and non-whitespace
 | 
			
		||||
    children.  For <testsuites>, <testsuite>, <testcase>, and <property>
 | 
			
		||||
    elements, the ID is the value of their "name" attribute; for <failure>
 | 
			
		||||
    elements, it is the value of the "message" attribute; for <properties>
 | 
			
		||||
    elements, it is the value of their parent's "name" attribute plus the
 | 
			
		||||
    literal string "properties"; CDATA sections and non-whitespace
 | 
			
		||||
    text nodes are concatenated into a single CDATA section with ID
 | 
			
		||||
    "detail".  An exception is raised if any element other than the above
 | 
			
		||||
    four is encountered, if two child elements with the same identifying
 | 
			
		||||
@ -123,11 +126,17 @@ class GTestXMLTestCase(gtest_test_utils.TestCase):
 | 
			
		||||
    children = {}
 | 
			
		||||
    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)
 | 
			
		||||
        childID = child.getAttribute(self.identifying_attribute[child.tagName])
 | 
			
		||||
        self.assert_(childID not in children)
 | 
			
		||||
        children[childID] = child
 | 
			
		||||
        if child.tagName == 'properties':
 | 
			
		||||
          self.assert_(child.parentNode is not None,
 | 
			
		||||
                       'Encountered <properties> element without a parent')
 | 
			
		||||
          child_id = child.parentNode.getAttribute('name') + '-properties'
 | 
			
		||||
        else:
 | 
			
		||||
          self.assert_(child.tagName in self.identifying_attribute,
 | 
			
		||||
                       'Encountered unknown element <%s>' % child.tagName)
 | 
			
		||||
          child_id = child.getAttribute(
 | 
			
		||||
              self.identifying_attribute[child.tagName])
 | 
			
		||||
        self.assert_(child_id not in children)
 | 
			
		||||
        children[child_id] = child
 | 
			
		||||
      elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
 | 
			
		||||
        if 'detail' not in children:
 | 
			
		||||
          if (child.nodeType == Node.CDATA_SECTION_NODE or
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user