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