1#!/usr/bin/env python 2# 3# Copyright 2008, Google Inc. 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions are 8# met: 9# 10# * Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# * Redistributions in binary form must reproduce the above 13# copyright notice, this list of conditions and the following disclaimer 14# in the documentation and/or other materials provided with the 15# distribution. 16# * Neither the name of Google Inc. nor the names of its 17# contributors may be used to endorse or promote products derived from 18# this software without specific prior written permission. 19# 20# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 32"""Unit test for the gtest_xml_output module.""" 33 34__author__ = "keith.ray@gmail.com (Keith Ray)" 35 36import os 37from xml.dom import minidom, Node 38 39import gtest_test_utils 40import gtest_xml_test_utils 41 42 43GTEST_OUTPUT_SUBDIR = "xml_outfiles" 44GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_" 45GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_" 46 47EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?> 48<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" name="AllTests"> 49 <testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*"> 50 <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" /> 51 </testsuite> 52</testsuites> 53""" 54 55EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?> 56<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" name="AllTests"> 57 <testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*"> 58 <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" /> 59 </testsuite> 60</testsuites> 61""" 62 63 64class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase): 65 """Unit test for Google Test's XML output functionality.""" 66 67 def setUp(self): 68 # We want the trailing '/' that the last "" provides in os.path.join, for 69 # telling Google Test to create an output directory instead of a single file 70 # for xml output. 71 self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(), 72 GTEST_OUTPUT_SUBDIR, "") 73 self.DeleteFilesAndDir() 74 75 def tearDown(self): 76 self.DeleteFilesAndDir() 77 78 def DeleteFilesAndDir(self): 79 try: 80 os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + ".xml")) 81 except os.error: 82 pass 83 try: 84 os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + ".xml")) 85 except os.error: 86 pass 87 try: 88 os.rmdir(self.output_dir_) 89 except os.error: 90 pass 91 92 def testOutfile1(self): 93 self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1) 94 95 def testOutfile2(self): 96 self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2) 97 98 def _TestOutFile(self, test_name, expected_xml): 99 gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name) 100 command = [gtest_prog_path, "--gtest_output=xml:%s" % self.output_dir_] 101 p = gtest_test_utils.Subprocess(command, 102 working_dir=gtest_test_utils.GetTempDir()) 103 self.assert_(p.exited) 104 self.assertEquals(0, p.exit_code) 105 106 # TODO(wan@google.com): libtool causes the built test binary to be 107 # named lt-gtest_xml_outfiles_test_ instead of 108 # gtest_xml_outfiles_test_. To account for this possibillity, we 109 # allow both names in the following code. We should remove this 110 # hack when Chandler Carruth's libtool replacement tool is ready. 111 output_file_name1 = test_name + ".xml" 112 output_file1 = os.path.join(self.output_dir_, output_file_name1) 113 output_file_name2 = 'lt-' + output_file_name1 114 output_file2 = os.path.join(self.output_dir_, output_file_name2) 115 self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2), 116 output_file1) 117 118 expected = minidom.parseString(expected_xml) 119 if os.path.isfile(output_file1): 120 actual = minidom.parse(output_file1) 121 else: 122 actual = minidom.parse(output_file2) 123 self.NormalizeXml(actual.documentElement) 124 self.AssertEquivalentNodes(expected.documentElement, 125 actual.documentElement) 126 expected.unlink() 127 actual.unlink() 128 129 130if __name__ == "__main__": 131 os.environ["GTEST_STACK_TRACE_DEPTH"] = "0" 132 gtest_test_utils.Main() 133