1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#!/usr/bin/env python
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2006, Google Inc.
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# All rights reserved.
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met:
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions of source code must retain the above copyright
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer.
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Redistributions in binary form must reproduce the above
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution.
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#     * Neither the name of Google Inc. nor the names of its
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission.
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Unit test for the gtest_xml_output module"""
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'eefacm@gmail.com (Sean Mcafee)'
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport errno
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport os
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport sys
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom xml.dom import minidom, Node
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport gtest_test_utils
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport gtest_xml_test_utils
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGTEST_OUTPUT_FLAG         = "--gtest_output"
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
47d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleSUPPORTS_STACK_TRACES = False
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif SUPPORTS_STACK_TRACES:
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  STACK_TRACE_TEMPLATE = "\nStack trace:\n*"
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleelse:
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  STACK_TRACE_TEMPLATE = ""
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
57d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville<testsuites tests="15" failures="4" disabled="2" errors="0" time="*" name="AllTests">
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  </testsuite>
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  <testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="Fails" status="run" time="*" classname="FailedTest">
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      <failure message="Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleValue of: 2
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleExpected: 1%(stack)s]]></failure>
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    </testcase>
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  </testsuite>
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  <testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="Fails" status="run" time="*" classname="MixedResultTest">
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      <failure message="Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleValue of: 2
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleExpected: 1%(stack)s]]></failure>
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      <failure message="Value of: 3&#x0A;Expected: 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleValue of: 3
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleExpected: 2%(stack)s]]></failure>
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    </testcase>
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="DISABLED_test" status="notrun" time="*" classname="MixedResultTest"/>
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  </testsuite>
80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  <testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*">
81d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    <testcase name="OutputsCData" status="run" time="*" classname="XmlQuotingTest">
82d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      <failure message="Failed&#x0A;XML output: &lt;?xml encoding=&quot;utf-8&quot;&gt;&lt;top&gt;&lt;![CDATA[cdata text]]&gt;&lt;/top&gt;" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
83d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleFailed
84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleXML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]&gt;<![CDATA[</top>%(stack)s]]></failure>
85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    </testcase>
86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  </testsuite>
87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  <testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*">
88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    <testcase name="InvalidCharactersInMessage" status="run" time="*" classname="InvalidCharactersTest">
89d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      <failure message="Failed&#x0A;Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
90d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleFailed
91d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleInvalid characters in brackets []%(stack)s]]></failure>
92d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    </testcase>
93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  </testsuite>
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  <testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*">
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  </testsuite>
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  <testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*">
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest" key_1="1"/>
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest" key_int="1"/>
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest" key_1="1" key_2="2" key_3="3"/>
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest" key_1="2"/>
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  </testsuite>
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  <testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*">
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville     <testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_int="1"/>
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville     <testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_string="1"/>
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  </testsuite>
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville</testsuites>""" % {'stack': STACK_TRACE_TEMPLATE}
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville<testsuites tests="0" failures="0" disabled="0" errors="0" time="*" name="AllTests">
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville</testsuites>"""
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Unit test for Google Test's XML output functionality.
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  """
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testNonEmptyXmlOutput(self):
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Runs a test program that generates a non-empty XML output, and
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests that the XML output is expected.
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
126d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testEmptyXmlOutput(self):
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Runs a test program that generates an empty XML output, and
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    tests that the XML output is expected.
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self._TestXmlOutput("gtest_no_test_unittest",
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        EXPECTED_EMPTY_XML, 0)
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def testDefaultOutputFile(self):
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Confirms that Google Test produces an XML output file with the expected
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    default name if no name is explicitly specified.
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    output_file = os.path.join(gtest_test_utils.GetTempDir(),
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               GTEST_DEFAULT_OUTPUT_FILE)
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "gtest_no_test_unittest")
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    try:
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      os.remove(output_file)
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    except OSError, e:
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if e.errno != errno.ENOENT:
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        raise
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    p = gtest_test_utils.Subprocess(
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        [gtest_prog_path, "%s=xml" % GTEST_OUTPUT_FLAG],
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        working_dir=gtest_test_utils.GetTempDir())
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assert_(p.exited)
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assertEquals(0, p.exit_code)
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.assert_(os.path.isfile(output_file))
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  def testSuppressedXmlOutput(self):
160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    Tests that no XML file is generated if the default XML listener is
162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    shut down before RUN_ALL_TESTS is invoked.
163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    """
164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                            GTEST_PROGRAM_NAME + "out.xml")
167d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if os.path.isfile(xml_path):
168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      os.remove(xml_path)
169d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)
171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    command = [gtest_prog_path,
173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               "%s=xml:%s" % (GTEST_OUTPUT_FLAG, xml_path),
174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville               "--shut_down_xml"]
175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    p = gtest_test_utils.Subprocess(command)
176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    if p.terminated_by_signal:
177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      self.assert_(False,
178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                   "%s was killed by signal %d" % (gtest_prog_name, p.signal))
179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    else:
180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      self.assert_(p.exited)
181d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      self.assertEquals(1, p.exit_code,
182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        "'%s' exited with code %s, which doesn't match "
183d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        "the expected exit code %s."
184d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville                        % (command, p.exit_code, 1))
185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    self.assert_(not os.path.isfile(xml_path))
187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code):
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    Asserts that the XML document generated by running the program
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    gtest_prog_name matches expected_xml, a string containing another
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    XML document.  Furthermore, the program's exit code must be
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    expected_exit_code.
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    """
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                            gtest_prog_name + "out.xml")
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    command = [gtest_prog_path, "%s=xml:%s" % (GTEST_OUTPUT_FLAG, xml_path)]
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    p = gtest_test_utils.Subprocess(command)
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if p.terminated_by_signal:
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assert_(False,
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                   "%s was killed by signal %d" % (gtest_prog_name, p.signal))
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    else:
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assert_(p.exited)
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      self.assertEquals(expected_exit_code, p.exit_code,
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        "'%s' exited with code %s, which doesn't match "
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        "the expected exit code %s."
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                        % (command, p.exit_code, expected_exit_code))
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    expected = minidom.parseString(expected_xml)
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    actual   = minidom.parse(xml_path)
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.NormalizeXml(actual.documentElement)
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    self.AssertEquivalentNodes(expected.documentElement,
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                               actual.documentElement)
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    expected.unlink()
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    actual  .unlink()
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__':
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  gtest_test_utils.Main()
225