diff options
Diffstat (limited to 'test/gtest_xml_output_unittest.py')
-rwxr-xr-x | test/gtest_xml_output_unittest.py | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/test/gtest_xml_output_unittest.py b/test/gtest_xml_output_unittest.py new file mode 100755 index 00000000..af021a9f --- /dev/null +++ b/test/gtest_xml_output_unittest.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# +# Copyright 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test for the gtest_xml_output module""" + +__author__ = 'eefacm@gmail.com (Sean Mcafee)' + +import errno +import gtest_test_utils +import os +import sys +import tempfile +import unittest + +from xml.dom import minidom, Node + +import gtest_xml_test_utils + +GTEST_OUTPUT_FLAG = "--gtest_output" +GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml" + +EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?> +<testsuite tests="13" failures="2" disabled="2" errors="0" time="*" name="AllTests"> + <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*"> + <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/> + </testsuite> + <testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*"> + <testcase name="Fails" status="run" time="*" classname="FailedTest"> + <failure message="gtest_xml_output_unittest_.cc:*
Value of: 2
Expected: 1" type=""/> + </testcase> + </testsuite> + <testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*"> + <testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/> + <testcase name="Fails" status="run" time="*" classname="MixedResultTest"> + <failure message="gtest_xml_output_unittest_.cc:*
Value of: 2
Expected: 1" type=""/> + <failure message="gtest_xml_output_unittest_.cc:*
Value of: 3
Expected: 2" type=""/> + </testcase> + <testcase name="DISABLED_test" status="notrun" time="*" classname="MixedResultTest"/> + </testsuite> + <testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*"> + <testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/> + </testsuite> + <testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*"> + <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"/> + </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"/> + </testsuite> +</testsuite>""" + + +EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?> +<testsuite tests="0" failures="0" disabled="0" errors="0" time="*" name="AllTests"> +</testsuite>""" + + +class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase): + """ + Unit test for Google Test's XML output functionality. + """ + + def testNonEmptyXmlOutput(self): + """ + Runs a test program that generates a non-empty XML output, and + tests that the XML output is expected. + """ + self._TestXmlOutput("gtest_xml_output_unittest_", + EXPECTED_NON_EMPTY_XML, 1) + + def testEmptyXmlOutput(self): + """ + Runs a test program that generates an empty XML output, and + tests that the XML output is expected. + """ + + self._TestXmlOutput("gtest_no_test_unittest", + EXPECTED_EMPTY_XML, 0) + + def testDefaultOutputFile(self): + """ + Confirms that Google Test produces an XML output file with the expected + default name if no name is explicitly specified. + """ + temp_dir = tempfile.mkdtemp() + output_file = os.path.join(temp_dir, + GTEST_DEFAULT_OUTPUT_FILE) + gtest_prog_path = os.path.join(gtest_test_utils.GetBuildDir(), + "gtest_no_test_unittest") + try: + os.remove(output_file) + except OSError, e: + if e.errno != errno.ENOENT: + raise + + status = os.system("cd %s && %s %s=xml &> /dev/null" + % (temp_dir, gtest_prog_path, + GTEST_OUTPUT_FLAG)) + self.assertEquals(0, status) + self.assert_(os.path.isfile(output_file)) + + + def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code): + """ + Asserts that the XML document generated by running the program + gtest_prog_name matches expected_xml, a string containing another + XML document. Furthermore, the program's exit code must be + expected_exit_code. + """ + + xml_path = os.path.join(tempfile.mkdtemp(), gtest_prog_name + "out.xml") + gtest_prog_path = os.path.join(gtest_test_utils.GetBuildDir(), + gtest_prog_name) + + command = ("%s %s=xml:%s &> /dev/null" + % (gtest_prog_path, GTEST_OUTPUT_FLAG, xml_path)) + status = os.system(command) + signal = status & 0xff + self.assertEquals(0, signal, + "%s was killed by signal %d" % (gtest_prog_name, signal)) + exit_code = status >> 8 + self.assertEquals(expected_exit_code, exit_code, + "'%s' exited with code %s, which doesn't match " + "the expected exit code %s." + % (command, exit_code, expected_exit_code)) + + expected = minidom.parseString(expected_xml) + actual = minidom.parse(xml_path) + self._NormalizeXml(actual.documentElement) + self._AssertEquivalentElements(expected.documentElement, + actual.documentElement) + expected.unlink() + actual .unlink() + + + +if __name__ == '__main__': + os.environ['GTEST_STACK_TRACE_DEPTH'] = '0' + gtest_test_utils.Main() |