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 (at] gmail.com (Keith Ray)" 35 36 import os 37 from xml.dom import minidom, Node 38 39 import gtest_test_utils 40 import gtest_xml_test_utils 41 42 43 GTEST_OUTPUT_SUBDIR = "xml_outfiles" 44 GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_" 45 GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_" 46 47 EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?> 48 <testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" 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 55 EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?> 56 <testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" 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 64 class 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 (at] 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 130 if __name__ == "__main__": 131 os.environ["GTEST_STACK_TRACE_DEPTH"] = "0" 132 gtest_test_utils.Main() 133