1*481dde66SAndroid Build Coastguard Worker#!/usr/bin/env python 2*481dde66SAndroid Build Coastguard Worker# 3*481dde66SAndroid Build Coastguard Worker# Copyright 2009, Google Inc. 4*481dde66SAndroid Build Coastguard Worker# All rights reserved. 5*481dde66SAndroid Build Coastguard Worker# 6*481dde66SAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 7*481dde66SAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are 8*481dde66SAndroid Build Coastguard Worker# met: 9*481dde66SAndroid Build Coastguard Worker# 10*481dde66SAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright 11*481dde66SAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 12*481dde66SAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above 13*481dde66SAndroid Build Coastguard Worker# copyright notice, this list of conditions and the following disclaimer 14*481dde66SAndroid Build Coastguard Worker# in the documentation and/or other materials provided with the 15*481dde66SAndroid Build Coastguard Worker# distribution. 16*481dde66SAndroid Build Coastguard Worker# * Neither the name of Google Inc. nor the names of its 17*481dde66SAndroid Build Coastguard Worker# contributors may be used to endorse or promote products derived from 18*481dde66SAndroid Build Coastguard Worker# this software without specific prior written permission. 19*481dde66SAndroid Build Coastguard Worker# 20*481dde66SAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21*481dde66SAndroid Build Coastguard Worker# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*481dde66SAndroid Build Coastguard Worker# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23*481dde66SAndroid Build Coastguard Worker# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24*481dde66SAndroid Build Coastguard Worker# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25*481dde66SAndroid Build Coastguard Worker# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26*481dde66SAndroid Build Coastguard Worker# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*481dde66SAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*481dde66SAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*481dde66SAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30*481dde66SAndroid Build Coastguard Worker# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*481dde66SAndroid Build Coastguard Worker 32*481dde66SAndroid Build Coastguard Worker"""Tests that leaked mock objects can be caught be Google Mock.""" 33*481dde66SAndroid Build Coastguard Worker 34*481dde66SAndroid Build Coastguard Workerfrom googlemock.test import gmock_test_utils 35*481dde66SAndroid Build Coastguard Worker 36*481dde66SAndroid Build Coastguard WorkerPROGRAM_PATH = gmock_test_utils.GetTestExecutablePath('gmock_leak_test_') 37*481dde66SAndroid Build Coastguard WorkerTEST_WITH_EXPECT_CALL = [PROGRAM_PATH, '--gtest_filter=*ExpectCall*'] 38*481dde66SAndroid Build Coastguard WorkerTEST_WITH_ON_CALL = [PROGRAM_PATH, '--gtest_filter=*OnCall*'] 39*481dde66SAndroid Build Coastguard WorkerTEST_MULTIPLE_LEAKS = [PROGRAM_PATH, '--gtest_filter=*MultipleLeaked*'] 40*481dde66SAndroid Build Coastguard Worker 41*481dde66SAndroid Build Coastguard Workerenviron = gmock_test_utils.environ 42*481dde66SAndroid Build Coastguard WorkerSetEnvVar = gmock_test_utils.SetEnvVar 43*481dde66SAndroid Build Coastguard Worker 44*481dde66SAndroid Build Coastguard Worker# Tests in this file run a Google-Test-based test program and expect it 45*481dde66SAndroid Build Coastguard Worker# to terminate prematurely. Therefore they are incompatible with 46*481dde66SAndroid Build Coastguard Worker# the premature-exit-file protocol by design. Unset the 47*481dde66SAndroid Build Coastguard Worker# premature-exit filepath to prevent Google Test from creating 48*481dde66SAndroid Build Coastguard Worker# the file. 49*481dde66SAndroid Build Coastguard WorkerSetEnvVar(gmock_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None) 50*481dde66SAndroid Build Coastguard Worker 51*481dde66SAndroid Build Coastguard Worker 52*481dde66SAndroid Build Coastguard Workerclass GMockLeakTest(gmock_test_utils.TestCase): 53*481dde66SAndroid Build Coastguard Worker 54*481dde66SAndroid Build Coastguard Worker def testCatchesLeakedMockByDefault(self): 55*481dde66SAndroid Build Coastguard Worker self.assertNotEqual( 56*481dde66SAndroid Build Coastguard Worker 0, 57*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Subprocess( 58*481dde66SAndroid Build Coastguard Worker TEST_WITH_EXPECT_CALL, env=environ 59*481dde66SAndroid Build Coastguard Worker ).exit_code, 60*481dde66SAndroid Build Coastguard Worker ) 61*481dde66SAndroid Build Coastguard Worker self.assertNotEqual( 62*481dde66SAndroid Build Coastguard Worker 0, gmock_test_utils.Subprocess(TEST_WITH_ON_CALL, env=environ).exit_code 63*481dde66SAndroid Build Coastguard Worker ) 64*481dde66SAndroid Build Coastguard Worker 65*481dde66SAndroid Build Coastguard Worker def testDoesNotCatchLeakedMockWhenDisabled(self): 66*481dde66SAndroid Build Coastguard Worker self.assertEqual( 67*481dde66SAndroid Build Coastguard Worker 0, 68*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Subprocess( 69*481dde66SAndroid Build Coastguard Worker TEST_WITH_EXPECT_CALL + ['--gmock_catch_leaked_mocks=0'], 70*481dde66SAndroid Build Coastguard Worker env=environ, 71*481dde66SAndroid Build Coastguard Worker ).exit_code, 72*481dde66SAndroid Build Coastguard Worker ) 73*481dde66SAndroid Build Coastguard Worker self.assertEqual( 74*481dde66SAndroid Build Coastguard Worker 0, 75*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Subprocess( 76*481dde66SAndroid Build Coastguard Worker TEST_WITH_ON_CALL + ['--gmock_catch_leaked_mocks=0'], env=environ 77*481dde66SAndroid Build Coastguard Worker ).exit_code, 78*481dde66SAndroid Build Coastguard Worker ) 79*481dde66SAndroid Build Coastguard Worker 80*481dde66SAndroid Build Coastguard Worker def testCatchesLeakedMockWhenEnabled(self): 81*481dde66SAndroid Build Coastguard Worker self.assertNotEqual( 82*481dde66SAndroid Build Coastguard Worker 0, 83*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Subprocess( 84*481dde66SAndroid Build Coastguard Worker TEST_WITH_EXPECT_CALL + ['--gmock_catch_leaked_mocks'], env=environ 85*481dde66SAndroid Build Coastguard Worker ).exit_code, 86*481dde66SAndroid Build Coastguard Worker ) 87*481dde66SAndroid Build Coastguard Worker self.assertNotEqual( 88*481dde66SAndroid Build Coastguard Worker 0, 89*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Subprocess( 90*481dde66SAndroid Build Coastguard Worker TEST_WITH_ON_CALL + ['--gmock_catch_leaked_mocks'], env=environ 91*481dde66SAndroid Build Coastguard Worker ).exit_code, 92*481dde66SAndroid Build Coastguard Worker ) 93*481dde66SAndroid Build Coastguard Worker 94*481dde66SAndroid Build Coastguard Worker def testCatchesLeakedMockWhenEnabledWithExplictFlagValue(self): 95*481dde66SAndroid Build Coastguard Worker self.assertNotEqual( 96*481dde66SAndroid Build Coastguard Worker 0, 97*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Subprocess( 98*481dde66SAndroid Build Coastguard Worker TEST_WITH_EXPECT_CALL + ['--gmock_catch_leaked_mocks=1'], 99*481dde66SAndroid Build Coastguard Worker env=environ, 100*481dde66SAndroid Build Coastguard Worker ).exit_code, 101*481dde66SAndroid Build Coastguard Worker ) 102*481dde66SAndroid Build Coastguard Worker 103*481dde66SAndroid Build Coastguard Worker def testCatchesMultipleLeakedMocks(self): 104*481dde66SAndroid Build Coastguard Worker self.assertNotEqual( 105*481dde66SAndroid Build Coastguard Worker 0, 106*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Subprocess( 107*481dde66SAndroid Build Coastguard Worker TEST_MULTIPLE_LEAKS + ['--gmock_catch_leaked_mocks'], env=environ 108*481dde66SAndroid Build Coastguard Worker ).exit_code, 109*481dde66SAndroid Build Coastguard Worker ) 110*481dde66SAndroid Build Coastguard Worker 111*481dde66SAndroid Build Coastguard Worker 112*481dde66SAndroid Build Coastguard Workerif __name__ == '__main__': 113*481dde66SAndroid Build Coastguard Worker gmock_test_utils.Main() 114