1# Copyright 2021 Google Inc. All Rights Reserved. 2# 3# Redistribution and use in source and binary forms, with or without 4# modification, are permitted provided that the following conditions are 5# met: 6# 7# * Redistributions of source code must retain the above copyright 8# notice, this list of conditions and the following disclaimer. 9# * Redistributions in binary form must reproduce the above 10# copyright notice, this list of conditions and the following disclaimer 11# in the documentation and/or other materials provided with the 12# distribution. 13# * Neither the name of Google Inc. nor the names of its 14# contributors may be used to endorse or promote products derived from 15# this software without specific prior written permission. 16# 17# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28"""Unit test for Google Test's global test environment behavior. 29 30A user can specify a global test environment via 31testing::AddGlobalTestEnvironment. Failures in the global environment should 32result in all unit tests being skipped. 33 34This script tests such functionality by invoking 35googletest-global-environment-unittest_ (a program written with Google Test). 36""" 37 38import re 39from googletest.test import gtest_test_utils 40 41 42def RunAndReturnOutput(args=None): 43 """Runs the test program and returns its output.""" 44 45 return gtest_test_utils.Subprocess( 46 [ 47 gtest_test_utils.GetTestExecutablePath( 48 'googletest-global-environment-unittest_' 49 ) 50 ] 51 + (args or []) 52 ).output 53 54 55class GTestGlobalEnvironmentUnitTest(gtest_test_utils.TestCase): 56 """Tests global test environment failures.""" 57 58 def testEnvironmentSetUpFails(self): 59 """Tests the behavior of not specifying the fail_fast.""" 60 61 # Run the test. 62 txt = RunAndReturnOutput() 63 64 # We should see the text of the global environment setup error. 65 self.assertIn('Canned environment setup error', txt) 66 67 # Our test should have been skipped due to the error, and not treated as a 68 # pass. 69 self.assertIn('[ SKIPPED ] 1 test', txt) 70 self.assertIn('[ PASSED ] 0 tests', txt) 71 72 # The test case shouldn't have been run. 73 self.assertNotIn('Unexpected call', txt) 74 75 def testEnvironmentSetUpAndTornDownForEachRepeat(self): 76 """Tests the behavior of test environments and gtest_repeat.""" 77 78 # When --gtest_recreate_environments_when_repeating is true, the global test 79 # environment should be set up and torn down for each iteration. 80 txt = RunAndReturnOutput([ 81 '--gtest_repeat=2', 82 '--gtest_recreate_environments_when_repeating=true', 83 ]) 84 85 expected_pattern = ( 86 '(.|\n)*' 87 r'Repeating all tests \(iteration 1\)' 88 '(.|\n)*' 89 'Global test environment set-up.' 90 '(.|\n)*' 91 'SomeTest.DoesFoo' 92 '(.|\n)*' 93 'Global test environment tear-down' 94 '(.|\n)*' 95 r'Repeating all tests \(iteration 2\)' 96 '(.|\n)*' 97 'Global test environment set-up.' 98 '(.|\n)*' 99 'SomeTest.DoesFoo' 100 '(.|\n)*' 101 'Global test environment tear-down' 102 '(.|\n)*' 103 ) 104 self.assertRegex(txt, expected_pattern) 105 106 def testEnvironmentSetUpAndTornDownOnce(self): 107 """Tests environment and --gtest_recreate_environments_when_repeating.""" 108 109 # By default the environment should only be set up and torn down once, at 110 # the start and end of the test respectively. 111 txt = RunAndReturnOutput( 112 [ 113 '--gtest_repeat=2', 114 ] 115 ) 116 117 expected_pattern = ( 118 '(.|\n)*' 119 r'Repeating all tests \(iteration 1\)' 120 '(.|\n)*' 121 'Global test environment set-up.' 122 '(.|\n)*' 123 'SomeTest.DoesFoo' 124 '(.|\n)*' 125 r'Repeating all tests \(iteration 2\)' 126 '(.|\n)*' 127 'SomeTest.DoesFoo' 128 '(.|\n)*' 129 'Global test environment tear-down' 130 '(.|\n)*' 131 ) 132 self.assertRegex(txt, expected_pattern) 133 134 self.assertEqual(len(re.findall('Global test environment set-up', txt)), 1) 135 self.assertEqual( 136 len(re.findall('Global test environment tear-down', txt)), 1 137 ) 138 139 140if __name__ == '__main__': 141 gtest_test_utils.Main() 142