text: #!/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()
  