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 39import 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 gtest_test_utils.GetTestExecutablePath( 47 'googletest-global-environment-unittest_') 48 ] + (args or [])).output 49 50 51class GTestGlobalEnvironmentUnitTest(gtest_test_utils.TestCase): 52 """Tests global test environment failures.""" 53 54 def testEnvironmentSetUpFails(self): 55 """Tests the behavior of not specifying the fail_fast.""" 56 57 # Run the test. 58 txt = RunAndReturnOutput() 59 60 # We should see the text of the global environment setup error. 61 self.assertIn('Canned environment setup error', txt) 62 63 # Our test should have been skipped due to the error, and not treated as a 64 # pass. 65 self.assertIn('[ SKIPPED ] 1 test', txt) 66 self.assertIn('[ PASSED ] 0 tests', txt) 67 68 # The test case shouldn't have been run. 69 self.assertNotIn('Unexpected call', txt) 70 71 def testEnvironmentSetUpAndTornDownForEachRepeat(self): 72 """Tests the behavior of test environments and gtest_repeat.""" 73 74 txt = RunAndReturnOutput(['--gtest_repeat=2']) 75 76 # By default, with gtest_repeat=2, the global test environment should be set 77 # up and torn down for each iteration. 78 expected_pattern = ('(.|\n)*' 79 r'Repeating all tests \(iteration 1\)' 80 '(.|\n)*' 81 'Global test environment set-up.' 82 '(.|\n)*' 83 'SomeTest.DoesFoo' 84 '(.|\n)*' 85 'Global test environment tear-down' 86 '(.|\n)*' 87 r'Repeating all tests \(iteration 2\)' 88 '(.|\n)*' 89 'Global test environment set-up.' 90 '(.|\n)*' 91 'SomeTest.DoesFoo' 92 '(.|\n)*' 93 'Global test environment tear-down' 94 '(.|\n)*') 95 self.assertRegex(txt, expected_pattern) 96 97 def testEnvironmentSetUpAndTornDownOnce(self): 98 """Tests environment and --gtest_recreate_environments_when_repeating.""" 99 100 txt = RunAndReturnOutput([ 101 '--gtest_repeat=2', '--gtest_recreate_environments_when_repeating=false' 102 ]) 103 104 # When --gtest_recreate_environments_when_repeating is false, the test 105 # environment should only be set up and torn down once, at the start and 106 # end of the test respectively. 107 expected_pattern = ('(.|\n)*' 108 r'Repeating all tests \(iteration 1\)' 109 '(.|\n)*' 110 'Global test environment set-up.' 111 '(.|\n)*' 112 'SomeTest.DoesFoo' 113 '(.|\n)*' 114 r'Repeating all tests \(iteration 2\)' 115 '(.|\n)*' 116 'SomeTest.DoesFoo' 117 '(.|\n)*' 118 'Global test environment tear-down' 119 '(.|\n)*') 120 self.assertRegex(txt, expected_pattern) 121 122 self.assertEqual(len(re.findall('Global test environment set-up', txt)), 1) 123 self.assertEqual( 124 len(re.findall('Global test environment tear-down', txt)), 1) 125 126 127if __name__ == '__main__': 128 gtest_test_utils.Main() 129