1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#!/usr/bin/env python 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2009, Google Inc. 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# All rights reserved. 5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met: 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions of source code must retain the above copyright 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer. 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions in binary form must reproduce the above 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution. 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Neither the name of Google Inc. nor the names of its 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission. 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Tests Google Test's throw-on-failure mode with exceptions disabled. 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleThis script invokes gtest_throw_on_failure_test_ (a program written with 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGoogle Test) with different environments and command line flags. 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'wan@google.com (Zhanyong Wan)' 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport os 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleimport gtest_test_utils 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Constants. 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The command line flag for enabling/disabling the throw-on-failure mode. 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTHROW_ON_FAILURE = 'gtest_throw_on_failure' 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Path to the gtest_throw_on_failure_test_ program, compiled with 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# exceptions disabled. 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleEXE_PATH = gtest_test_utils.GetTestExecutablePath( 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'gtest_throw_on_failure_test_') 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Utilities. 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef SetEnvVar(env_var, value): 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Sets an environment variable to a given value; unsets it when the 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville given value is None. 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville env_var = env_var.upper() 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if value is not None: 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville os.environ[env_var] = value 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville elif env_var in os.environ: 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville del os.environ[env_var] 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilledef Run(command): 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Runs a command; returns True/False if its exit code is/isn't 0.""" 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville print 'Running "%s". . .' % ' '.join(command) 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville p = gtest_test_utils.Subprocess(command) 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return p.exited and p.exit_code == 0 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# The tests. TODO(wan@google.com): refactor the class to share common 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# logic with code in gtest_break_on_failure_unittest.py. 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ThrowOnFailureTest(gtest_test_utils.TestCase): 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Tests the throw-on-failure mode.""" 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def RunAndVerify(self, env_var_value, flag_value, should_fail): 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Runs gtest_throw_on_failure_test_ and verifies that it does 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (or does not) exit with a non-zero code. 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville Args: 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville env_var_value: value of the GTEST_BREAK_ON_FAILURE environment 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville variable; None if the variable should be unset. 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value: value of the --gtest_break_on_failure flag; 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None if the flag should not be present. 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail: True iff the program is expected to fail. 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """ 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetEnvVar(THROW_ON_FAILURE, env_var_value) 96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if env_var_value is None: 98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville env_var_value_msg = ' is not set' 99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville env_var_value_msg = '=' + env_var_value 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if flag_value is None: 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag = '' 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville elif flag_value == '0': 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag = '--%s=0' % THROW_ON_FAILURE 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag = '--%s' % THROW_ON_FAILURE 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville command = [EXE_PATH] 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if flag: 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville command.append(flag) 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville if should_fail: 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_or_not = 'should' 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville else: 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_or_not = 'should not' 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville failed = not Run(command) 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville SetEnvVar(THROW_ON_FAILURE, None) 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville msg = ('when %s%s, an assertion failure in "%s" %s cause a non-zero ' 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 'exit code.' % 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville (THROW_ON_FAILURE, env_var_value_msg, ' '.join(command), 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_or_not)) 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assert_(failed == should_fail, msg) 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testDefaultBehavior(self): 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Tests the behavior of the default mode.""" 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False) 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testThrowOnFailureEnvVar(self): 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Tests using the GTEST_THROW_ON_FAILURE environment variable.""" 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value='0', 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value=None, 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=False) 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value='1', 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value=None, 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=True) 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testThrowOnFailureFlag(self): 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Tests using the --gtest_throw_on_failure flag.""" 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value=None, 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value='0', 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=False) 149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value=None, 150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value='1', 151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=True) 152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testThrowOnFailureFlagOverridesEnvVar(self): 154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville """Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE.""" 155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value='0', 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value='0', 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=False) 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value='0', 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value='1', 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=True) 162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value='1', 163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value='0', 164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=False) 165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.RunAndVerify(env_var_value='1', 166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville flag_value='1', 167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville should_fail=True) 168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__': 171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville gtest_test_utils.Main() 172