# Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Tests for gtest.py""" import unittest from typing import Optional import conditions from conditions import Condition import gtest class GtestTest(unittest.TestCase): def disabler_test(self, input_file: str, test_name: str, new_cond, expected_result: str, message: Optional[str] = None): """Helper function for testing gtest.disabler.""" self.maxDiff = None if isinstance(new_cond, list): new_cond = conditions.parse(new_cond) else: assert isinstance(new_cond, conditions.BaseCondition) resulting_file = gtest.disabler(test_name, input_file, new_cond, message) self.assertEqual(expected_result.strip(), resulting_file.strip()) def test_disable_enabled_test(self): self.disabler_test('TEST_F(Suite, Test) {}', 'Suite.Test', conditions.ALWAYS, 'TEST_F(Suite, DISABLED_Test) {}') def test_disable_already_disabled_test(self): self.disabler_test('TEST(Suite, DISABLED_Test) {}', 'Suite.Test', conditions.ALWAYS, 'TEST(Suite, DISABLED_Test) {}') def test_enable_disabled_test(self): self.disabler_test('TEST_F(Suite, DISABLED_Test) {}', 'Suite.Test', conditions.NEVER, 'TEST_F(Suite, Test) {}') def test_enable_already_enabled_test(self): self.disabler_test('TEST(Suite, Test) {}', 'Suite.Test', conditions.NEVER, 'TEST(Suite, Test) {}') def test_conditionally_disable_test(self): # Include some bad formatting in the original TEST line, to make sure # the set of modified lines passed to clang-format includes it. self.disabler_test( 'TEST ( Suite, Test) {}', 'Suite.Test', ['linux', 'mac'], ''' #include "build/build_config.h" #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''') def test_conditionally_disable_already_disabled_test(self): # Include some bad formatting in the original TEST line, to make sure # the set of modified lines passed to clang-format includes it. self.disabler_test( 'TEST(Suite , DISABLED_Test) {}', 'Suite.Test', ['linux', 'mac'], ''' #include "build/build_config.h" #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''') def test_extend_conditions_on_conditionally_disabled_test(self): self.disabler_test( ''' #include "build/build_config.h" #if BUILDFLAG(IS_WIN) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''', 'Suite.Test', ['linux', 'mac'], ''' #include "build/build_config.h" #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''') def test_enable_conditionally_disabled_test(self): self.disabler_test( ''' #if BUILDFLAG(IS_WIN) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''', 'Suite.Test', conditions.NEVER, 'TEST(Suite, Test) {}') def test_simplify_redundant_conditions(self): self.disabler_test( ''' #include "build/build_config.h" #if BUILDFLAG(IS_LINUX) && defined(ADDRESS_SANITIZER)) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''', 'Suite.Test', ['linux'], ''' #include "build/build_config.h" #if BUILDFLAG(IS_LINUX) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''') def test_handle_backslash_line_continuations(self): self.disabler_test( r''' #if BUILDFLAG(IS_WIN) #define MAYBE_Test \ DISABLED_Test #else #define MAYBE_Test \ Test #endif TEST(Suite, MAYBE_Test) {} ''', 'Suite.Test', conditions.ALWAYS, 'TEST(Suite, DISABLED_Test) {}') def test_disable_test_via_build_flag(self): self.disabler_test( 'TEST(Suite, Test) {}', 'Suite.Test', ['lacros'], ''' #include "build/chromeos_buildflags.h" #if BUILDFLAG(IS_CHROMEOS_LACROS) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''') def test_split_long_lines_disabled(self): self.disabler_test( 'TEST(Suite, ' + 'ReallyReallyReallyReallyReallyReallyReallyReallyLongTestName) {}', 'Suite.ReallyReallyReallyReallyReallyReallyReallyReallyLongTestName', conditions.ALWAYS, ''' TEST(Suite, DISABLED_ReallyReallyReallyReallyReallyReallyReallyReallyLongTestName) {} ''') def test_split_long_lines_conditionally_disabled(self): self.disabler_test( 'TEST(Suite, ReallyReallyReallyReallyLongTestName) {}', 'Suite.ReallyReallyReallyReallyLongTestName', ['win'], r''' #include "build/build_config.h" #if BUILDFLAG(IS_WIN) #define MAYBE_ReallyReallyReallyReallyLongTestName \ DISABLED_ReallyReallyReallyReallyLongTestName #else #define MAYBE_ReallyReallyReallyReallyLongTestName \ ReallyReallyReallyReallyLongTestName #endif TEST(Suite, MAYBE_ReallyReallyReallyReallyLongTestName) {} ''') def test_with_name_ocurring_later_in_file(self): self.disabler_test( ''' TEST(Suite, Test) {} void SomeFunctionWihTestInTheName() {} ''', 'Suite.Test', conditions.ALWAYS, ''' TEST(Suite, DISABLED_Test) {} void SomeFunctionWihTestInTheName() {} ''') def test_ignore_comments_in_preprocessor_directive(self): self.disabler_test( ''' #if /* something */ BUILDFLAG( /* something else */ IS_WIN) // comment || #define MAYBE_Test DISABLED_Test // another one && #else /* and another... */ #define MAYBE_Test Test // you know the drill( #endif // one more! TEST(Suite, MAYBE_Test) {} ''', 'Suite.Test', conditions.NEVER, 'TEST(Suite, Test) {}') def test_disable_unconditionally_with_message(self): # Also include some formatting that should be fixed up, to test that the # correct line number is passed to clang-format. self.disabler_test(''' // existing comment TEST(Suite, Test) {} // another comment''', 'Suite.Test', conditions.ALWAYS, ''' // existing comment // here is the message TEST(Suite, DISABLED_Test) {} // another comment''', message='here is the message') def test_conditionally_disable_test_with_message(self): # Also include some formatting that should be fixed up, to test that the # correct line number is passed to clang-format. self.disabler_test('TEST(Suite, Test) {}', 'Suite.Test', ['linux', 'mac'], ''' #include "build/build_config.h" // we should really fix this #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) #define MAYBE_Test DISABLED_Test #else #define MAYBE_Test Test #endif TEST(Suite, MAYBE_Test) {} ''', message='we should really fix this') def test_ignores_test_names_in_other_contexts(self): self.disabler_test( ''' IN_PROC_BROWSER_TEST_P(Suite, Test) { // This is a very important Test. auto s = "Test"; auto t = "some other Test stuff"; }''', 'Suite.Test', conditions.ALWAYS, ''' IN_PROC_BROWSER_TEST_P(Suite, DISABLED_Test) { // This is a very important Test. auto s = "Test"; auto t = "some other Test stuff"; }''') if __name__ == '__main__': unittest.main()