3 # Copyright 2009, Google Inc.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
10 # * Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # * Redistributions in binary form must reproduce the above
13 # copyright notice, this list of conditions and the following disclaimer
14 # in the documentation and/or other materials provided with the
16 # * Neither the name of Google Inc. nor the names of its
17 # contributors may be used to endorse or promote products derived from
18 # this software without specific prior written permission.
20 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 """Tests the --help flag of Google C++ Testing and Mocking Framework.
35 gtest_help_test.py --build_dir=BUILD/DIR
36 # where BUILD/DIR contains the built gtest_help_test_ file.
43 from googletest.test import gtest_test_utils
46 IS_DARWIN = os.name == 'posix' and os.uname()[0] == 'Darwin'
47 IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
48 IS_GNUHURD = os.name == 'posix' and os.uname()[0] == 'GNU'
49 IS_GNUKFREEBSD = os.name == 'posix' and os.uname()[0] == 'GNU/kFreeBSD'
50 IS_OPENBSD = os.name == 'posix' and os.uname()[0] == 'OpenBSD'
51 IS_WINDOWS = os.name == 'nt'
53 PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')
54 FLAG_PREFIX = '--gtest_'
55 DEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'
56 STREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'
57 LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
58 INTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'
60 SUPPORTS_DEATH_TESTS = (
62 in gtest_test_utils.Subprocess([PROGRAM_PATH, LIST_TESTS_FLAG]).output
65 HAS_ABSL_FLAGS = '--has_absl_flags' in sys.argv
67 # The help message must match this regex.
68 HELP_REGEX = re.compile(
74 + r'also_run_disabled_tests.*'
90 + r'break_on_failure.*'
92 + r'throw_on_failure.*'
94 + r'catch_exceptions=0.*',
99 def RunWithFlag(flag):
100 """Runs gtest_help_test_ with the given flag.
103 the exit code and the text output as a tuple.
105 flag: the command-line flag to pass to gtest_help_test_, or None.
109 command = [PROGRAM_PATH]
111 command = [PROGRAM_PATH, flag]
112 child = gtest_test_utils.Subprocess(command)
113 return child.exit_code, child.output
116 class GTestHelpTest(gtest_test_utils.TestCase):
117 """Tests the --help flag and its equivalent forms."""
119 def TestHelpFlag(self, flag):
120 """Verifies correct behavior when help flag is specified.
122 The right message must be printed and the tests must
123 skipped when the given flag is specified.
126 flag: A flag to pass to the binary or None.
129 exit_code, output = RunWithFlag(flag)
131 # The Abseil flags library prints the ProgramUsageMessage() with
132 # --help and returns 1.
133 self.assertEqual(1, exit_code)
135 self.assertEqual(0, exit_code)
137 self.assertTrue(HELP_REGEX.search(output), output)
139 if IS_DARWIN or IS_LINUX or IS_GNUHURD or IS_GNUKFREEBSD or IS_OPENBSD:
140 self.assertIn(STREAM_RESULT_TO_FLAG, output)
142 self.assertNotIn(STREAM_RESULT_TO_FLAG, output)
144 if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:
145 self.assertIn(DEATH_TEST_STYLE_FLAG, output)
147 self.assertNotIn(DEATH_TEST_STYLE_FLAG, output)
149 def TestUnknownFlagWithAbseil(self, flag):
150 """Verifies correct behavior when an unknown flag is specified.
152 The right message must be printed and the tests must
153 skipped when the given flag is specified.
156 flag: A flag to pass to the binary or None.
158 exit_code, output = RunWithFlag(flag)
159 self.assertEqual(1, exit_code)
160 self.assertIn('ERROR: Unknown command line flag', output)
162 def TestNonHelpFlag(self, flag):
163 """Verifies correct behavior when no help flag is specified.
165 Verifies that when no help flag is specified, the tests are run
166 and the help message is not printed.
169 flag: A flag to pass to the binary or None.
172 exit_code, output = RunWithFlag(flag)
173 self.assertNotEqual(exit_code, 0)
174 self.assertFalse(HELP_REGEX.search(output), output)
176 def testPrintsHelpWithFullFlag(self):
177 self.TestHelpFlag('--help')
179 def testRunsTestsWithoutHelpFlag(self):
180 """Verifies correct behavior when no help flag is specified.
182 Verifies that when no help flag is specified, the tests are run
183 and the help message is not printed.
186 self.TestNonHelpFlag(None)
188 def testRunsTestsWithGtestInternalFlag(self):
189 """Verifies correct behavior when internal testing flag is specified.
191 Verifies that the tests are run and no help message is printed when
192 a flag starting with Google Test prefix and 'internal_' is supplied.
195 self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)
198 if __name__ == '__main__':
199 if '--has_absl_flags' in sys.argv:
200 sys.argv.remove('--has_absl_flags')
201 gtest_test_utils.Main()