1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#!/usr/bin/env python
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Copyright 2009, Google Inc.
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# All rights reserved.
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# Redistribution and use in source and binary forms, with or without
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# modification, are permitted provided that the following conditions are
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# met:
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#     * Redistributions of source code must retain the above copyright
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# notice, this list of conditions and the following disclaimer.
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#     * Redistributions in binary form must reproduce the above
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# copyright notice, this list of conditions and the following disclaimer
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# in the documentation and/or other materials provided with the
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# distribution.
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#     * Neither the name of Google Inc. nor the names of its
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# contributors may be used to endorse or promote products derived from
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# this software without specific prior written permission.
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter"""Tests the --help flag of Google C++ Testing Framework.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterSYNOPSIS
3546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan       gtest_help_test.py --build_dir=BUILD/DIR
36dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter         # where BUILD/DIR contains the built gtest_help_test_ file.
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter       gtest_help_test.py
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter"""
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter__author__ = 'wan@google.com (Zhanyong Wan)'
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
42dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterimport os
43dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterimport re
44dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterimport gtest_test_utils
45dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
46dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanIS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterIS_WINDOWS = os.name == 'nt'
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterPROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterFLAG_PREFIX = '--gtest_'
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterDEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'
5346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanSTREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'
5446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanUNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'
5546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
5646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanINCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),
5746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                           re.sub('^--', '/', LIST_TESTS_FLAG),
5846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                           re.sub('_', '-', LIST_TESTS_FLAG)]
5946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanINTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'
6046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
6146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanSUPPORTS_DEATH_TESTS = "DeathTest" in gtest_test_utils.Subprocess(
6246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    [PROGRAM_PATH, LIST_TESTS_FLAG]).output
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter# The help message must match this regex.
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterHELP_REGEX = re.compile(
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'list_tests.*' +
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'filter=.*' +
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'also_run_disabled_tests.*' +
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'repeat=.*' +
7046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    FLAG_PREFIX + r'shuffle.*' +
7146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    FLAG_PREFIX + r'random_seed=.*' +
72dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'color=.*' +
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'print_time.*' +
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'output=.*' +
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    FLAG_PREFIX + r'break_on_failure.*' +
7646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    FLAG_PREFIX + r'throw_on_failure.*' +
7746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    FLAG_PREFIX + r'catch_exceptions=0.*',
78dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    re.DOTALL)
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterdef RunWithFlag(flag):
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  """Runs gtest_help_test_ with the given flag.
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Returns:
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    the exit code and the text output as a tuple.
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Args:
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    flag: the command-line flag to pass to gtest_help_test_, or None.
88dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  """
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  if flag is None:
91dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    command = [PROGRAM_PATH]
92dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  else:
93dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    command = [PROGRAM_PATH, flag]
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  child = gtest_test_utils.Subprocess(command)
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return child.exit_code, child.output
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
97dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
98dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass GTestHelpTest(gtest_test_utils.TestCase):
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  """Tests the --help flag and its equivalent forms."""
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def TestHelpFlag(self, flag):
10246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    """Verifies correct behavior when help flag is specified.
10346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
10446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    The right message must be printed and the tests must
10546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    skipped when the given flag is specified.
10646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
10746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    Args:
10846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      flag:  A flag to pass to the binary or None.
10946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    """
110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    exit_code, output = RunWithFlag(flag)
112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.assertEquals(0, exit_code)
113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.assert_(HELP_REGEX.search(output), output)
11446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
11546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    if IS_LINUX:
11646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      self.assert_(STREAM_RESULT_TO_FLAG in output, output)
117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    else:
11846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      self.assert_(STREAM_RESULT_TO_FLAG not in output, output)
11946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
12046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:
121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)
12246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    else:
12346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)
12446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
12546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  def TestNonHelpFlag(self, flag):
12646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    """Verifies correct behavior when no help flag is specified.
12746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
12846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    Verifies that when no help flag is specified, the tests are run
12946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    and the help message is not printed.
13046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
13146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    Args:
13246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      flag:  A flag to pass to the binary or None.
13346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    """
13446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
13546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    exit_code, output = RunWithFlag(flag)
13646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.assert_(exit_code != 0)
13746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.assert_(not HELP_REGEX.search(output), output)
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testPrintsHelpWithFullFlag(self):
140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.TestHelpFlag('--help')
141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testPrintsHelpWithShortFlag(self):
143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.TestHelpFlag('-h')
144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testPrintsHelpWithQuestionFlag(self):
146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.TestHelpFlag('-?')
147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testPrintsHelpWithWindowsStyleQuestionFlag(self):
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    self.TestHelpFlag('/?')
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
15146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):
15246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.TestHelpFlag(UNKNOWN_FLAG)
15346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
15446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  def testPrintsHelpWithIncorrectFlagStyle(self):
15546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    for incorrect_flag in INCORRECT_FLAG_VARIANTS:
15646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      self.TestHelpFlag(incorrect_flag)
15746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  def testRunsTestsWithoutHelpFlag(self):
159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    """Verifies that when no help flag is specified, the tests are run
160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    and the help message is not printed."""
161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
16246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.TestNonHelpFlag(None)
16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  def testRunsTestsWithGtestInternalFlag(self):
16546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    """Verifies that the tests are run and no help message is printed when
16646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    a flag starting with Google Test prefix and 'internal_' is supplied."""
16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)
169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterif __name__ == '__main__':
172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  gtest_test_utils.Main()
173