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