#!/usr/bin/env python # # Copyright 2006, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following disclaimer # in the documentation and/or other materials provided with the # distribution. # * Neither the name of Google Inc. nor the names of its # contributors may be used to endorse or promote products derived from # this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """Unit test for Google Test's --gtest_list_tests flag. A user can ask Google Test to list all tests by specifying the --gtest_list_tests flag. If output is requested, via --gtest_output=xml or --gtest_output=json, the tests are listed, with extra information in the output file. This script tests such functionality by invoking gtest_list_output_unittest_ (a program written with Google Test) the command line flags. """ import os import re import gtest_test_utils GTEST_LIST_TESTS_FLAG = '--gtest_list_tests' GTEST_OUTPUT_FLAG = '--gtest_output' EXPECTED_XML = """<\?xml version="1.0" encoding="UTF-8"\?> """ EXPECTED_JSON = """{ "tests": 2, "name": "AllTests", "testsuites": \[ { "name": "FooTest", "tests": 2, "testsuite": \[ { "name": "Test1", "file": ".*gtest_list_output_unittest_.cc", "line": 43 }, { "name": "Test2", "file": ".*gtest_list_output_unittest_.cc", "line": 45 } \] } \] } """ class GTestListTestsOutputUnitTest(gtest_test_utils.TestCase): """Unit test for Google Test's list tests with output to file functionality. """ def testXml(self): """Verifies XML output for listing tests in a Google Test binary. Runs a test program that generates an empty XML output, and tests that the XML output is expected. """ self._TestOutput('xml', EXPECTED_XML) def testJSON(self): """Verifies XML output for listing tests in a Google Test binary. Runs a test program that generates an empty XML output, and tests that the XML output is expected. """ self._TestOutput('json', EXPECTED_JSON) def _GetOutput(self, out_format): file_path = os.path.join(gtest_test_utils.GetTempDir(), 'test_out.' + out_format) gtest_prog_path = gtest_test_utils.GetTestExecutablePath( 'gtest_list_output_unittest_') command = ([ gtest_prog_path, '%s=%s:%s' % (GTEST_OUTPUT_FLAG, out_format, file_path), '--gtest_list_tests' ]) environ_copy = os.environ.copy() p = gtest_test_utils.Subprocess( command, env=environ_copy, working_dir=gtest_test_utils.GetTempDir()) self.assert_(p.exited) self.assertEquals(0, p.exit_code) with open(file_path) as f: result = f.read() return result def _TestOutput(self, test_format, expected_output): actual = self._GetOutput(test_format) actual_lines = actual.splitlines() expected_lines = expected_output.splitlines() line_count = 0 for actual_line in actual_lines: expected_line = expected_lines[line_count] expected_line_re = re.compile(expected_line.strip()) self.assert_( expected_line_re.match(actual_line.strip()), ('actual output of "%s",\n' 'which does not match expected regex of "%s"\n' 'on line %d' % (actual, expected_output, line_count))) line_count = line_count + 1 if __name__ == '__main__': os.environ['GTEST_STACK_TRACE_DEPTH'] = '1' gtest_test_utils.Main()