111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#!/usr/bin/env python
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Copyright 2009, Google Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# All rights reserved.
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Redistribution and use in source and binary forms, with or without
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# modification, are permitted provided that the following conditions are
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# met:
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#     * Redistributions of source code must retain the above copyright
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# notice, this list of conditions and the following disclaimer.
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#     * Redistributions in binary form must reproduce the above
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# copyright notice, this list of conditions and the following disclaimer
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# in the documentation and/or other materials provided with the
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# distribution.
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#     * Neither the name of Google Inc. nor the names of its
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# contributors may be used to endorse or promote products derived from
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# this software without specific prior written permission.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert"""Tests the --help flag of Google C++ Testing Framework.
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertSYNOPSIS
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       gtest_help_test.py --build_dir=BUILD/DIR
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert         # where BUILD/DIR contains the built gtest_help_test_ file.
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       gtest_help_test.py
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert"""
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert__author__ = 'wan@google.com (Zhanyong Wan)'
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport os
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport re
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport gtest_test_utils
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertIS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
4811cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertIS_WINDOWS = os.name == 'nt'
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5011cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')
5111cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertFLAG_PREFIX = '--gtest_'
5211cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertDEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'
5311cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertSTREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'
5411cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertUNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'
5511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
5611cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                           re.sub('^--', '/', LIST_TESTS_FLAG),
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                           re.sub('_', '-', LIST_TESTS_FLAG)]
5911cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertINTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6111cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertSUPPORTS_DEATH_TESTS = "DeathTest" in gtest_test_utils.Subprocess(
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    [PROGRAM_PATH, LIST_TESTS_FLAG]).output
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# The help message must match this regex.
6511cd02dfb91661c65134cac258cf5924270e9d2Dan AlbertHELP_REGEX = re.compile(
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'list_tests.*' +
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'filter=.*' +
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'also_run_disabled_tests.*' +
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'repeat=.*' +
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'shuffle.*' +
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'random_seed=.*' +
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'color=.*' +
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'print_time.*' +
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'output=.*' +
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'break_on_failure.*' +
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'throw_on_failure.*' +
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    FLAG_PREFIX + r'catch_exceptions=0.*',
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    re.DOTALL)
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef RunWithFlag(flag):
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  """Runs gtest_help_test_ with the given flag.
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  Returns:
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    the exit code and the text output as a tuple.
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  Args:
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    flag: the command-line flag to pass to gtest_help_test_, or None.
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  """
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  if flag is None:
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    command = [PROGRAM_PATH]
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  else:
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    command = [PROGRAM_PATH, flag]
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  child = gtest_test_utils.Subprocess(command)
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  return child.exit_code, child.output
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass GTestHelpTest(gtest_test_utils.TestCase):
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  """Tests the --help flag and its equivalent forms."""
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def TestHelpFlag(self, flag):
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    """Verifies correct behavior when help flag is specified.
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    The right message must be printed and the tests must
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    skipped when the given flag is specified.
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Args:
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      flag:  A flag to pass to the binary or None.
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    """
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    exit_code, output = RunWithFlag(flag)
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.assertEquals(0, exit_code)
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.assert_(HELP_REGEX.search(output), output)
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if IS_LINUX:
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      self.assert_(STREAM_RESULT_TO_FLAG in output, output)
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else:
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      self.assert_(STREAM_RESULT_TO_FLAG not in output, output)
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    else:
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def TestNonHelpFlag(self, flag):
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    """Verifies correct behavior when no help flag is specified.
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Verifies that when no help flag is specified, the tests are run
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    and the help message is not printed.
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    Args:
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      flag:  A flag to pass to the binary or None.
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    """
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    exit_code, output = RunWithFlag(flag)
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.assert_(exit_code != 0)
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.assert_(not HELP_REGEX.search(output), output)
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testPrintsHelpWithFullFlag(self):
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.TestHelpFlag('--help')
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testPrintsHelpWithShortFlag(self):
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.TestHelpFlag('-h')
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testPrintsHelpWithQuestionFlag(self):
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.TestHelpFlag('-?')
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testPrintsHelpWithWindowsStyleQuestionFlag(self):
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.TestHelpFlag('/?')
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.TestHelpFlag(UNKNOWN_FLAG)
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testPrintsHelpWithIncorrectFlagStyle(self):
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    for incorrect_flag in INCORRECT_FLAG_VARIANTS:
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      self.TestHelpFlag(incorrect_flag)
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testRunsTestsWithoutHelpFlag(self):
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    """Verifies that when no help flag is specified, the tests are run
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    and the help message is not printed."""
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.TestNonHelpFlag(None)
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  def testRunsTestsWithGtestInternalFlag(self):
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    """Verifies that the tests are run and no help message is printed when
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    a flag starting with Google Test prefix and 'internal_' is supplied."""
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertif __name__ == '__main__':
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  gtest_test_utils.Main()
173