diff options
Diffstat (limited to 'googletest/test/gtest_list_output_unittest.py')
| -rw-r--r-- | googletest/test/gtest_list_output_unittest.py | 141 | 
1 files changed, 141 insertions, 0 deletions
diff --git a/googletest/test/gtest_list_output_unittest.py b/googletest/test/gtest_list_output_unittest.py new file mode 100644 index 000000000000..3bba7ea2cfd3 --- /dev/null +++ b/googletest/test/gtest_list_output_unittest.py @@ -0,0 +1,141 @@ +#!/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"\?> +<testsuites tests="2" name="AllTests"> +  <testsuite name="FooTest" tests="2"> +    <testcase name="Test1" file=".*gtest_list_output_unittest_.cc" line="43" /> +    <testcase name="Test2" file=".*gtest_list_output_unittest_.cc" line="45" /> +  </testsuite> +</testsuites> +""" + +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()  | 
