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