diff options
Diffstat (limited to 'test')
-rwxr-xr-x | test/gmock_output_test.py | 48 | ||||
-rw-r--r-- | test/gmock_output_test_.cc | 11 | ||||
-rw-r--r-- | test/gmock_output_test_golden.txt | 3 |
3 files changed, 52 insertions, 10 deletions
diff --git a/test/gmock_output_test.py b/test/gmock_output_test.py index 2e992190..f43f7074 100755 --- a/test/gmock_output_test.py +++ b/test/gmock_output_test.py @@ -64,6 +64,7 @@ GOLDEN_NAME = 'gmock_output_test_golden.txt' GOLDEN_PATH = os.path.join(gmock_test_utils.GetSourceDir(), GOLDEN_NAME) + def ToUnixLineEnding(s): """Changes all Windows/Mac line endings in s to UNIX line endings.""" @@ -109,15 +110,38 @@ def RemoveMemoryAddresses(output): return re.sub(r'@\w+', '@0x#', output) -def NormalizeOutput(output): - """Normalizes output (the output of gmock_output_test_.exe).""" +def RemoveTestNamesOfLeakedMocks(output): + """Removes the test names of leaked mock objects from the test output.""" + + return re.sub(r'\(used in test .+\) ', '', output) + + +def GetLeakyTests(output): + """Returns a list of test names that leak mock objects.""" + + # findall() returns a list of all matches of the regex in output. + # For example, if '(used in test FooTest.Bar)' is in output, the + # list will contain 'FooTest.Bar'. + return re.findall(r'\(used in test (.+)\)', output) + + +def GetNormalizedOutputAndLeakyTests(output): + """Normalizes the output of gmock_output_test_. + + Args: + output: The test output. + + Returns: + A tuple (the normalized test output, the list of test names that have + leaked mocks). + """ output = ToUnixLineEnding(output) output = RemoveReportHeaderAndFooter(output) output = NormalizeErrorMarker(output) output = RemoveLocations(output) output = RemoveMemoryAddresses(output) - return output + return (RemoveTestNamesOfLeakedMocks(output), GetLeakyTests(output)) def IterShellCommandOutput(cmd, stdin_string=None): @@ -167,9 +191,8 @@ def GetShellCommandOutput(cmd, stdin_string=None): return string.join(lines, '') -def GetCommandOutput(cmd): - """Runs a command and returns its output with all file location - info stripped off. +def GetNormalizedCommandOutputAndLeakyTests(cmd): + """Runs a command and returns its normalized output and a list of leaky tests. Args: cmd: the shell command. @@ -177,22 +200,29 @@ def GetCommandOutput(cmd): # Disables exception pop-ups on Windows. os.environ['GTEST_CATCH_EXCEPTIONS'] = '1' - return NormalizeOutput(GetShellCommandOutput(cmd, '')) + return GetNormalizedOutputAndLeakyTests(GetShellCommandOutput(cmd, '')) class GMockOutputTest(unittest.TestCase): def testOutput(self): - output = GetCommandOutput(COMMAND) + (output, leaky_tests) = GetNormalizedCommandOutputAndLeakyTests(COMMAND) golden_file = open(GOLDEN_PATH, 'rb') golden = golden_file.read() golden_file.close() + # The normalized output should match the golden file. self.assertEquals(golden, output) + # The raw output should contain 2 leaked mock object errors for + # test GMockOutputTest.CatchesLeakedMocks. + self.assertEquals(['GMockOutputTest.CatchesLeakedMocks', + 'GMockOutputTest.CatchesLeakedMocks'], + leaky_tests) + if __name__ == '__main__': if sys.argv[1:] == [GENGOLDEN_FLAG]: - output = GetCommandOutput(COMMAND) + (output, _) = GetNormalizedCommandOutputAndLeakyTests(COMMAND) golden_file = open(GOLDEN_PATH, 'wb') golden_file.write(output) golden_file.close() diff --git a/test/gmock_output_test_.cc b/test/gmock_output_test_.cc index c97bc78c..97619af1 100644 --- a/test/gmock_output_test_.cc +++ b/test/gmock_output_test_.cc @@ -258,6 +258,16 @@ TEST_F(GMockOutputTest, CatchesLeakedMocks) { // Both foo1 and foo2 are deliberately leaked. } +void TestCatchesLeakedMocksInAdHocTests() { + MockFoo* foo = new MockFoo; + + // Invokes EXPECT_CALL on foo. + EXPECT_CALL(*foo, Bar2(_, _)); + foo->Bar2(2, 1); + + // foo is deliberately leaked. +} + int main(int argc, char **argv) { testing::InitGoogleMock(&argc, argv); @@ -266,5 +276,6 @@ int main(int argc, char **argv) { testing::GMOCK_FLAG(catch_leaked_mocks) = true; testing::GMOCK_FLAG(verbose) = "warning"; + TestCatchesLeakedMocksInAdHocTests(); return RUN_ALL_TESTS(); } diff --git a/test/gmock_output_test_golden.txt b/test/gmock_output_test_golden.txt index 50ef7b75..887b7be7 100644 --- a/test/gmock_output_test_golden.txt +++ b/test/gmock_output_test_golden.txt @@ -298,4 +298,5 @@ Stack trace: FILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#. FILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#. -ERROR: 2 leaked mock objects found at program exit. +FILE:#: ERROR: this mock object should be deleted but never is. Its address is @0x#. +ERROR: 3 leaked mock objects found at program exit. |