141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#!/usr/bin/env python
241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#
341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# Copyright 2010 Google Inc.  All Rights Reserved.
441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#
541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# Redistribution and use in source and binary forms, with or without
641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# modification, are permitted provided that the following conditions are
741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# met:
841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#
941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#     * Redistributions of source code must retain the above copyright
1041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# notice, this list of conditions and the following disclaimer.
1141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#     * Redistributions in binary form must reproduce the above
1241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# copyright notice, this list of conditions and the following disclaimer
1341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# in the documentation and/or other materials provided with the
1441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# distribution.
1541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#     * Neither the name of Google Inc. nor the names of its
1641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# contributors may be used to endorse or promote products derived from
1741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# this software without specific prior written permission.
1841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot#
1941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot"""Tests Google Test's exception catching behavior.
3241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3341d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotThis script invokes gtest_catch_exceptions_test_ and
3441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotgtest_catch_exceptions_ex_test_ (programs written with
3541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotGoogle Test) and verifies their output.
3641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot"""
3741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
3841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot__author__ = 'vladl@google.com (Vlad Losev)'
3941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotimport os
4141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotimport gtest_test_utils
4341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
4441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# Constants.
4541d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotFLAG_PREFIX = '--gtest_'
4641d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
4741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotNO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'
4841d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotFILTER_FLAG = FLAG_PREFIX + 'filter'
4941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with
5141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# exceptions enabled.
5241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotEX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
5341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    'gtest_catch_exceptions_ex_test_')
5441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
5541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# Path to the gtest_catch_exceptions_test_ binary, compiled with
5641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# exceptions disabled.
5741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotEXE_PATH = gtest_test_utils.GetTestExecutablePath(
5841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    'gtest_catch_exceptions_no_ex_test_')
5941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6041d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotTEST_LIST = gtest_test_utils.Subprocess([EXE_PATH, LIST_TESTS_FLAG]).output
6141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6241d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotSUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST
6341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotif SUPPORTS_SEH_EXCEPTIONS:
6541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH]).output
6641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6741d0579e8de9ef4ff178fc4991043c61a19943f7Brett ChabotEX_BINARY_OUTPUT = gtest_test_utils.Subprocess([EX_EXE_PATH]).output
6841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
6941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot# The tests.
7041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotif SUPPORTS_SEH_EXCEPTIONS:
7141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  # pylint:disable-msg=C6302
7241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  class CatchSehExceptionsTest(gtest_test_utils.TestCase):
7341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    """Tests exception-catching behavior."""
7441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
7641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    def TestSehExceptions(self, test_output):
7741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.assert_('SEH exception with code 0x2a thrown '
7841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   'in the test fixture\'s constructor'
7941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   in test_output)
8041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.assert_('SEH exception with code 0x2a thrown '
8141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   'in the test fixture\'s destructor'
8241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   in test_output)
8341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()'
8441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   in test_output)
8541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()'
8641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   in test_output)
8741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.assert_('SEH exception with code 0x2a thrown in SetUp()'
8841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   in test_output)
8941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.assert_('SEH exception with code 0x2a thrown in TearDown()'
9041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   in test_output)
9141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.assert_('SEH exception with code 0x2a thrown in the test body'
9241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                   in test_output)
9341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):
9541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.TestSehExceptions(EX_BINARY_OUTPUT)
9641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
9741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    def testCatchesSehExceptionsWithCxxExceptionsDisabled(self):
9841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot      self.TestSehExceptions(BINARY_OUTPUT)
9941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotclass CatchCxxExceptionsTest(gtest_test_utils.TestCase):
10241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  """Tests C++ exception-catching behavior.
10341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
10441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot     Tests in this test case verify that:
10541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot     * C++ exceptions are caught and logged as C++ (not SEH) exceptions
10641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot     * Exception thrown affect the remainder of the test work flow in the
10741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot       expected manner.
10841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  """
10941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
11041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesCxxExceptionsInFixtureConstructor(self):
11141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('C++ exception with description '
11241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 '"Standard C++ exception" thrown '
11341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'in the test fixture\'s constructor'
11441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
11541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
11641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'This failure belongs in this test only if '
11741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 '"CxxExceptionInConstructorTest" (no quotes) '
11841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'appears on the same line as words "called unexpectedly"')
11941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesCxxExceptionsInFixtureDestructor(self):
12141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('C++ exception with description '
12241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 '"Standard C++ exception" thrown '
12341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'in the test fixture\'s destructor'
12441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
12541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() '
12641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
12741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
12841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
12941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesCxxExceptionsInSetUpTestCase(self):
13041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('C++ exception with description "Standard C++ exception"'
13141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 ' thrown in SetUpTestCase()'
13241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
13341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() '
13441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
13541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
13641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTestCaseTest constructor '
13741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
13841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
13941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTestCaseTest destructor '
14041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
14141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
14241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() '
14341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
14441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
14541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() '
14641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
14741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
14841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTestCaseTest test body '
14941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
15041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
15141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesCxxExceptionsInTearDownTestCase(self):
15341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('C++ exception with description "Standard C++ exception"'
15441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 ' thrown in TearDownTestCase()'
15541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
15641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
15741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesCxxExceptionsInSetUp(self):
15841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('C++ exception with description "Standard C++ exception"'
15941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 ' thrown in SetUp()'
16041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
16141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() '
16241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
16341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
16441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTest destructor '
16541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
16641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
16741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInSetUpTest::TearDown() '
16841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
16941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
17041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
17141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'This failure belongs in this test only if '
17241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 '"CxxExceptionInSetUpTest" (no quotes) '
17341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'appears on the same line as words "called unexpectedly"')
17441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
17541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesCxxExceptionsInTearDown(self):
17641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('C++ exception with description "Standard C++ exception"'
17741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 ' thrown in TearDown()'
17841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
17941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() '
18041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
18141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
18241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInTearDownTest destructor '
18341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
18441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
18541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
18641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesCxxExceptionsInTestBody(self):
18741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('C++ exception with description "Standard C++ exception"'
18841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 ' thrown in the test body'
18941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
19041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() '
19141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
19241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
19341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInTestBodyTest destructor '
19441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
19541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
19641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('CxxExceptionInTestBodyTest::TearDown() '
19741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 'called as expected.'
19841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
19941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testCatchesNonStdCxxExceptions(self):
20141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('Unknown C++ exception thrown in the test body'
20241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in EX_BINARY_OUTPUT)
20341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
20441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  def testUnhandledCxxExceptionsAbortTheProgram(self):
20541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    # Filters out SEH exception tests on Windows. Unhandled SEH exceptions
20641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    # cause tests to show pop-up windows there.
20741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'
20841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    # By default, Google Test doesn't catch the exceptions.
20941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(
21041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot        [EX_EXE_PATH,
21141d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot         NO_CATCH_EXCEPTIONS_FLAG,
21241d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot         FITLER_OUT_SEH_TESTS_FLAG]).output
21341d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21441d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('Unhandled C++ exception terminating the program'
21541d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot                 in uncaught_exceptions_ex_binary_output)
21641d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot    self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)
21741d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21841d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot
21941d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabotif __name__ == '__main__':
22041d0579e8de9ef4ff178fc4991043c61a19943f7Brett Chabot  gtest_test_utils.Main()
221