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