113481Sgiacomo.travaglini@arm.com#!/usr/bin/env python 213481Sgiacomo.travaglini@arm.com# 313481Sgiacomo.travaglini@arm.com# Copyright 2010 Google Inc. All Rights Reserved. 413481Sgiacomo.travaglini@arm.com# 513481Sgiacomo.travaglini@arm.com# Redistribution and use in source and binary forms, with or without 613481Sgiacomo.travaglini@arm.com# modification, are permitted provided that the following conditions are 713481Sgiacomo.travaglini@arm.com# met: 813481Sgiacomo.travaglini@arm.com# 913481Sgiacomo.travaglini@arm.com# * Redistributions of source code must retain the above copyright 1013481Sgiacomo.travaglini@arm.com# notice, this list of conditions and the following disclaimer. 1113481Sgiacomo.travaglini@arm.com# * Redistributions in binary form must reproduce the above 1213481Sgiacomo.travaglini@arm.com# copyright notice, this list of conditions and the following disclaimer 1313481Sgiacomo.travaglini@arm.com# in the documentation and/or other materials provided with the 1413481Sgiacomo.travaglini@arm.com# distribution. 1513481Sgiacomo.travaglini@arm.com# * Neither the name of Google Inc. nor the names of its 1613481Sgiacomo.travaglini@arm.com# contributors may be used to endorse or promote products derived from 1713481Sgiacomo.travaglini@arm.com# this software without specific prior written permission. 1813481Sgiacomo.travaglini@arm.com# 1913481Sgiacomo.travaglini@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2013481Sgiacomo.travaglini@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2113481Sgiacomo.travaglini@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2213481Sgiacomo.travaglini@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2313481Sgiacomo.travaglini@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2413481Sgiacomo.travaglini@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2513481Sgiacomo.travaglini@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2613481Sgiacomo.travaglini@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2713481Sgiacomo.travaglini@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2813481Sgiacomo.travaglini@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2913481Sgiacomo.travaglini@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3013481Sgiacomo.travaglini@arm.com 3113481Sgiacomo.travaglini@arm.com"""Tests Google Test's exception catching behavior. 3213481Sgiacomo.travaglini@arm.com 3313481Sgiacomo.travaglini@arm.comThis script invokes gtest_catch_exceptions_test_ and 3413481Sgiacomo.travaglini@arm.comgtest_catch_exceptions_ex_test_ (programs written with 3513481Sgiacomo.travaglini@arm.comGoogle Test) and verifies their output. 3613481Sgiacomo.travaglini@arm.com""" 3713481Sgiacomo.travaglini@arm.com 3813481Sgiacomo.travaglini@arm.com__author__ = 'vladl@google.com (Vlad Losev)' 3913481Sgiacomo.travaglini@arm.com 4013481Sgiacomo.travaglini@arm.comimport os 4113481Sgiacomo.travaglini@arm.com 4213481Sgiacomo.travaglini@arm.comimport gtest_test_utils 4313481Sgiacomo.travaglini@arm.com 4413481Sgiacomo.travaglini@arm.com# Constants. 4513481Sgiacomo.travaglini@arm.comFLAG_PREFIX = '--gtest_' 4613481Sgiacomo.travaglini@arm.comLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests' 4713481Sgiacomo.travaglini@arm.comNO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0' 4813481Sgiacomo.travaglini@arm.comFILTER_FLAG = FLAG_PREFIX + 'filter' 4913481Sgiacomo.travaglini@arm.com 5013481Sgiacomo.travaglini@arm.com# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with 5113481Sgiacomo.travaglini@arm.com# exceptions enabled. 5213481Sgiacomo.travaglini@arm.comEX_EXE_PATH = gtest_test_utils.GetTestExecutablePath( 5313481Sgiacomo.travaglini@arm.com 'gtest_catch_exceptions_ex_test_') 5413481Sgiacomo.travaglini@arm.com 5513481Sgiacomo.travaglini@arm.com# Path to the gtest_catch_exceptions_test_ binary, compiled with 5613481Sgiacomo.travaglini@arm.com# exceptions disabled. 5713481Sgiacomo.travaglini@arm.comEXE_PATH = gtest_test_utils.GetTestExecutablePath( 5813481Sgiacomo.travaglini@arm.com 'gtest_catch_exceptions_no_ex_test_') 5913481Sgiacomo.travaglini@arm.com 6013481Sgiacomo.travaglini@arm.comenviron = gtest_test_utils.environ 6113481Sgiacomo.travaglini@arm.comSetEnvVar = gtest_test_utils.SetEnvVar 6213481Sgiacomo.travaglini@arm.com 6313481Sgiacomo.travaglini@arm.com# Tests in this file run a Google-Test-based test program and expect it 6413481Sgiacomo.travaglini@arm.com# to terminate prematurely. Therefore they are incompatible with 6513481Sgiacomo.travaglini@arm.com# the premature-exit-file protocol by design. Unset the 6613481Sgiacomo.travaglini@arm.com# premature-exit filepath to prevent Google Test from creating 6713481Sgiacomo.travaglini@arm.com# the file. 6813481Sgiacomo.travaglini@arm.comSetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None) 6913481Sgiacomo.travaglini@arm.com 7013481Sgiacomo.travaglini@arm.comTEST_LIST = gtest_test_utils.Subprocess( 7113481Sgiacomo.travaglini@arm.com [EXE_PATH, LIST_TESTS_FLAG], env=environ).output 7213481Sgiacomo.travaglini@arm.com 7313481Sgiacomo.travaglini@arm.comSUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST 7413481Sgiacomo.travaglini@arm.com 7513481Sgiacomo.travaglini@arm.comif SUPPORTS_SEH_EXCEPTIONS: 7613481Sgiacomo.travaglini@arm.com BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH], env=environ).output 7713481Sgiacomo.travaglini@arm.com 7813481Sgiacomo.travaglini@arm.comEX_BINARY_OUTPUT = gtest_test_utils.Subprocess( 7913481Sgiacomo.travaglini@arm.com [EX_EXE_PATH], env=environ).output 8013481Sgiacomo.travaglini@arm.com 8113481Sgiacomo.travaglini@arm.com 8213481Sgiacomo.travaglini@arm.com# The tests. 8313481Sgiacomo.travaglini@arm.comif SUPPORTS_SEH_EXCEPTIONS: 8413481Sgiacomo.travaglini@arm.com # pylint:disable-msg=C6302 8513481Sgiacomo.travaglini@arm.com class CatchSehExceptionsTest(gtest_test_utils.TestCase): 8613481Sgiacomo.travaglini@arm.com """Tests exception-catching behavior.""" 8713481Sgiacomo.travaglini@arm.com 8813481Sgiacomo.travaglini@arm.com 8913481Sgiacomo.travaglini@arm.com def TestSehExceptions(self, test_output): 9013481Sgiacomo.travaglini@arm.com self.assert_('SEH exception with code 0x2a thrown ' 9113481Sgiacomo.travaglini@arm.com 'in the test fixture\'s constructor' 9213481Sgiacomo.travaglini@arm.com in test_output) 9313481Sgiacomo.travaglini@arm.com self.assert_('SEH exception with code 0x2a thrown ' 9413481Sgiacomo.travaglini@arm.com 'in the test fixture\'s destructor' 9513481Sgiacomo.travaglini@arm.com in test_output) 9613481Sgiacomo.travaglini@arm.com self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()' 9713481Sgiacomo.travaglini@arm.com in test_output) 9813481Sgiacomo.travaglini@arm.com self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()' 9913481Sgiacomo.travaglini@arm.com in test_output) 10013481Sgiacomo.travaglini@arm.com self.assert_('SEH exception with code 0x2a thrown in SetUp()' 10113481Sgiacomo.travaglini@arm.com in test_output) 10213481Sgiacomo.travaglini@arm.com self.assert_('SEH exception with code 0x2a thrown in TearDown()' 10313481Sgiacomo.travaglini@arm.com in test_output) 10413481Sgiacomo.travaglini@arm.com self.assert_('SEH exception with code 0x2a thrown in the test body' 10513481Sgiacomo.travaglini@arm.com in test_output) 10613481Sgiacomo.travaglini@arm.com 10713481Sgiacomo.travaglini@arm.com def testCatchesSehExceptionsWithCxxExceptionsEnabled(self): 10813481Sgiacomo.travaglini@arm.com self.TestSehExceptions(EX_BINARY_OUTPUT) 10913481Sgiacomo.travaglini@arm.com 11013481Sgiacomo.travaglini@arm.com def testCatchesSehExceptionsWithCxxExceptionsDisabled(self): 11113481Sgiacomo.travaglini@arm.com self.TestSehExceptions(BINARY_OUTPUT) 11213481Sgiacomo.travaglini@arm.com 11313481Sgiacomo.travaglini@arm.com 11413481Sgiacomo.travaglini@arm.comclass CatchCxxExceptionsTest(gtest_test_utils.TestCase): 11513481Sgiacomo.travaglini@arm.com """Tests C++ exception-catching behavior. 11613481Sgiacomo.travaglini@arm.com 11713481Sgiacomo.travaglini@arm.com Tests in this test case verify that: 11813481Sgiacomo.travaglini@arm.com * C++ exceptions are caught and logged as C++ (not SEH) exceptions 11913481Sgiacomo.travaglini@arm.com * Exception thrown affect the remainder of the test work flow in the 12013481Sgiacomo.travaglini@arm.com expected manner. 12113481Sgiacomo.travaglini@arm.com """ 12213481Sgiacomo.travaglini@arm.com 12313481Sgiacomo.travaglini@arm.com def testCatchesCxxExceptionsInFixtureConstructor(self): 12413481Sgiacomo.travaglini@arm.com self.assert_('C++ exception with description ' 12513481Sgiacomo.travaglini@arm.com '"Standard C++ exception" thrown ' 12613481Sgiacomo.travaglini@arm.com 'in the test fixture\'s constructor' 12713481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 12813481Sgiacomo.travaglini@arm.com self.assert_('unexpected' not in EX_BINARY_OUTPUT, 12913481Sgiacomo.travaglini@arm.com 'This failure belongs in this test only if ' 13013481Sgiacomo.travaglini@arm.com '"CxxExceptionInConstructorTest" (no quotes) ' 13113481Sgiacomo.travaglini@arm.com 'appears on the same line as words "called unexpectedly"') 13213481Sgiacomo.travaglini@arm.com 13313481Sgiacomo.travaglini@arm.com if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in 13413481Sgiacomo.travaglini@arm.com EX_BINARY_OUTPUT): 13513481Sgiacomo.travaglini@arm.com 13613481Sgiacomo.travaglini@arm.com def testCatchesCxxExceptionsInFixtureDestructor(self): 13713481Sgiacomo.travaglini@arm.com self.assert_('C++ exception with description ' 13813481Sgiacomo.travaglini@arm.com '"Standard C++ exception" thrown ' 13913481Sgiacomo.travaglini@arm.com 'in the test fixture\'s destructor' 14013481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 14113481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() ' 14213481Sgiacomo.travaglini@arm.com 'called as expected.' 14313481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 14413481Sgiacomo.travaglini@arm.com 14513481Sgiacomo.travaglini@arm.com def testCatchesCxxExceptionsInSetUpTestCase(self): 14613481Sgiacomo.travaglini@arm.com self.assert_('C++ exception with description "Standard C++ exception"' 14713481Sgiacomo.travaglini@arm.com ' thrown in SetUpTestCase()' 14813481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 14913481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() ' 15013481Sgiacomo.travaglini@arm.com 'called as expected.' 15113481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 15213481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTestCaseTest constructor ' 15313481Sgiacomo.travaglini@arm.com 'called as expected.' 15413481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 15513481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTestCaseTest destructor ' 15613481Sgiacomo.travaglini@arm.com 'called as expected.' 15713481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 15813481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() ' 15913481Sgiacomo.travaglini@arm.com 'called as expected.' 16013481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 16113481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() ' 16213481Sgiacomo.travaglini@arm.com 'called as expected.' 16313481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 16413481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTestCaseTest test body ' 16513481Sgiacomo.travaglini@arm.com 'called as expected.' 16613481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 16713481Sgiacomo.travaglini@arm.com 16813481Sgiacomo.travaglini@arm.com def testCatchesCxxExceptionsInTearDownTestCase(self): 16913481Sgiacomo.travaglini@arm.com self.assert_('C++ exception with description "Standard C++ exception"' 17013481Sgiacomo.travaglini@arm.com ' thrown in TearDownTestCase()' 17113481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 17213481Sgiacomo.travaglini@arm.com 17313481Sgiacomo.travaglini@arm.com def testCatchesCxxExceptionsInSetUp(self): 17413481Sgiacomo.travaglini@arm.com self.assert_('C++ exception with description "Standard C++ exception"' 17513481Sgiacomo.travaglini@arm.com ' thrown in SetUp()' 17613481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 17713481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() ' 17813481Sgiacomo.travaglini@arm.com 'called as expected.' 17913481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 18013481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTest destructor ' 18113481Sgiacomo.travaglini@arm.com 'called as expected.' 18213481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 18313481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInSetUpTest::TearDown() ' 18413481Sgiacomo.travaglini@arm.com 'called as expected.' 18513481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 18613481Sgiacomo.travaglini@arm.com self.assert_('unexpected' not in EX_BINARY_OUTPUT, 18713481Sgiacomo.travaglini@arm.com 'This failure belongs in this test only if ' 18813481Sgiacomo.travaglini@arm.com '"CxxExceptionInSetUpTest" (no quotes) ' 18913481Sgiacomo.travaglini@arm.com 'appears on the same line as words "called unexpectedly"') 19013481Sgiacomo.travaglini@arm.com 19113481Sgiacomo.travaglini@arm.com def testCatchesCxxExceptionsInTearDown(self): 19213481Sgiacomo.travaglini@arm.com self.assert_('C++ exception with description "Standard C++ exception"' 19313481Sgiacomo.travaglini@arm.com ' thrown in TearDown()' 19413481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 19513481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() ' 19613481Sgiacomo.travaglini@arm.com 'called as expected.' 19713481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 19813481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInTearDownTest destructor ' 19913481Sgiacomo.travaglini@arm.com 'called as expected.' 20013481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 20113481Sgiacomo.travaglini@arm.com 20213481Sgiacomo.travaglini@arm.com def testCatchesCxxExceptionsInTestBody(self): 20313481Sgiacomo.travaglini@arm.com self.assert_('C++ exception with description "Standard C++ exception"' 20413481Sgiacomo.travaglini@arm.com ' thrown in the test body' 20513481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 20613481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() ' 20713481Sgiacomo.travaglini@arm.com 'called as expected.' 20813481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 20913481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInTestBodyTest destructor ' 21013481Sgiacomo.travaglini@arm.com 'called as expected.' 21113481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 21213481Sgiacomo.travaglini@arm.com self.assert_('CxxExceptionInTestBodyTest::TearDown() ' 21313481Sgiacomo.travaglini@arm.com 'called as expected.' 21413481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 21513481Sgiacomo.travaglini@arm.com 21613481Sgiacomo.travaglini@arm.com def testCatchesNonStdCxxExceptions(self): 21713481Sgiacomo.travaglini@arm.com self.assert_('Unknown C++ exception thrown in the test body' 21813481Sgiacomo.travaglini@arm.com in EX_BINARY_OUTPUT) 21913481Sgiacomo.travaglini@arm.com 22013481Sgiacomo.travaglini@arm.com def testUnhandledCxxExceptionsAbortTheProgram(self): 22113481Sgiacomo.travaglini@arm.com # Filters out SEH exception tests on Windows. Unhandled SEH exceptions 22213481Sgiacomo.travaglini@arm.com # cause tests to show pop-up windows there. 22313481Sgiacomo.travaglini@arm.com FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*' 22413481Sgiacomo.travaglini@arm.com # By default, Google Test doesn't catch the exceptions. 22513481Sgiacomo.travaglini@arm.com uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess( 22613481Sgiacomo.travaglini@arm.com [EX_EXE_PATH, 22713481Sgiacomo.travaglini@arm.com NO_CATCH_EXCEPTIONS_FLAG, 22813481Sgiacomo.travaglini@arm.com FITLER_OUT_SEH_TESTS_FLAG], 22913481Sgiacomo.travaglini@arm.com env=environ).output 23013481Sgiacomo.travaglini@arm.com 23113481Sgiacomo.travaglini@arm.com self.assert_('Unhandled C++ exception terminating the program' 23213481Sgiacomo.travaglini@arm.com in uncaught_exceptions_ex_binary_output) 23313481Sgiacomo.travaglini@arm.com self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output) 23413481Sgiacomo.travaglini@arm.com 23513481Sgiacomo.travaglini@arm.com 23613481Sgiacomo.travaglini@arm.comif __name__ == '__main__': 23713481Sgiacomo.travaglini@arm.com gtest_test_utils.Main() 238