1735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#!/usr/bin/env python
2735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
3735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Copyright 2010 Google Inc.  All Rights Reserved.
4735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
5735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Redistribution and use in source and binary forms, with or without
6735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# modification, are permitted provided that the following conditions are
7735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# met:
8735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
9735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#     * Redistributions of source code must retain the above copyright
10735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# notice, this list of conditions and the following disclaimer.
11735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#     * Redistributions in binary form must reproduce the above
12735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# copyright notice, this list of conditions and the following disclaimer
13735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# in the documentation and/or other materials provided with the
14735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# distribution.
15735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#     * Neither the name of Google Inc. nor the names of its
16735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# contributors may be used to endorse or promote products derived from
17735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# this software without specific prior written permission.
18735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner#
19735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
31735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner"""Tests Google Test's exception catching behavior.
32735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
33735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerThis script invokes gtest_catch_exceptions_test_ and
34735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnergtest_catch_exceptions_ex_test_ (programs written with
35735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerGoogle Test) and verifies their output.
36735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner"""
37735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
38735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner__author__ = 'vladl@google.com (Vlad Losev)'
39735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
40735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerimport os
41735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
42735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerimport gtest_test_utils
43735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
44735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Constants.
45735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerFLAG_PREFIX = '--gtest_'
46735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerLIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
47735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerNO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'
48735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerFILTER_FLAG = FLAG_PREFIX + 'filter'
49735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
50735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with
51735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# exceptions enabled.
52735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerEX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
53735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'gtest_catch_exceptions_ex_test_')
54735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
55735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# Path to the gtest_catch_exceptions_test_ binary, compiled with
56735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# exceptions disabled.
57735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerEXE_PATH = gtest_test_utils.GetTestExecutablePath(
58735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    'gtest_catch_exceptions_no_ex_test_')
59735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
60735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerTEST_LIST = gtest_test_utils.Subprocess([EXE_PATH, LIST_TESTS_FLAG]).output
61735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
62735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerSUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST
63735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
64735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerif SUPPORTS_SEH_EXCEPTIONS:
65735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH]).output
66735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
67735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' TurnerEX_BINARY_OUTPUT = gtest_test_utils.Subprocess([EX_EXE_PATH]).output
68735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
69735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner# The tests.
70735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerif SUPPORTS_SEH_EXCEPTIONS:
71735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  # pylint:disable-msg=C6302
72735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  class CatchSehExceptionsTest(gtest_test_utils.TestCase):
73735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    """Tests exception-catching behavior."""
74735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
75735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
76735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    def TestSehExceptions(self, test_output):
77735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('SEH exception with code 0x2a thrown '
78735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   'in the test fixture\'s constructor'
79735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in test_output)
80735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('SEH exception with code 0x2a thrown '
81735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   'in the test fixture\'s destructor'
82735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in test_output)
83735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()'
84735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in test_output)
85735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()'
86735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in test_output)
87735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('SEH exception with code 0x2a thrown in SetUp()'
88735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in test_output)
89735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('SEH exception with code 0x2a thrown in TearDown()'
90735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in test_output)
91735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('SEH exception with code 0x2a thrown in the test body'
92735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in test_output)
93735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
94735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):
95735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.TestSehExceptions(EX_BINARY_OUTPUT)
96735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
97735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    def testCatchesSehExceptionsWithCxxExceptionsDisabled(self):
98735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.TestSehExceptions(BINARY_OUTPUT)
99735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
100735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
101735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerclass CatchCxxExceptionsTest(gtest_test_utils.TestCase):
102735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """Tests C++ exception-catching behavior.
103735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
104735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner     Tests in this test case verify that:
105735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner     * C++ exceptions are caught and logged as C++ (not SEH) exceptions
106735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner     * Exception thrown affect the remainder of the test work flow in the
107735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner       expected manner.
108735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  """
109735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
110735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testCatchesCxxExceptionsInFixtureConstructor(self):
111735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('C++ exception with description '
112735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 '"Standard C++ exception" thrown '
113735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'in the test fixture\'s constructor'
114735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
115735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
116735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'This failure belongs in this test only if '
117735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 '"CxxExceptionInConstructorTest" (no quotes) '
118735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'appears on the same line as words "called unexpectedly"')
119735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
120735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in
121735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      EX_BINARY_OUTPUT):
122735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
123735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    def testCatchesCxxExceptionsInFixtureDestructor(self):
124735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('C++ exception with description '
125735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   '"Standard C++ exception" thrown '
126735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   'in the test fixture\'s destructor'
127735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in EX_BINARY_OUTPUT)
128735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner      self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() '
129735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   'called as expected.'
130735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                   in EX_BINARY_OUTPUT)
131735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
132735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testCatchesCxxExceptionsInSetUpTestCase(self):
133735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('C++ exception with description "Standard C++ exception"'
134735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 ' thrown in SetUpTestCase()'
135735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
136735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() '
137735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
138735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
139735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTestCaseTest constructor '
140735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
141735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
142735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTestCaseTest destructor '
143735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
144735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
145735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() '
146735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
147735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
148735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() '
149735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
150735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
151735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTestCaseTest test body '
152735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
153735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
154735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
155735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testCatchesCxxExceptionsInTearDownTestCase(self):
156735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('C++ exception with description "Standard C++ exception"'
157735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 ' thrown in TearDownTestCase()'
158735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
159735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
160735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testCatchesCxxExceptionsInSetUp(self):
161735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('C++ exception with description "Standard C++ exception"'
162735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 ' thrown in SetUp()'
163735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
164735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() '
165735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
166735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
167735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTest destructor '
168735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
169735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
170735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInSetUpTest::TearDown() '
171735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
172735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
173735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
174735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'This failure belongs in this test only if '
175735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 '"CxxExceptionInSetUpTest" (no quotes) '
176735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'appears on the same line as words "called unexpectedly"')
177735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
178735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testCatchesCxxExceptionsInTearDown(self):
179735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('C++ exception with description "Standard C++ exception"'
180735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 ' thrown in TearDown()'
181735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
182735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() '
183735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
184735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
185735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInTearDownTest destructor '
186735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
187735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
188735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
189735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testCatchesCxxExceptionsInTestBody(self):
190735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('C++ exception with description "Standard C++ exception"'
191735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 ' thrown in the test body'
192735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
193735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() '
194735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
195735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
196735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInTestBodyTest destructor '
197735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
198735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
199735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('CxxExceptionInTestBodyTest::TearDown() '
200735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 'called as expected.'
201735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
202735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
203735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testCatchesNonStdCxxExceptions(self):
204735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('Unknown C++ exception thrown in the test body'
205735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in EX_BINARY_OUTPUT)
206735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
207735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  def testUnhandledCxxExceptionsAbortTheProgram(self):
208735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # Filters out SEH exception tests on Windows. Unhandled SEH exceptions
209735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # cause tests to show pop-up windows there.
210735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'
211735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    # By default, Google Test doesn't catch the exceptions.
212735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(
213735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner        [EX_EXE_PATH,
214735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner         NO_CATCH_EXCEPTIONS_FLAG,
215735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner         FITLER_OUT_SEH_TESTS_FLAG]).output
216735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
217735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('Unhandled C++ exception terminating the program'
218735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner                 in uncaught_exceptions_ex_binary_output)
219735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner    self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)
220735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
221735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner
222735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turnerif __name__ == '__main__':
223735d57d5d1c055db9e0ef28857e8dc7b3d7d6b9bDavid 'Digit' Turner  gtest_test_utils.Main()
224