111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#!/usr/bin/env python
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Copyright 2008, Google Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# All rights reserved.
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Redistribution and use in source and binary forms, with or without
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# modification, are permitted provided that the following conditions are
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# met:
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#     * Redistributions of source code must retain the above copyright
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# notice, this list of conditions and the following disclaimer.
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#     * Redistributions in binary form must reproduce the above
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# copyright notice, this list of conditions and the following disclaimer
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# in the documentation and/or other materials provided with the
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# distribution.
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#     * Neither the name of Google Inc. nor the names of its
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# contributors may be used to endorse or promote products derived from
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# this software without specific prior written permission.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert"""Unit test for the gtest_xml_output module."""
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__author__ = "keith.ray@gmail.com (Keith Ray)"
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport os
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertfrom xml.dom import minidom, Node
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport gtest_test_utils
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport gtest_xml_test_utils
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4311cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertGTEST_OUTPUT_SUBDIR = "xml_outfiles"
4411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertGTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"
4511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertGTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertEXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  <testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  </testsuite>
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert</testsuites>
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert"""
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertEXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  <testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  </testsuite>
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert</testsuites>
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert"""
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  """Unit test for Google Test's XML output functionality."""
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def setUp(self):
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    # We want the trailing '/' that the last "" provides in os.path.join, for
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    # telling Google Test to create an output directory instead of a single file
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    # for xml output.
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                    GTEST_OUTPUT_SUBDIR, "")
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.DeleteFilesAndDir()
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def tearDown(self):
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.DeleteFilesAndDir()
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def DeleteFilesAndDir(self):
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    try:
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + ".xml"))
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    except os.error:
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pass
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    try:
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + ".xml"))
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    except os.error:
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pass
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    try:
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      os.rmdir(self.output_dir_)
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    except os.error:
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      pass
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testOutfile1(self):
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1)
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testOutfile2(self):
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2)
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def _TestOutFile(self, test_name, expected_xml):
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    command = [gtest_prog_path, "--gtest_output=xml:%s" % self.output_dir_]
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    p = gtest_test_utils.Subprocess(command,
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                    working_dir=gtest_test_utils.GetTempDir())
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.assert_(p.exited)
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.assertEquals(0, p.exit_code)
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    # TODO(wan@google.com): libtool causes the built test binary to be
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #   named lt-gtest_xml_outfiles_test_ instead of
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #   gtest_xml_outfiles_test_.  To account for this possibillity, we
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #   allow both names in the following code.  We should remove this
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    #   hack when Chandler Carruth's libtool replacement tool is ready.
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    output_file_name1 = test_name + ".xml"
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    output_file1 = os.path.join(self.output_dir_, output_file_name1)
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    output_file_name2 = 'lt-' + output_file_name1
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    output_file2 = os.path.join(self.output_dir_, output_file_name2)
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 output_file1)
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    expected = minidom.parseString(expected_xml)
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if os.path.isfile(output_file1):
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      actual = minidom.parse(output_file1)
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else:
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      actual = minidom.parse(output_file2)
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.NormalizeXml(actual.documentElement)
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.AssertEquivalentNodes(expected.documentElement,
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                               actual.documentElement)
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    expected.unlink()
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    actual.unlink()
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif __name__ == "__main__":
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  os.environ["GTEST_STACK_TRACE_DEPTH"] = "0"
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  gtest_test_utils.Main()
133